Open configured vault folders

This commit is contained in:
2026-08-10 17:21:35 +02:00
parent c301d9a3df
commit 491d7b1557
11 changed files with 712 additions and 19 deletions

View File

@@ -7,6 +7,7 @@ pub enum UiAction {
About,
Settings,
NewEntry,
OpenFolder,
OpenEntry,
Save,
CloseWindow,
@@ -34,6 +35,7 @@ impl UiAction {
Self::About => "about",
Self::Settings => "settings",
Self::NewEntry => "new-entry",
Self::OpenFolder => "open-folder",
Self::OpenEntry => "open-entry",
Self::Save => "save",
Self::CloseWindow => "close-window",
@@ -104,6 +106,7 @@ pub struct ActionContext {
pub editing: bool,
pub dirty: bool,
pub saving: bool,
pub switching_vault: bool,
pub focused_field: bool,
pub focused_sensitive: bool,
pub entry_path: bool,
@@ -127,7 +130,13 @@ pub const ACTIONS: &[ActionSpec] = &[
Some("⌘Q"),
),
spec(UiAction::NewEntry, MenuGroup::File, "New Entry", Some("⌘N")),
spec(UiAction::OpenEntry, MenuGroup::File, "Open", Some("⌘O")),
spec(
UiAction::OpenFolder,
MenuGroup::File,
"Open Folder…",
Some("⌘O"),
),
spec(UiAction::OpenEntry, MenuGroup::Entry, "Open Entry", None),
spec(UiAction::Save, MenuGroup::File, "Save", Some("⌘S")),
spec(
UiAction::CloseWindow,
@@ -221,20 +230,53 @@ pub fn enabled(action: UiAction, context: ActionContext) -> bool {
UiAction::About | UiAction::Settings | UiAction::Help => true,
// Entry creation is not valid until the dedicated workflow exists.
UiAction::NewEntry => false,
UiAction::OpenEntry => context.storage_ready && context.entry_path && !context.saving,
UiAction::Save => context.unlocked && context.editing && context.dirty && !context.saving,
UiAction::CloseWindow | UiAction::Quit | UiAction::Minimize => true,
UiAction::OpenFolder => {
context.storage_ready && !context.saving && !context.switching_vault
}
UiAction::OpenEntry => {
context.storage_ready
&& context.entry_path
&& !context.saving
&& !context.switching_vault
}
UiAction::Save => {
context.unlocked
&& context.editing
&& context.dirty
&& !context.saving
&& !context.switching_vault
}
UiAction::CloseWindow | UiAction::Quit => !context.switching_vault,
UiAction::Minimize => true,
UiAction::Undo | UiAction::Redo | UiAction::Cut | UiAction::Paste | UiAction::Find => false,
UiAction::CopyField => {
context.unlocked && context.document_open && !context.editing && context.focused_field
context.unlocked
&& context.document_open
&& !context.editing
&& !context.switching_vault
&& context.focused_field
}
UiAction::CopyEditedField => {
context.unlocked && context.editing && !context.switching_vault && context.focused_field
}
UiAction::CopyEditedField => context.unlocked && context.editing && context.focused_field,
UiAction::TogglePaneFocus => true,
UiAction::Refresh => context.storage_ready && !context.tree_loading,
UiAction::ReloadEntry => context.unlocked && context.document_open && !context.saving,
UiAction::EditEntry => context.unlocked && context.document_open && !context.editing,
UiAction::Refresh => {
context.storage_ready && !context.tree_loading && !context.switching_vault
}
UiAction::ReloadEntry => {
context.unlocked && context.document_open && !context.saving && !context.switching_vault
}
UiAction::EditEntry => {
context.unlocked
&& context.document_open
&& !context.editing
&& !context.switching_vault
}
UiAction::ToggleReveal => {
context.unlocked && context.document_open && context.focused_sensitive
context.unlocked
&& context.document_open
&& !context.switching_vault
&& context.focused_sensitive
}
UiAction::Lock => context.unlocked,
}
@@ -253,7 +295,7 @@ pub fn shortcut_action(key: &keyboard::Key, modifiers: keyboard::Modifiers) -> O
match key.as_ref() {
keyboard::Key::Character(",") => Some(UiAction::Settings),
keyboard::Key::Character("n" | "N") => Some(UiAction::NewEntry),
keyboard::Key::Character("o" | "O") => Some(UiAction::OpenEntry),
keyboard::Key::Character("o" | "O") => Some(UiAction::OpenFolder),
keyboard::Key::Character("s" | "S") => Some(UiAction::Save),
keyboard::Key::Character("w" | "W") => Some(UiAction::CloseWindow),
keyboard::Key::Character("q" | "Q") => Some(UiAction::Quit),
@@ -285,6 +327,7 @@ mod tests {
editing: true,
dirty: true,
saving: false,
switching_vault: false,
focused_field: true,
focused_sensitive: true,
entry_path: true,
@@ -350,13 +393,37 @@ mod tests {
..ready
}
));
assert!(!enabled(
UiAction::OpenFolder,
ActionContext {
switching_vault: true,
..ready
}
));
let switching = ActionContext {
switching_vault: true,
..ready
};
for action in [
UiAction::Save,
UiAction::CloseWindow,
UiAction::Quit,
UiAction::CopyField,
UiAction::CopyEditedField,
UiAction::Refresh,
UiAction::ReloadEntry,
UiAction::EditEntry,
UiAction::ToggleReveal,
] {
assert!(!enabled(action, switching), "{action:?}");
}
}
#[test]
fn conventional_shortcuts_resolve_to_the_registered_actions() {
let primary = keyboard::Modifiers::COMMAND;
for (key, expected) in [
("o", UiAction::OpenEntry),
("o", UiAction::OpenFolder),
("s", UiAction::Save),
("f", UiAction::Find),
("n", UiAction::NewEntry),