summaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/window.c b/src/window.c
index 65ef229..26beb57 100644
--- a/src/window.c
+++ b/src/window.c
@@ -462,6 +462,38 @@ _action_mark_all(GSimpleAction *p_a, GVariant *p_v, gpointer p_data) {
_update_header(p_win);
}
+/* `V` range-mark: mark every file from the last `v`-toggled mark (the anchor)
+ * to the highlighted grid cell / current large-view image, inclusive. No-op
+ * if no mark has been toggled on yet (no anchor). Emits "changed" so grid
+ * badges and the header mark count refresh. */
+static void
+_action_mark_range(GSimpleAction *p_a, GVariant *p_v, gpointer p_data) {
+ (void)p_a;
+ (void)p_v;
+ GgazeWindow *p_win = GGAZE_WINDOW(p_data);
+ if (p_win->p_nav == NULL) {
+ return;
+ }
+ GFile *p_anchor = navigator_get_last_mark(p_win->p_nav);
+ if (p_anchor == NULL) {
+ return;
+ }
+ GFile *p_target = NULL;
+ const char *c_cur =
+ gtk_stack_get_visible_child_name(GTK_STACK(p_win->p_stack));
+ if (g_strcmp0(c_cur, "grid") == 0 && p_win->p_grid != NULL) {
+ p_target = ggaze_grid_get_selected_file(p_win->p_grid);
+ }
+ if (p_target == NULL) {
+ p_target = navigator_get_current(p_win->p_nav);
+ }
+ if (p_target == NULL) {
+ return;
+ }
+ navigator_mark_range(p_win->p_nav, p_anchor, p_target);
+ _update_header(p_win);
+}
+
/* GtkBuilder UI for the shortcuts overlay (?). Accel strings use gtk
* accelerator syntax: "h Left" means h OR Left triggers it. */
static const char *SHORTCUTS_UI =
@@ -557,6 +589,13 @@ static const char *SHORTCUTS_UI =
" </child>\n"
" <child>\n"
" <object class=\"GtkShortcutsShortcut\">\n"
+ " <property name=\"accelerator\">Shift+V</property>\n"
+ " <property name=\"title\">Range-mark from last mark "
+ "to current</property>\n"
+ " </object>\n"
+ " </child>\n"
+ " <child>\n"
+ " <object class=\"GtkShortcutsShortcut\">\n"
" <property name=\"accelerator\">Ctrl+a</property>\n"
" <property name=\"title\">Mark all</property>\n"
" </object>\n"
@@ -1083,6 +1122,7 @@ static const GActionEntry ACTIONS[] = {
{.name = "toggle-view", .activate = _action_toggle_view},
{.name = "mark", .activate = _action_mark},
{.name = "mark-all", .activate = _action_mark_all},
+ {.name = "mark-range", .activate = _action_mark_range},
{.name = "shortcuts", .activate = _action_shortcuts},
{.name = "enhance-1", .activate = _action_enhance_n},
{.name = "enhance-2", .activate = _action_enhance_n},