Compare commits
No commits in common. "e12622700d28b7bfd088fef9ce4db432ebd770e6" and "a88d5da4ddfe206f66bdd2db0ae2533ffc1e534f" have entirely different histories.
e12622700d
...
a88d5da4dd
@ -63,7 +63,6 @@ see [Screen capture](#screen-capture).
|
|||||||
frame), and **Ctrl-Shift-C** its full path. Neither acts while you type in the search box. They
|
frame), and **Ctrl-Shift-C** its full path. Neither acts while you type in the search box. They
|
||||||
are `copy_image` and `copy_path` in `[hotkeys]` in `settings.config`. Copying images is Windows
|
are `copy_image` and `copy_path` in `[hotkeys]` in `settings.config`. Copying images is Windows
|
||||||
only so far.
|
only so far.
|
||||||
- **Ctrl-F** puts the keyboard in the search box, its text selected (`focus_search` in `[hotkeys]`).
|
|
||||||
- **Files added or deleted outside the app** (in Explorer, by another program) appear in the grid
|
- **Files added or deleted outside the app** (in Explorer, by another program) appear in the grid
|
||||||
or leave it on their own, folders added, renamed or deleted too: the library is watched.
|
or leave it on their own, folders added, renamed or deleted too: the library is watched.
|
||||||
**Refresh** looks at the whole folder again, should the watcher have missed something.
|
**Refresh** looks at the whole folder again, should the watcher have missed something.
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
# Delete and PrintScreen. For example: Ctrl-Alt-Space bring_to_foreground
|
# Delete and PrintScreen. For example: Ctrl-Alt-Space bring_to_foreground
|
||||||
# Changes apply as soon as the file is saved.
|
# Changes apply as soon as the file is saved.
|
||||||
|
|
||||||
Ctrl-Shift-M bring_to_foreground
|
none bring_to_foreground
|
||||||
|
|
||||||
# Freezes every screen to drag a region over and capture it, into the clipboard and the library.
|
# Freezes every screen to drag a region over and capture it, into the clipboard and the library.
|
||||||
# PrintScreen is Snagit's key too: only one program can have it, so quit Snagit or choose another
|
# PrintScreen is Snagit's key too: only one program can have it, so quit Snagit or choose another
|
||||||
|
|||||||
@ -22,9 +22,6 @@ Ctrl-Shift-Alt-R reset_layout
|
|||||||
Ctrl-C copy_image
|
Ctrl-C copy_image
|
||||||
Ctrl-Shift-C copy_path
|
Ctrl-Shift-C copy_path
|
||||||
|
|
||||||
# Library
|
|
||||||
Ctrl-F focus_search
|
|
||||||
|
|
||||||
# Debug
|
# Debug
|
||||||
Ctrl-Shift-D toggle_debug_panel
|
Ctrl-Shift-D toggle_debug_panel
|
||||||
Ctrl-Shift-L toggle_logger_panel
|
Ctrl-Shift-L toggle_logger_panel
|
||||||
|
|||||||
@ -22,9 +22,6 @@ Cmd-Shift-Opt-R reset_layout
|
|||||||
Cmd-C copy_image
|
Cmd-C copy_image
|
||||||
Cmd-Shift-C copy_path
|
Cmd-Shift-C copy_path
|
||||||
|
|
||||||
# Library
|
|
||||||
Cmd-F focus_search
|
|
||||||
|
|
||||||
# Debug
|
# Debug
|
||||||
Cmd-Shift-D toggle_debug_panel
|
Cmd-Shift-D toggle_debug_panel
|
||||||
Cmd-Shift-L toggle_logger_panel
|
Cmd-Shift-L toggle_logger_panel
|
||||||
|
|||||||
@ -47,7 +47,7 @@ APP_NAME :: "mcap";
|
|||||||
APP_FOLDER_NAME :: "mcap";
|
APP_FOLDER_NAME :: "mcap";
|
||||||
GIT_BRANCH :: "check";
|
GIT_BRANCH :: "check";
|
||||||
GIT_HASH :: "-";
|
GIT_HASH :: "-";
|
||||||
VERSION :: "0.1.20";
|
VERSION :: "0.1.17";
|
||||||
BUILD_DATE :: "-";
|
BUILD_DATE :: "-";
|
||||||
DEBUG :: true;
|
DEBUG :: true;
|
||||||
COMPILE_TESTS :: true;
|
COMPILE_TESTS :: true;
|
||||||
|
|||||||
@ -8,7 +8,7 @@ APP_NAME :: "mcap";
|
|||||||
APP_FOLDER_NAME :: "mcap";
|
APP_FOLDER_NAME :: "mcap";
|
||||||
APP_BUNDLE_IDENTIFIER :: "com.example.mcap";
|
APP_BUNDLE_IDENTIFIER :: "com.example.mcap";
|
||||||
|
|
||||||
VERSION :: "0.1.20";
|
VERSION :: "0.1.17";
|
||||||
// Where everything goes: bin/, or bin-headless/ for builds made with no_crash_dialog, so automated
|
// Where everything goes: bin/, or bin-headless/ for builds made with no_crash_dialog, so automated
|
||||||
// builds never write over the ones you run by hand.
|
// builds never write over the ones you run by hand.
|
||||||
build_directory := "bin";
|
build_directory := "bin";
|
||||||
|
|||||||
@ -134,7 +134,6 @@ viewer: struct {
|
|||||||
visible_generation: s64; // counts rebuilds of visible
|
visible_generation: s64; // counts rebuilds of visible
|
||||||
sorted_by_date: bool;
|
sorted_by_date: bool;
|
||||||
search_buffer: [256] u8;
|
search_buffer: [256] u8;
|
||||||
focus_search: bool; // Ctrl-F (focus_search in [hotkeys]): the search box takes the keyboard next frame
|
|
||||||
search_terms: [..] Search_Term;
|
search_terms: [..] Search_Term;
|
||||||
folders: [..] string; // the library's folders holding captures, sorted; "" for its top
|
folders: [..] string; // the library's folders holding captures, sorted; "" for its top
|
||||||
folder_filter: string; // the folder the grid shows; "" for all (heap)
|
folder_filter: string; // the folder the grid shows; "" for all (heap)
|
||||||
@ -1060,11 +1059,6 @@ viewer_ui :: () { using ImGui;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if viewer.focus_search {
|
|
||||||
viewer.focus_search = false;
|
|
||||||
SetWindowFocus(); // SetKeyboardFocusHere alone leaves another window in front
|
|
||||||
SetKeyboardFocusHere(); // tabbing in: its text is selected, so typing replaces the query
|
|
||||||
}
|
|
||||||
SetNextItemWidth(min(GetContentRegionAvail().x * 0.5, 520));
|
SetNextItemWidth(min(GetContentRegionAvail().x * 0.5, 520));
|
||||||
if InputTextWithHint("##search", "Search text, titles, URLs, apps, notes, labels. \"a phrase\" ocr: title: url: app: note: label: like: folder: has:", viewer.search_buffer.data, viewer.search_buffer.count) {
|
if InputTextWithHint("##search", "Search text, titles, URLs, apps, notes, labels. \"a phrase\" ocr: title: url: app: note: label: like: folder: has:", viewer.search_buffer.data, viewer.search_buffer.count) {
|
||||||
viewer_search_changed();
|
viewer_search_changed();
|
||||||
|
|||||||
@ -229,38 +229,6 @@ settings_tests :: () {
|
|||||||
defer settings_free(*settings);
|
defer settings_free(*settings);
|
||||||
expect(ok && !seen.event_log && settings.event_log_capacity == EVENT_LOG_CAPACITY_DEFAULT,
|
expect(ok && !seen.event_log && settings.event_log_capacity == EVENT_LOG_CAPACITY_DEFAULT,
|
||||||
"a file without the key gave seen % and capacity %", seen.event_log, settings.event_log_capacity);
|
"a file without the key gave seen % and capacity %", seen.event_log, settings.event_log_capacity);
|
||||||
|
|
||||||
// A section that does not mention an action gets its default installed right away, since the save
|
|
||||||
// that writes it into the file does not reload it; a pre-upgrade file gets "none" instead.
|
|
||||||
{
|
|
||||||
group("hotkeys missing from [hotkeys]");
|
|
||||||
hotkey_actions_init();
|
|
||||||
defaults := hotkey_defaults();
|
|
||||||
bindings: [..] Hotkey_Binding;
|
|
||||||
bindings.allocator = temp;
|
|
||||||
errors := hotkeys_parse_section("logger_tests", "[hotkeys]\nCtrl-Shift-Q program_exit\nnone minimize_to_tray\n", hotkey_actions, *bindings);
|
|
||||||
expect(errors == 0 && bindings.count == 2, "the partial section gave % bindings and % errors", bindings.count, errors);
|
|
||||||
|
|
||||||
exit_action := hotkey_find_action(hotkey_actions, "program_exit");
|
|
||||||
minimize := hotkey_find_action(hotkey_actions, "minimize_to_tray");
|
|
||||||
focus_search := hotkey_find_action(hotkey_actions, "focus_search");
|
|
||||||
|
|
||||||
installed := hotkeys_with_missing_defaults(hotkey_actions, bindings, defaults, APP_USER_SETTINGS_VERSION);
|
|
||||||
count_for :: (bindings: [] Hotkey_Binding, action: s32) -> int {
|
|
||||||
count := 0;
|
|
||||||
for bindings if it.action == action count += 1;
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
expect(count_for(installed, exit_action) == 1, "program_exit has % bindings, not just its own 1", count_for(installed, exit_action));
|
|
||||||
expect(count_for(installed, minimize) == 1, "minimize_to_tray's \"none\" was joined by % more", count_for(installed, minimize) - 1);
|
|
||||||
expect(count_for(installed, focus_search) == count_for(defaults, focus_search) && count_for(defaults, focus_search) > 0,
|
|
||||||
"focus_search got % of its % default bindings", count_for(installed, focus_search), count_for(defaults, focus_search));
|
|
||||||
missing, _ := hotkeys_missing_lines(hotkey_actions, installed, defaults, APP_USER_SETTINGS_VERSION);
|
|
||||||
expect(missing == "", "with the defaults added, these are still missing:%", missing);
|
|
||||||
|
|
||||||
old := hotkeys_with_missing_defaults(hotkey_actions, bindings, defaults, APP_USER_SETTINGS_VERSION - 1);
|
|
||||||
expect(old.count == bindings.count, "a pre-upgrade file got % default bindings", old.count - bindings.count);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#scope_export
|
#scope_export
|
||||||
|
|||||||
@ -167,9 +167,6 @@ reset_layout_hotkey: Hotkey;
|
|||||||
copy_image_hotkey: Hotkey = .{ignore_when_text_field_active = true};
|
copy_image_hotkey: Hotkey = .{ignore_when_text_field_active = true};
|
||||||
copy_path_hotkey: Hotkey = .{ignore_when_text_field_active = true};
|
copy_path_hotkey: Hotkey = .{ignore_when_text_field_active = true};
|
||||||
|
|
||||||
// The search box (app/viewer.jai). Also while typing elsewhere, as in the Import window's fields.
|
|
||||||
focus_search_hotkey: Hotkey;
|
|
||||||
|
|
||||||
Hotkey_Action :: struct {
|
Hotkey_Action :: struct {
|
||||||
name: string; // as written in [hotkeys]
|
name: string; // as written in [hotkeys]
|
||||||
hotkey: *Hotkey;
|
hotkey: *Hotkey;
|
||||||
@ -192,7 +189,6 @@ hotkey_actions_build :: (out: *[..] Hotkey_Action) {
|
|||||||
add(out, "reset_layout", *reset_layout_hotkey);
|
add(out, "reset_layout", *reset_layout_hotkey);
|
||||||
add(out, "copy_image", *copy_image_hotkey);
|
add(out, "copy_image", *copy_image_hotkey);
|
||||||
add(out, "copy_path", *copy_path_hotkey);
|
add(out, "copy_path", *copy_path_hotkey);
|
||||||
add(out, "focus_search", *focus_search_hotkey);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hotkey_actions: [..] Hotkey_Action;
|
hotkey_actions: [..] Hotkey_Action;
|
||||||
@ -293,7 +289,9 @@ hotkeys_missing_lines :: (actions: [] Hotkey_Action, bindings: [] Hotkey_Binding
|
|||||||
new_active_count := 0;
|
new_active_count := 0;
|
||||||
|
|
||||||
for action, action_index: actions {
|
for action, action_index: actions {
|
||||||
if hotkeys_mention_action(bindings, action_index) continue;
|
mentioned := false;
|
||||||
|
for bindings if it.action == action_index { mentioned = true; break; }
|
||||||
|
if mentioned continue;
|
||||||
|
|
||||||
if !header_written {
|
if !header_written {
|
||||||
append(*builder, "\n# Added automatically; new since this file was last saved.\n");
|
append(*builder, "\n# Added automatically; new since this file was last saved.\n");
|
||||||
@ -312,28 +310,6 @@ hotkeys_missing_lines :: (actions: [] Hotkey_Action, bindings: [] Hotkey_Binding
|
|||||||
return builder_to_string(*builder,, temp), new_active_count;
|
return builder_to_string(*builder,, temp), new_active_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The bindings to install for a section as read: its own, plus the shipped defaults of the actions
|
|
||||||
// it does not mention, which hotkeys_missing_lines gives the file in the save that follows. That
|
|
||||||
// save records the hash of what it wrote, so the file is not reloaded, and without these a new
|
|
||||||
// action would stay unbound until the file next changed. temp.
|
|
||||||
hotkeys_with_missing_defaults :: (actions: [] Hotkey_Action, bindings: [] Hotkey_Binding, defaults: [] Hotkey_Binding, file_version: s64) -> [] Hotkey_Binding {
|
|
||||||
if file_version < APP_USER_SETTINGS_VERSION return bindings; // these get "none"
|
|
||||||
|
|
||||||
result: [..] Hotkey_Binding;
|
|
||||||
result.allocator = temp;
|
|
||||||
array_add(*result, ..bindings);
|
|
||||||
for action, action_index: actions {
|
|
||||||
if hotkeys_mention_action(bindings, action_index) continue;
|
|
||||||
for defaults if it.action == action_index array_add(*result, it);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
hotkeys_mention_action :: (bindings: [] Hotkey_Binding, action_index: int) -> bool {
|
|
||||||
for bindings if it.action == action_index return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------- the [global_hotkeys] section
|
// ---------------------------------------------------------------- the [global_hotkeys] section
|
||||||
|
|
||||||
// Registered with the OS, so they fire from any app: RegisterHotKey on Windows, Carbon's
|
// Registered with the OS, so they fire from any app: RegisterHotKey on Windows, Carbon's
|
||||||
@ -661,7 +637,6 @@ app_check_key_combinations :: () {
|
|||||||
// The viewer is the shutdown thread's once shutdown has started. View mode has the file alone (app/open_file.jai).
|
// The viewer is the shutdown thread's once shutdown has started. View mode has the file alone (app/open_file.jai).
|
||||||
if check_key_combination(*copy_image_hotkey) && !app_exit_shutdown_started() { if app.view_mode open_file_copy_image(); else viewer_copy_image(); }
|
if check_key_combination(*copy_image_hotkey) && !app_exit_shutdown_started() { if app.view_mode open_file_copy_image(); else viewer_copy_image(); }
|
||||||
if check_key_combination(*copy_path_hotkey) && !app_exit_shutdown_started() { if app.view_mode open_file_copy_path(); else viewer_copy_path(); }
|
if check_key_combination(*copy_path_hotkey) && !app_exit_shutdown_started() { if app.view_mode open_file_copy_path(); else viewer_copy_path(); }
|
||||||
if check_key_combination(*focus_search_hotkey) && !app_exit_shutdown_started() && !app.view_mode viewer.focus_search = true; // view mode has no search
|
|
||||||
|
|
||||||
if should_exit_this_frame {
|
if should_exit_this_frame {
|
||||||
log("Calling exit hotkey... exiting program!");
|
log("Calling exit hotkey... exiting program!");
|
||||||
|
|||||||
@ -366,11 +366,11 @@ app_load_user_settings_file :: () -> write_back: bool {
|
|||||||
|
|
||||||
bindings: [] Hotkey_Binding = hotkey_defaults();
|
bindings: [] Hotkey_Binding = hotkey_defaults();
|
||||||
if ok && seen.hotkeys bindings = app_user_settings.hotkey_bindings;
|
if ok && seen.hotkeys bindings = app_user_settings.hotkey_bindings;
|
||||||
hotkeys_install(hotkeys_with_missing_defaults(hotkey_actions, bindings, hotkey_defaults(), version));
|
hotkeys_install(bindings);
|
||||||
|
|
||||||
global_bindings: [] Hotkey_Binding = global_hotkey_defaults();
|
global_bindings: [] Hotkey_Binding = global_hotkey_defaults();
|
||||||
if ok && seen.global_hotkeys global_bindings = app_user_settings.global_hotkey_bindings;
|
if ok && seen.global_hotkeys global_bindings = app_user_settings.global_hotkey_bindings;
|
||||||
global_hotkeys_install(hotkeys_with_missing_defaults(global_hotkey_actions, global_bindings, global_hotkey_defaults(), version));
|
global_hotkeys_install(global_bindings);
|
||||||
|
|
||||||
if !ok return false;
|
if !ok return false;
|
||||||
|
|
||||||
@ -804,7 +804,7 @@ app_reload_user_settings_if_changed :: () {
|
|||||||
settings_file_hash = hash;
|
settings_file_hash = hash;
|
||||||
|
|
||||||
fresh: App_User_Settings;
|
fresh: App_User_Settings;
|
||||||
ok, seen, version := settings_parse(path, file_data, *fresh);
|
ok, seen, _ := settings_parse(path, file_data, *fresh);
|
||||||
if !ok {
|
if !ok {
|
||||||
settings_free(*fresh);
|
settings_free(*fresh);
|
||||||
log_error("[settings] Could not apply the changes to %; keeping the current settings.", path);
|
log_error("[settings] Could not apply the changes to %; keeping the current settings.", path);
|
||||||
@ -832,11 +832,11 @@ app_reload_user_settings_if_changed :: () {
|
|||||||
|
|
||||||
bindings: [] Hotkey_Binding = hotkey_defaults();
|
bindings: [] Hotkey_Binding = hotkey_defaults();
|
||||||
if seen.hotkeys bindings = app_user_settings.hotkey_bindings;
|
if seen.hotkeys bindings = app_user_settings.hotkey_bindings;
|
||||||
hotkeys_install(hotkeys_with_missing_defaults(hotkey_actions, bindings, hotkey_defaults(), version));
|
hotkeys_install(bindings);
|
||||||
|
|
||||||
global_bindings: [] Hotkey_Binding = global_hotkey_defaults();
|
global_bindings: [] Hotkey_Binding = global_hotkey_defaults();
|
||||||
if seen.global_hotkeys global_bindings = app_user_settings.global_hotkey_bindings;
|
if seen.global_hotkeys global_bindings = app_user_settings.global_hotkey_bindings;
|
||||||
global_hotkeys_install(hotkeys_with_missing_defaults(global_hotkey_actions, global_bindings, global_hotkey_defaults(), version));
|
global_hotkeys_install(global_bindings);
|
||||||
global_hotkeys_reapply();
|
global_hotkeys_reapply();
|
||||||
|
|
||||||
settings_note_synced();
|
settings_note_synced();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user