[shotwell] Remove GtkUIManager and Gtk*Action*
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [shotwell] Remove GtkUIManager and Gtk*Action*
- Date: Mon, 14 Nov 2016 23:32:49 +0000 (UTC)
commit 17c8587e485cc8fad18abdecc2d6fa603416c973
Author: Jens Georg <mail jensge org>
Date: Wed Oct 19 21:56:15 2016 +0200
Remove GtkUIManager and Gtk*Action*
https://bugzilla.gnome.org/show_bug.cgi?id=768271
Signed-off-by: Jens Georg <mail jensge org>
shotwell.am | 7 +-
src/AppWindow.vala | 179 ++--------
src/Application.vala | 4 +
src/CollectionPage.vala | 217 +++++--------
src/MediaPage.vala | 447 ++++++-------------------
src/Page.vala | 389 +++++++++++++---------
src/PhotoPage.vala | 459 ++++++-------------------
src/Resources.vala | 21 --
src/SearchFilter.vala | 355 +++++++-------------
src/camera/ImportPage.vala | 58 ++--
src/direct/DirectPhotoPage.vala | 207 ++----------
src/events/EventPage.vala | 26 +-
src/events/EventsDirectoryPage.vala | 76 ++---
src/library/ImportQueuePage.vala | 20 +-
src/library/LibraryWindow.vala | 395 ++++++++--------------
src/library/OfflinePage.vala | 29 +-
src/library/TrashPage.vala | 35 +--
src/org.gnome.Shotwell.gresource.xml | 4 +
src/searches/Branch.vala | 36 +--
src/searches/SavedSearchPage.vala | 40 +--
src/sidebar/Tree.vala | 44 ++--
src/tags/Branch.vala | 38 +--
src/tags/TagPage.vala | 52 ++--
src/util/ui.vala | 10 -
ui/collection.ui | 276 ++++++++++++---
ui/direct.ui | 267 +++++++++++----
ui/direct_context.ui | 42 ++-
ui/event.ui | 618 ++++++++++++++++++++++++++++++++--
ui/events_directory.ui | 255 +++++++++++----
ui/import.ui | 285 ++++++++++++----
ui/import_queue.ui | 123 +++++--
ui/media.ui | 552 +++++++++++++++++++++++-------
ui/offline.ui | 319 ++++++++++++++----
ui/photo.ui | 537 ++++++++++++++++++++++-------
ui/photo_context.ui | 182 ++++++++--
ui/savedsearch.ui | 30 ++-
ui/search_bar.ui | 67 +++-
ui/search_sidebar_context.ui | 18 +-
ui/set_background_dialog.ui | 11 +-
ui/sidebar_default_context.ui | 22 +-
ui/tag_sidebar_context.ui | 17 +-
ui/tags.ui | 470 ++++++++++++++++++++++++--
ui/top.ui | 57 +++-
ui/trash.ui | 405 ++++++++++++++++++-----
44 files changed, 4772 insertions(+), 2929 deletions(-)
---
diff --git a/shotwell.am b/shotwell.am
index d1b64ef..6f8250d 100644
--- a/shotwell.am
+++ b/shotwell.am
@@ -24,7 +24,12 @@ nodist_shotwell_SOURCES = \
src/resource.c
MOSTLYCLEANFILES += src/resource.c
-src/resource.c: src/org.gnome.Shotwell.gresource.xml
+shotwell_resource_deps = $(shell $(GLIB_COMPILE_RESOURCES) \
+ --sourcedir=$(abs_top_srcdir)/icons \
+ --sourcedir=$(abs_top_srcdir)/ui \
+ --generate-dependencies src/org.gnome.Shotwell.gresource.xml)
+
+src/resource.c: src/org.gnome.Shotwell.gresource.xml $(shotwell_resource_deps)
$(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ \
--sourcedir=$(abs_top_srcdir)/icons \
--sourcedir=$(abs_top_srcdir)/ui \
diff --git a/src/AppWindow.vala b/src/AppWindow.vala
index 0103300..677a1c6 100644
--- a/src/AppWindow.vala
+++ b/src/AppWindow.vala
@@ -19,26 +19,17 @@ public class FullscreenWindow : PageWindow {
private bool switched_to = false;
private bool is_toolbar_dismissal_enabled;
+ private const GLib.ActionEntry[] entries = {
+ { "LeaveFullscreen", on_close }
+ };
+
public FullscreenWindow(Page page) {
set_current_page(page);
- File ui_file = Resources.get_ui("fullscreen.ui");
+ AppWindow.get_instance().add_action_entries (entries, this);
+ const string[] accels = { "F11" };
+ Application.set_accels_for_action ("win.LeaveFullscreen", accels);
- try {
- ui.add_ui_from_file(ui_file.get_path());
- } catch (Error err) {
- error("Error loading UI file %s: %s", ui_file.get_path(), err.message);
- }
-
- Gtk.ActionGroup action_group = new Gtk.ActionGroup("FullscreenActionGroup");
- action_group.add_actions(create_actions(), this);
- ui.insert_action_group(action_group, 0);
- ui.ensure_update();
-
- Gtk.AccelGroup accel_group = ui.get_accel_group();
- if (accel_group != null)
- add_accel_group(accel_group);
-
set_screen(AppWindow.get_instance().get_screen());
// Needed so fullscreen will occur on correct monitor in multi-monitor setups
@@ -58,7 +49,7 @@ public class FullscreenWindow : PageWindow {
close_button.set_icon_name("view-restore");
close_button.set_tooltip_text(_("Leave fullscreen"));
- close_button.clicked.connect(on_close);
+ close_button.set_action_name ("win.LeaveFullscreen");
toolbar = page.get_toolbar();
toolbar.set_show_arrow(false);
@@ -130,18 +121,6 @@ public class FullscreenWindow : PageWindow {
return result;
}
-
- private Gtk.ActionEntry[] create_actions() {
- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-
- Gtk.ActionEntry leave_fullscreen = { "LeaveFullscreen", Resources.LEAVE_FULLSCREEN_LABEL,
- TRANSLATABLE, "F11", TRANSLATABLE, on_close };
- leave_fullscreen.label = Resources.LEAVE_FULLSCREEN_LABEL;
- leave_fullscreen.tooltip = Resources.LEAVE_FULLSCREEN_LABEL;
- actions += leave_fullscreen;
-
- return actions;
- }
public override bool key_press_event(Gdk.EventKey event) {
// check for an escape/abort
@@ -289,9 +268,7 @@ public class FullscreenWindow : PageWindow {
// subclass. A subclass should set current_page to the user-visible Page for it to receive
// various notifications. It is the responsibility of the subclass to notify Pages when they're
// switched to and from, and other aspects of the Page interface.
-public abstract class PageWindow : Gtk.Window {
- protected Gtk.UIManager ui = new Gtk.UIManager();
-
+public abstract class PageWindow : Gtk.ApplicationWindow {
private Page current_page = null;
private int busy_counter = 0;
@@ -302,12 +279,6 @@ public abstract class PageWindow : Gtk.Window {
// the current page needs to know when modifier keys are pressed
add_events(Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK
| Gdk.EventMask.STRUCTURE_MASK);
-
- set_has_resize_grip(false);
- }
-
- public Gtk.UIManager get_ui_manager() {
- return ui;
}
public Page? get_current_page() {
@@ -416,14 +387,11 @@ public abstract class AppWindow : PageWindow {
// the AppWindow maintains its own UI manager because the first UIManager an action group is
// added to is the one that claims its accelerators
- protected Gtk.ActionGroup[] common_action_groups;
protected bool maximized = false;
protected Dimensions dimensions;
protected int pos_x = 0;
protected int pos_y = 0;
- private Gtk.ActionGroup common_action_group = new Gtk.ActionGroup("AppWindowGlobalActionGroup");
-
public AppWindow() {
// although there are multiple AppWindow types, only one may exist per-process
assert(instance == null);
@@ -454,18 +422,8 @@ public abstract class AppWindow : PageWindow {
// UIManager. In order to activate those accelerators, we need to create a dummy UI string
// that lists all the common actions. We build it on-the-fly from the actions associated
// with each ActionGroup while we're adding the groups to the UIManager.
- common_action_groups = create_common_action_groups();
- foreach (Gtk.ActionGroup group in common_action_groups)
- ui.insert_action_group(group, 0);
-
- try {
- ui.add_ui_from_string(build_dummy_ui_string(common_action_groups), -1);
- } catch (Error err) {
- error("Unable to add AppWindow UI: %s", err.message);
- }
-
- ui.ensure_update();
- add_accel_group(ui.get_accel_group());
+
+ add_actions ();
Gtk.CssProvider provider = new Gtk.CssProvider();
try {
@@ -475,67 +433,20 @@ public abstract class AppWindow : PageWindow {
debug("Unable to load custom CSS: %s", err.message);
}
}
-
- private Gtk.ActionEntry[] create_common_actions() {
- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-
- Gtk.ActionEntry quit = { "CommonQuit", Resources.QUIT_LABEL, TRANSLATABLE, "<Ctrl>Q",
- TRANSLATABLE, on_quit };
- quit.label = Resources.QUIT_LABEL;
- actions += quit;
-
- Gtk.ActionEntry about = { "CommonAbout", Resources.ABOUT_LABEL, TRANSLATABLE, null,
- TRANSLATABLE, on_about };
- about.label = Resources.ABOUT_LABEL;
- actions += about;
- Gtk.ActionEntry fullscreen = { "CommonFullscreen", Resources.FULLSCREEN_LABEL,
- TRANSLATABLE, "F11", TRANSLATABLE, on_fullscreen };
- fullscreen.label = Resources.FULLSCREEN_LABEL;
- actions += fullscreen;
+ private const GLib.ActionEntry[] common_actions = {
+ { "CommonQuit", on_quit },
+ { "CommonFullscreen", on_fullscreen },
+ { "CommonHelpContents", on_help_contents },
+ { "CommonHelpFAQ", on_help_faq },
+ { "CommonHelpReportProblem", on_help_report_problem },
+ { "CommonUndo", on_undo },
+ { "CommonRedo", on_redo },
+ { "CommonJumpToFile", on_jump_to_file },
+ { "CommonSelectAll", on_select_all },
+ { "CommonSelectNone", on_select_none }
+ };
- Gtk.ActionEntry help_contents = { "CommonHelpContents", Resources.HELP_LABEL,
- TRANSLATABLE, "F1", TRANSLATABLE, on_help_contents };
- help_contents.label = _("_Contents");
- actions += help_contents;
-
- Gtk.ActionEntry help_faq = { "CommonHelpFAQ", null, TRANSLATABLE, null,
- TRANSLATABLE, on_help_faq };
- help_faq.label = _("_Frequently Asked Questions");
- actions += help_faq;
-
- Gtk.ActionEntry help_report_problem = { "CommonHelpReportProblem", null, TRANSLATABLE, null,
- TRANSLATABLE, on_help_report_problem };
- help_report_problem.label = _("_Report a Problem…");
- actions += help_report_problem;
-
- Gtk.ActionEntry undo = { "CommonUndo", Resources.UNDO_MENU, TRANSLATABLE, "<Ctrl>Z",
- TRANSLATABLE, on_undo };
- undo.label = Resources.UNDO_MENU;
- actions += undo;
-
- Gtk.ActionEntry redo = { "CommonRedo", Resources.REDO_MENU, TRANSLATABLE, "<Ctrl><Shift>Z",
- TRANSLATABLE, on_redo };
- redo.label = Resources.REDO_MENU;
- actions += redo;
-
- Gtk.ActionEntry jump_to_file = { "CommonJumpToFile", Resources.JUMP_TO_FILE_MENU, TRANSLATABLE,
- "<Ctrl><Shift>M", TRANSLATABLE, on_jump_to_file };
- jump_to_file.label = Resources.JUMP_TO_FILE_MENU;
- actions += jump_to_file;
-
- Gtk.ActionEntry select_all = { "CommonSelectAll", Resources.SELECT_ALL_MENU, TRANSLATABLE,
- "<Ctrl>A", TRANSLATABLE, on_select_all };
- select_all.label = Resources.SELECT_ALL_MENU;
- actions += select_all;
-
- Gtk.ActionEntry select_none = { "CommonSelectNone", null, null,
- "<Ctrl><Shift>A", TRANSLATABLE, on_select_none };
- actions += select_none;
-
- return actions;
- }
-
protected abstract void on_fullscreen();
public static bool has_instance() {
@@ -747,22 +658,10 @@ public abstract class AppWindow : PageWindow {
sys_show_uri(get_window().get_screen(), url);
}
- protected virtual Gtk.ActionGroup[] create_common_action_groups() {
- Gtk.ActionGroup[] groups = new Gtk.ActionGroup[0];
-
- common_action_group.add_actions(create_common_actions(), this);
- groups += common_action_group;
-
- return groups;
- }
-
- public Gtk.ActionGroup[] get_common_action_groups() {
- return common_action_groups;
- }
-
- public virtual void replace_common_placeholders(Gtk.UIManager ui) {
+ protected virtual void add_actions () {
+ this.add_action_entries (AppWindow.common_actions, this);
}
-
+
public void go_fullscreen(Page page) {
// if already fullscreen, use that
if (fullscreen_window != null) {
@@ -801,34 +700,26 @@ public abstract class AppWindow : PageWindow {
present();
}
- public Gtk.Action? get_common_action(string name) {
- foreach (Gtk.ActionGroup group in common_action_groups) {
- Gtk.Action? action = group.get_action(name);
- if (action != null)
- return action;
- }
-
- warning("No common action found: %s", name);
-
- return null;
+ public GLib.Action? get_common_action(string name) {
+ return lookup_action (name);
}
public void set_common_action_sensitive(string name, bool sensitive) {
- Gtk.Action? action = get_common_action(name);
+ var action = get_common_action(name) as GLib.SimpleAction;
if (action != null)
- action.sensitive = sensitive;
+ action.set_enabled (sensitive);
}
public void set_common_action_important(string name, bool important) {
- Gtk.Action? action = get_common_action(name);
+ var action = get_common_action(name) as GLib.SimpleAction;
if (action != null)
- action.is_important = important;
+ action.set_enabled (sensitive);
}
public void set_common_action_visible(string name, bool visible) {
- Gtk.Action? action = get_common_action(name);
+ var action = get_common_action(name) as GLib.SimpleAction;
if (action != null)
- action.visible = visible;
+ action.set_enabled (sensitive);
}
protected override void switched_pages(Page? old_page, Page? new_page) {
@@ -891,6 +782,7 @@ public abstract class AppWindow : PageWindow {
private void decorate_command_manager_action(string name, string prefix,
string default_explanation, CommandDescription? desc) {
+#if 0
Gtk.Action? action = get_common_action(name);
if (action == null)
return;
@@ -904,6 +796,7 @@ public abstract class AppWindow : PageWindow {
action.tooltip = default_explanation;
action.sensitive = false;
}
+#endif
}
public void decorate_undo_action() {
diff --git a/src/Application.vala b/src/Application.vala
index fe3e3e9..21055dd 100644
--- a/src/Application.vala
+++ b/src/Application.vala
@@ -91,6 +91,10 @@ public class Application {
return get_instance().direct;
}
+ public static void set_accels_for_action (string action, string[] accel) {
+ get_instance().system_app.set_accels_for_action (action, accel);
+ }
+
/**
* @brief Signal handler for GApplication's 'command-line' signal.
*
diff --git a/src/CollectionPage.vala b/src/CollectionPage.vala
index 953f9b5..7b871b6 100644
--- a/src/CollectionPage.vala
+++ b/src/CollectionPage.vala
@@ -34,8 +34,8 @@ public abstract class CollectionPage : MediaPage {
get_view().items_altered.connect(on_photos_altered);
- init_item_context_menu("/CollectionContextMenu");
- init_toolbar("/CollectionToolbar");
+ init_item_context_menu("CollectionContextMenu");
+ init_toolbar("CollectionToolbar");
show_all();
@@ -46,7 +46,7 @@ public abstract class CollectionPage : MediaPage {
public override Gtk.Toolbar get_toolbar() {
if (toolbar == null) {
base.get_toolbar();
-
+
// separator to force slider to right side of toolbar
Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
separator.set_expand(true);
@@ -69,66 +69,78 @@ public abstract class CollectionPage : MediaPage {
}
private static InjectionGroup create_file_menu_injectables() {
- InjectionGroup group = new InjectionGroup("/MenuBar/FileMenu/FileExtrasPlaceholder");
+ InjectionGroup group = new InjectionGroup("FileExtrasPlaceholder");
- group.add_menu_item("Print");
+ group.add_menu_item(_("_Print"), "Print", "<Primary>p");
group.add_separator();
- group.add_menu_item("Publish");
- group.add_menu_item("SendTo");
- group.add_menu_item("SetBackground");
+ group.add_menu_item(_("_Publish"), "Publish", "<Primary><Shift>p");
+ group.add_menu_item(_("Send _To…"), "SendTo");
+ group.add_menu_item(_("Set as _Desktop Background"), "SetBackground");
return group;
}
private static InjectionGroup create_edit_menu_injectables() {
- InjectionGroup group = new InjectionGroup("/MenuBar/EditMenu/EditExtrasPlaceholder");
+ InjectionGroup group = new InjectionGroup("EditExtrasPlaceholder");
- group.add_menu_item("Duplicate");
+ group.add_menu_item(_("_Duplicate"), "Duplicate", "<Primary>D");
return group;
}
private static InjectionGroup create_view_menu_fullscreen_injectables() {
- InjectionGroup group = new
InjectionGroup("/MenuBar/ViewMenu/ViewExtrasFullscreenSlideshowPlaceholder");
+ InjectionGroup group = new InjectionGroup("ViewExtrasFullscreenSlideshowPlaceholder");
- group.add_menu_item("Fullscreen", "CommonFullscreen");
+ group.add_menu_item(_("Fullscreen"), "CommonFullscreen", "F11");
group.add_separator();
- group.add_menu_item("Slideshow");
+ group.add_menu_item(_("S_lideshow"), "Slideshow", "F5");
return group;
}
private static InjectionGroup create_photos_menu_edits_injectables() {
- InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasEditsPlaceholder");
-
- group.add_menu_item("RotateClockwise");
- group.add_menu_item("RotateCounterclockwise");
- group.add_menu_item("FlipHorizontally");
- group.add_menu_item("FlipVertically");
+ InjectionGroup group = new InjectionGroup("PhotosExtrasEditsPlaceholder");
+
+ group.add_menu_item(_("Rotate _Right"),
+ "RotateClockwise",
+ "<Primary>r");
+ group.add_menu_item(_("Rotate _Left"),
+ "RotateCounterclockwise",
+ "<Primary><Shift>r");
+ group.add_menu_item(_("Flip Hori_zontally"), "FlipHorizontally");
+ group.add_menu_item(_("Flip Verti_cally"), "FlipVertically");
group.add_separator();
- group.add_menu_item("Enhance");
- group.add_menu_item("Revert");
+ group.add_menu_item(_("_Enhance"), "Enhance");
+ group.add_menu_item(_("Re_vert to Original"), "Revert");
group.add_separator();
- group.add_menu_item("CopyColorAdjustments");
- group.add_menu_item("PasteColorAdjustments");
+ group.add_menu_item(_("_Copy Color Adjustments"),
+ "CopyColorAdjustments",
+ "<Primary><Shift>c");
+ group.add_menu_item(_("_Paste Color Adjustments"),
+ "PasteColorAdjustments",
+ "<Primary><Shift>v");
return group;
}
private static InjectionGroup create_photos_menu_date_injectables() {
- InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasDateTimePlaceholder");
+ InjectionGroup group = new InjectionGroup("PhotosExtrasDateTimePlaceholder");
- group.add_menu_item("AdjustDateTime");
+ group.add_menu_item(_("Adjust Date and Time…"), "AdjustDateTime");
return group;
}
private static InjectionGroup create_photos_menu_externals_injectables() {
- InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasExternalsPlaceholder");
+ InjectionGroup group = new InjectionGroup("PhotosExtrasExternalsPlaceholder");
- group.add_menu_item("ExternalEdit");
- group.add_menu_item("ExternalEditRAW");
- group.add_menu_item("PlayVideo");
+ group.add_menu_item(_("Open With E_xternal Editor"),
+ "ExternalEdit",
+ "<Primary>Return");
+ group.add_menu_item(_("Open With RA_W Editor"),
+ "ExternalEditRAW",
+ "<Primary><Shift>Return");
+ group.add_menu_item(_("_Play"), "PlayVideo", "<Primary>Y");
return group;
}
@@ -138,102 +150,32 @@ public abstract class CollectionPage : MediaPage {
ui_filenames.add("collection.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
- Gtk.ActionEntry print = { "Print", Resources.PRINT_LABEL, TRANSLATABLE, "<Ctrl>P",
- TRANSLATABLE, on_print };
- print.label = Resources.PRINT_MENU;
- actions += print;
-
- Gtk.ActionEntry publish = { "Publish", Resources.PUBLISH, TRANSLATABLE, "<Ctrl><Shift>P",
- TRANSLATABLE, on_publish };
- publish.label = Resources.PUBLISH_MENU;
- publish.tooltip = Resources.PUBLISH_TOOLTIP;
- actions += publish;
-
- Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE,
- TRANSLATABLE, "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
- rotate_right.label = Resources.ROTATE_CW_MENU;
- rotate_right.tooltip = Resources.ROTATE_CW_TOOLTIP;
- actions += rotate_right;
-
- Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
- TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
- rotate_left.label = Resources.ROTATE_CCW_MENU;
- rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
- actions += rotate_left;
-
- Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
- TRANSLATABLE, on_flip_horizontally };
- hflip.label = Resources.HFLIP_MENU;
- actions += hflip;
-
- Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
- TRANSLATABLE, on_flip_vertically };
- vflip.label = Resources.VFLIP_MENU;
- actions += vflip;
-
- Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
- TRANSLATABLE, on_enhance };
- enhance.label = Resources.ENHANCE_MENU;
- enhance.tooltip = Resources.ENHANCE_TOOLTIP;
- actions += enhance;
-
- Gtk.ActionEntry copy_adjustments = { "CopyColorAdjustments", null, TRANSLATABLE,
- "<Ctrl><Shift>C", TRANSLATABLE, on_copy_adjustments};
- copy_adjustments.label = Resources.COPY_ADJUSTMENTS_MENU;
- copy_adjustments.tooltip = Resources.COPY_ADJUSTMENTS_TOOLTIP;
- actions += copy_adjustments;
-
- Gtk.ActionEntry paste_adjustments = { "PasteColorAdjustments", null, TRANSLATABLE,
- "<Ctrl><Shift>V", TRANSLATABLE, on_paste_adjustments};
- paste_adjustments.label = Resources.PASTE_ADJUSTMENTS_MENU;
- paste_adjustments.tooltip = Resources.PASTE_ADJUSTMENTS_TOOLTIP;
- actions += paste_adjustments;
-
- Gtk.ActionEntry revert = { "Revert", null, TRANSLATABLE, null,
- TRANSLATABLE, on_revert };
- revert.label = Resources.REVERT_MENU;
- actions += revert;
-
- Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
- TRANSLATABLE, on_set_background };
- set_background.label = Resources.SET_BACKGROUND_MENU;
- set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
- actions += set_background;
-
- Gtk.ActionEntry duplicate = { "Duplicate", null, TRANSLATABLE, "<Ctrl>D", TRANSLATABLE,
- on_duplicate_photo };
- duplicate.label = Resources.DUPLICATE_PHOTO_MENU;
- duplicate.tooltip = Resources.DUPLICATE_PHOTO_TOOLTIP;
- actions += duplicate;
-
- Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
- TRANSLATABLE, on_adjust_date_time };
- adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
- actions += adjust_date_time;
-
- Gtk.ActionEntry external_edit = { "ExternalEdit", Resources.EDIT_LABEL, TRANSLATABLE, "<Ctrl>Return",
- TRANSLATABLE, on_external_edit };
- external_edit.label = Resources.EXTERNAL_EDIT_MENU;
- actions += external_edit;
-
- Gtk.ActionEntry edit_raw = { "ExternalEditRAW", null, TRANSLATABLE, "<Ctrl><Shift>Return",
- TRANSLATABLE, on_external_edit_raw };
- edit_raw.label = Resources.EXTERNAL_EDIT_RAW_MENU;
- actions += edit_raw;
-
- Gtk.ActionEntry slideshow = { "Slideshow", null, TRANSLATABLE, "F5", TRANSLATABLE,
- on_slideshow };
- slideshow.label = _("S_lideshow");
- slideshow.tooltip = _("Play a slideshow");
- actions += slideshow;
-
- return actions;
+ private const GLib.ActionEntry[] entries = {
+ { "Print", on_print },
+ { "Publish", on_publish },
+ { "RotateClockwise", on_rotate_clockwise },
+ { "RotateCounterclockwise", on_rotate_counterclockwise },
+ { "FlipHorizontally", on_flip_horizontally },
+ { "FlipVertically", on_flip_vertically },
+ { "Enhance", on_enhance },
+ { "CopyColorAdjustments", on_copy_adjustments },
+ { "PasteColorAdjustments", on_paste_adjustments },
+ { "Revert", on_revert },
+ { "SetBackground", on_set_background },
+ { "Duplicate", on_duplicate_photo },
+ { "AdjustDateTime", on_adjust_date_time },
+ { "ExternalEdit", on_external_edit },
+ { "ExternalEditRAW", on_external_edit_raw },
+ { "Slideshow", on_slideshow }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
-
+
protected override InjectionGroup[] init_collect_injection_groups() {
InjectionGroup[] groups = base.init_collect_injection_groups();
@@ -321,12 +263,13 @@ public abstract class CollectionPage : MediaPage {
set_action_sensitive("SetBackground", (!selection_has_videos) && has_selected );
if (has_selected) {
- Gtk.Action? set_background = get_action("SetBackground");
+ debug ("Setting action label for SetBackground...");
+/* Gtk.Action? set_background = get_action("SetBackground");
if (set_background != null) {
set_background.label = one_selected
? Resources.SET_BACKGROUND_MENU
: Resources.SET_BACKGROUND_SLIDESHOW_MENU;
- }
+ } */
}
}
@@ -745,20 +688,24 @@ public abstract class CollectionPage : MediaPage {
}
protected override bool on_ctrl_pressed(Gdk.EventKey? event) {
- Gtk.ToolButton? rotate_button = ui.get_widget("/CollectionToolbar/ToolRotate")
- as Gtk.ToolButton;
- if (rotate_button != null)
- rotate_button.set_related_action(get_action("RotateCounterclockwise"));
-
+ Gtk.ToolButton? rotate_button = this.builder.get_object ("ToolRotate") as Gtk.ToolButton;
+ if (rotate_button != null) {
+ rotate_button.set_action_name ("win.RotateCounterclockwise");
+ rotate_button.set_icon_name ("object-rotate-left");
+ rotate_button.set_tooltip_text (Resources.ROTATE_CCW_TOOLTIP);
+ }
+
return base.on_ctrl_pressed(event);
}
protected override bool on_ctrl_released(Gdk.EventKey? event) {
- Gtk.ToolButton? rotate_button = ui.get_widget("/CollectionToolbar/ToolRotate")
- as Gtk.ToolButton;
- if (rotate_button != null)
- rotate_button.set_related_action(get_action("RotateClockwise"));
-
+ Gtk.ToolButton? rotate_button = this.builder.get_object ("ToolRotate") as Gtk.ToolButton;
+ if (rotate_button != null) {
+ rotate_button.set_action_name ("win.RotateClockwise");
+ rotate_button.set_icon_name ("object-rotate-right");
+ rotate_button.set_tooltip_text (Resources.ROTATE_CW_TOOLTIP);
+ }
+
return base.on_ctrl_released(event);
}
diff --git a/src/MediaPage.vala b/src/MediaPage.vala
index 89aa2fc..c9b23b8 100644
--- a/src/MediaPage.vala
+++ b/src/MediaPage.vala
@@ -282,250 +282,62 @@ public abstract class MediaPage : CheckerboardPage {
ui_filenames.add("media.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry export = { "Export", Resources.SAVE_AS_LABEL, TRANSLATABLE, "<Ctrl><Shift>E",
- TRANSLATABLE, on_export };
- export.label = Resources.EXPORT_MENU;
- actions += export;
-
- Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
- TRANSLATABLE, on_send_to };
- send_to.label = Resources.SEND_TO_MENU;
- actions += send_to;
-
- // This is identical to the above action, except that it has different
- // mnemonics and is _only_ for use in the context menu.
- Gtk.ActionEntry send_to_context_menu = { "SendToContextMenu", "document-send", TRANSLATABLE, null,
- TRANSLATABLE, on_send_to };
- send_to_context_menu.label = Resources.SEND_TO_CONTEXT_MENU;
- actions += send_to_context_menu;
-
- Gtk.ActionEntry remove_from_library = { "RemoveFromLibrary", Resources.REMOVE_LABEL, TRANSLATABLE,
- "<Shift>Delete", TRANSLATABLE, on_remove_from_library };
- remove_from_library.label = Resources.REMOVE_FROM_LIBRARY_MENU;
- actions += remove_from_library;
-
- Gtk.ActionEntry move_to_trash = { "MoveToTrash", "user-trash-full", TRANSLATABLE, "Delete",
- TRANSLATABLE, on_move_to_trash };
- move_to_trash.label = Resources.MOVE_TO_TRASH_MENU;
- actions += move_to_trash;
-
- Gtk.ActionEntry new_event = { "NewEvent", Resources.NEW_LABEL, TRANSLATABLE, "<Ctrl>N",
- TRANSLATABLE, on_new_event };
- new_event.label = Resources.NEW_EVENT_MENU;
- actions += new_event;
-
- Gtk.ActionEntry add_tags = { "AddTags", null, TRANSLATABLE, "<Ctrl>T", TRANSLATABLE,
- on_add_tags };
- add_tags.label = Resources.ADD_TAGS_MENU;
- actions += add_tags;
-
- // This is identical to the above action, except that it has different
- // mnemonics and is _only_ for use in the context menu.
- Gtk.ActionEntry add_tags_context_menu = { "AddTagsContextMenu", null, TRANSLATABLE, "<Ctrl>A",
TRANSLATABLE,
- on_add_tags };
- add_tags_context_menu.label = Resources.ADD_TAGS_CONTEXT_MENU;
- actions += add_tags_context_menu;
-
- Gtk.ActionEntry modify_tags = { "ModifyTags", null, TRANSLATABLE, "<Ctrl>M", TRANSLATABLE,
- on_modify_tags };
- modify_tags.label = Resources.MODIFY_TAGS_MENU;
- actions += modify_tags;
-
- Gtk.ActionEntry increase_size = { "IncreaseSize", Resources.ZOOM_IN_LABEL, TRANSLATABLE,
- "<Ctrl>plus", TRANSLATABLE, on_increase_size };
- increase_size.label = _("Zoom _In");
- increase_size.tooltip = _("Increase the magnification of the thumbnails");
- actions += increase_size;
-
- Gtk.ActionEntry decrease_size = { "DecreaseSize", Resources.ZOOM_OUT_LABEL, TRANSLATABLE,
- "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
- decrease_size.label = _("Zoom _Out");
- decrease_size.tooltip = _("Decrease the magnification of the thumbnails");
- actions += decrease_size;
-
- Gtk.ActionEntry flag = { "Flag", null, TRANSLATABLE, "<Ctrl>G", TRANSLATABLE, on_flag_unflag };
- flag.label = Resources.FLAG_MENU;
- actions += flag;
-
- Gtk.ActionEntry set_rating = { "Rate", null, TRANSLATABLE, null, null, null };
- set_rating.label = Resources.RATING_MENU;
- actions += set_rating;
-
- Gtk.ActionEntry increase_rating = { "IncreaseRating", null, TRANSLATABLE,
- "greater", TRANSLATABLE, on_increase_rating };
- increase_rating.label = Resources.INCREASE_RATING_MENU;
- actions += increase_rating;
-
- Gtk.ActionEntry decrease_rating = { "DecreaseRating", null, TRANSLATABLE,
- "less", TRANSLATABLE, on_decrease_rating };
- decrease_rating.label = Resources.DECREASE_RATING_MENU;
- actions += decrease_rating;
-
- Gtk.ActionEntry rate_rejected = { "RateRejected", null, TRANSLATABLE,
- "9", TRANSLATABLE, on_rate_rejected };
- rate_rejected.label = Resources.rating_menu(Rating.REJECTED);
- actions += rate_rejected;
-
- Gtk.ActionEntry rate_unrated = { "RateUnrated", null, TRANSLATABLE,
- "0", TRANSLATABLE, on_rate_unrated };
- rate_unrated.label = Resources.rating_menu(Rating.UNRATED);
- actions += rate_unrated;
-
- Gtk.ActionEntry rate_one = { "RateOne", null, TRANSLATABLE,
- "1", TRANSLATABLE, on_rate_one };
- rate_one.label = Resources.rating_menu(Rating.ONE);
- actions += rate_one;
-
- Gtk.ActionEntry rate_two = { "RateTwo", null, TRANSLATABLE,
- "2", TRANSLATABLE, on_rate_two };
- rate_two.label = Resources.rating_menu(Rating.TWO);
- actions += rate_two;
-
- Gtk.ActionEntry rate_three = { "RateThree", null, TRANSLATABLE,
- "3", TRANSLATABLE, on_rate_three };
- rate_three.label = Resources.rating_menu(Rating.THREE);
- actions += rate_three;
-
- Gtk.ActionEntry rate_four = { "RateFour", null, TRANSLATABLE,
- "4", TRANSLATABLE, on_rate_four };
- rate_four.label = Resources.rating_menu(Rating.FOUR);
- actions += rate_four;
-
- Gtk.ActionEntry rate_five = { "RateFive", null, TRANSLATABLE,
- "5", TRANSLATABLE, on_rate_five };
- rate_five.label = Resources.rating_menu(Rating.FIVE);
- actions += rate_five;
-
- Gtk.ActionEntry edit_title = { "EditTitle", null, TRANSLATABLE, "F2", TRANSLATABLE,
- on_edit_title };
- edit_title.label = Resources.EDIT_TITLE_MENU;
- actions += edit_title;
-
- Gtk.ActionEntry edit_comment = { "EditComment", null, TRANSLATABLE, "F3", TRANSLATABLE,
- on_edit_comment };
- edit_comment.label = Resources.EDIT_COMMENT_MENU;
- actions += edit_comment;
-
- Gtk.ActionEntry sort_photos = { "SortPhotos", null, TRANSLATABLE, null, null, null };
- sort_photos.label = _("Sort _Photos");
- actions += sort_photos;
-
- Gtk.ActionEntry filter_photos = { "FilterPhotos", null, TRANSLATABLE, null, null, null };
- filter_photos.label = Resources.FILTER_PHOTOS_MENU;
- actions += filter_photos;
-
- Gtk.ActionEntry play = { "PlayVideo", Resources.PLAY_LABEL, TRANSLATABLE, "<Ctrl>Y",
- TRANSLATABLE, on_play_video };
- play.label = _("_Play Video");
- play.tooltip = _("Open the selected videos in the system video player");
- actions += play;
-
- Gtk.ActionEntry raw_developer = { "RawDeveloper", null, TRANSLATABLE, null, null, null };
- raw_developer.label = _("_Developer");
- actions += raw_developer;
-
- // RAW developers.
-
- Gtk.ActionEntry dev_shotwell = { "RawDeveloperShotwell", null, TRANSLATABLE, null, TRANSLATABLE,
- on_raw_developer_shotwell };
- dev_shotwell.label = _("Shotwell");
- actions += dev_shotwell;
-
- Gtk.ActionEntry dev_camera = { "RawDeveloperCamera", null, TRANSLATABLE, null, TRANSLATABLE,
- on_raw_developer_camera };
- dev_camera.label = _("Camera");
- actions += dev_camera;
- return actions;
- }
-
- protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
- Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
-
- Gtk.ToggleActionEntry titles = { "ViewTitle", null, TRANSLATABLE, "<Ctrl><Shift>T",
- TRANSLATABLE, on_display_titles, Config.Facade.get_instance().get_display_photo_titles() };
- titles.label = _("_Titles");
- titles.tooltip = _("Display the title of each photo");
- toggle_actions += titles;
-
- Gtk.ToggleActionEntry comments = { "ViewComment", null, TRANSLATABLE, "<Ctrl><Shift>C",
- TRANSLATABLE, on_display_comments, Config.Facade.get_instance().get_display_photo_comments() };
- comments.label = _("_Comments");
- comments.tooltip = _("Display the comment of each photo");
- toggle_actions += comments;
-
- Gtk.ToggleActionEntry ratings = { "ViewRatings", null, TRANSLATABLE, "<Ctrl><Shift>N",
- TRANSLATABLE, on_display_ratings, Config.Facade.get_instance().get_display_photo_ratings() };
- ratings.label = Resources.VIEW_RATINGS_MENU;
- ratings.tooltip = Resources.VIEW_RATINGS_TOOLTIP;
- toggle_actions += ratings;
-
- Gtk.ToggleActionEntry tags = { "ViewTags", null, TRANSLATABLE, "<Ctrl><Shift>G",
- TRANSLATABLE, on_display_tags, Config.Facade.get_instance().get_display_photo_tags() };
- tags.label = _("Ta_gs");
- tags.tooltip = _("Display each photo’s tags");
- toggle_actions += tags;
-
- return toggle_actions;
- }
-
- protected override void register_radio_actions(Gtk.ActionGroup action_group) {
+ private const GLib.ActionEntry[] entries = {
+ { "Export", on_export },
+ { "SendTo", on_send_to },
+ { "SendToContextMenu", on_send_to },
+ { "RemoveFromLibrary", on_remove_from_library },
+ { "MoveToTrash", on_move_to_trash },
+ { "NewEvent", on_new_event },
+ { "AddTags", on_add_tags },
+ { "AddTagsContextMenu", on_add_tags },
+ { "ModifyTags", on_modify_tags },
+ { "IncreaseSize", on_increase_size },
+ { "DecreaseSize", on_decrease_size },
+ { "Flag", on_flag_unflag },
+ { "IncreaseRating", on_increase_rating },
+ { "DecreaseRating", on_decrease_rating },
+ { "RateRejected", on_rate_rejected },
+ { "RateUnrated", on_rate_unrated },
+ { "RateOne", on_rate_one },
+ { "RateTwo", on_rate_two },
+ { "RateThree", on_rate_three },
+ { "RateFour", on_rate_four },
+ { "RateFive", on_rate_five },
+ { "EditTitle", on_edit_title },
+ { "EditComment", on_edit_comment },
+ { "PlayVideo", on_play_video },
+
+ // Toggle actions
+ { "ViewTitle", on_action_toggle, null, "false", on_display_titles },
+ { "ViewComment", on_action_toggle, null, "false", on_display_comments },
+ { "ViewRatings", on_action_toggle, null, "false", on_display_ratings },
+ { "ViewTags", on_action_toggle, null, "false", on_display_tags },
+
+ // Radio actions
+ { "SortBy", on_action_radio, "s", "'1'", on_sort_changed },
+ { "Sort", on_action_radio, "s", "'ascending'", on_sort_changed },
+ { "RawDeveloper", on_action_radio, "s", "'Shotwell'", on_raw_developer_changed }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
bool sort_order;
int sort_by;
get_config_photos_sort(out sort_order, out sort_by);
-
- // Sort criteria.
- Gtk.RadioActionEntry[] sort_crit_actions = new Gtk.RadioActionEntry[0];
-
- Gtk.RadioActionEntry by_title = { "SortByTitle", null, TRANSLATABLE, null, TRANSLATABLE,
- SortBy.TITLE };
- by_title.label = _("By _Title");
- by_title.tooltip = _("Sort photos by title");
- sort_crit_actions += by_title;
-
- Gtk.RadioActionEntry by_date = { "SortByExposureDate", null, TRANSLATABLE, null,
- TRANSLATABLE, SortBy.EXPOSURE_DATE };
- by_date.label = _("By Exposure _Date");
- by_date.tooltip = _("Sort photos by exposure date");
- sort_crit_actions += by_date;
-
- Gtk.RadioActionEntry by_rating = { "SortByRating", null, TRANSLATABLE, null,
- TRANSLATABLE, SortBy.RATING };
- by_rating.label = _("By _Rating");
- by_rating.tooltip = _("Sort photos by rating");
- sort_crit_actions += by_rating;
-
- Gtk.RadioActionEntry by_filename = { "SortByFilename", null, TRANSLATABLE, null,
- TRANSLATABLE, SortBy.FILENAME };
- by_filename.label = _("By _Filename");
- by_filename.tooltip = _("Sort photos by filename");
- sort_crit_actions += by_filename;
- action_group.add_radio_actions(sort_crit_actions, sort_by, on_sort_changed);
-
- // Sort order.
- Gtk.RadioActionEntry[] sort_order_actions = new Gtk.RadioActionEntry[0];
-
- Gtk.RadioActionEntry ascending = { "SortAscending", Resources.SORT_ASCENDING_LABEL,
- TRANSLATABLE, null, TRANSLATABLE, SORT_ORDER_ASCENDING };
- ascending.label = _("_Ascending");
- ascending.tooltip = _("Sort photos in an ascending order");
- sort_order_actions += ascending;
-
- Gtk.RadioActionEntry descending = { "SortDescending", Resources.SORT_DESCENDING_LABEL,
- TRANSLATABLE, null, TRANSLATABLE, SORT_ORDER_DESCENDING };
- descending.label = _("D_escending");
- descending.tooltip = _("Sort photos in a descending order");
- sort_order_actions += descending;
-
- action_group.add_radio_actions(sort_order_actions,
- sort_order ? SORT_ORDER_ASCENDING : SORT_ORDER_DESCENDING, on_sort_changed);
-
- base.register_radio_actions(action_group);
+ AppWindow.get_instance ().add_action_entries (entries, this);
+ (get_action ("ViewTitle") as GLib.SimpleAction).set_state (Config.Facade.get_instance
().get_display_photo_titles ());
+ (get_action ("ViewComment") as GLib.SimpleAction).set_state (Config.Facade.get_instance
().get_display_photo_comments ());
+ (get_action ("ViewRatings") as GLib.SimpleAction).set_state (Config.Facade.get_instance
().get_display_photo_ratings ());
+ (get_action ("ViewTags") as GLib.SimpleAction).set_state (Config.Facade.get_instance
().get_display_photo_tags ());
+ (get_action ("SortBy") as GLib.SimpleAction).set_state ("%d".printf (sort_by));
+ (get_action ("Sort") as GLib.SimpleAction).set_state (sort_order ? "'ascending'" : "'descending'");
+ var d = Config.Facade.get_instance().get_default_raw_developer();
+ var action = get_action ("RawDeveloper") as GLib.SimpleAction;
+ action.set_state (d == RawDeveloper.SHOTWELL ? "'Shotwell'" : "'Camera'");
}
protected override void update_actions(int selected_count, int count) {
@@ -584,76 +396,34 @@ public abstract class MediaPage : CheckerboardPage {
}
// Collect some stats about what's selected.
- bool avail_shotwell = false; // True if Shotwell developer is available.
- bool avail_camera = false; // True if camera developer is available.
bool is_raw = false; // True if any RAW photos are selected
foreach (DataView view in get_view().get_selected()) {
Photo? photo = ((Thumbnail) view).get_media_source() as Photo;
if (photo != null && photo.get_master_file_format() == PhotoFileFormat.RAW) {
is_raw = true;
-
- if (!avail_shotwell && photo.is_raw_developer_available(RawDeveloper.SHOTWELL))
- avail_shotwell = true;
-
- if (!avail_camera && (photo.is_raw_developer_available(RawDeveloper.CAMERA) ||
- photo.is_raw_developer_available(RawDeveloper.EMBEDDED)))
- avail_camera = true;
-
- if (avail_shotwell && avail_camera)
- break; // optimization: break out of loop when all options available
-
+
+ break;
}
}
// Enable/disable menu.
set_action_sensitive("RawDeveloper", is_raw);
-
- if (is_raw) {
- // Set which developers are available.
- set_action_sensitive("RawDeveloperShotwell", avail_shotwell);
- set_action_sensitive("RawDeveloperCamera", avail_camera);
- }
}
private void update_flag_action(int selected_count) {
set_action_sensitive("Flag", selected_count > 0);
-
- string flag_label = Resources.FLAG_MENU;
-
- if (selected_count > 0) {
- bool all_flagged = true;
- foreach (DataSource source in get_view().get_selected_sources()) {
- Flaggable? flaggable = source as Flaggable;
- if (flaggable != null && !flaggable.is_flagged()) {
- all_flagged = false;
-
- break;
- }
- }
-
- if (all_flagged) {
- flag_label = Resources.UNFLAG_MENU;
- }
- }
-
- Gtk.Action? flag_action = get_action("Flag");
- if (flag_action != null) {
- flag_action.label = flag_label;
- }
}
public override Core.ViewTracker? get_view_tracker() {
return tracker;
}
-
+
public void set_display_ratings(bool display) {
get_view().freeze_notifications();
get_view().set_property(Thumbnail.PROP_SHOW_RATINGS, display);
get_view().thaw_notifications();
-
- Gtk.ToggleAction? action = get_action("ViewRatings") as Gtk.ToggleAction;
- if (action != null)
- action.set_active(display);
+
+ this.set_action_active ("ViewRatings", display);
}
private bool can_rate_selected(Rating rating) {
@@ -937,10 +707,8 @@ public abstract class MediaPage : CheckerboardPage {
get_view().freeze_notifications();
get_view().set_property(Thumbnail.PROP_SHOW_TAGS, display);
get_view().thaw_notifications();
-
- Gtk.ToggleAction? action = get_action("ViewTags") as Gtk.ToggleAction;
- if (action != null)
- action.set_active(display);
+
+ this.set_action_active ("ViewTags", display);
}
private void on_new_event() {
@@ -1072,58 +840,84 @@ public abstract class MediaPage : CheckerboardPage {
get_command_manager().execute(new EditMultipleCommentsCommand(media_sources, new_comment));
}
- protected virtual void on_display_titles(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ protected virtual void on_display_titles(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
set_display_titles(display);
Config.Facade.get_instance().set_display_photo_titles(display);
+ action.set_state (value);
}
- protected virtual void on_display_comments(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ protected virtual void on_display_comments(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
set_display_comments(display);
Config.Facade.get_instance().set_display_photo_comments(display);
+ action.set_state (value);
}
- protected virtual void on_display_ratings(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ protected virtual void on_display_ratings(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
set_display_ratings(display);
Config.Facade.get_instance().set_display_photo_ratings(display);
+ action.set_state (value);
}
- protected virtual void on_display_tags(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ protected virtual void on_display_tags(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
set_display_tags(display);
Config.Facade.get_instance().set_display_photo_tags(display);
+ action.set_state (value);
}
protected abstract void get_config_photos_sort(out bool sort_order, out int sort_by);
protected abstract void set_config_photos_sort(bool sort_order, int sort_by);
- public virtual void on_sort_changed() {
+ public virtual void on_sort_changed(GLib.SimpleAction action, Variant? value) {
int sort_by = get_menu_sort_by();
bool sort_order = get_menu_sort_order();
set_view_comparator(sort_by, sort_order);
set_config_photos_sort(sort_order, sort_by);
+
+ action.set_state (value);
}
- public void on_raw_developer_shotwell(Gtk.Action action) {
+ public void on_raw_developer_shotwell() {
developer_changed(RawDeveloper.SHOTWELL);
}
- public void on_raw_developer_camera(Gtk.Action action) {
+ public void on_raw_developer_camera() {
developer_changed(RawDeveloper.CAMERA);
}
-
+
+ private void on_raw_developer_changed(GLib.SimpleAction action,
+ Variant? value) {
+ RawDeveloper developer = RawDeveloper.SHOTWELL;
+
+ switch (value.get_string ()) {
+ case "Shotwell":
+ developer = RawDeveloper.SHOTWELL;
+ break;
+ case "Camera":
+ developer = RawDeveloper.CAMERA;
+ break;
+ default:
+ break;
+ }
+
+ developer_changed(developer);
+
+ action.set_state (value);
+ }
+
protected virtual void developer_changed(RawDeveloper rd) {
if (get_view().get_selected_count() == 0)
return;
@@ -1156,49 +950,46 @@ public abstract class MediaPage : CheckerboardPage {
protected override void set_display_titles(bool display) {
base.set_display_titles(display);
-
- Gtk.ToggleAction? action = get_action("ViewTitle") as Gtk.ToggleAction;
- if (action != null)
- action.set_active(display);
+
+ this.set_action_active ("ViewTitle", display);
}
protected override void set_display_comments(bool display) {
base.set_display_comments(display);
- Gtk.ToggleAction? action = get_action("ViewComment") as Gtk.ToggleAction;
- if (action != null)
- action.set_active(display);
+ this.set_action_active ("ViewComment", display);
}
- private Gtk.RadioAction sort_by_title_action() {
- Gtk.RadioAction action = (Gtk.RadioAction) get_action("SortByTitle");
+ private GLib.Action sort_by_title_action() {
+ var action = get_action ("SortBy");
assert(action != null);
return action;
}
- private Gtk.RadioAction sort_ascending_action() {
- Gtk.RadioAction action = (Gtk.RadioAction) get_action("SortAscending");
+ private GLib.Action sort_ascending_action() {
+ var action = get_action ("Sort");
assert(action != null);
return action;
}
protected int get_menu_sort_by() {
// any member of the group knows the current value
- return sort_by_title_action().get_current_value();
+ return int.parse (sort_by_title_action().get_state().get_string ());
}
protected void set_menu_sort_by(int val) {
- sort_by_title_action().set_current_value(val);
+ var sort = "%d".printf (val);
+ (sort_by_title_action() as GLib.SimpleAction).set_state (sort);
}
protected bool get_menu_sort_order() {
// any member of the group knows the current value
- return sort_ascending_action().get_current_value() == SORT_ORDER_ASCENDING;
+ return sort_ascending_action().get_state ().get_string () == "ascending";
}
protected void set_menu_sort_order(bool ascending) {
- sort_ascending_action().set_current_value(
- ascending ? SORT_ORDER_ASCENDING : SORT_ORDER_DESCENDING);
+ (sort_ascending_action() as GLib.SimpleAction).set_state (
+ ascending ? "'ascending'" : "'descending'");
}
void set_view_comparator(int sort_by, bool ascending) {
@@ -1244,26 +1035,6 @@ public abstract class MediaPage : CheckerboardPage {
get_view().set_comparator(comparator, predicate);
}
- protected string get_sortby_path(int sort_by) {
- switch(sort_by) {
- case SortBy.TITLE:
- return "/MenuBar/ViewMenu/SortPhotos/SortByTitle";
-
- case SortBy.EXPOSURE_DATE:
- return "/MenuBar/ViewMenu/SortPhotos/SortByExposureDate";
-
- case SortBy.RATING:
- return "/MenuBar/ViewMenu/SortPhotos/SortByRating";
-
- case SortBy.FILENAME:
- return "/MenuBar/ViewMenu/SortPhotos/SortByFilename";
-
- default:
- debug("Unknown sort criteria: %d", sort_by);
- return "/MenuBar/ViewMenu/SortPhotos/SortByTitle";
- }
- }
-
protected void sync_sort() {
// It used to be that the config and UI could both agree on what
// sort order and criteria were selected, but the sorting wouldn't
diff --git a/src/Page.vala b/src/Page.vala
index 4877a47..e02028b 100644
--- a/src/Page.vala
+++ b/src/Page.vala
@@ -6,50 +6,60 @@
public class InjectionGroup {
public class Element {
+ public enum ItemType {
+ MENUITEM,
+ MENU,
+ SEPARATOR
+ }
public string name;
public string action;
- public Gtk.UIManagerItemType kind;
-
- public Element(string name, string? action, Gtk.UIManagerItemType kind) {
+ public string? accellerator;
+ public ItemType kind;
+
+ public Element(string name, string? action, string? accellerator, ItemType kind) {
this.name = name;
this.action = action != null ? action : name;
+ this.accellerator = accellerator;
this.kind = kind;
}
}
-
+
private string path;
private Gee.ArrayList<Element?> elements = new Gee.ArrayList<Element?>();
private int separator_id = 0;
-
+
public InjectionGroup(string path) {
this.path = path;
}
-
+
public string get_path() {
return path;
}
-
+
public Gee.List<Element?> get_elements() {
return elements;
}
-
- public void add_menu_item(string name, string? action = null) {
- elements.add(new Element(name, action, Gtk.UIManagerItemType.MENUITEM));
+
+ public void add_menu_item(string name, string? action = null, string?
+ accellerator = null) {
+ elements.add(new Element(name, action, accellerator, Element.ItemType.MENUITEM));
}
-
+
public void add_menu(string name, string? action = null) {
- elements.add(new Element(name, action, Gtk.UIManagerItemType.MENU));
+ elements.add(new Element(name, action, null, Element.ItemType.MENU));
}
-
+
public void add_separator() {
- elements.add(new Element("%d-separator".printf(separator_id++), null,
Gtk.UIManagerItemType.SEPARATOR));
+ elements.add(new Element("%d-separator".printf(separator_id++), null,
+ null,
+ Element.ItemType.SEPARATOR));
}
}
public abstract class Page : Gtk.ScrolledWindow {
private const int CONSIDER_CONFIGURE_HALTED_MSEC = 400;
- protected Gtk.UIManager ui;
+ protected Gtk.Builder builder = new Gtk.Builder ();
protected Gtk.Toolbar toolbar;
protected bool in_view = false;
@@ -76,10 +86,6 @@ public abstract class Page : Gtk.ScrolledWindow {
private int cursor_hide_time_cached = 0;
private bool are_actions_attached = false;
private OneShotScheduler? update_actions_scheduler = null;
- private Gtk.ActionGroup? action_group = null;
- private Gtk.ActionGroup[]? common_action_groups = null;
-
- private uint[] merge_ids = new uint[0];
protected Page(string page_name) {
this.page_name = page_name;
@@ -155,7 +161,6 @@ public abstract class Page : Gtk.ScrolledWindow {
assert(this.container == null);
this.container = container;
- ui = ((PageWindow) container).get_ui_manager();
}
public virtual void clear_container() {
@@ -199,22 +204,59 @@ public abstract class Page : Gtk.ScrolledWindow {
public Gtk.Widget? get_event_source() {
return event_source;
}
-
- public virtual Gtk.MenuBar get_menubar() {
- Gtk.MenuBar? menubar = ui.get_widget("/MenuBar") as Gtk.MenuBar;
- assert(menubar != null);
-
- return menubar;
- }
- public virtual unowned Gtk.Widget get_page_ui_widget(string path) {
- return ui.get_widget(path);
+ private Gtk.MenuBar menubar;
+
+ public Gtk.MenuBar get_menubar() {
+ if (this.menubar == null) {
+ var model = builder.get_object ("MenuBar") as GLib.Menu;
+
+ // Collect injected UI elements and add them to the UI manager
+ InjectionGroup[] injection_groups = init_collect_injection_groups();
+ foreach (InjectionGroup group in injection_groups) {
+ var items = model.get_n_items ();
+ for (int i = 0; i < items; i++) {
+ var submenu = model.get_item_link (i, GLib.Menu.LINK_SUBMENU);
+
+ var section = this.find_extension_point (submenu,
+ group.get_path ());
+
+ if (section == null) {
+ continue;
+ }
+
+ foreach (var element in group.get_elements ()) {
+ var menu = section as GLib.Menu;
+ switch (element.kind) {
+ case InjectionGroup.Element.ItemType.MENUITEM:
+ var item = new GLib.MenuItem (element.name,
+ "win." + element.action);
+ if (element.accellerator != null) {
+ item.set_attribute ("accel",
+ "s",
+ element.accellerator);
+ }
+
+ menu.append_item (item);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ this.menubar = new Gtk.MenuBar.from_model (model);
+ }
+
+ return this.menubar;
}
public virtual Gtk.Toolbar get_toolbar() {
if (toolbar == null) {
toolbar = toolbar_path == null ? new Gtk.Toolbar() :
- ui.get_widget(toolbar_path) as Gtk.Toolbar;
+ builder.get_object (toolbar_path)
+ as Gtk.Toolbar;
toolbar.get_style_context().add_class("bottom-toolbar"); // for elementary theme
toolbar.set_icon_size(Gtk.IconSize.SMALL_TOOLBAR);
}
@@ -227,7 +269,6 @@ public abstract class Page : Gtk.ScrolledWindow {
public virtual void switching_from() {
in_view = false;
- remove_ui();
if (toolbar_path != null)
toolbar = null;
}
@@ -250,77 +291,59 @@ public abstract class Page : Gtk.ScrolledWindow {
public virtual void returning_from_fullscreen(FullscreenWindow fsw) {
}
-
- public Gtk.Action? get_action(string name) {
- if (action_group == null)
- return null;
-
- Gtk.Action? action = action_group.get_action(name);
- if (action == null)
- action = get_common_action(name, false);
-
- if (action == null)
- warning("Page %s: Unable to locate action %s", get_page_name(), name);
-
- return action;
+
+ public GLib.Action? get_action (string name) {
+ var aw = AppWindow.get_instance ();
+
+ if (aw != null) {
+ return aw.lookup_action (name);
+ }
+
+ return null;
}
public void set_action_sensitive(string name, bool sensitive) {
- Gtk.Action? action = get_action(name);
+ GLib.SimpleAction? action = get_action(name) as GLib.SimpleAction;
if (action != null)
- action.sensitive = sensitive;
+ action.set_enabled (sensitive);
}
public void set_action_important(string name, bool important) {
- Gtk.Action? action = get_action(name);
- if (action != null)
- action.is_important = important;
+ set_action_sensitive (name, important);
}
public void set_action_visible(string name, bool visible) {
- Gtk.Action? action = get_action(name);
- if (action == null)
- return;
-
- action.visible = visible;
- action.sensitive = visible;
+ set_action_sensitive (name, visible);
}
public void set_action_short_label(string name, string short_label) {
- Gtk.Action? action = get_action(name);
- if (action != null)
- action.short_label = short_label;
+ debug ("=> Set action short_label called for %s", name);
}
public void set_action_details(string name, string? label, string? tooltip, bool sensitive) {
- Gtk.Action? action = get_action(name);
+ GLib.SimpleAction? action = get_action(name) as GLib.SimpleAction;
+
if (action == null)
return;
-
+
if (label != null)
- action.label = label;
-
- if (tooltip != null)
- action.tooltip = tooltip;
-
- action.sensitive = sensitive;
+ this.update_menu_item_label (name, label);
+
+ action.set_enabled (sensitive);
}
public void activate_action(string name) {
- Gtk.Action? action = get_action(name);
+ var action = get_action(name);
+
if (action != null)
- action.activate();
+ action.activate (null);
}
- public Gtk.Action? get_common_action(string name, bool log_warning = true) {
- if (common_action_groups == null)
- return null;
-
- foreach (Gtk.ActionGroup group in common_action_groups) {
- Gtk.Action? action = group.get_action(name);
- if (action != null)
- return action;
- }
+ public GLib.Action? get_common_action(string name, bool log_warning = true) {
+ var action = get_action (name);
+
+ if (action != null)
+ return action;
if (log_warning)
warning("Page %s: Unable to locate common action %s", get_page_name(), name);
@@ -329,27 +352,23 @@ public abstract class Page : Gtk.ScrolledWindow {
}
public void set_common_action_sensitive(string name, bool sensitive) {
- Gtk.Action? action = get_common_action(name);
+ var action = get_common_action(name) as GLib.SimpleAction;
if (action != null)
- action.sensitive = sensitive;
+ action.set_enabled (sensitive);
}
public void set_common_action_label(string name, string label) {
- Gtk.Action? action = get_common_action(name);
- if (action != null)
- action.set_label(label);
+ debug ("Trying to set common action label for %s", name);
}
public void set_common_action_important(string name, bool important) {
- Gtk.Action? action = get_common_action(name);
- if (action != null)
- action.is_important = important;
+ debug ("Setting action to important: %s", name);
}
public void activate_common_action(string name) {
- Gtk.Action? action = get_common_action(name);
+ var action = get_common_action(name) as GLib.SimpleAction;
if (action != null)
- action.activate();
+ action.activate(null);
}
public bool get_ctrl_pressed() {
@@ -367,7 +386,14 @@ public abstract class Page : Gtk.ScrolledWindow {
public bool get_super_pressed() {
return super_pressed;
}
-
+
+ protected void set_action_active (string name, bool active) {
+ var action = get_action (name) as GLib.SimpleAction;
+ if (action != null) {
+ action.set_state (active);
+ }
+ }
+
private bool get_modifiers(out bool ctrl, out bool alt, out bool shift, out bool super) {
if (AppWindow.get_instance().get_window() == null) {
ctrl = false;
@@ -440,27 +466,20 @@ public abstract class Page : Gtk.ScrolledWindow {
public CommandManager get_command_manager() {
return AppWindow.get_command_manager();
}
-
+
+ protected virtual void add_actions () { }
+
+ protected void on_action_toggle (GLib.Action action, Variant? value) {
+ Variant new_state = ! (bool) action.get_state ();
+ action.change_state (new_state);
+ }
+
+ protected void on_action_radio (GLib.Action action, Variant? value) {
+ action.change_state (value);
+ }
+
private void init_ui() {
- action_group = new Gtk.ActionGroup("PageActionGroup");
-
- // Collect all Gtk.Actions and add them to the Page's Gtk.ActionGroup
- Gtk.ActionEntry[] action_entries = init_collect_action_entries();
- if (action_entries.length > 0)
- action_group.add_actions(action_entries, this);
-
- // Collect all Gtk.ToggleActionEntries and add them to the Gtk.ActionGroup
- Gtk.ToggleActionEntry[] toggle_entries = init_collect_toggle_action_entries();
- if (toggle_entries.length > 0)
- action_group.add_toggle_actions(toggle_entries, this);
-
- // Collect all Gtk.RadioActionEntries and add them to the Gtk.ActionGroup
- // (Would use a similar collection scheme as the other calls, but there is a binding
- // problem with Gtk.RadioActionCallback that doesn't allow it to be stored in a struct)
- register_radio_actions(action_group);
-
- // Get global (common) action groups from the application window
- common_action_groups = AppWindow.get_instance().get_common_action_groups();
+ add_actions ();
}
private void add_ui() {
@@ -472,34 +491,10 @@ public abstract class Page : Gtk.ScrolledWindow {
foreach (string ui_filename in ui_filenames)
init_load_ui(ui_filename);
-
- ui.insert_action_group(action_group, 0);
-
- // Collect injected UI elements and add them to the UI manager
- InjectionGroup[] injection_groups = init_collect_injection_groups();
- foreach (InjectionGroup group in injection_groups) {
- foreach (InjectionGroup.Element element in group.get_elements()) {
- uint merge_id = ui.new_merge_id();
- ui.add_ui(merge_id, group.get_path(), element.name, element.action,
- element.kind, false);
- merge_ids += merge_id;
- }
- }
-
- AppWindow.get_instance().replace_common_placeholders(ui);
-
- ui.ensure_update();
- }
-
- private void remove_ui() {
- for (int i = merge_ids.length - 1 ; i >= 0 ; --i)
- ui.remove_ui(merge_ids[i]);
- ui.remove_action_group(action_group);
- merge_ids.resize(0);
-
- ui.ensure_update();
+
+ //ui.insert_action_group(action_group, 0);
}
-
+
public void init_toolbar(string path) {
toolbar_path = path;
}
@@ -558,7 +553,7 @@ public abstract class Page : Gtk.ScrolledWindow {
File ui_file = Resources.get_ui(ui_filename);
try {
- merge_ids += ui.add_ui_from_file(ui_file.get_path());
+ builder.add_from_file(ui_file.get_path());
} catch (Error err) {
AppWindow.error_message("Error loading UI file %s: %s".printf(
ui_file.get_path(), err.message));
@@ -571,21 +566,7 @@ public abstract class Page : Gtk.ScrolledWindow {
// classes' filename.
protected virtual void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
}
-
- // This is called during init_ui() to collect all Gtk.ActionEntries for the page.
- protected virtual Gtk.ActionEntry[] init_collect_action_entries() {
- return new Gtk.ActionEntry[0];
- }
-
- // This is called during init_ui() to collect all Gtk.ToggleActionEntries for the page
- protected virtual Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
- return new Gtk.ToggleActionEntry[0];
- }
-
- // This is called during init_ui() to collect all Gtk.RadioActionEntries for the page
- protected virtual void register_radio_actions(Gtk.ActionGroup action_group) {
- }
-
+
// This is called during init_ui() to collect all Page.InjectedUIElements for the page. They
// should be added to the MultiSet using the injection path as the key.
protected virtual InjectionGroup[] init_collect_injection_groups() {
@@ -1162,6 +1143,84 @@ public abstract class Page : Gtk.ScrolledWindow {
return false;
}
+
+ protected void update_menu_item_label (string id,
+ string new_label) {
+ var bar = this.builder.get_object ("MenuBar") as GLib.Menu;
+
+ if (bar == null) {
+ return;
+ }
+
+ var items = bar.get_n_items ();
+ for (var i = 0; i< items; i++) {
+ var model = bar.get_item_link (i, GLib.Menu.LINK_SUBMENU);
+ if (bar == null) {
+ continue;
+ }
+
+ var model_items = model.get_n_items ();
+ for (var j = 0; j < model_items; j++) {
+ var subsection = model.get_item_link (j, GLib.Menu.LINK_SECTION);
+
+ if (subsection == null)
+ continue;
+
+ // Recurse into submenus
+ var sub_items = subsection.get_n_items ();
+ for (var k = 0; k < sub_items; k++) {
+ var it = subsection.iterate_item_attributes (k);
+ while (it.next ()) {
+ if (it.get_name () == "id") {
+ if (it.get_value ().get_string () == id) {
+ var md = subsection as GLib.Menu;
+ var m = new GLib.MenuItem.from_model
+ (subsection, k);
+ m.set_label (new_label);
+ md.remove (k);
+ md.insert_item (k, m);
+
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ protected GLib.MenuModel? find_extension_point (GLib.MenuModel model,
+ string extension_point) {
+ var items = model.get_n_items ();
+ GLib.MenuModel? section = null;
+
+ for (int i = 0; i < items && section == null; i++) {
+ string? name = null;
+ model.get_item_attribute (i, "id", "s", out name);
+ if (name == extension_point) {
+ section = model.get_item_link (i, GLib.Menu.LINK_SECTION);
+ } else {
+ var subsection = model.get_item_link (i, GLib.Menu.LINK_SECTION);
+
+ if (subsection == null)
+ continue;
+
+ // Recurse into submenus
+ var sub_items = subsection.get_n_items ();
+ for (int j = 0; j < sub_items && section == null; j++) {
+ var submenu = subsection.get_item_link
+ (j, GLib.Menu.LINK_SUBMENU);
+ if (submenu != null) {
+ section = this.find_extension_point (submenu,
+ extension_point);
+ }
+ }
+ }
+ }
+
+ return section;
+ }
+
}
public abstract class CheckerboardPage : Page {
@@ -1244,18 +1303,28 @@ public abstract class CheckerboardPage : Page {
get_page_context_menu();
}
+ private Gtk.Menu item_context_menu;
public virtual Gtk.Menu? get_item_context_menu() {
- Gtk.Menu menu = (Gtk.Menu) ui.get_widget(item_context_menu_path);
- assert(menu != null);
- return menu;
+ if (item_context_menu == null) {
+ var model = this.builder.get_object (item_context_menu_path)
+ as GLib.MenuModel;
+ item_context_menu = new Gtk.Menu.from_model (model);
+ item_context_menu.attach_to_widget (this, null);
+ }
+
+ return item_context_menu;
}
+ private Gtk.Menu page_context_menu;
public override Gtk.Menu? get_page_context_menu() {
- if (page_context_menu_path == null)
- return null;
- Gtk.Menu menu = (Gtk.Menu) ui.get_widget(page_context_menu_path);
- assert(menu != null);
- return menu;
+ if (page_context_menu == null) {
+ var model = this.builder.get_object (page_context_menu_path)
+ as GLib.MenuModel;
+ page_context_menu = new Gtk.Menu.from_model (model);
+ page_context_menu.attach_to_widget (this, null);
+ }
+
+ return page_context_menu;
}
protected override bool on_context_keypress() {
@@ -2593,4 +2662,6 @@ public class DragAndDropHandler {
private void on_export_completed() {
exporter = null;
}
+
+
}
diff --git a/src/PhotoPage.vala b/src/PhotoPage.vala
index 0e14aab..09995bd 100644
--- a/src/PhotoPage.vala
+++ b/src/PhotoPage.vala
@@ -2378,352 +2378,105 @@ public class LibraryPhotoPage : EditingHostPage {
ui_filenames.add("photo_context.ui");
ui_filenames.add("photo.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry export = { "Export", Resources.SAVE_AS_LABEL, TRANSLATABLE, "<Ctrl><Shift>E",
- TRANSLATABLE, on_export };
- export.label = Resources.EXPORT_MENU;
- actions += export;
-
- Gtk.ActionEntry print = { "Print", Resources.PRINT_LABEL, TRANSLATABLE, "<Ctrl>P",
- TRANSLATABLE, on_print };
- print.label = Resources.PRINT_MENU;
- actions += print;
-
- Gtk.ActionEntry publish = { "Publish", Resources.PUBLISH, TRANSLATABLE, "<Ctrl><Shift>P",
- TRANSLATABLE, on_publish };
- publish.label = Resources.PUBLISH_MENU;
- publish.tooltip = Resources.PUBLISH_TOOLTIP;
- actions += publish;
-
- Gtk.ActionEntry remove_from_library = { "RemoveFromLibrary", Resources.REMOVE_LABEL, TRANSLATABLE,
- "<Shift>Delete", TRANSLATABLE, on_remove_from_library };
- remove_from_library.label = Resources.REMOVE_FROM_LIBRARY_MENU;
- actions += remove_from_library;
-
- Gtk.ActionEntry move_to_trash = { "MoveToTrash", "user-trash-full", TRANSLATABLE, "Delete",
- TRANSLATABLE, on_move_to_trash };
- move_to_trash.label = Resources.MOVE_TO_TRASH_MENU;
- actions += move_to_trash;
-
- Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, on_view_menu };
- view.label = _("_View");
- actions += view;
-
- Gtk.ActionEntry tools = { "Tools", null, TRANSLATABLE, null, null, null };
- tools.label = _("T_ools");
- actions += tools;
-
- Gtk.ActionEntry prev = { "PrevPhoto", Resources.PREVIOUS_LABEL, TRANSLATABLE, null,
- TRANSLATABLE, on_previous_photo };
- prev.label = _("_Previous Photo");
- prev.tooltip = _("Previous Photo");
- actions += prev;
-
- Gtk.ActionEntry next = { "NextPhoto", Resources.NEXT_LABEL, TRANSLATABLE, null,
- TRANSLATABLE, on_next_photo };
- next.label = _("_Next Photo");
- next.tooltip = _("Next Photo");
- actions += next;
-
- Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE, TRANSLATABLE,
- "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
- rotate_right.label = Resources.ROTATE_CW_MENU;
- rotate_right.tooltip = Resources.ROTATE_CW_TOOLTIP;
- actions += rotate_right;
-
- Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
- TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
- rotate_left.label = Resources.ROTATE_CCW_MENU;
- rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
- actions += rotate_left;
-
- Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
- TRANSLATABLE, on_flip_horizontally };
- hflip.label = Resources.HFLIP_MENU;
- actions += hflip;
-
- Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
- TRANSLATABLE, on_flip_vertically };
- vflip.label = Resources.VFLIP_MENU;
- actions += vflip;
-
- Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
- TRANSLATABLE, on_enhance };
- enhance.label = Resources.ENHANCE_MENU;
- enhance.tooltip = Resources.ENHANCE_TOOLTIP;
- actions += enhance;
-
- Gtk.ActionEntry copy_adjustments = { "CopyColorAdjustments", null, TRANSLATABLE,
- "<Ctrl><Shift>C", TRANSLATABLE, on_copy_adjustments};
- copy_adjustments.label = Resources.COPY_ADJUSTMENTS_MENU;
- copy_adjustments.tooltip = Resources.COPY_ADJUSTMENTS_TOOLTIP;
- actions += copy_adjustments;
-
- Gtk.ActionEntry paste_adjustments = { "PasteColorAdjustments", null, TRANSLATABLE,
- "<Ctrl><Shift>V", TRANSLATABLE, on_paste_adjustments};
- paste_adjustments.label = Resources.PASTE_ADJUSTMENTS_MENU;
- paste_adjustments.tooltip = Resources.PASTE_ADJUSTMENTS_TOOLTIP;
- actions += paste_adjustments;
-
- Gtk.ActionEntry crop = { "Crop", Resources.CROP, TRANSLATABLE, "<Ctrl>O",
- TRANSLATABLE, toggle_crop };
- crop.label = Resources.CROP_MENU;
- crop.tooltip = Resources.CROP_TOOLTIP;
- actions += crop;
-
- Gtk.ActionEntry straighten = { "Straighten", Resources.REFRESH_LABEL, TRANSLATABLE, "<Ctrl>A",
- TRANSLATABLE, toggle_straighten };
- straighten.label = Resources.STRAIGHTEN_MENU;
- straighten.tooltip = Resources.STRAIGHTEN_TOOLTIP;
- actions += straighten;
-
- Gtk.ActionEntry red_eye = { "RedEye", Resources.REDEYE, TRANSLATABLE, "<Ctrl>Y",
- TRANSLATABLE, toggle_redeye };
- red_eye.label = Resources.RED_EYE_MENU;
- red_eye.tooltip = Resources.RED_EYE_TOOLTIP;
- actions += red_eye;
-
- Gtk.ActionEntry adjust = { "Adjust", Resources.ADJUST, TRANSLATABLE, "<Ctrl>D",
- TRANSLATABLE, toggle_adjust };
- adjust.label = Resources.ADJUST_MENU;
- adjust.tooltip = Resources.ADJUST_TOOLTIP;
- actions += adjust;
-
- Gtk.ActionEntry revert = { "Revert", Resources.REVERT_TO_SAVED_LABEL, TRANSLATABLE,
- null, TRANSLATABLE, on_revert };
- revert.label = Resources.REVERT_MENU;
- actions += revert;
-
- Gtk.ActionEntry edit_title = { "EditTitle", null, TRANSLATABLE, "F2", TRANSLATABLE,
- on_edit_title };
- edit_title.label = Resources.EDIT_TITLE_MENU;
- actions += edit_title;
-
- Gtk.ActionEntry edit_comment = { "EditComment", null, TRANSLATABLE, "F3", TRANSLATABLE,
- on_edit_comment };
- edit_comment.label = Resources.EDIT_COMMENT_MENU;
- actions += edit_comment;
-
- Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
- TRANSLATABLE, on_adjust_date_time };
- adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
- actions += adjust_date_time;
-
- Gtk.ActionEntry external_edit = { "ExternalEdit", Resources.EDIT_LABEL, TRANSLATABLE,
- "<Ctrl>Return", TRANSLATABLE, on_external_edit };
- external_edit.label = Resources.EXTERNAL_EDIT_MENU;
- actions += external_edit;
-
- Gtk.ActionEntry edit_raw = { "ExternalEditRAW", null, TRANSLATABLE, "<Ctrl><Shift>Return",
- TRANSLATABLE, on_external_edit_raw };
- edit_raw.label = Resources.EXTERNAL_EDIT_RAW_MENU;
- actions += edit_raw;
-
- Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
- TRANSLATABLE, on_send_to };
- send_to.label = Resources.SEND_TO_MENU;
- actions += send_to;
-
- Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
- TRANSLATABLE, on_set_background };
- set_background.label = Resources.SET_BACKGROUND_MENU;
- set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
- actions += set_background;
-
- Gtk.ActionEntry flag = { "Flag", null, TRANSLATABLE, "<Ctrl>G", TRANSLATABLE, on_flag_unflag };
- flag.label = Resources.FLAG_MENU;
- actions += flag;
-
- Gtk.ActionEntry set_rating = { "Rate", null, TRANSLATABLE, null, null, null };
- set_rating.label = Resources.RATING_MENU;
- actions += set_rating;
-
- Gtk.ActionEntry increase_rating = { "IncreaseRating", null, TRANSLATABLE,
- "greater", TRANSLATABLE, on_increase_rating };
- increase_rating.label = Resources.INCREASE_RATING_MENU;
- actions += increase_rating;
-
- Gtk.ActionEntry decrease_rating = { "DecreaseRating", null, TRANSLATABLE,
- "less", TRANSLATABLE, on_decrease_rating };
- decrease_rating.label = Resources.DECREASE_RATING_MENU;
- actions += decrease_rating;
-
- Gtk.ActionEntry rate_rejected = { "RateRejected", null, TRANSLATABLE,
- "9", TRANSLATABLE, on_rate_rejected };
- rate_rejected.label = Resources.rating_menu(Rating.REJECTED);
- actions += rate_rejected;
-
- Gtk.ActionEntry rate_unrated = { "RateUnrated", null, TRANSLATABLE,
- "0", TRANSLATABLE, on_rate_unrated };
- rate_unrated.label = Resources.rating_menu(Rating.UNRATED);
- actions += rate_unrated;
-
- Gtk.ActionEntry rate_one = { "RateOne", null, TRANSLATABLE,
- "1", TRANSLATABLE, on_rate_one };
- rate_one.label = Resources.rating_menu(Rating.ONE);
- actions += rate_one;
-
- Gtk.ActionEntry rate_two = { "RateTwo", null, TRANSLATABLE,
- "2", TRANSLATABLE, on_rate_two };
- rate_two.label = Resources.rating_menu(Rating.TWO);
- actions += rate_two;
-
- Gtk.ActionEntry rate_three = { "RateThree", null, TRANSLATABLE,
- "3", TRANSLATABLE, on_rate_three };
- rate_three.label = Resources.rating_menu(Rating.THREE);
- actions += rate_three;
-
- Gtk.ActionEntry rate_four = { "RateFour", null, TRANSLATABLE,
- "4", TRANSLATABLE, on_rate_four };
- rate_four.label = Resources.rating_menu(Rating.FOUR);
- actions += rate_four;
-
- Gtk.ActionEntry rate_five = { "RateFive", null, TRANSLATABLE,
- "5", TRANSLATABLE, on_rate_five };
- rate_five.label = Resources.rating_menu(Rating.FIVE);
- actions += rate_five;
-
- Gtk.ActionEntry increase_size = { "IncreaseSize", Resources.ZOOM_IN_LABEL, TRANSLATABLE,
- "<Ctrl>plus", TRANSLATABLE, on_increase_size };
- increase_size.label = _("Zoom _In");
- increase_size.tooltip = _("Increase the magnification of the photo");
- actions += increase_size;
-
- Gtk.ActionEntry decrease_size = { "DecreaseSize", Resources.ZOOM_OUT_LABEL, TRANSLATABLE,
- "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
- decrease_size.label = _("Zoom _Out");
- decrease_size.tooltip = _("Decrease the magnification of the photo");
- actions += decrease_size;
-
- Gtk.ActionEntry best_fit = { "ZoomFit", Resources.ZOOM_FIT_LABEL, TRANSLATABLE,
- "<Ctrl>0", TRANSLATABLE, snap_zoom_to_min };
- best_fit.label = _("Fit to _Page");
- best_fit.tooltip = _("Zoom the photo to fit on the screen");
- actions += best_fit;
-
- Gtk.ActionEntry actual_size = { "Zoom100", Resources.ZOOM_100_LABEL, TRANSLATABLE,
- "<Ctrl>1", TRANSLATABLE, snap_zoom_to_isomorphic };
- /// xgettext:no-c-format
- actual_size.label = _("Zoom _100%");
- /// xgettext:no-c-format
- actual_size.tooltip = _("Zoom the photo to 100% magnification");
- actions += actual_size;
-
- Gtk.ActionEntry max_size = { "Zoom200", null, TRANSLATABLE,
- "<Ctrl>2", TRANSLATABLE, snap_zoom_to_max };
- /// xgettext:no-c-format
- max_size.label = _("Zoom _200%");
- /// xgettext:no-c-format
- max_size.tooltip = _("Zoom the photo to 200% magnification");
- actions += max_size;
-
- Gtk.ActionEntry add_tags = { "AddTags", null, TRANSLATABLE, "<Ctrl>T", TRANSLATABLE,
- on_add_tags };
- add_tags.label = Resources.ADD_TAGS_MENU;
- actions += add_tags;
-
- Gtk.ActionEntry modify_tags = { "ModifyTags", null, TRANSLATABLE, "<Ctrl>M", TRANSLATABLE,
- on_modify_tags };
- modify_tags.label = Resources.MODIFY_TAGS_MENU;
- actions += modify_tags;
-
- Gtk.ActionEntry slideshow = { "Slideshow", null, TRANSLATABLE, "F5", TRANSLATABLE,
- on_slideshow };
- slideshow.label = _("S_lideshow");
- slideshow.tooltip = _("Play a slideshow");
- actions += slideshow;
-
- Gtk.ActionEntry raw_developer = { "RawDeveloper", null, TRANSLATABLE, null, null, null };
- raw_developer.label = _("_Developer");
- actions += raw_developer;
-
- // These are identical to add_tags and send_to, except that they have
- // different mnemonics and are _only_ for use in the context menu.
- Gtk.ActionEntry send_to_context_menu = { "SendToContextMenu", "document-send", TRANSLATABLE, null,
- TRANSLATABLE, on_send_to };
- send_to_context_menu.label = Resources.SEND_TO_CONTEXT_MENU;
- actions += send_to_context_menu;
-
- Gtk.ActionEntry add_tags_context_menu = { "AddTagsContextMenu", null, TRANSLATABLE, "<Ctrl>A",
TRANSLATABLE,
- on_add_tags };
- add_tags_context_menu.label = Resources.ADD_TAGS_CONTEXT_MENU;
- actions += add_tags_context_menu;
-
- return actions;
- }
-
- protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
- Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
-
- Gtk.ToggleActionEntry ratings = { "ViewRatings", null, TRANSLATABLE, "<Ctrl><Shift>N",
- TRANSLATABLE, on_display_ratings, Config.Facade.get_instance().get_display_photo_ratings() };
- ratings.label = Resources.VIEW_RATINGS_MENU;
- ratings.tooltip = Resources.VIEW_RATINGS_TOOLTIP;
- toggle_actions += ratings;
-
- return toggle_actions;
+
+ private const GLib.ActionEntry[] entries = {
+ { "Export", on_export },
+ { "Print", on_print },
+ { "Publish", on_publish },
+ { "RemoveFromLibrary", on_remove_from_library },
+ { "MoveToTrash", on_move_to_trash },
+ { "PrevPhoto", on_previous_photo },
+ { "NextPhoto", on_next_photo },
+ { "RotateClockwise", on_rotate_clockwise },
+ { "RotateCounterclockwise", on_rotate_counterclockwise },
+ { "FlipHorizontally", on_flip_horizontally },
+ { "FlipVertically", on_flip_vertically },
+ { "Enhance", on_enhance },
+ { "CopyColorAdjustments", on_copy_adjustments },
+ { "PasteColorAdjustments", on_paste_adjustments },
+ { "Crop", toggle_crop },
+ { "Straighten", toggle_straighten },
+ { "RedEye", toggle_redeye },
+ { "Adjust", toggle_adjust },
+ { "Revert", on_revert },
+ { "EditTitle", on_edit_title },
+ { "EditComment", on_edit_comment },
+ { "AdjustDateTime", on_adjust_date_time },
+ { "ExternalEdit", on_external_edit },
+ { "ExternalEditRAW", on_external_edit_raw },
+ { "SendTo", on_send_to },
+ { "SetBackground", on_set_background },
+ { "Flag", on_flag_unflag },
+ { "IncreaseRating", on_increase_rating },
+ { "DecreaseRating", on_decrease_rating },
+ { "RateRejected", on_rate_rejected },
+ { "RateUnrated", on_rate_unrated },
+ { "RateOne", on_rate_one },
+ { "RateTwo", on_rate_two },
+ { "RateThree", on_rate_three },
+ { "RateFour", on_rate_four },
+ { "RateFive", on_rate_five },
+ { "IncreaseSize", on_increase_size },
+ { "DecreaseSize", on_decrease_size },
+ { "ZoomFit", snap_zoom_to_min },
+ { "Zoom100", snap_zoom_to_isomorphic },
+ { "Zoom200", snap_zoom_to_max },
+ { "AddTags", on_add_tags },
+ { "ModifyTags", on_modify_tags },
+ { "Slideshow", on_slideshow },
+
+ // Toggle actions
+ { "ViewRatings", on_action_toggle, null, "false", on_display_ratings },
+
+ // Radio actions
+ { "RawDeveloper", on_action_radio, "s", "'Shotwell'", on_raw_developer_changed }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
+ AppWindow.get_instance ().add_action_entries (entries, this);
+ (get_action ("ViewRatings") as GLib.SimpleAction).set_state (Config.Facade.get_instance
().get_display_photo_ratings ());
+ var d = Config.Facade.get_instance().get_default_raw_developer();
+ var action = get_action ("RawDeveloper") as GLib.SimpleAction;
+ action.set_state (d == RawDeveloper.SHOTWELL ? "'Shotwell'" : "'Camera'");
}
-
+
protected override InjectionGroup[] init_collect_injection_groups() {
InjectionGroup[] groups = base.init_collect_injection_groups();
-
- InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
- print_group.add_menu_item("Print");
+
+ InjectionGroup print_group = new InjectionGroup("PrintPlaceholder");
+ print_group.add_menu_item(_("_Print"), "Print", "<Primary>p");
groups += print_group;
- InjectionGroup publish_group = new InjectionGroup("/MenuBar/FileMenu/PublishPlaceholder");
- publish_group.add_menu_item("Publish");
+ InjectionGroup publish_group = new InjectionGroup("PublishPlaceholder");
+ publish_group.add_menu_item(_("_Publish"), "Publish", "<Primary><Shift>p");
groups += publish_group;
- InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
- bg_group.add_menu_item("SetBackground");
+ InjectionGroup bg_group = new InjectionGroup("SetBackgroundPlaceholder");
+ bg_group.add_menu_item(_("Set as _Desktop Background"), "SetBackground");
groups += bg_group;
return groups;
}
- protected override void register_radio_actions(Gtk.ActionGroup action_group) {
- // RAW developer.
- //get_config_photos_sort(out sort_order, out sort_by); // TODO: fetch default from config
-
- Gtk.RadioActionEntry[] developer_actions = new Gtk.RadioActionEntry[0];
-
- Gtk.RadioActionEntry dev_shotwell = { "RawDeveloperShotwell", null, TRANSLATABLE, null, TRANSLATABLE,
- RawDeveloper.SHOTWELL };
- string label_shotwell = RawDeveloper.SHOTWELL.get_label();
- dev_shotwell.label = label_shotwell;
- developer_actions += dev_shotwell;
-
- Gtk.RadioActionEntry dev_camera = { "RawDeveloperCamera", null, TRANSLATABLE, null, TRANSLATABLE,
- RawDeveloper.CAMERA };
- string label_camera = RawDeveloper.CAMERA.get_label();
- dev_camera.label = label_camera;
- developer_actions += dev_camera;
-
- action_group.add_radio_actions(developer_actions, RawDeveloper.SHOTWELL, on_raw_developer_changed);
-
- base.register_radio_actions(action_group);
- }
-
- private void on_display_ratings(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ private void on_display_ratings(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
set_display_ratings(display);
Config.Facade.get_instance().set_display_photo_ratings(display);
- repaint();
+ action.set_state (value);
}
+
private void set_display_ratings(bool display) {
- Gtk.ToggleAction? action = get_action("ViewRatings") as Gtk.ToggleAction;
+ var action = get_action("ViewRatings") as GLib.SimpleAction;
if (action != null)
- action.set_active(display);
+ action.set_enabled(display);
}
protected override void update_actions(int selected_count, int count) {
@@ -2774,8 +2527,24 @@ public class LibraryPhotoPage : EditingHostPage {
update_flag_action();
}
- private void on_raw_developer_changed(Gtk.Action action, Gtk.Action current) {
- developer_changed((RawDeveloper) ((Gtk.RadioAction) current).get_current_value());
+ private void on_raw_developer_changed(GLib.SimpleAction action,
+ Variant? value) {
+ RawDeveloper developer = RawDeveloper.SHOTWELL;
+
+ switch (value.get_string ()) {
+ case "Shotwell":
+ developer = RawDeveloper.SHOTWELL;
+ break;
+ case "Camera":
+ developer = RawDeveloper.CAMERA;
+ break;
+ default:
+ break;
+ }
+
+ developer_changed(developer);
+
+ action.set_state (value);
}
protected virtual void developer_changed(RawDeveloper rd) {
@@ -2799,13 +2568,14 @@ public class LibraryPhotoPage : EditingHostPage {
private void update_flag_action() {
if (has_photo()) {
- Gtk.Action? action = get_action("Flag");
+ var action = get_action("Flag") as GLib.SimpleAction;
assert(action != null);
- bool is_flagged = ((LibraryPhoto) get_photo()).is_flagged();
+// bool is_flagged = ((LibraryPhoto) get_photo()).is_flagged();
- action.label = is_flagged ? Resources.UNFLAG_MENU : Resources.FLAG_MENU;
- action.sensitive = true;
+ debug ("Setting label of action flagged");
+// action.label = is_flagged ? Resources.UNFLAG_MENU : Resources.FLAG_MENU;
+ action.set_enabled (true);
} else {
set_action_sensitive("Flag", false);
}
@@ -3049,11 +2819,18 @@ public class LibraryPhotoPage : EditingHostPage {
return base.on_left_released(event);
}
-
+
+ private Gtk.Menu context_menu;
+
private Gtk.Menu get_context_menu() {
- Gtk.Menu menu = (Gtk.Menu) ui.get_widget("/PhotoContextMenu");
- assert(menu != null);
- return menu;
+ if (context_menu == null) {
+ var model = this.builder.get_object ("PhotoContextMenu")
+ as GLib.MenuModel;
+ context_menu = new Gtk.Menu.from_model (model);
+ context_menu.attach_to_widget (this, null);
+ }
+
+ return this.context_menu;
}
protected override bool on_context_buttonpress(Gdk.EventButton event) {
@@ -3236,10 +3013,6 @@ public class LibraryPhotoPage : EditingHostPage {
(Gee.Collection<MediaSource>) get_view().get_selected_sources());
}
- private void on_view_menu() {
- update_zoom_menu_item_sensitivity();
- }
-
private void on_increase_rating() {
if (!has_photo() || get_photo_missing())
return;
@@ -3315,22 +3088,16 @@ public class LibraryPhotoPage : EditingHostPage {
set_action_sensitive("RawDeveloper", format == PhotoFileFormat.RAW);
if (format == PhotoFileFormat.RAW) {
- // Set which developers are available.
- set_action_sensitive("RawDeveloperShotwell",
- get_photo().is_raw_developer_available(RawDeveloper.SHOTWELL));
- set_action_sensitive("RawDeveloperCamera",
- get_photo().is_raw_developer_available(RawDeveloper.EMBEDDED) ||
- get_photo().is_raw_developer_available(RawDeveloper.CAMERA));;
-
+ // FIXME: Only enable radio actions that are actually possible..
// Set active developer in menu.
switch (get_photo().get_raw_developer()) {
case RawDeveloper.SHOTWELL:
- activate_action("RawDeveloperShotwell");
+ get_action ("RawDeveloper").change_state ("'Shotwell'");
break;
case RawDeveloper.CAMERA:
case RawDeveloper.EMBEDDED:
- activate_action("RawDeveloperCamera");
+ get_action ("RawDeveloper").change_state ("'Camera'");
break;
default:
diff --git a/src/Resources.vala b/src/Resources.vala
index 6829d7c..bf34ae0 100644
--- a/src/Resources.vala
+++ b/src/Resources.vala
@@ -423,27 +423,6 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
return _("Delete Search “%s”").printf(name);
}
- private unowned string rating_menu(Rating rating) {
- switch (rating) {
- case Rating.REJECTED:
- return RATE_REJECTED_MENU;
- case Rating.UNRATED:
- return RATE_UNRATED_MENU;
- case Rating.ONE:
- return RATE_ONE_MENU;
- case Rating.TWO:
- return RATE_TWO_MENU;
- case Rating.THREE:
- return RATE_THREE_MENU;
- case Rating.FOUR:
- return RATE_FOUR_MENU;
- case Rating.FIVE:
- return RATE_FIVE_MENU;
- default:
- return RATE_UNRATED_MENU;
- }
- }
-
private unowned string rating_label(Rating rating) {
switch (rating) {
case Rating.REJECTED:
diff --git a/src/SearchFilter.vala b/src/SearchFilter.vala
index 5fcf76f..d947bfa 100644
--- a/src/SearchFilter.vala
+++ b/src/SearchFilter.vala
@@ -331,33 +331,33 @@ public class TextAction {
public class SearchFilterActions {
- public unowned Gtk.ToggleAction? flagged {
+ public unowned GLib.SimpleAction? flagged {
get {
- return get_action("CommonDisplayFlagged") as Gtk.ToggleAction;
+ return get_action ("display.flagged");
}
}
- public unowned Gtk.ToggleAction? photos {
+ public unowned GLib.SimpleAction? photos {
get {
- return get_action("CommonDisplayPhotos") as Gtk.ToggleAction;
+ return get_action ("display.photos");
}
}
- public unowned Gtk.ToggleAction? videos {
+ public unowned GLib.SimpleAction? videos {
get {
- return get_action("CommonDisplayVideos") as Gtk.ToggleAction;
+ return get_action ("display.videos");
}
}
- public unowned Gtk.ToggleAction? raw {
+ public unowned GLib.SimpleAction? raw {
get {
- return get_action("CommonDisplayRaw") as Gtk.ToggleAction;
+ return get_action ("display.raw");
}
}
- public unowned Gtk.RadioAction? rating {
+ public unowned GLib.SimpleAction? rating {
get {
- return get_action("CommonDisplayUnratedOrHigher") as Gtk.RadioAction;
+ return get_action ("display.rating");
}
}
@@ -368,7 +368,6 @@ public class SearchFilterActions {
}
}
- private Gtk.ActionGroup action_group = new Gtk.ActionGroup("SearchFilterActionGroup");
private SearchFilterCriteria criteria = SearchFilterCriteria.ALL;
private TextAction? _text = null;
private bool has_flagged = true;
@@ -388,6 +387,7 @@ public class SearchFilterActions {
public signal void rating_changed(RatingFilter filter);
public signal void text_changed(string? text);
+
/**
* fired when the kinds of media present in the current view change (e.g., a video becomes
@@ -410,30 +410,39 @@ public class SearchFilterActions {
text.text_changed.connect(on_text_changed);
}
- public Gtk.ActionGroup get_action_group() {
- return action_group;
- }
-
public SearchFilterCriteria get_criteria() {
return criteria;
}
+
+ public unowned GLib.ActionEntry[] get_actions () {
+ return SearchFilterActions.entries;
+ }
- public unowned Gtk.Action? get_action(string name) {
- return action_group.get_action(name);
+ public unowned GLib.SimpleAction? get_action(string name) {
+ var lw = AppWindow.get_instance () as LibraryWindow;
+ if (lw != null) {
+ return lw.lookup_action (name) as GLib.SimpleAction;
+ }
+
+ return null;
+ // return action_group.lookup_action(name) as GLib.SimpleAction;
}
- public void set_action_sensitive(string name, bool sensitive) {
- Gtk.Action? action = get_action(name);
- if (action != null)
- action.sensitive = sensitive;
+ public void set_action_sensitive (string name, bool sensitive) {
+ var action = get_action(name);
+ if (action != null) {
+ action.set_enabled (sensitive);
+ }
}
public void reset() {
- flagged.active = false;
- photos.active = false;
- raw.active = false;
- videos.active = false;
- rating.current_value = RatingFilter.UNRATED_OR_HIGHER;
+ rating.set_enabled (false);
+ photos.set_enabled (false);
+ raw.set_enabled (false);
+ videos.set_enabled (false);
+ Variant v = "'%d'".printf (RatingFilter.UNRATED_OR_HIGHER);
+ rating.set_state (v);
+
text.set_text(null);
}
@@ -506,27 +515,9 @@ public class SearchFilterActions {
}
private void update_sensitivities() {
- flagged.set_stock_id(((SearchFilterCriteria.FLAG & criteria) != 0 && has_flagged) ?
- Resources.ICON_FILTER_FLAGGED : Resources.ICON_FILTER_FLAGGED_DISABLED);
-
- bool allow_media = (SearchFilterCriteria.MEDIA & criteria) != 0;
- videos.set_stock_id((allow_media && has_videos) ?
- Resources.ICON_FILTER_VIDEOS : Resources.ICON_FILTER_VIDEOS_DISABLED);
- photos.set_stock_id((allow_media && has_photos) ?
- Resources.ICON_FILTER_PHOTOS : Resources.ICON_FILTER_PHOTOS_DISABLED);
- raw.set_stock_id((allow_media && has_raw) ?
- Resources.ICON_FILTER_RAW : Resources.ICON_FILTER_RAW_DISABLED);
-
bool allow_ratings = (SearchFilterCriteria.RATING & criteria) != 0;
- set_action_sensitive("CommonDisplayRejectedOnly", allow_ratings & can_filter_by_stars);
- set_action_sensitive("CommonDisplayRejectedOrHigher", allow_ratings & can_filter_by_stars);
- set_action_sensitive("CommonDisplayUnratedOrHigher", allow_ratings & can_filter_by_stars);
- set_action_sensitive("CommonDisplayOneOrHigher", allow_ratings & can_filter_by_stars);
- set_action_sensitive("CommonDisplayTwoOrHigher", allow_ratings & can_filter_by_stars);
- set_action_sensitive("CommonDisplayThreeOrHigher", allow_ratings & can_filter_by_stars);
- set_action_sensitive("CommonDisplayFourOrHigher", allow_ratings & can_filter_by_stars);
- set_action_sensitive("CommonDisplayFiveOrHigher", allow_ratings & can_filter_by_stars);
-
+ set_action_sensitive("display.rating", allow_ratings & can_filter_by_stars);
+
// Ticket #3343 - Don't disable the text field, even
// when no searchable items are available.
text.set_sensitive(true);
@@ -537,111 +528,59 @@ public class SearchFilterActions {
private void on_text_changed(TextAction action, string? text) {
text_changed(text);
}
+
+ private const GLib.ActionEntry[] entries = {
+ { "display.rating", on_action_radio, "s", "'2'", on_rating_changed },
+ { "display.flagged", on_action_toggle, null, "false", on_flagged_toggled },
+ { "display.photos", on_action_toggle, null, "false", on_photos_toggled },
+ { "display.videos", on_action_toggle, null, "false", on_videos_toggled },
+ { "display.raw", on_action_toggle, null, "false", on_raw_toggled }
+ };
+
+ private void on_action_radio (GLib.SimpleAction action,
+ GLib.Variant? parameter) {
+ action.change_state (parameter);
+ }
+
+ private void on_action_toggle (GLib.SimpleAction action,
+ GLib.Variant? parameter) {
+ var state = (bool) action.get_state ();
+ action.change_state (!state);
+ }
private void register() {
_text = new TextAction();
-
- Gtk.RadioActionEntry[] view_filter_actions = new Gtk.RadioActionEntry[0];
-
- Gtk.RadioActionEntry rejected_only = { "CommonDisplayRejectedOnly", null, TRANSLATABLE,
- "<Ctrl>8", TRANSLATABLE, RatingFilter.REJECTED_ONLY };
- rejected_only.label = Resources.DISPLAY_REJECTED_ONLY_MENU;
- rejected_only.tooltip = Resources.DISPLAY_REJECTED_ONLY_TOOLTIP;
- view_filter_actions += rejected_only;
-
- Gtk.RadioActionEntry rejected_or_higher = { "CommonDisplayRejectedOrHigher", null, TRANSLATABLE,
- "<Ctrl>9", TRANSLATABLE, RatingFilter.REJECTED_OR_HIGHER };
- rejected_or_higher.label = Resources.DISPLAY_REJECTED_OR_HIGHER_MENU;
- rejected_or_higher.tooltip = GLib.dpgettext2 (null, "Tooltip",
- Resources.DISPLAY_REJECTED_OR_HIGHER_TOOLTIP);
- view_filter_actions += rejected_or_higher;
-
- Gtk.RadioActionEntry unrated_or_higher = { "CommonDisplayUnratedOrHigher", null, TRANSLATABLE,
- "<Ctrl>0", TRANSLATABLE, RatingFilter.UNRATED_OR_HIGHER };
- unrated_or_higher.label = Resources.DISPLAY_UNRATED_OR_HIGHER_MENU;
- unrated_or_higher.tooltip = Resources.DISPLAY_UNRATED_OR_HIGHER_TOOLTIP;
- view_filter_actions += unrated_or_higher;
-
- Gtk.RadioActionEntry one_or_higher = { "CommonDisplayOneOrHigher", null, TRANSLATABLE,
- "<Ctrl>1", TRANSLATABLE, RatingFilter.ONE_OR_HIGHER };
- one_or_higher.label = Resources.DISPLAY_ONE_OR_HIGHER_MENU;
- one_or_higher.tooltip = Resources.DISPLAY_ONE_OR_HIGHER_TOOLTIP;
- view_filter_actions += one_or_higher;
-
- Gtk.RadioActionEntry two_or_higher = { "CommonDisplayTwoOrHigher", null, TRANSLATABLE,
- "<Ctrl>2", TRANSLATABLE, RatingFilter.TWO_OR_HIGHER };
- two_or_higher.label = Resources.DISPLAY_TWO_OR_HIGHER_MENU;
- two_or_higher.tooltip = Resources.DISPLAY_TWO_OR_HIGHER_TOOLTIP;
- view_filter_actions += two_or_higher;
-
- Gtk.RadioActionEntry three_or_higher = { "CommonDisplayThreeOrHigher", null, TRANSLATABLE,
- "<Ctrl>3", TRANSLATABLE, RatingFilter.THREE_OR_HIGHER };
- three_or_higher.label = Resources.DISPLAY_THREE_OR_HIGHER_MENU;
- three_or_higher.tooltip = Resources.DISPLAY_THREE_OR_HIGHER_TOOLTIP;
- view_filter_actions += three_or_higher;
-
- Gtk.RadioActionEntry four_or_higher = { "CommonDisplayFourOrHigher", null, TRANSLATABLE,
- "<Ctrl>4", TRANSLATABLE, RatingFilter.FOUR_OR_HIGHER };
- four_or_higher.label = Resources.DISPLAY_FOUR_OR_HIGHER_MENU;
- four_or_higher.tooltip = Resources.DISPLAY_FOUR_OR_HIGHER_TOOLTIP;
- view_filter_actions += four_or_higher;
-
- Gtk.RadioActionEntry five_or_higher = { "CommonDisplayFiveOrHigher", null, TRANSLATABLE,
- "<Ctrl>5", TRANSLATABLE, RatingFilter.FIVE_OR_HIGHER };
- five_or_higher.label = Resources.DISPLAY_FIVE_OR_HIGHER_MENU;
- five_or_higher.tooltip = Resources.DISPLAY_FIVE_OR_HIGHER_TOOLTIP;
- view_filter_actions += five_or_higher;
-
- action_group.add_radio_actions(view_filter_actions, RatingFilter.UNRATED_OR_HIGHER,
- on_rating_changed);
-
- Gtk.ToggleActionEntry[] toggle_actions = new Gtk.ToggleActionEntry[0];
-
- Gtk.ToggleActionEntry flagged_action = { "CommonDisplayFlagged", Resources.ICON_FILTER_FLAGGED,
- TRANSLATABLE, null, TRANSLATABLE, on_flagged_toggled, false };
- flagged_action.label = _("Flagged");
- flagged_action.tooltip = _("Flagged");
- toggle_actions += flagged_action;
-
- Gtk.ToggleActionEntry photos_action = { "CommonDisplayPhotos", Resources.ICON_FILTER_PHOTOS,
- TRANSLATABLE, null, TRANSLATABLE, on_photos_toggled, false };
- photos_action.label = _("Photos");
- photos_action.tooltip = _("Photos");
- toggle_actions += photos_action;
-
- Gtk.ToggleActionEntry videos_action = { "CommonDisplayVideos", Resources.ICON_FILTER_VIDEOS,
- TRANSLATABLE, null, TRANSLATABLE, on_videos_toggled, false };
- videos_action.label = _("Videos");
- videos_action.tooltip = _("Videos");
- toggle_actions += videos_action;
-
- Gtk.ToggleActionEntry raw_action = { "CommonDisplayRaw", Resources.ICON_FILTER_RAW, TRANSLATABLE,
- null, TRANSLATABLE, on_raw_toggled, false };
- raw_action.label = _("RAW Photos");
- raw_action.tooltip = _("RAW photos");
- toggle_actions += raw_action;
-
- action_group.add_toggle_actions(toggle_actions, this);
}
-
- private void on_rating_changed(Gtk.Action action, Gtk.Action current) {
- rating_changed((RatingFilter) ((Gtk.RadioAction) current).get_current_value());
+
+ private void on_rating_changed (GLib.SimpleAction action,
+ GLib.Variant value) {
+ action.set_state (value);
+ var filter = (RatingFilter) int.parse (value.get_string ());
+ rating_changed(filter);
}
- private void on_flagged_toggled(Gtk.Action action) {
- flagged_toggled(((Gtk.ToggleAction) action).active);
+ private void on_flagged_toggled (GLib.SimpleAction action,
+ GLib.Variant value) {
+ action.set_state (value);
+ flagged_toggled (value.get_boolean ());
}
- private void on_photos_toggled(Gtk.Action action) {
- photos_toggled(((Gtk.ToggleAction) action).active);
+ private void on_photos_toggled (GLib.SimpleAction action,
+ GLib.Variant value) {
+ action.set_state (value);
+ photos_toggled (value.get_boolean ());
}
- private void on_videos_toggled(Gtk.Action action) {
- videos_toggled(((Gtk.ToggleAction) action).active);
+ private void on_videos_toggled (GLib.SimpleAction action,
+ GLib.Variant value) {
+ action.set_state (value);
+ videos_toggled (value.get_boolean ());
}
- private void on_raw_toggled(Gtk.Action action) {
- raw_toggled(((Gtk.ToggleAction) action).active);
+ private void on_raw_toggled (GLib.SimpleAction action,
+ GLib.Variant value) {
+ action.set_state (value);
+ raw_toggled (value.get_boolean ());
}
public bool get_has_photos() {
@@ -689,14 +628,11 @@ public class SearchFilterToolbar : Gtk.Revealer {
private class ToggleActionToolButton : Gtk.ToolItem {
private Gtk.ToggleButton button;
- private Gtk.ToggleAction action;
- public ToggleActionToolButton(Gtk.ToggleAction action) {
- this.action = action;
+ public ToggleActionToolButton(string action) {
button = new Gtk.ToggleButton();
button.set_can_focus(false);
- button.set_active(action.active);
- button.clicked.connect(on_button_activate);
+ button.set_action_name (action);
button.set_has_tooltip(true);
button.set_relief(Gtk.ReliefStyle.NONE);
button.set_margin_start(2);
@@ -704,14 +640,6 @@ public class SearchFilterToolbar : Gtk.Revealer {
this.add(button);
}
- ~ToggleActionToolButton() {
- button.clicked.disconnect(on_button_activate);
- }
-
- private void on_button_activate() {
- action.activate();
- }
-
public void set_icon_name(string icon_name) {
Gtk.Image? image = null;
button.set_always_show_image(true);
@@ -811,33 +739,22 @@ public class SearchFilterToolbar : Gtk.Revealer {
// Handles ratings filters.
protected class RatingFilterButton : Gtk.ToolItem {
- public Gtk.Menu filter_popup = null;
- public Gtk.Button button;
-
- public signal void clicked();
-
- public RatingFilterButton() {
- button = new Gtk.Button();
- button.set_image(get_filter_icon(RatingFilter.UNRATED_OR_HIGHER));
+ public Gtk.MenuButton button;
+
+ public RatingFilterButton(GLib.MenuModel model) {
+ button = new Gtk.MenuButton();
+
+ button.set_image (get_filter_icon(RatingFilter.UNRATED_OR_HIGHER));
button.set_can_focus(false);
button.set_relief(Gtk.ReliefStyle.NONE);
button.set_margin_start(2);
+ button.set_menu_model (model);
- button.clicked.connect(on_clicked);
-
set_homogeneous(false);
-
+
this.add(button);
}
-
- ~RatingFilterButton() {
- button.clicked.disconnect(on_clicked);
- }
-
- private void on_clicked() {
- clicked();
- }
-
+
private Gtk.Widget get_filter_icon(RatingFilter filter) {
string filename = null;
@@ -845,7 +762,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
case RatingFilter.ONE_OR_HIGHER:
filename = Resources.ICON_FILTER_ONE_OR_BETTER;
break;
-
+
case RatingFilter.TWO_OR_HIGHER:
filename = Resources.ICON_FILTER_TWO_OR_BETTER;
break;
@@ -1112,12 +1029,12 @@ public class SearchFilterToolbar : Gtk.Revealer {
}
}
- public Gtk.UIManager ui = new Gtk.UIManager();
+ public Gtk.Builder builder = new Gtk.Builder ();
private SearchFilterActions actions;
private SavedSearch saved_search = null;
private SearchBox search_box;
- private RatingFilterButton rating_button = new RatingFilterButton();
+ private RatingFilterButton rating_button;
private SavedSearchFilterButton saved_search_button = new SavedSearchFilterButton();
private bool elide_showing_again = false;
private SearchViewFilter? search_filter = null;
@@ -1133,22 +1050,20 @@ public class SearchFilterToolbar : Gtk.Revealer {
public SearchFilterToolbar(SearchFilterActions actions) {
this.actions = actions;
toolbar = new Gtk.Toolbar();
+// toolbar.insert_action_group ("filterbar", actions.get_action_group ());
actions.media_context_changed.connect(on_media_context_changed);
search_box = new SearchBox(actions.text);
toolbar.set_name("search-filter-toolbar");
toolbar.set_icon_size(Gtk.IconSize.SMALL_TOOLBAR);
- File ui_file = Resources.get_ui("search_bar.ui");
try {
- ui.add_ui_from_file(ui_file.get_path());
+ this.builder.add_from_resource ("/org/gnome/Shotwell/search_bar.ui");
} catch (Error err) {
- AppWindow.panic(_("Error loading UI file %s: %s").printf(
- ui_file.get_path(), err.message));
+ AppWindow.panic(_("Error loading search bar UI: %s").printf(
+ err.message));
}
- ui.insert_action_group(actions.get_action_group(), 0);
-
// Ticket #3260 - Add a 'close' context menu to
// the searchbar.
// Prepare the close menu for use, but don't
@@ -1163,14 +1078,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
label_type = new LabelToolItem(_("Type"), 10, 5);
toolbar.insert(label_type, -1);
- toolbtn_photos = new ToggleActionToolButton(actions.photos);
-
toolbtn_photos.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayPhotos").tooltip);
+ toolbtn_photos = new ToggleActionToolButton("win.display.photos");
+ toolbtn_photos.set_tooltip_text (_("Photos"));
- toolbtn_videos = new ToggleActionToolButton(actions.videos);
-
toolbtn_videos.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayVideos").tooltip);
+ toolbtn_videos = new ToggleActionToolButton("win.display.videos");
+ toolbtn_videos.set_tooltip_text(_("Videos"));
- toolbtn_raw = new ToggleActionToolButton(actions.raw);
- toolbtn_raw.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayRaw").tooltip);
+ toolbtn_raw = new ToggleActionToolButton("win.display.raw");
+ toolbtn_raw.set_tooltip_text(_("RAW Photos"));
toolbar.insert(toolbtn_photos, -1);
toolbar.insert(toolbtn_videos, -1);
@@ -1182,9 +1097,9 @@ public class SearchFilterToolbar : Gtk.Revealer {
// Flagged button
- toolbtn_flag = new ToggleActionToolButton(actions.flagged);
+ toolbtn_flag = new ToggleActionToolButton("win.display.flagged");
toolbtn_flag.set_label(_("Flagged"));
- toolbtn_flag.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayFlagged").tooltip);
+ toolbtn_flag.set_tooltip_text(_("Flagged"));
toolbar.insert(toolbtn_flag, -1);
@@ -1193,10 +1108,10 @@ public class SearchFilterToolbar : Gtk.Revealer {
toolbar.insert(sepr_flagged_rating, -1);
// Rating button
- rating_button.filter_popup = (Gtk.Menu) ui.get_widget("/FilterPopupMenu");
+ var model = this.builder.get_object ("popup-menu") as GLib.MenuModel;
+ rating_button = new RatingFilterButton (model);
rating_button.set_label(_("Rating"));
rating_button.set_expand(false);
- rating_button.clicked.connect(on_filter_button_clicked);
toolbar.insert(rating_button, -1);
// separator
@@ -1289,12 +1204,13 @@ public class SearchFilterToolbar : Gtk.Revealer {
// Try to obtain the action for toggling the searchbar. If
// it's null, then we're probably in direct edit mode, and
// shouldn't do anything anyway.
- Gtk.ToggleAction searchbar_toggle = aw.get_common_action("CommonDisplaySearchbar") as
Gtk.ToggleAction;
+ var action = aw.lookup_action ("CommonDisplaySearchbar") as
+ GLib.SimpleAction;
// Could we find the appropriate action?
- if(searchbar_toggle != null) {
+ if(action != null) {
// Yes, hide the search bar.
- searchbar_toggle.set_active(false);
+ action.set_state(false);
}
}
@@ -1324,9 +1240,13 @@ public class SearchFilterToolbar : Gtk.Revealer {
if (aw == null)
return;
- Gtk.ToggleAction searchbar_toggle = aw.get_common_action("CommonDisplaySearchbar") as
Gtk.ToggleAction;
- if(searchbar_toggle != null)
- searchbar_toggle.set_active(true);
+ var action = aw.lookup_action ("CommonDisplaySearchbar") as
+ GLib.SimpleAction;
+
+ // Could we find the appropriate action?
+ if(action != null) {
+ action.set_state(true);
+ }
update();
}
@@ -1365,12 +1285,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
assert(null != search_filter);
search_filter.set_search_filter(actions.text.value);
- search_filter.flagged = actions.flagged.active;
- search_filter.show_media_video = actions.videos.active;
- search_filter.show_media_photos = actions.photos.active;
- search_filter.show_media_raw = actions.raw.active;
-
- RatingFilter filter = (RatingFilter) actions.rating.current_value;
+ search_filter.flagged = actions.flagged.get_state ().get_boolean ();
+ search_filter.show_media_video = actions.videos.get_state
+ ().get_boolean ();
+ search_filter.show_media_photos = actions.photos.get_state
+ ().get_boolean ();
+ search_filter.show_media_raw = actions.raw.get_state ().get_boolean ();
+
+ var filter = (RatingFilter) int.parse (actions.rating.get_state ().get_string ());
search_filter.set_rating_filter(filter);
rating_button.set_filter_icon(filter);
@@ -1404,31 +1326,6 @@ public class SearchFilterToolbar : Gtk.Revealer {
search_filter.refresh();
}
- private void position_filter_popup(Gtk.Menu menu, out int x, out int y, out bool push_in) {
- menu.realize();
- int rx, ry;
- rating_button.get_window().get_root_origin(out rx, out ry);
-
- Gtk.Allocation rating_button_allocation;
- rating_button.get_allocation(out rating_button_allocation);
-
- Gtk.Allocation menubar_allocation;
- AppWindow.get_instance().get_current_page().get_menubar().get_allocation(out menubar_allocation);
-
- int sidebar_w = Config.Facade.get_instance().get_sidebar_position();
-
- x = rx + rating_button_allocation.x + sidebar_w;
- y = ry + rating_button_allocation.y + rating_button_allocation.height +
- menubar_allocation.height;
-
- push_in = false;
- }
-
- private void on_filter_button_clicked() {
- rating_button.filter_popup.popup(null, null, position_filter_popup, 0,
- Gtk.get_current_event_time());
- }
-
private void on_savedsearch_selected(SavedSearch saved_search) {
this.saved_search = saved_search;
update();
@@ -1438,7 +1335,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
this.saved_search = null;
update();
}
-
+
private void edit_dialog(SavedSearch search) {
saved_search_button.filter_popup.hide();
SavedSearchDialog ssd = new SavedSearchDialog.edit_existing(search);
diff --git a/src/camera/ImportPage.vala b/src/camera/ImportPage.vala
index db48634..352bba6 100644
--- a/src/camera/ImportPage.vala
+++ b/src/camera/ImportPage.vala
@@ -801,7 +801,7 @@ public class ImportPage : CheckerboardPage {
// Find button
Gtk.ToggleToolButton find_button = new Gtk.ToggleToolButton();
- find_button.set_related_action(get_action("CommonDisplaySearchbar"));
+ find_button.set_action_name ("win.CommonDisplaySearchbar");
toolbar.insert(find_button, -1);
@@ -811,14 +811,14 @@ public class ImportPage : CheckerboardPage {
// Import selected
Gtk.ToolButton import_selected_button = new Gtk.ToolButton(null, null);
import_selected_button.set_icon_name(Resources.IMPORT);
- import_selected_button.set_related_action(get_action("ImportSelected"));
+ import_selected_button.set_action_name ("win.ImportSelected");
toolbar.insert(import_selected_button, -1);
// Import all
Gtk.ToolButton import_all_button = new Gtk.ToolButton(null, null);
import_all_button.set_icon_name(Resources.IMPORT_ALL);
- import_all_button.set_related_action(get_action("ImportAll"));
+ import_all_button.set_action_name ("win.ImportAll");
toolbar.insert(import_all_button, -1);
@@ -864,35 +864,20 @@ public class ImportPage : CheckerboardPage {
ui_filenames.add("import.ui");
}
-
- protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
- Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
- Gtk.ToggleActionEntry titles = { "ViewTitle", null, TRANSLATABLE, "<Ctrl><Shift>T",
- TRANSLATABLE, on_display_titles, Config.Facade.get_instance().get_display_photo_titles() };
- titles.label = _("_Titles");
- titles.tooltip = _("Display the title of each photo");
- toggle_actions += titles;
+ private const GLib.ActionEntry[] entries = {
+ { "ImportSelected", on_import_selected },
+ { "ImportAll", on_import_all },
+ // Toggle actions
+ { "ViewTitle", on_action_toggle, null, "false", on_display_titles },
+ };
- return toggle_actions;
- }
+ protected override void add_actions () {
+ base.add_actions ();
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry import_selected = { "ImportSelected", Resources.IMPORT,
- TRANSLATABLE, null, null, on_import_selected };
- import_selected.label = _("Import _Selected");
- import_selected.tooltip = _("Import the selected photos into your library");
- actions += import_selected;
+ AppWindow.get_instance ().add_action_entries (entries, this);
- Gtk.ActionEntry import_all = { "ImportAll", Resources.IMPORT_ALL, TRANSLATABLE,
- null, null, on_import_all };
- import_all.label = _("Import _All");
- import_all.tooltip = _("Import all the photos into your library");
- actions += import_all;
-
- return actions;
+ (get_action ("ViewTitle") as GLib.SimpleAction).set_state (Config.Facade.get_instance
().get_display_photo_titles ());
}
public GPhoto.Camera get_camera() {
@@ -948,8 +933,7 @@ public class ImportPage : CheckerboardPage {
private void on_view_changed() {
set_action_sensitive("ImportSelected", !busy && refreshed && get_view().get_selected_count() > 0);
set_action_sensitive("ImportAll", !busy && refreshed && get_view().get_count() > 0);
- AppWindow.get_instance().set_common_action_sensitive("CommonSelectAll",
- !busy && (get_view().get_count() > 0));
+ set_action_sensitive("CommonSelectAll", !busy && (get_view().get_count() > 0));
update_toolbar_state();
}
@@ -958,13 +942,15 @@ public class ImportPage : CheckerboardPage {
search_filter.refresh();
}
- private void on_display_titles(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ private void on_display_titles(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
set_display_titles(display);
+
Config.Facade.get_instance().set_display_photo_titles(display);
+ action.set_state (value);
}
-
+
public override void switched_to() {
set_display_titles(Config.Facade.get_instance().get_display_photo_titles());
@@ -1791,10 +1777,8 @@ public class ImportPage : CheckerboardPage {
public override void set_display_titles(bool display) {
base.set_display_titles(display);
-
- Gtk.ToggleAction? action = get_action("ViewTitle") as Gtk.ToggleAction;
- if (action != null)
- action.set_active(display);
+
+ set_action_active ("ViewTitle", display);
}
// Gets the search view filter for this page.
diff --git a/src/direct/DirectPhotoPage.vala b/src/direct/DirectPhotoPage.vala
index 2a56887..57dfe11 100644
--- a/src/direct/DirectPhotoPage.vala
+++ b/src/direct/DirectPhotoPage.vala
@@ -38,184 +38,49 @@ public class DirectPhotoPage : EditingHostPage {
ui_filenames.add("direct_context.ui");
ui_filenames.add("direct.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry file = { "FileMenu", null, TRANSLATABLE, null, null, null };
- file.label = _("_File");
- actions += file;
-
- Gtk.ActionEntry save = { "Save", Resources.SAVE_LABEL, TRANSLATABLE, "<Ctrl>S", TRANSLATABLE,
- on_save };
- save.label = _("_Save");
- save.tooltip = _("Save photo");
- actions += save;
-
- Gtk.ActionEntry save_as = { "SaveAs", Resources.SAVE_AS_LABEL, TRANSLATABLE,
- "<Ctrl><Shift>S", TRANSLATABLE, on_save_as };
- save_as.label = _("Save _As…");
- save_as.tooltip = _("Save photo with a different name");
- actions += save_as;
-
- Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
- TRANSLATABLE, on_send_to };
- send_to.label = Resources.SEND_TO_MENU;
- actions += send_to;
-
- Gtk.ActionEntry print = { "Print", Resources.PRINT_LABEL, TRANSLATABLE, "<Ctrl>P",
- TRANSLATABLE, on_print };
- print.label = Resources.PRINT_MENU;
- print.tooltip = _("Print the photo to a printer connected to your computer");
- actions += print;
-
- Gtk.ActionEntry edit = { "EditMenu", null, TRANSLATABLE, null, null, null };
- edit.label = _("_Edit");
- actions += edit;
-
- Gtk.ActionEntry photo = { "PhotoMenu", null, "", null, null, null };
- photo.label = _("_Photo");
- actions += photo;
-
- Gtk.ActionEntry tools = { "Tools", null, TRANSLATABLE, null, null, null };
- tools.label = _("T_ools");
- actions += tools;
-
- Gtk.ActionEntry prev = { "PrevPhoto", Resources.PREVIOUS_LABEL, TRANSLATABLE, null,
- TRANSLATABLE, on_previous_photo };
- prev.label = _("_Previous Photo");
- prev.tooltip = _("Previous Photo");
- actions += prev;
-
- Gtk.ActionEntry next = { "NextPhoto", Resources.NEXT_LABEL, TRANSLATABLE, null,
- TRANSLATABLE, on_next_photo };
- next.label = _("_Next Photo");
- next.tooltip = _("Next Photo");
- actions += next;
-
- Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE,
- TRANSLATABLE, "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
- rotate_right.label = Resources.ROTATE_CW_MENU;
- rotate_right.tooltip = Resources.ROTATE_CCW_TOOLTIP;
- actions += rotate_right;
-
- Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
- TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
- rotate_left.label = Resources.ROTATE_CCW_MENU;
- rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
- actions += rotate_left;
-
- Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
- TRANSLATABLE, on_flip_horizontally };
- hflip.label = Resources.HFLIP_MENU;
- actions += hflip;
-
- Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
- TRANSLATABLE, on_flip_vertically };
- vflip.label = Resources.VFLIP_MENU;
- actions += vflip;
-
- Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
- TRANSLATABLE, on_enhance };
- enhance.label = Resources.ENHANCE_MENU;
- enhance.tooltip = Resources.ENHANCE_TOOLTIP;
- actions += enhance;
-
- Gtk.ActionEntry crop = { "Crop", Resources.CROP, TRANSLATABLE, "<Ctrl>O",
- TRANSLATABLE, toggle_crop };
- crop.label = Resources.CROP_MENU;
- crop.tooltip = Resources.CROP_TOOLTIP;
- actions += crop;
-
- Gtk.ActionEntry straighten = { "Straighten", Resources.REFRESH_LABEL, TRANSLATABLE, "<Ctrl>A",
- TRANSLATABLE, toggle_straighten };
- straighten.label = Resources.STRAIGHTEN_MENU;
- straighten.tooltip = Resources.STRAIGHTEN_TOOLTIP;
- actions += straighten;
-
- Gtk.ActionEntry red_eye = { "RedEye", Resources.REDEYE, TRANSLATABLE, "<Ctrl>Y",
- TRANSLATABLE, toggle_redeye };
- red_eye.label = Resources.RED_EYE_MENU;
- red_eye.tooltip = Resources.RED_EYE_TOOLTIP;
- actions += red_eye;
-
- Gtk.ActionEntry adjust = { "Adjust", Resources.ADJUST, TRANSLATABLE, "<Ctrl>D",
- TRANSLATABLE, toggle_adjust };
- adjust.label = Resources.ADJUST_MENU;
- adjust.tooltip = Resources.ADJUST_TOOLTIP;
- actions += adjust;
-
- Gtk.ActionEntry revert = { "Revert", Resources.REVERT_LABEL, TRANSLATABLE,
- null, TRANSLATABLE, on_revert };
- revert.label = Resources.REVERT_MENU;
- actions += revert;
-
- Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
- TRANSLATABLE, on_adjust_date_time };
- adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
- actions += adjust_date_time;
-
- Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
- TRANSLATABLE, on_set_background };
- set_background.label = Resources.SET_BACKGROUND_MENU;
- set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
- actions += set_background;
-
- Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, null };
- view.label = _("_View");
- actions += view;
-
- Gtk.ActionEntry help = { "HelpMenu", null, TRANSLATABLE, null, null, null };
- help.label = _("_Help");
- actions += help;
-
- Gtk.ActionEntry increase_size = { "IncreaseSize", Resources.ZOOM_IN_LABEL, TRANSLATABLE,
- "<Ctrl>plus", TRANSLATABLE, on_increase_size };
- increase_size.label = _("Zoom _In");
- increase_size.tooltip = _("Increase the magnification of the photo");
- actions += increase_size;
-
- Gtk.ActionEntry decrease_size = { "DecreaseSize", Resources.ZOOM_OUT_LABEL, TRANSLATABLE,
- "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
- decrease_size.label = _("Zoom _Out");
- decrease_size.tooltip = _("Decrease the magnification of the photo");
- actions += decrease_size;
-
- Gtk.ActionEntry best_fit = { "ZoomFit", Resources.ZOOM_FIT_LABEL, TRANSLATABLE,
- "<Ctrl>0", TRANSLATABLE, snap_zoom_to_min };
- best_fit.label = _("Fit to _Page");
- best_fit.tooltip = _("Zoom the photo to fit on the screen");
- actions += best_fit;
-
- Gtk.ActionEntry actual_size = { "Zoom100", Resources.ZOOM_100_LABEL, TRANSLATABLE,
- "<Ctrl>1", TRANSLATABLE, snap_zoom_to_isomorphic };
- /// xgettext:no-c-format
- actual_size.label = _("Zoom _100%");
- /// xgettext:no-c-format
- actual_size.tooltip = _("Zoom the photo to 100% magnification");
- actions += actual_size;
-
- Gtk.ActionEntry max_size = { "Zoom200", null, TRANSLATABLE,
- "<Ctrl>2", TRANSLATABLE, snap_zoom_to_max };
- /// xgettext:no-c-format
- max_size.label = _("Zoom _200%");
- /// xgettext:no-c-format
- max_size.tooltip = _("Zoom the photo to 200% magnification");
- actions += max_size;
- return actions;
+ private const GLib.ActionEntry[] entries = {
+ { "Save", on_save },
+ { "SaveAs", on_save_as },
+ { "SendTo", on_send_to },
+ { "Print", on_print },
+ { "PrevPhoto", on_previous_photo },
+ { "NextPhoto", on_next_photo },
+ { "RotateClockwise", on_rotate_clockwise },
+ { "RotateCounterclockwise", on_rotate_counterclockwise },
+ { "FlipHorizontally", on_flip_horizontally },
+ { "FlipVertically", on_flip_vertically },
+ { "Enhance", on_enhance },
+ { "Crop", toggle_crop },
+ { "Straighten", toggle_straighten },
+ { "RedEye", toggle_redeye },
+ { "Adjust", toggle_adjust },
+ { "Revert", on_revert },
+ { "AdjustDateTime", on_adjust_date_time },
+ { "SetBackground", on_set_background },
+ { "IncreaseSize", on_increase_size },
+ { "DecreaseSize", on_decrease_size },
+ { "ZoomFit", snap_zoom_to_min },
+ { "Zoom100", snap_zoom_to_isomorphic },
+ { "Zoom200", snap_zoom_to_max }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
protected override InjectionGroup[] init_collect_injection_groups() {
InjectionGroup[] groups = base.init_collect_injection_groups();
- InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
- print_group.add_menu_item("Print");
+ InjectionGroup print_group = new InjectionGroup("PrintPlaceholder");
+ print_group.add_menu_item(_("_Print"), "Print", "<Primary>p");
groups += print_group;
- InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
- bg_group.add_menu_item("SetBackground");
+ InjectionGroup bg_group = new InjectionGroup("SetBackgroundPlaceholder");
+ bg_group.add_menu_item(_("Set as _Desktop Background"), "SetBackground");
groups += bg_group;
@@ -274,8 +139,8 @@ public class DirectPhotoPage : EditingHostPage {
}
protected override bool on_context_buttonpress(Gdk.EventButton event) {
- Gtk.Menu context_menu = (Gtk.Menu) ui.get_widget("/DirectContextMenu");
- popup_context_menu(context_menu, event);
+// Gtk.Menu context_menu = (Gtk.Menu) ui.get_widget("/DirectContextMenu");
+// popup_context_menu(context_menu, event);
return true;
}
diff --git a/src/events/EventPage.vala b/src/events/EventPage.vala
index fdaf80b..8b271d1 100644
--- a/src/events/EventPage.vala
+++ b/src/events/EventPage.vala
@@ -46,27 +46,19 @@ public class EventPage : CollectionPage {
ui_filenames.add("event.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] new_actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry make_primary = { "MakePrimary", Resources.MAKE_PRIMARY,
- TRANSLATABLE, null, TRANSLATABLE, on_make_primary };
- make_primary.label = Resources.MAKE_KEY_PHOTO_MENU;
- new_actions += make_primary;
- Gtk.ActionEntry rename = { "Rename", null, TRANSLATABLE, null, TRANSLATABLE, on_rename };
- rename.label = Resources.RENAME_EVENT_MENU;
- new_actions += rename;
+ private const GLib.ActionEntry[] entries = {
+ { "MakePrimary", on_make_primary },
+ { "Rename", on_rename },
+ { "EditEventComment", on_edit_comment }
+ };
- Gtk.ActionEntry comment = { "EditEventComment", null, TRANSLATABLE, null,
- Resources.EDIT_EVENT_COMMENT_MENU, on_edit_comment};
- comment.label = Resources.EDIT_EVENT_COMMENT_MENU;
- new_actions += comment;
+ protected override void add_actions () {
+ base.add_actions ();
- return new_actions;
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
-
+
protected override void init_actions(int selected_count, int count) {
base.init_actions(selected_count, count);
}
diff --git a/src/events/EventsDirectoryPage.vala b/src/events/EventsDirectoryPage.vala
index 75ac468..2e0624f 100644
--- a/src/events/EventsDirectoryPage.vala
+++ b/src/events/EventsDirectoryPage.vala
@@ -54,7 +54,7 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
get_view().set_property(Event.PROP_SHOW_COMMENTS,
Config.Facade.get_instance().get_display_event_comments());
- init_item_context_menu("/EventsDirectoryContextMenu");
+ init_item_context_menu("EventsDirectoryContextMenu");
this.view_manager = view_manager;
@@ -63,15 +63,18 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
// merge tool
Gtk.ToolButton merge_button = new Gtk.ToolButton.from_stock(Resources.MERGE);
- merge_button.set_related_action(get_action("Merge"));
+ merge_button.set_action_name("win.Merge");
+ merge_button.is_important = true;
+ merge_button.set_tooltip_text (Resources.MERGE_TOOLTIP);
+ merge_button.set_label (Resources.MERGE_LABEL);
toolbar.insert(merge_button, -1);
}
~EventsDirectoryPage() {
- Gtk.RadioAction? action = get_action("CommonSortEventsAscending") as Gtk.RadioAction;
+ var action = get_action("CommonSortEvents") as GLib.SimpleAction;
assert(action != null);
- action.changed.disconnect(on_sort_changed);
+ action.change_state.disconnect(on_sort_changed);
}
protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
@@ -101,45 +104,30 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
else
return event_descending_comparator;
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry rename = { "Rename", null, TRANSLATABLE, "F2", TRANSLATABLE, on_rename };
- rename.label = Resources.RENAME_EVENT_MENU;
- actions += rename;
-
- Gtk.ActionEntry merge = { "Merge", Resources.MERGE, TRANSLATABLE, null, Resources.MERGE_TOOLTIP,
- on_merge };
- merge.label = Resources.MERGE_MENU;
- actions += merge;
-
- Gtk.ActionEntry comment = { "EditComment", null, TRANSLATABLE, null, Resources.EDIT_COMMENT_MENU,
- on_edit_comment };
- comment.label = Resources.EDIT_COMMENT_MENU;
- actions += comment;
-
- return actions;
- }
-
- protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
- Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
-
- Gtk.ToggleActionEntry comments = { "ViewComment", null, TRANSLATABLE, "<Ctrl><Shift>C",
- TRANSLATABLE, on_display_comments, Config.Facade.get_instance().get_display_event_comments() };
- comments.label = _("_Comments");
- comments.tooltip = _("Display the comment of each event");
- toggle_actions += comments;
-
- return toggle_actions;
+
+ private const GLib.ActionEntry[] entries = {
+ { "Rename", on_rename },
+ { "Merge", on_merge },
+ { "EditComment", on_edit_comment },
+
+ // Toggle actions
+ { "ViewComment", on_action_toggle, null, "false", on_display_comments }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+ AppWindow.get_instance ().add_action_entries (entries, this);
+
+ (get_action ("ViewComment") as GLib.SimpleAction).set_state
+ (Config.Facade.get_instance().get_display_event_comments());
}
protected override void init_actions(int selected_count, int count) {
base.init_actions(selected_count, count);
- Gtk.RadioAction? action = get_action("CommonSortEventsAscending") as Gtk.RadioAction;
+ var action = get_action("CommonSortEvents") as GLib.SimpleAction;
assert(action != null);
- action.changed.connect(on_sort_changed);
+ action.change_state.connect(on_sort_changed);
}
protected override void update_actions(int selected_count, int count) {
@@ -165,12 +153,12 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
LibraryWindow.get_app().switch_to_event(event.event);
}
- private void on_sort_changed(Gtk.Action action, Gtk.Action c) {
- Gtk.RadioAction current = (Gtk.RadioAction) c;
-
+ private void on_sort_changed(GLib.SimpleAction action, Variant? value) {
get_view().set_comparator(
- get_event_comparator(current.current_value == LibraryWindow.SORT_EVENTS_ORDER_ASCENDING),
+ get_event_comparator(value.get_string() == LibraryWindow.SORT_EVENTS_ORDER_ASCENDING),
event_comparator_predicate);
+
+ action.set_state (value);
}
private void on_rename() {
@@ -213,12 +201,14 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
get_command_manager().execute(command);
}
- private void on_display_comments(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ private void on_display_comments(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
set_display_comments(display);
Config.Facade.get_instance().set_display_event_comments(display);
+
+ action.set_state (value);
}
public override SearchViewFilter get_search_view_filter() {
diff --git a/src/library/ImportQueuePage.vala b/src/library/ImportQueuePage.vala
index b5a5eb6..a2f2290 100644
--- a/src/library/ImportQueuePage.vala
+++ b/src/library/ImportQueuePage.vala
@@ -30,7 +30,7 @@ public class ImportQueuePage : SinglePhotoPage {
// Stop button
Gtk.ToolButton stop_button = new Gtk.ToolButton(null, null);
stop_button.set_icon_name("stop");
- stop_button.set_related_action(get_action("Stop"));
+ stop_button.set_action_name ("win.Stop");
toolbar.insert(stop_button, -1);
@@ -58,17 +58,15 @@ public class ImportQueuePage : SinglePhotoPage {
base.init_collect_ui_filenames(ui_filenames);
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry stop = { "Stop", Resources.STOP_LABEL, TRANSLATABLE, null, TRANSLATABLE,
- on_stop };
- stop.label = _("_Stop Import");
- stop.tooltip = _("Stop importing photos");
- actions += stop;
- return actions;
+ private const GLib.ActionEntry[] entries = {
+ {"Stop", on_stop }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
public void enqueue_and_schedule(BatchImport batch_import, bool allow_user_cancel) {
diff --git a/src/library/LibraryWindow.vala b/src/library/LibraryWindow.vala
index b464f11..e6b9d11 100644
--- a/src/library/LibraryWindow.vala
+++ b/src/library/LibraryWindow.vala
@@ -13,8 +13,8 @@ public class LibraryWindow : AppWindow {
}
}
- public const int SORT_EVENTS_ORDER_ASCENDING = 0;
- public const int SORT_EVENTS_ORDER_DESCENDING = 1;
+ public const string SORT_EVENTS_ORDER_ASCENDING = "ascending";
+ public const string SORT_EVENTS_ORDER_DESCENDING = "descending";
private const string[] SUPPORTED_MOUNT_SCHEMES = {
"gphoto2:",
@@ -98,8 +98,6 @@ public class LibraryWindow : AppWindow {
private Gtk.Paned client_paned = new Gtk.Paned(Gtk.Orientation.HORIZONTAL);
private Gtk.Frame bottom_frame = new Gtk.Frame(null);
- private Gtk.ActionGroup common_action_group = new Gtk.ActionGroup("LibraryWindowGlobalActionGroup");
-
private OneShotScheduler properties_scheduler = null;
private bool notify_library_is_home_dir = true;
@@ -176,7 +174,7 @@ public class LibraryWindow : AppWindow {
// setup search bar and add its accelerators to the window
search_toolbar = new SearchFilterToolbar(search_actions);
- try {
+/* try {
File ui_file = Resources.get_ui("top.ui");
ui.add_ui_from_file(ui_file.get_path());
} catch (Error e) {
@@ -189,6 +187,7 @@ public class LibraryWindow : AppWindow {
// We never want to invoke show_all() on the menubar since that will show empty menus,
// which should be hidden.
menubar.no_show_all = true;
+ */
// create the main layout & start at the Library page
create_layout(library_branch.photos_entry.get_page());
@@ -276,227 +275,88 @@ public class LibraryWindow : AppWindow {
monitor.auto_import_preparing.disconnect(on_library_monitor_auto_import_preparing);
monitor.auto_import_progress.disconnect(on_library_monitor_auto_import_progress);
}
-
- private Gtk.ActionEntry[] create_common_actions() {
- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-
- Gtk.ActionEntry import = { "CommonFileImport", Resources.IMPORT,
- TRANSLATABLE, "<Ctrl>I", TRANSLATABLE, on_file_import };
- import.label = _("_Import From Folder…");
- import.tooltip = _("Import photos from disk to library");
- actions += import;
-
- Gtk.ActionEntry import_from_external = {
- "ExternalLibraryImport", Resources.IMPORT, TRANSLATABLE,
- null, TRANSLATABLE, on_external_library_import
- };
- import_from_external.label = _("Import From _Application…");
- actions += import_from_external;
-
- Gtk.ActionEntry sort = { "CommonSortEvents", null, TRANSLATABLE, null, null, null };
- sort.label = _("Sort _Events");
- actions += sort;
-
- Gtk.ActionEntry preferences = { "CommonPreferences", Resources.PREFERENCES_LABEL, TRANSLATABLE,
- null, TRANSLATABLE, on_preferences };
- preferences.label = Resources.PREFERENCES_MENU;
- actions += preferences;
-
- Gtk.ActionEntry empty = { "CommonEmptyTrash", null, TRANSLATABLE, null, null,
- on_empty_trash };
- empty.label = _("Empty T_rash");
- empty.tooltip = _("Delete all photos in the trash");
- actions += empty;
-
- Gtk.ActionEntry jump_to_event = { "CommonJumpToEvent", null, TRANSLATABLE, null,
- TRANSLATABLE, on_jump_to_event };
- jump_to_event.label = _("View Eve_nt for Photo");
- actions += jump_to_event;
-
- Gtk.ActionEntry find = { "CommonFind", null, TRANSLATABLE, null, null, on_find };
- find.label = _("_Find");
- find.tooltip = _("Find photos and videos by search criteria");
- actions += find;
-
- // add the common action for the FilterPhotos submenu (the submenu contains items from
- // SearchFilterActions)
- Gtk.ActionEntry filter_photos = { "CommonFilterPhotos", null, TRANSLATABLE, null, null, null };
- filter_photos.label = Resources.FILTER_PHOTOS_MENU;
- actions += filter_photos;
-
- Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, "<Ctrl>S", null,
- on_new_search };
- new_search.label = _("Ne_w Saved Search…");
- actions += new_search;
- // top-level menus
-
- Gtk.ActionEntry file = { "FileMenu", null, TRANSLATABLE, null, null, null };
- file.label = _("_File");
- actions += file;
-
- Gtk.ActionEntry edit = { "EditMenu", null, TRANSLATABLE, null, null, null };
- edit.label = _("_Edit");
- actions += edit;
-
- Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, null };
- view.label = _("_View");
- actions += view;
-
- Gtk.ActionEntry photo = { "PhotoMenu", null, TRANSLATABLE, null, null, null };
- photo.label = _("_Photo");
- actions += photo;
-
- Gtk.ActionEntry photos = { "PhotosMenu", null, TRANSLATABLE, null, null, null };
- photos.label = _("_Photos");
- actions += photos;
-
- Gtk.ActionEntry event = { "EventsMenu", null, TRANSLATABLE, null, null, null };
- event.label = _("Even_ts");
- actions += event;
-
- Gtk.ActionEntry tags = { "TagsMenu", null, TRANSLATABLE, null, null, null };
- tags.label = _("Ta_gs");
- actions += tags;
-
- Gtk.ActionEntry help = { "HelpMenu", null, TRANSLATABLE, null, null, null };
- help.label = _("_Help");
- actions += help;
-
- return actions;
- }
-
- private Gtk.ToggleActionEntry[] create_common_toggle_actions() {
- Gtk.ToggleActionEntry[] actions = new Gtk.ToggleActionEntry[0];
-
- Gtk.ToggleActionEntry basic_props = { "CommonDisplayBasicProperties", null,
- TRANSLATABLE, "<Ctrl><Shift>I", TRANSLATABLE, on_display_basic_properties, false };
- basic_props.label = _("_Basic Information");
- basic_props.tooltip = _("Display basic information for the selection");
- actions += basic_props;
-
- Gtk.ToggleActionEntry extended_props = { "CommonDisplayExtendedProperties", null,
- TRANSLATABLE, "<Ctrl><Shift>X", TRANSLATABLE, on_display_extended_properties, false };
- extended_props.label = _("E_xtended Information");
- extended_props.tooltip = _("Display extended information for the selection");
- actions += extended_props;
-
- Gtk.ToggleActionEntry searchbar = { "CommonDisplaySearchbar", "edit-find", TRANSLATABLE,
- "F8", TRANSLATABLE, on_display_searchbar, is_search_toolbar_visible };
- searchbar.label = _("_Search Bar");
- searchbar.tooltip = _("Display the search bar");
- actions += searchbar;
-
- Gtk.ToggleActionEntry sidebar = { "CommonDisplaySidebar", null, TRANSLATABLE,
- "F9", TRANSLATABLE, on_display_sidebar, is_sidebar_visible() };
- sidebar.label = _("S_idebar");
- sidebar.tooltip = _("Display the sidebar");
- actions += sidebar;
-
- Gtk.ToggleActionEntry toolbar = { "CommonDisplayToolbar", null, TRANSLATABLE,
- "<Ctrl>F9", TRANSLATABLE, on_display_toolbar, is_toolbar_visible() };
- toolbar.label = _("T_oolbar");
- toolbar.tooltip = _("Display the tool bar");
- actions += toolbar;
-
- return actions;
- }
-
- private void add_common_radio_actions(Gtk.ActionGroup group) {
- Gtk.RadioActionEntry[] actions = new Gtk.RadioActionEntry[0];
-
- Gtk.RadioActionEntry ascending = { "CommonSortEventsAscending",
- Resources.SORT_ASCENDING_LABEL, TRANSLATABLE, null, TRANSLATABLE,
- SORT_EVENTS_ORDER_ASCENDING };
- ascending.label = _("_Ascending");
- ascending.tooltip = _("Sort photos in an ascending order");
- actions += ascending;
+ private const GLib.ActionEntry[] common_actions = {
+ // Normal actions
+ { "CommonFileImport", on_file_import },
+ { "ExternalLibraryImport", on_external_library_import },
+ { "CommonPreferences", on_preferences },
+ { "CommonEmptyTrash", on_empty_trash },
+ { "CommonJumpToEvent", on_jump_to_event },
+ { "CommonFind", on_find },
+ { "CommonNewSearch", on_new_search },
- Gtk.RadioActionEntry descending = { "CommonSortEventsDescending",
- Resources.SORT_DESCENDING_LABEL, TRANSLATABLE, null, TRANSLATABLE,
- SORT_EVENTS_ORDER_DESCENDING };
- descending.label = _("D_escending");
- descending.tooltip = _("Sort photos in a descending order");
- actions += descending;
-
- group.add_radio_actions(actions, SORT_EVENTS_ORDER_ASCENDING, on_events_sort_changed);
- }
-
- protected override Gtk.ActionGroup[] create_common_action_groups() {
- Gtk.ActionGroup[] groups = base.create_common_action_groups();
-
- common_action_group.add_actions(create_common_actions(), this);
- common_action_group.add_toggle_actions(create_common_toggle_actions(), this);
- add_common_radio_actions(common_action_group);
-
- Gtk.Action? action = common_action_group.get_action("CommonDisplaySearchbar");
- if (action != null) {
- action.short_label = Resources.FIND_LABEL;
- action.is_important = true;
- }
-
- groups += common_action_group;
- groups += search_actions.get_action_group();
-
- return groups;
- }
-
- public override void replace_common_placeholders(Gtk.UIManager ui) {
- base.replace_common_placeholders(ui);
+ // Toogle actions
+ { "CommonDisplayBasicProperties", on_action_toggle, null, "false", on_display_basic_properties },
+ { "CommonDisplayExtendedProperties", on_action_toggle, null, "false", on_display_extended_properties
},
+
+#if 0
+ { "CommonDisplaySearchbar", on_display_searchbar, null, is_search_toolbar_visible.to_string () },
+ { "CommonDisplaySidebar", on_display_sidebar, null, is_sidebar_visible ().to_string () },
+ { "CommonDisplayToolbar", on_display_toolbar, null, is_toolbar_visible ().to_string () }
+#endif
+ { "CommonDisplaySearchbar", on_action_toggle, null, "false", on_display_searchbar },
+ { "CommonDisplaySidebar", on_action_toggle, null, "true", on_display_sidebar },
+ { "CommonDisplayToolbar", on_action_toggle, null, "true", on_display_toolbar },
+
+ { "CommonSortEvents", on_action_radio, "s", "'ascending'", on_events_sort_changed }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+ this.add_action_entries (common_actions, this);
+ this.add_action_entries (search_actions.get_actions (), search_actions);
}
-
+
protected override void switched_pages(Page? old_page, Page? new_page) {
base.switched_pages(old_page, new_page);
-
+
// monitor when the ViewFilter is changed in any page
if (old_page != null) {
old_page.get_view().view_filter_installed.disconnect(on_view_filter_installed);
old_page.get_view().view_filter_removed.disconnect(on_view_filter_removed);
}
-
+
if (new_page != null) {
new_page.get_view().view_filter_installed.connect(on_view_filter_installed);
new_page.get_view().view_filter_removed.connect(on_view_filter_removed);
}
-
+
search_actions.monitor_page_contents(old_page, new_page);
}
-
+
private void on_view_filter_installed(ViewFilter filter) {
filter.refresh.connect(on_view_filter_refreshed);
}
-
+
private void on_view_filter_removed(ViewFilter filter) {
filter.refresh.disconnect(on_view_filter_refreshed);
}
-
+
private void on_view_filter_refreshed() {
// if view filter is reset to show all items, do nothing (leave searchbar in current
// state)
if (!get_current_page().get_view().are_items_filtered_out())
return;
-
+
// always show the searchbar when items are filtered
- Gtk.ToggleAction? display_searchbar = get_common_action("CommonDisplaySearchbar")
- as Gtk.ToggleAction;
- if (display_searchbar != null)
- display_searchbar.active = true;
+ var action = this.lookup_action ("CommonDisplaySearchbar") as
+ GLib.SimpleAction;
+
+ if (action != null)
+ action.set_state (true);
}
-
+
// show_all() may make visible certain items we wish to keep programmatically hidden
public override void show_all() {
base.show_all();
-
- Gtk.ToggleAction? basic_properties_action = get_current_page().get_common_action(
- "CommonDisplayBasicProperties") as Gtk.ToggleAction;
+
+ var basic_properties_action = get_current_page ().get_common_action
+ ("CommonDisplayBasicProperties");
assert(basic_properties_action != null);
-
- if (!basic_properties_action.get_active())
+
+ if (!basic_properties_action.get_state().get_boolean())
bottom_frame.hide();
-
- Gtk.ToggleAction? searchbar_action = get_current_page().get_common_action(
- "CommonDisplaySearchbar") as Gtk.ToggleAction;
- assert(searchbar_action != null);
// Make sure rejected pictures are not being displayed on startup
CheckerboardPage? current_page = get_current_page() as CheckerboardPage;
@@ -504,27 +364,27 @@ public class LibraryWindow : AppWindow {
init_view_filter(current_page);
toggle_search_bar(should_show_search_bar(), current_page);
-
+
// Sidebar
set_sidebar_visible(is_sidebar_visible());
}
-
+
public static LibraryWindow get_app() {
assert(instance is LibraryWindow);
-
+
return (LibraryWindow) instance;
}
-
+
// This may be called before Debug.init(), so no error logging may be made
public static bool is_mount_uri_supported(string uri) {
foreach (string scheme in SUPPORTED_MOUNT_SCHEMES) {
if (uri.has_prefix(scheme))
return true;
}
-
+
return false;
}
-
+
public override string get_app_role() {
return Resources.APP_LIBRARY_ROLE;
}
@@ -536,7 +396,7 @@ public class LibraryWindow : AppWindow {
else
debug("No tag entry found for rename");
}
-
+
public void rename_event_in_sidebar(Event event) {
Events.EventEntry? entry = events_branch.get_entry_for_event(event);
if (entry != null)
@@ -544,7 +404,7 @@ public class LibraryWindow : AppWindow {
else
debug("No event entry found for rename");
}
-
+
public void rename_search_in_sidebar(SavedSearch search) {
Searches.SidebarEntry? entry = saved_search_branch.get_entry_for_saved_search(search);
if (entry != null)
@@ -552,28 +412,28 @@ public class LibraryWindow : AppWindow {
else
debug("No search entry found for rename");
}
-
+
protected override void on_quit() {
Config.Facade.get_instance().set_library_window_state(maximized, dimensions);
Config.Facade.get_instance().set_sidebar_position(client_paned.position);
-
+
base.on_quit();
}
-
+
private Photo? get_start_fullscreen_photo(CollectionPage page) {
ViewCollection view = page.get_view();
-
+
// if a selection is present, use the first selected LibraryPhoto, otherwise do
// nothing; if no selection present, use the first LibraryPhoto
Gee.List<DataSource>? sources = (view.get_selected_count() > 0)
? view.get_selected_sources_of_type(typeof(LibraryPhoto))
: view.get_sources_of_type(typeof(LibraryPhoto));
-
+
return (sources != null && sources.size != 0)
? (Photo) sources[0] : null;
}
-
+
private bool get_fullscreen_photo(Page page, out CollectionPage collection, out Photo start,
out ViewCollection? view_collection = null) {
collection = null;
@@ -586,7 +446,7 @@ public class LibraryWindow : AppWindow {
Photo? photo = get_start_fullscreen_photo(collection);
if (photo == null)
return false;
-
+
start = photo;
view_collection = null;
@@ -601,11 +461,11 @@ public class LibraryWindow : AppWindow {
Event? event = (Event?) ((DataView) view.get_at(0)).get_source();
if (event == null)
return false;
-
+
Events.EventEntry? entry = events_branch.get_entry_for_event(event);
if (entry == null)
return false;
-
+
collection = (EventPage) entry.get_page();
Photo? photo = get_start_fullscreen_photo(collection);
if (photo == null)
@@ -616,7 +476,7 @@ public class LibraryWindow : AppWindow {
return true;
}
-
+
if (page is LibraryPhotoPage) {
LibraryPhotoPage photo_page = (LibraryPhotoPage) page;
@@ -626,11 +486,11 @@ public class LibraryWindow : AppWindow {
if (!photo_page.has_photo())
return false;
-
+
collection = controller;
start = photo_page.get_photo();
view_collection = photo_page.get_view();
-
+
return true;
}
@@ -652,7 +512,7 @@ public class LibraryWindow : AppWindow {
go_fullscreen(fs_photo);
}
-
+
private void on_file_import() {
Gtk.FileChooserDialog import_dialog = new Gtk.FileChooserDialog(_("Import From Folder"), null,
Gtk.FileChooserAction.SELECT_FOLDER, Resources.CANCEL_LABEL, Gtk.ResponseType.CANCEL,
@@ -670,7 +530,7 @@ public class LibraryWindow : AppWindow {
? Gtk.ResponseType.REJECT : copy_files_dialog();
if (copy_files_response != Gtk.ResponseType.CANCEL) {
- dispatch_import_jobs(import_dialog.get_uris(), "folders",
+ dispatch_import_jobs(import_dialog.get_uris(), "folders",
copy_files_response == Gtk.ResponseType.ACCEPT);
}
}
@@ -689,7 +549,7 @@ public class LibraryWindow : AppWindow {
base.update_common_action_availability(old_page, new_page);
bool is_checkerboard = new_page is CheckerboardPage;
-
+
set_common_action_sensitive("CommonDisplaySearchbar", is_checkerboard);
set_common_action_sensitive("CommonFind", is_checkerboard);
}
@@ -717,7 +577,7 @@ public class LibraryWindow : AppWindow {
private bool can_empty_trash() {
return (LibraryPhoto.global.get_trashcan_count() > 0) || (Video.global.get_trashcan_count() > 0);
}
-
+
private void on_empty_trash() {
Gee.ArrayList<MediaSource> to_remove = new Gee.ArrayList<MediaSource>();
to_remove.add_all(LibraryPhoto.global.get_trashcan_contents());
@@ -762,10 +622,10 @@ public class LibraryWindow : AppWindow {
}
private void on_find() {
- Gtk.ToggleAction action = (Gtk.ToggleAction) get_current_page().get_common_action(
- "CommonDisplaySearchbar");
- action.active = true;
-
+ var action = this.lookup_action ("CommonDisplaySearchbar") as
+ GLib.SimpleAction;
+ action.set_state (true);
+
// give it focus (which should move cursor to the text entry control)
search_toolbar.take_focus();
}
@@ -780,24 +640,27 @@ public class LibraryWindow : AppWindow {
}
public int get_events_sort() {
- Gtk.RadioAction? action = get_common_action("CommonSortEventsAscending") as Gtk.RadioAction;
+ var action = this.lookup_action ("CommonSortEvents") as GLib.SimpleAction;
- return (action != null) ? action.current_value : SORT_EVENTS_ORDER_DESCENDING;
+ return (action != null) ? (action.state.get_string () == SORT_EVENTS_ORDER_ASCENDING)
+ ? 0 : 1
+ : 1;
}
- private void on_events_sort_changed(Gtk.Action action, Gtk.Action c) {
- Gtk.RadioAction current = (Gtk.RadioAction) c;
+ private void on_events_sort_changed(GLib.SimpleAction action, Variant? value) {
Config.Facade.get_instance().set_events_sort_ascending(
- current.current_value == SORT_EVENTS_ORDER_ASCENDING);
+ value.get_string () == SORT_EVENTS_ORDER_ASCENDING);
+
+ action.set_state (value);
}
private void on_preferences() {
PreferencesDialog.show();
}
- private void on_display_basic_properties(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ private void on_display_basic_properties(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
if (display) {
basic_properties.update_properties(get_current_page());
@@ -810,10 +673,20 @@ public class LibraryWindow : AppWindow {
// sync the setting so it will persist
Config.Facade.get_instance().set_display_basic_properties(display);
+ action.set_state (value);
+ }
+
+ private void on_action_toggle (GLib.Action action, Variant? value) {
+ Variant new_state = ! (bool) action.get_state ();
+ action.change_state (new_state);
+ }
+
+ private void on_action_radio (GLib.Action action, Variant? value) {
+ action.change_state (value);
}
- private void on_display_extended_properties(Gtk.Action action) {
- bool display = ((Gtk.ToggleAction) action).get_active();
+ private void on_display_extended_properties(GLib.SimpleAction action, Variant? value) {
+ bool display = value.get_boolean ();
if (display) {
extended_properties.update_properties(get_current_page());
@@ -821,12 +694,17 @@ public class LibraryWindow : AppWindow {
} else {
extended_properties.hide();
}
+
+ action.set_state (value);
}
- private void on_display_searchbar(Gtk.Action action) {
- bool is_shown = ((Gtk.ToggleAction) action).get_active();
+ private void on_display_searchbar(GLib.SimpleAction action, Variant? value) {
+ bool is_shown = value.get_boolean ();
+
Config.Facade.get_instance().set_display_search_bar(is_shown);
show_search_bar(is_shown);
+
+ action.set_state (value);
}
public void show_search_bar(bool display) {
@@ -839,9 +717,10 @@ public class LibraryWindow : AppWindow {
search_actions.reset();
}
- private void on_display_sidebar(Gtk.Action action) {
- set_sidebar_visible(((Gtk.ToggleAction) action).get_active());
-
+ private void on_display_sidebar(GLib.SimpleAction action, Variant? variant) {
+ set_sidebar_visible(variant.get_boolean ());
+
+ action.set_state (variant);
}
private void set_sidebar_visible(bool visible) {
@@ -853,8 +732,10 @@ public class LibraryWindow : AppWindow {
return Config.Facade.get_instance().get_display_sidebar();
}
- private void on_display_toolbar (Gtk.Action action) {
- set_toolbar_visible ((action as Gtk.ToggleAction).get_active ());
+ private void on_display_toolbar (GLib.SimpleAction action, Variant? variant) {
+ set_toolbar_visible (variant.get_boolean ());
+
+ action.set_state (variant);
}
private void set_toolbar_visible (bool visible) {
@@ -878,10 +759,9 @@ public class LibraryWindow : AppWindow {
}
private void sync_extended_properties(bool show) {
- Gtk.ToggleAction? extended_display_action = get_common_action("CommonDisplayExtendedProperties")
- as Gtk.ToggleAction;
- assert(extended_display_action != null);
- extended_display_action.set_active(show);
+ var action = this.lookup_action ("CommonDisplayExtendedProperties")
+ as GLib.SimpleAction;
+ action.set_state (show);
// sync the setting so it will persist
Config.Facade.get_instance().set_display_extended_properties(show);
@@ -966,7 +846,7 @@ public class LibraryWindow : AppWindow {
return true;
}
-
+
// since we cannot set a default action, we must set it when we spy a drag motion
Gdk.DragAction drag_action = get_drag_action();
@@ -1120,32 +1000,28 @@ public class LibraryWindow : AppWindow {
// check for settings that should persist between instances
private void load_configuration() {
- Gtk.ToggleAction? basic_display_action = get_common_action("CommonDisplayBasicProperties")
- as Gtk.ToggleAction;
+ var basic_display_action = lookup_action("CommonDisplayBasicProperties");
assert(basic_display_action != null);
- basic_display_action.set_active(Config.Facade.get_instance().get_display_basic_properties());
+ basic_display_action.change_state (Config.Facade.get_instance().get_display_basic_properties());
- Gtk.ToggleAction? extended_display_action = get_common_action("CommonDisplayExtendedProperties")
- as Gtk.ToggleAction;
+ var extended_display_action = lookup_action("CommonDisplayExtendedProperties");
assert(extended_display_action != null);
- extended_display_action.set_active(Config.Facade.get_instance().get_display_extended_properties());
+ extended_display_action.change_state(Config.Facade.get_instance().get_display_extended_properties());
- Gtk.ToggleAction? search_bar_display_action = get_common_action("CommonDisplaySearchbar")
- as Gtk.ToggleAction;
+ var search_bar_display_action = lookup_action("CommonDisplaySearchbar");
assert(search_bar_display_action != null);
- search_bar_display_action.set_active(Config.Facade.get_instance().get_display_search_bar());
+ search_bar_display_action.change_state(Config.Facade.get_instance().get_display_search_bar());
- Gtk.RadioAction? sort_events_action = get_common_action("CommonSortEventsAscending")
- as Gtk.RadioAction;
+ var sort_events_action = lookup_action("CommonSortEvents");
assert(sort_events_action != null);
// Ticket #3321 - Event sorting order wasn't saving on exit.
// Instead of calling set_active against one of the toggles, call
// set_current_value against the entire radio group...
- int event_sort_val = Config.Facade.get_instance().get_events_sort_ascending() ?
SORT_EVENTS_ORDER_ASCENDING :
+ string event_sort_val = Config.Facade.get_instance().get_events_sort_ascending() ?
SORT_EVENTS_ORDER_ASCENDING :
SORT_EVENTS_ORDER_DESCENDING;
- sort_events_action.set_current_value(event_sort_val);
+ sort_events_action.change_state (event_sort_val);
}
private void start_pulse_background_progress_bar(string label, int priority) {
@@ -1345,6 +1221,11 @@ public class LibraryWindow : AppWindow {
Page current_page = get_current_page();
if (current_page != null) {
+ var menubar = current_page.get_menubar ();
+ if (menubar != null) {
+ layout.remove (menubar);
+ }
+
Gtk.Toolbar toolbar = current_page.get_toolbar();
if (toolbar != null)
right_vbox.remove(toolbar);
@@ -1399,6 +1280,12 @@ public class LibraryWindow : AppWindow {
subscribe_for_basic_information(get_current_page());
page.switched_to();
+
+ var menubar = page.get_menubar ();
+ if (menubar != null) {
+ layout.pack_start (menubar, false, false);
+ menubar.show_all ();
+ }
Gtk.Toolbar toolbar = page.get_toolbar();
if (toolbar != null) {
diff --git a/src/library/OfflinePage.vala b/src/library/OfflinePage.vala
index 899dc53..bd916d0 100644
--- a/src/library/OfflinePage.vala
+++ b/src/library/OfflinePage.vala
@@ -28,8 +28,8 @@ public class OfflinePage : CheckerboardPage {
public OfflinePage() {
base (NAME);
- init_item_context_menu("/OfflineContextMenu");
- init_toolbar("/OfflineToolbar");
+ init_item_context_menu("OfflineContextMenu");
+ init_toolbar("OfflineToolbar");
tracker = new MediaViewTracker(get_view());
@@ -51,27 +51,24 @@ public class OfflinePage : CheckerboardPage {
ui_filenames.add("offline.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry remove = { "RemoveFromLibrary", Resources.REMOVE_LABEL, TRANSLATABLE, "Delete",
- TRANSLATABLE, on_remove_from_library };
- remove.label = Resources.REMOVE_FROM_LIBRARY_MENU;
- remove.tooltip = Resources.DELETE_FROM_LIBRARY_TOOLTIP;
- actions += remove;
-
- return actions;
+
+ private const GLib.ActionEntry[] entries = {
+ { "RemoveFromLibrary", on_remove_from_library }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
-
+
public override Core.ViewTracker? get_view_tracker() {
return tracker;
}
protected override void update_actions(int selected_count, int count) {
set_action_sensitive("RemoveFromLibrary", selected_count > 0);
- set_action_important("RemoveFromLibrary", true);
-
+
base.update_actions(selected_count, count);
}
diff --git a/src/library/TrashPage.vala b/src/library/TrashPage.vala
index 0a38ac0..943c5e1 100644
--- a/src/library/TrashPage.vala
+++ b/src/library/TrashPage.vala
@@ -28,9 +28,9 @@ public class TrashPage : CheckerboardPage {
public TrashPage() {
base (NAME);
- init_item_context_menu("/TrashContextMenu");
- init_page_context_menu("/TrashPageMenu");
- init_toolbar("/TrashToolbar");
+ init_item_context_menu("TrashContextMenu");
+ init_page_context_menu("TrashPageMenu");
+ init_toolbar("TrashToolbar");
tracker = new MediaViewTracker(get_view());
@@ -46,25 +46,18 @@ public class TrashPage : CheckerboardPage {
ui_filenames.add("trash.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry delete_action = { "Delete", Resources.DELETE_LABEL, TRANSLATABLE, "Delete",
- TRANSLATABLE, on_delete };
- delete_action.label = Resources.DELETE_PHOTOS_MENU;
- delete_action.tooltip = Resources.DELETE_FROM_TRASH_TOOLTIP;
- actions += delete_action;
-
- Gtk.ActionEntry restore = { "Restore", Resources.UNDELETE_LABEL, TRANSLATABLE, null, TRANSLATABLE,
- on_restore };
- restore.label = Resources.RESTORE_PHOTOS_MENU;
- restore.tooltip = Resources.RESTORE_PHOTOS_TOOLTIP;
- actions += restore;
-
- return actions;
+
+ private const GLib.ActionEntry[] entries = {
+ { "Delete", on_delete },
+ { "Restore", on_restore }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
-
+
public override Core.ViewTracker? get_view_tracker() {
return tracker;
}
diff --git a/src/org.gnome.Shotwell.gresource.xml b/src/org.gnome.Shotwell.gresource.xml
index a7e3d8d..abf7eb2 100644
--- a/src/org.gnome.Shotwell.gresource.xml
+++ b/src/org.gnome.Shotwell.gresource.xml
@@ -2,5 +2,9 @@
<gresources>
<gresource prefix="/org/gnome/Shotwell">
<file>crop-pivot-reticle.png</file>
+ <file>search_sidebar_context.ui</file>
+ <file>tag_sidebar_context.ui</file>
+ <file>sidebar_default_context.ui</file>
+ <file>search_bar.ui</file>
</gresource>
</gresources>
diff --git a/src/searches/Branch.vala b/src/searches/Branch.vala
index 0c86733..f557baa 100644
--- a/src/searches/Branch.vala
+++ b/src/searches/Branch.vala
@@ -61,45 +61,31 @@ public class Searches.Branch : Sidebar.Branch {
}
public class Searches.Header : Sidebar.Header, Sidebar.Contextable {
- private Gtk.UIManager ui = new Gtk.UIManager();
+ private Gtk.Builder builder;
private Gtk.Menu? context_menu = null;
public Header() {
base (_("Saved Searches"));
setup_context_menu();
}
-
+
private void setup_context_menu() {
- Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-
- Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, null, null, on_new_search };
- new_search.label = _("Ne_w Saved Search…");
- actions += new_search;
-
- group.add_actions(actions, this);
- ui.insert_action_group(group, 0);
-
- File ui_file = Resources.get_ui("search_sidebar_context.ui");
+ this.builder = new Gtk.Builder ();
try {
- ui.add_ui_from_file(ui_file.get_path());
- } catch (Error err) {
- AppWindow.error_message("Error loading UI file %s: %s".printf(
- ui_file.get_path(), err.message));
+ this.builder.add_from_resource
+ ("/org/gnome/Shotwell/search_sidebar_context.ui");
+ var model = builder.get_object ("popup-menu") as GLib.MenuModel;
+ this.context_menu = new Gtk.Menu.from_model (model);
+ } catch (Error error) {
+ AppWindow.error_message("Error loading UI resource: %s".printf(
+ error.message));
Application.get_instance().panic();
}
- context_menu = (Gtk.Menu) ui.get_widget("/SidebarSearchContextMenu");
-
- ui.ensure_update();
}
-
+
public Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event) {
return context_menu;
}
-
- private void on_new_search() {
- (new SavedSearchDialog()).show();
- }
}
public class Searches.SidebarEntry : Sidebar.SimplePageEntry, Sidebar.RenameableEntry,
diff --git a/src/searches/SavedSearchPage.vala b/src/searches/SavedSearchPage.vala
index 1693ca3..c57ec7d 100644
--- a/src/searches/SavedSearchPage.vala
+++ b/src/searches/SavedSearchPage.vala
@@ -31,7 +31,7 @@ public class SavedSearchPage : CollectionPage {
foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all())
get_view().monitor_source_collection(sources, new SavedSearchManager(this, search), null);
- init_page_context_menu("/SearchContextMenu");
+ init_page_context_menu("SearchContextMenu");
}
protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
@@ -46,20 +46,17 @@ public class SavedSearchPage : CollectionPage {
base.init_collect_ui_filenames(ui_filenames);
ui_filenames.add("savedsearch.ui");
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry rename_search = { "RenameSearch", null, TRANSLATABLE, null, null, on_rename_search };
- actions += rename_search;
-
- Gtk.ActionEntry edit_search = { "EditSearch", null, TRANSLATABLE, null, null, on_edit_search };
- actions += edit_search;
-
- Gtk.ActionEntry delete_search = { "DeleteSearch", null, TRANSLATABLE, null, null, on_delete_search };
- actions += delete_search;
-
- return actions;
+
+ private const GLib.ActionEntry[] entries = {
+ { "RenameSearch", on_rename_search },
+ { "EditSearch", on_edit_search },
+ { "DeleteSearch", on_delete_search }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
+
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
private void on_delete_search() {
@@ -77,15 +74,10 @@ public class SavedSearchPage : CollectionPage {
}
protected override void update_actions(int selected_count, int count) {
- set_action_details("RenameSearch",
- Resources.RENAME_SEARCH_MENU,
- null, true);
- set_action_details("EditSearch",
- Resources.EDIT_SEARCH_MENU,
- null, true);
- set_action_details("DeleteSearch",
- Resources.DELETE_SEARCH_MENU,
- null, true);
+ set_action_sensitive ("RenameSearch", true);
+ set_action_sensitive ("EditSearch", true);
+ set_action_sensitive ("DeleteSearch", true);
+
base.update_actions(selected_count, count);
}
}
diff --git a/src/sidebar/Tree.vala b/src/sidebar/Tree.vala
index 0fd9144..267c8de 100644
--- a/src/sidebar/Tree.vala
+++ b/src/sidebar/Tree.vala
@@ -59,7 +59,7 @@ public class Sidebar.Tree : Gtk.TreeView {
typeof (string?) // ICON
);
- private Gtk.UIManager ui = new Gtk.UIManager();
+ private Gtk.Builder builder = new Gtk.Builder ();
private Gtk.CellRendererText text_renderer;
private unowned ExternalDropHandler drop_handler;
private Gtk.Entry? text_entry = null;
@@ -190,33 +190,27 @@ public class Sidebar.Tree : Gtk.TreeView {
return false;
}
-
- private void setup_default_context_menu() {
- Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-
- Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, null, null, on_new_search };
- new_search.label = _("Ne_w Saved Search…");
- actions += new_search;
- Gtk.ActionEntry new_tag = { "CommonNewTag", null, TRANSLATABLE, null, null, on_new_tag };
- new_tag.label = _("New _Tag…");
- actions += new_tag;
-
- group.add_actions(actions, this);
- ui.insert_action_group(group, 0);
-
- File ui_file = Resources.get_ui("sidebar_default_context.ui");
+ private const GLib.ActionEntry[] entries = {
+ { "tag.new", on_new_tag },
+ { "search.new", on_new_search }
+ };
+
+ private void setup_default_context_menu() {
try {
- ui.add_ui_from_file(ui_file.get_path());
- } catch (Error err) {
- AppWindow.error_message("Error loading UI file %s: %s".printf(
- ui_file.get_path(), err.message));
+ this.builder.add_from_resource
+ ("/org/gnome/Shotwell/sidebar_default_context.ui");
+ var model = builder.get_object ("popup-menu") as GLib.MenuModel;
+ this.default_context_menu = new Gtk.Menu.from_model (model);
+ var group = new GLib.SimpleActionGroup ();
+ group.add_action_entries (entries, this);
+ this.insert_action_group ("sidebar", group);
+ this.default_context_menu.attach_to_widget (this, null);
+ } catch (Error error) {
+ AppWindow.error_message("Error loading UI resource: %s".printf(
+ error.message));
Application.get_instance().panic();
}
- default_context_menu = (Gtk.Menu) ui.get_widget("/SidebarDefaultContextMenu");
-
- ui.ensure_update();
}
private bool has_wrapper(Sidebar.Entry entry) {
@@ -852,6 +846,8 @@ public class Sidebar.Tree : Gtk.TreeView {
if (context_menu == null)
return false;
+ context_menu.attach_to_widget (this, null);
+
if (event != null)
context_menu.popup(null, null, null, event.button, event.time);
else
diff --git a/src/tags/Branch.vala b/src/tags/Branch.vala
index 0663fe4..41c6feb 100644
--- a/src/tags/Branch.vala
+++ b/src/tags/Branch.vala
@@ -124,38 +124,28 @@ public class Tags.Branch : Sidebar.Branch {
public class Tags.Header : Sidebar.Header, Sidebar.InternalDropTargetEntry,
Sidebar.InternalDragSourceEntry, Sidebar.Contextable {
- private Gtk.UIManager ui = new Gtk.UIManager();
+ private Gtk.Builder builder;
private Gtk.Menu? context_menu = null;
public Header() {
base (_("Tags"));
setup_context_menu();
}
-
+
private void setup_context_menu() {
- Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-
- Gtk.ActionEntry new_tag = { "CommonNewTag", null, TRANSLATABLE, null, null, on_new_tag };
- new_tag.label = Resources.NEW_CHILD_TAG_SIDEBAR_MENU;
- actions += new_tag;
-
- group.add_actions(actions, this);
- ui.insert_action_group(group, 0);
-
- File ui_file = Resources.get_ui("tag_sidebar_context.ui");
+ this.builder = new Gtk.Builder ();
try {
- ui.add_ui_from_file(ui_file.get_path());
- } catch (Error err) {
- AppWindow.error_message("Error loading UI file %s: %s".printf(
- ui_file.get_path(), err.message));
+ this.builder.add_from_resource
+ ("/org/gnome/Shotwell/tag_sidebar_context.ui");
+ var model = builder.get_object ("popup-menu") as GLib.MenuModel;
+ this.context_menu = new Gtk.Menu.from_model (model);
+ } catch (Error error) {
+ AppWindow.error_message("Error loading UI resource: %s".printf(
+ error.message));
Application.get_instance().panic();
}
- context_menu = (Gtk.Menu) ui.get_widget("/SidebarTagContextMenu");
-
- ui.ensure_update();
}
-
+
public bool internal_drop_received(Gee.List<MediaSource> media) {
AddTagsDialog dialog = new AddTagsDialog();
string[]? names = dialog.execute();
@@ -192,12 +182,6 @@ public class Tags.Header : Sidebar.Header, Sidebar.InternalDropTargetEntry,
public Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event) {
return context_menu;
}
-
- private void on_new_tag() {
- NewRootTagCommand creation_command = new NewRootTagCommand();
- AppWindow.get_command_manager().execute(creation_command);
- LibraryWindow.get_app().rename_tag_in_sidebar(creation_command.get_created_tag());
- }
}
public class Tags.SidebarEntry : Sidebar.SimplePageEntry, Sidebar.RenameableEntry,
diff --git a/src/tags/TagPage.vala b/src/tags/TagPage.vala
index 7e937ad..04696c5 100644
--- a/src/tags/TagPage.vala
+++ b/src/tags/TagPage.vala
@@ -15,7 +15,7 @@ public class TagPage : CollectionPage {
Tag.global.items_altered.connect(on_tags_altered);
tag.mirror_sources(get_view(), create_thumbnail);
- init_page_context_menu("/TagsContextMenu");
+ init_page_context_menu("TagsContextMenu");
}
~TagPage() {
@@ -39,44 +39,36 @@ public class TagPage : CollectionPage {
protected override void set_config_photos_sort(bool sort_order, int sort_by) {
Config.Facade.get_instance().set_event_photos_sort(sort_order, sort_by);
}
-
- protected override Gtk.ActionEntry[] init_collect_action_entries() {
- Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-
- Gtk.ActionEntry delete_tag = { "DeleteTag", null, TRANSLATABLE, null, null, on_delete_tag };
- // label and tooltip are assigned when the menu is displayed
- actions += delete_tag;
-
- Gtk.ActionEntry rename_tag = { "RenameTag", null, TRANSLATABLE, null, null, on_rename_tag };
- // label and tooltip are assigned when the menu is displayed
- actions += rename_tag;
-
- Gtk.ActionEntry remove_tag = { "RemoveTagFromPhotos", null, TRANSLATABLE, null, null,
- on_remove_tag_from_photos };
- // label and tooltip are assigned when the menu is displayed
- actions += remove_tag;
-
- Gtk.ActionEntry delete_tag_sidebar = { "DeleteTagSidebar", null, Resources.DELETE_TAG_SIDEBAR_MENU,
- null, null, on_delete_tag };
- actions += delete_tag_sidebar;
-
- Gtk.ActionEntry rename_tag_sidebar = { "RenameTagSidebar", null, Resources.RENAME_TAG_SIDEBAR_MENU,
- null, null, on_rename_tag };
- actions += rename_tag_sidebar;
- Gtk.ActionEntry new_child_tag_sidebar = { "NewChildTagSidebar", null,
Resources.NEW_CHILD_TAG_SIDEBAR_MENU,
- null, null, on_new_child_tag_sidebar };
- actions += new_child_tag_sidebar;
+ private const GLib.ActionEntry entries[] = {
+ { "DeleteTag", on_delete_tag },
+ { "RenameTag", on_rename_tag },
+ { "RemoveTagFromPhotos", on_remove_tag_from_photos },
+ { "NewChildTagSidebar", on_new_child_tag_sidebar }
+ };
+
+ protected override void add_actions () {
+ base.add_actions ();
- return actions;
+ AppWindow.get_instance ().add_action_entries (entries, this);
}
-
+
private void on_tags_altered(Gee.Map<DataObject, Alteration> map) {
if (map.has_key(tag)) {
set_page_name(tag.get_name());
update_actions(get_view().get_selected_count(), get_view().get_count());
}
}
+
+ public override void switched_to () {
+ base.switched_to ();
+ this.update_menu_item_label ("DeleteTag",
+ Resources.delete_tag_menu(tag.get_user_visible_name()));
+ this.update_menu_item_label ("RenameTag",
+ Resources.rename_tag_menu(tag.get_user_visible_name()));
+ this.update_menu_item_label ("RemoveTagFromPhotos",
+ Resources.untag_photos_menu(tag.get_user_visible_name(), 0));
+ }
protected override void update_actions(int selected_count, int count) {
set_action_details("DeleteTag",
diff --git a/src/util/ui.vala b/src/util/ui.vala
index a161ebd..e1c22f1 100644
--- a/src/util/ui.vala
+++ b/src/util/ui.vala
@@ -86,13 +86,3 @@ public bool has_only_key_modifier(Gdk.ModifierType field, Gdk.ModifierType mask)
| Gdk.ModifierType.META_MASK)) == mask;
}
-public string build_dummy_ui_string(Gtk.ActionGroup[] groups) {
- string ui_string = "<ui>";
- foreach (Gtk.ActionGroup group in groups) {
- foreach (Gtk.Action action in group.list_actions())
- ui_string += "<accelerator name=\"%s\" action=\"%s\" />".printf(action.name, action.name);
- }
- ui_string += "</ui>";
-
- return ui_string;
-}
diff --git a/ui/collection.ui b/ui/collection.ui
index d832ea6..d634579 100644
--- a/ui/collection.ui
+++ b/ui/collection.ui
@@ -1,51 +1,225 @@
-<ui>
- <popup name="CollectionContextMenu">
- <menuitem name="ContextEnhance" action="Enhance" />
- <menuitem name="ContextRevert" action="Revert" />
- <separator />
- <menuitem name="ContextAddTags" action="AddTagsContextMenu" />
- <menuitem name="ContextModifyTags" action="ModifyTags" />
- <placeholder name="ContextTagsPlaceholder" />
- <separator />
- <placeholder name="ContextFacesPlaceholder" />
- <separator />
- <menuitem name="ContextFlag" action="Flag" />
- <menu name="Rate" action="Rate">
- <menuitem name="RateFive" action="RateFive" />
- <menuitem name="RateFour" action="RateFour" />
- <menuitem name="RateThree" action="RateThree" />
- <menuitem name="RateTwo" action="RateTwo" />
- <menuitem name="RateOne" action="RateOne" />
- <menuitem name="RateUnrated" action="RateUnrated" />
- <menuitem name="RateRejected" action="RateRejected" />
- <separator />
- <menuitem name="IncreaseRating" action="IncreaseRating" />
- <menuitem name="DecreaseRating" action="DecreaseRating" />
- </menu>
- <menu name="RawDeveloper" action="RawDeveloper">
- <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
- <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
- </menu>
- <separator />
- <menuitem name="ContextEditTitle" action="EditTitle" />
- <menuitem name="ContextEditComment" action="EditComment" />
- <menuitem name="ContextExternalEdit" action="ExternalEdit" />
- <menuitem name="ContextExternalEditRAW" action="ExternalEditRAW" />
- <separator />
- <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
- <menuitem name="ContextSendTo" action="SendToContextMenu" />
- <separator />
- <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
- </popup>
-
- <toolbar name="CollectionToolbar">
- <toolitem name="ToolRotate" action="RotateClockwise" />
- <toolitem name="ToolEnhance" action="Enhance" />
- <separator />
- <toolitem name="ToolPublish" action="Publish" />
- <separator />
- <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
- </toolbar>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="shotwell">
+ <requires lib="gtk+" version="3.14"/>
+ <menu id="CollectionContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Enhance</attribute>
+ <attribute name="accel"><Primary>e</attribute>
+ <attribute name="action">win.Enhance</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+ <attribute name="action">win.Revert</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Add _Tags…</attribute>
+ <attribute name="accel"><Primary>t</attribute>
+ <attribute name="action">win.AddTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+ <attribute name="accel"><Primary>m</attribute>
+ <attribute name="action">win.ModifyTags</attribute>
+ </item>
+ <attribute name="id">ContextTagsPlaceholder</attribute>
+ </section>
+ <section>
+ <attribute name="id">ContextFacesPlaceholder</attribute>
+ <item>
+ <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+ <attribute name="accel"><Primary>g</attribute>
+ <attribute name="action">win.Flag</attribute>
+ </item>
+ </section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Set Rating</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">win.RateFive</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">win.RateFour</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">win.RateThree</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">win.RateTwo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">win.RateOne</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Unrated</attribute>
+ <attribute name="action">win.RateUnrated</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rejected</attribute>
+ <attribute name="action">win.RateRejected</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Increase</attribute>
+ <attribute name="action">win.IncreaseRating</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Decrease</attribute>
+ <attribute name="action">win.DecreaseRating</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Developer</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Shotwell</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Shotwell</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Camera</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Camera</attribute>
+ </item>
+ </section>
+ </submenu>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Title…</attribute>
+ <attribute name="action">win.EditTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+ <attribute name="accel"><Primary>Return</attribute>
+ <attribute name="action">win.ExternalEdit</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+ <attribute name="action">win.ExternalEditRAW</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+ <attribute name="action">win.CommonJumpToEvent</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Send _To…</attribute>
+ <attribute name="action">win.SendTo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Move to Trash</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.MoveToTrash</attribute>
+ </item>
+ </section>
+ </menu>
+ <object class="GtkToolbar" id="CollectionToolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="ToolRotate">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Rotate the photos right (press Ctrl to rotate
left)</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.RotateClockwise</property>
+ <property name="label" translatable="yes">Rotate</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">object-rotate-right</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToolEnhance">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Automatically improve the photo’s
appearance</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.Enhance</property>
+ <property name="label" translatable="yes">Enhance</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">shotwell-auto-enhance</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToolPublish">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Publish to various websites</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.Publish</property>
+ <property name="label" translatable="yes">Publish</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">applications-internet</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToolFind">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Find an image by typing text that appears in its
name or tags</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.CommonDisplaySearchbar</property>
+ <property name="label" translatable="yes">Find</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">edit-find</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/ui/direct.ui b/ui/direct.ui
index e3d4e34..75acb0f 100644
--- a/ui/direct.ui
+++ b/ui/direct.ui
@@ -1,70 +1,197 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Save" action="Save" />
- <menuitem name="SaveAs" action="SaveAs" />
- <separator />
- <placeholder name="PrintPlaceholder"/>
- <separator />
- <menuitem name="SendTo" action="SendTo" />
- <placeholder name="SetBackgroundPlaceholder" />
- <separator />
- <menuitem name="JumpToFile" action="CommonJumpToFile" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="EditMenu" action="EditMenu">
- <menuitem name="Undo" action="CommonUndo" />
- <menuitem name="Redo" action="CommonRedo" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="Fullscreen" action="CommonFullscreen" />
- <separator />
- <menuitem name="IncreaseSize" action="IncreaseSize" />
- <menuitem name="DecreaseSize" action="DecreaseSize" />
- <separator />
- <menuitem name="ZoomFit" action="ZoomFit" />
- <menuitem name="Zoom100" action="Zoom100" />
- <menuitem name="Zoom200" action="Zoom200" />
- </menu>
-
- <menu name="PhotoMenu" action="PhotoMenu">
- <menuitem name="PrevPhoto" action="PrevPhoto" />
- <menuitem name="NextPhoto" action="NextPhoto" />
- <separator />
- <menuitem name="RotateClockwise" action="RotateClockwise" />
- <menuitem name="RotateCounterclockwise" action="RotateCounterclockwise" />
- <menuitem name="FlipHorizontally" action="FlipHorizontally" />
- <menuitem name="FlipVertically" action="FlipVertically" />
- <separator />
- <menu name="Tools" action="Tools">
- <menuitem name="Enhance" action="Enhance" />
- <menuitem name="Crop" action="Crop" />
- <menuitem name="Straighten" action="Straighten" />
- <menuitem name="RedEye" action="RedEye" />
- <menuitem name="Adjust" action="Adjust" />
- </menu>
- <menuitem name="Revert" action="Revert" />
- <separator />
- <menuitem name="AdjustDateTime" action="AdjustDateTime" />
- </menu>
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-
- <popup name="DirectContextMenu">
- <placeholder name="ContextJumpPlaceholder">
- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
- </placeholder>
- </popup>
-
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Save</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.Save</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Save _As…</attribute>
+ <attribute name="accel"><Primary><Shift>s</attribute>
+ <attribute name="action">win.SaveAs</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">PrintPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Send _To…</attribute>
+ <attribute name="action">win.SendTo</attribute>
+ </item>
+ <attribute name="id">SetBackgroundPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>q</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Fulls_creen</attribute>
+ <attribute name="accel">F11</attribute>
+ <attribute name="action">win.CommonFullscreen</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _In</attribute>
+ <attribute name="accel"><Primary>plus</attribute>
+ <attribute name="action">win.IncreaseSize</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _Out</attribute>
+ <attribute name="accel"><Primary>minus</attribute>
+ <attribute name="action">win.DecreaseSize</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Fit to _Page</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ <attribute name="action">win.ZoomFit</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _100%</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ <attribute name="action">win.Zoom100</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _200%</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ <attribute name="action">win.Zoom200</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Photo</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Previous Photo</attribute>
+ <attribute name="action">win.PrevPhoto</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Next Photo</attribute>
+ <attribute name="action">win.NextPhoto</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Rotate _Right</attribute>
+ <attribute name="accel"><Primary>r</attribute>
+ <attribute name="action">win.RotateClockwise</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rotate _Left</attribute>
+ <attribute name="accel"><Primary><Shift>r</attribute>
+ <attribute name="action">win.RotateCounterclockwise</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Flip Hori_zontally</attribute>
+ <attribute name="action">win.FlipHorizontally</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Flip Verti_cally</attribute>
+ <attribute name="action">win.FlipVertically</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">T_ools</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Enhance</attribute>
+ <attribute name="accel"><Primary>e</attribute>
+ <attribute name="action">win.Enhance</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Crop</attribute>
+ <attribute name="accel"><Primary>o</attribute>
+ <attribute name="action">win.Crop</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Straighten</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.Straighten</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Red-eye</attribute>
+ <attribute name="accel"><Primary>y</attribute>
+ <attribute name="action">win.RedEye</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Adjust</attribute>
+ <attribute name="accel"><Primary>d</attribute>
+ <attribute name="action">win.Adjust</attribute>
+ </item>
+ </section>
+ </submenu>
+ <item>
+ <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+ <attribute name="action">win.Revert</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Adjust Date and Time…</attribute>
+ <attribute name="action">win.AdjustDateTime</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+</interface>
diff --git a/ui/direct_context.ui b/ui/direct_context.ui
index 7b0d564..de758c2 100644
--- a/ui/direct_context.ui
+++ b/ui/direct_context.ui
@@ -1,10 +1,32 @@
-<ui>
- <popup name="DirectContextMenu">
- <menuitem name="ContextEnhance" action="Enhance" />
- <menuitem name="ContextRevert" action="Revert" />
- <separator />
- <placeholder name="ContextJumpPlaceholder" />
- <menuitem name="ContextSendTo" action="SendTo" />
- </popup>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="shotwell">
+ <requires lib="gtk+" version="3.14"/>
+ <menu id="DirectContextMenu">
+ <submenu>
+ <attribute name="label" translatable="yes">DirectContextMenu</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Enhance</attribute>
+ <attribute name="accel"><Primary>e</attribute>
+ <attribute name="action">win.Enhance</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+ <attribute name="action">win.Revert</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Send _To…</attribute>
+ <attribute name="action">win.SendTo</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+</interface>
diff --git a/ui/event.ui b/ui/event.ui
index dcb1d95..11d9b74 100644
--- a/ui/event.ui
+++ b/ui/event.ui
@@ -1,25 +1,593 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="PhotosMenu" action="PhotosMenu">
- <separator />
- <menuitem name="MakePrimary" action="MakePrimary" />
- </menu>
- <menu name="EventsMenu" action="EventsMenu">
- <menuitem name="EventRename" action="Rename" />
- <menuitem name="EditComment" action="EditComment" />
- </menu>
- </menubar>
-
- <popup name="CollectionContextMenu">
- <separator />
- <menuitem name="ContextMakePrimary" action="MakePrimary" />
- </popup>
-
- <popup name="EventContextMenu">
- <menuitem name="ContextRename" action="Rename" />
- <menuitem name="EditEventComment" action="EditEventComment" />
- </popup>
-
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Save _As…</attribute>
+ <attribute name="accel"><Primary><Shift>e</attribute>
+ <attribute name="action">win.Export</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">FileExtrasPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Find</attribute>
+ <attribute name="action">win.CommonFind</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">EditExtrasPlaceholder</attribute>
+ <item>
+ <attribute name="label" translatable="yes">R_emove from Library</attribute>
+ <attribute name="accel"><Shift>Delete</attribute>
+ <attribute name="action">win.RemoveFromLibrary</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Move to Trash</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.MoveToTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select _All</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.CommonSelectAll</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Search Bar</attribute>
+ <attribute name="accel">F8</attribute>
+ <attribute name="action">win.CommonDisplaySearchbar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Titles</attribute>
+ <attribute name="accel"><Primary><Shift>t</attribute>
+ <attribute name="action">win.ViewTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Comments</attribute>
+ <attribute name="accel"><Primary><Shift>c</attribute>
+ <attribute name="action">win.ViewComment</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <attribute name="accel"><Primary><Shift>g</attribute>
+ <attribute name="action">win.ViewTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Ratings</attribute>
+ <attribute name="accel"><Primary><Shift>n</attribute>
+ <attribute name="action">win.ViewRatings</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Filter Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">7</attribute>
+ <attribute name="accel"><Primary>5</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">6</attribute>
+ <attribute name="accel"><Primary>4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">5</attribute>
+ <attribute name="accel"><Primary>3</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">4</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">3</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_All Photos</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">2</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">All + _Rejected</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">1</attribute>
+ <attribute name="accel"><Primary>9</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rejected _Only</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">8</attribute>
+ <attribute name="accel"><Primary>8</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">By _Title</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By _Filename</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By Exposure _Date</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By _Rating</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">3</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.Sort</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">D_escending</attribute>
+ <attribute name="action">win.Sort</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Descending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _In</attribute>
+ <attribute name="accel"><Primary>plus</attribute>
+ <attribute name="action">win.IncreaseSize</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _Out</attribute>
+ <attribute name="accel"><Primary>minus</attribute>
+ <attribute name="action">win.DecreaseSize</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">ViewExtrasFullscreenSlideshowPlaceholder</attribute>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Photos</attribute>
+ <section>
+ <attribute name="id">PhotosExtrasEditsPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+ <attribute name="accel"><Primary>g</attribute>
+ <attribute name="action">win.Flag</attribute>
+ </item>
+ <submenu>
+ <attribute name="label" translatable="yes">_Set Rating</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="accel">5</attribute>
+ <attribute name="action">win.RateFive</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="accel">4</attribute>
+ <attribute name="action">win.RateFour</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="accel">3</attribute>
+ <attribute name="action">win.RateThree</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="accel">2</attribute>
+ <attribute name="action">win.RateTwo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="accel">1</attribute>
+ <attribute name="action">win.RateOne</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Unrated</attribute>
+ <attribute name="accel">0</attribute>
+ <attribute name="action">win.RateUnrated</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rejected</attribute>
+ <attribute name="accel">9</attribute>
+ <attribute name="action">win.RateRejected</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Increase</attribute>
+ <attribute name="accel">greater</attribute>
+ <attribute name="action">win.IncreaseRating</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Decrease</attribute>
+ <attribute name="accel">less</attribute>
+ <attribute name="action">win.DecreaseRating</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Title…</attribute>
+ <attribute name="action">win.EditTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ <attribute name="id">PhotosExtrasDateTimePlaceholder</attribute>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Developer</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Shotwell</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Shotwell</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Camera</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Camera</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <attribute name="id">PhotosExtrasExternalsPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Make _Key Photo for Event</attribute>
+ <attribute name="action">win.MakePrimary</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Even_ts</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_New Event</attribute>
+ <attribute name="accel"><Primary>n</attribute>
+ <attribute name="action">win.NewEvent</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+ <attribute name="action">win.CommonJumpToEvent</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Re_name Event…</attribute>
+ <attribute name="accel">F2</attribute>
+ <attribute name="action">win.Rename</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Add _Tags…</attribute>
+ <attribute name="accel"><Primary>t</attribute>
+ <attribute name="action">win.AddTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+ <attribute name="accel"><Primary>m</attribute>
+ <attribute name="action">win.ModifyTags</attribute>
+ </item>
+ </section>
+ </submenu>
+ <!-- Faces menu goes here FacesMenuPlaceholder -->
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+ <menu id="CollectionContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Enhance</attribute>
+ <attribute name="accel"><Primary>e</attribute>
+ <attribute name="action">win.Enhance</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+ <attribute name="action">win.Revert</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Add _Tags…</attribute>
+ <attribute name="accel"><Primary>t</attribute>
+ <attribute name="action">win.AddTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+ <attribute name="accel"><Primary>m</attribute>
+ <attribute name="action">win.ModifyTags</attribute>
+ </item>
+ <attribute name="id">ContextTagsPlaceholder</attribute>
+ </section>
+ <section>
+ <attribute name="id">ContextFacesPlaceholder</attribute>
+ <item>
+ <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+ <attribute name="accel"><Primary>g</attribute>
+ <attribute name="action">win.Flag</attribute>
+ </item>
+ </section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Set Rating</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">win.RateFive</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">win.RateFour</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">win.RateThree</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">win.RateTwo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">win.RateOne</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Unrated</attribute>
+ <attribute name="action">win.RateUnrated</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rejected</attribute>
+ <attribute name="action">win.RateRejected</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Increase</attribute>
+ <attribute name="action">win.IncreaseRating</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Decrease</attribute>
+ <attribute name="action">win.DecreaseRating</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Developer</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Shotwell</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Shotwell</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Camera</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Camera</attribute>
+ </item>
+ </section>
+ </submenu>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Title…</attribute>
+ <attribute name="action">win.EditTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+ <attribute name="accel"><Primary>Return</attribute>
+ <attribute name="action">win.ExternalEdit</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+ <attribute name="action">win.ExternalEditRAW</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+ <attribute name="action">win.CommonJumpToEvent</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Send _To…</attribute>
+ <attribute name="action">win.SendTo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Move to Trash</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.MoveToTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Make _Key Photo for Event</attribute>
+ <attribute name="action">win.MakePrimary</attribute>
+ </item>
+ </section>
+ </menu>
+ <menu id="EventContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Re_name Event…</attribute>
+ <attribute name="action">win.Rename</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit Event _Comment…</attribute>
+ <attribute name="action">win.EditEventComment</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/events_directory.ui b/ui/events_directory.ui
index 33ab5d7..380da0a 100644
--- a/ui/events_directory.ui
+++ b/ui/events_directory.ui
@@ -1,64 +1,191 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Import" action="CommonFileImport" />
- <menuitem name="ImportExternal" action="ExternalLibraryImport" />
- <separator />
- <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="EditMenu" action="EditMenu">
- <menuitem name="Undo" action="CommonUndo" />
- <menuitem name="Redo" action="CommonRedo" />
- <separator />
- <menuitem name="Find" action="CommonFind" />
- <menuitem name="NewSearch" action="CommonNewSearch" />
- <separator />
- <menuitem name="SelectAll" action="CommonSelectAll" />
- <separator />
- <menuitem name="Preferences" action="CommonPreferences" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
- <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
- <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
- <separator />
- <menuitem name="ViewComment" action="ViewComment" />
- <separator />
- <menu name="SortEvents" action="CommonSortEvents">
- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
- </menu>
- <separator />
- <menuitem name="Fullscreen" action="CommonFullscreen" />
- </menu>
-
- <menu name="EventsMenu" action="EventsMenu">
- <menuitem name="EventMerge" action="Merge" />
- <menuitem name="EventRename" action="Rename" />
- <menuitem name="EditComment" action="EditComment" />
- </menu>
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-
- <popup name="EventsDirectoryContextMenu">
- <menuitem name="ContextMerge" action="Merge" />
- <menuitem name="ContextRename" action="Rename" />
- <menuitem name="ContextEditComment" action="EditComment" />
- </popup>
-
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Find</attribute>
+ <attribute name="action">win.CommonFind</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select _All</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.CommonSelectAll</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Search Bar</attribute>
+ <attribute name="accel">F8</attribute>
+ <attribute name="action">win.CommonDisplaySearchbar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Comments</attribute>
+ <attribute name="accel"><Primary><Shift>c</attribute>
+ <attribute name="action">win.ViewComment</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">D_escending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Fulls_creen</attribute>
+ <attribute name="accel">F11</attribute>
+ <attribute name="action">win.CommonFullscreen</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Even_ts</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Merge Events</attribute>
+ <attribute name="action">win.Merge</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Re_name Event…</attribute>
+ <attribute name="accel">F2</attribute>
+ <attribute name="action">win.Rename</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+ <menu id="EventsDirectoryContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Merge Events</attribute>
+ <attribute name="action">win.Merge</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Re_name Event…</attribute>
+ <attribute name="accel">F2</attribute>
+ <attribute name="action">win.Rename</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/import.ui b/ui/import.ui
index 3c3cac3..522ca7b 100644
--- a/ui/import.ui
+++ b/ui/import.ui
@@ -1,66 +1,219 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Import" action="CommonFileImport" />
- <menuitem name="ImportSelected" action="ImportSelected" />
- <menuitem name="ImportAll" action="ImportAll" />
- <menuitem name="ImportExternal" action="ExternalLibraryImport" />
- <separator />
- <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="EditMenu" action="EditMenu">
- <menuitem name="Undo" action="CommonUndo" />
- <menuitem name="Redo" action="CommonRedo" />
- <separator />
- <menuitem name="Find" action="CommonFind" />
- <separator />
- <menuitem name="SelectAll" action="CommonSelectAll" />
- <separator />
- <menuitem name="Preferences" action="CommonPreferences" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
- <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
- <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
- <separator />
- <menuitem name="ViewTitle" action="ViewTitle" />
- <separator />
- <menu name="FilterPhotos" action="CommonFilterPhotos">
- <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
- <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
- <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
- <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
- <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
- <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
- <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
- <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
- </menu>
- <separator />
- <menu name="SortEvents" action="CommonSortEvents">
- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
- </menu>
- </menu>
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-
- <popup name="ImportContextMenu">
- <menuitem name="ContextImportSelected" action="ImportSelected" />
- <menuitem name="ContextImportAll" action="ImportAll" />
- </popup>
-
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import _Selected</attribute>
+ <attribute name="action">win.ImportSelected</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import _All</attribute>
+ <attribute name="action">win.ImportAll</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Find</attribute>
+ <attribute name="action">win.CommonFind</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select _All</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.CommonSelectAll</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Search Bar</attribute>
+ <attribute name="accel">F8</attribute>
+ <attribute name="action">win.CommonDisplaySearchbar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Titles</attribute>
+ <attribute name="accel"><Primary><Shift>t</attribute>
+ <attribute name="action">win.ViewTitle</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Filter Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">7</attribute>
+ <attribute name="accel"><Primary>5</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">6</attribute>
+ <attribute name="accel"><Primary>4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">5</attribute>
+ <attribute name="accel"><Primary>3</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">4</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">3</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_All Photos</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">2</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">All + _Rejected</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">1</attribute>
+ <attribute name="accel"><Primary>9</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rejected _Only</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">8</attribute>
+ <attribute name="accel"><Primary>8</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Descending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+ <menu id="ImportContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Import _Selected</attribute>
+ <attribute name="action">win.ImportSelected</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import _All</attribute>
+ <attribute name="action">win.ImportAll</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/import_queue.ui b/ui/import_queue.ui
index 88078b8..9b07d9c 100644
--- a/ui/import_queue.ui
+++ b/ui/import_queue.ui
@@ -1,34 +1,89 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Stop" action="Stop" />
- <separator />
- <menuitem name="Import" action="CommonFileImport" />
- <menuitem name="ImportExternal" action="ExternalLibraryImport" />
- <separator />
- <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
- <separator />
- <menu name="SortEvents" action="CommonSortEvents">
- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
- </menu>
- </menu>
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Stop Import</attribute>
+ <attribute name="action">win.Stop</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">D_escending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+</interface>
diff --git a/ui/media.ui b/ui/media.ui
index f42c189..e3d8ba1 100644
--- a/ui/media.ui
+++ b/ui/media.ui
@@ -1,127 +1,425 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Import" action="CommonFileImport" />
- <menuitem name="ImportExternal" action="ExternalLibraryImport" />
- <menuitem name="Export" action="Export" />
- <separator />
- <placeholder name="FileExtrasPlaceholder" />
- <separator />
- <menuitem name="JumpToFile" action="CommonJumpToFile" />
- <separator />
- <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="EditMenu" action="EditMenu">
- <menuitem name="Undo" action="CommonUndo" />
- <menuitem name="Redo" action="CommonRedo" />
- <separator />
- <menuitem name="Find" action="CommonFind" />
- <menuitem name="NewSearch" action="CommonNewSearch" />
- <separator />
- <placeholder name="EditExtrasPlaceholder" />
- <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
- <menuitem name="MoveToTrash" action="MoveToTrash" />
- <separator />
- <menuitem name="SelectAll" action="CommonSelectAll" />
- <separator />
- <menuitem name="Preferences" action="CommonPreferences" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
- <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
- <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
- <separator />
- <menuitem name="ViewTitle" action="ViewTitle" />
- <menuitem name="ViewComment" action="ViewComment" />
- <menuitem name="ViewTags" action="ViewTags" />
- <menuitem name="ViewRatings" action="ViewRatings" />
- <separator />
- <menu name="FilterPhotos" action="CommonFilterPhotos">
- <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
- <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
- <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
- <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
- <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
- <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
- <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
- <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
- </menu>
- <separator />
- <menu name="SortPhotos" action="SortPhotos">
- <menuitem name="SortByTitle" action="SortByTitle" />
- <menuitem name="SortByFilename" action="SortByFilename" />
- <menuitem name="SortByExposureDate" action="SortByExposureDate" />
- <menuitem name="SortByRating" action="SortByRating" />
- <separator />
- <menuitem name="SortAscending" action="SortAscending" />
- <menuitem name="SortDescending" action="SortDescending" />
- </menu>
- <menu name="SortEvents" action="CommonSortEvents">
- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
- </menu>
- <separator />
- <menuitem name="IncreaseSize" action="IncreaseSize" />
- <menuitem name="DecreaseSize" action="DecreaseSize" />
- <separator />
- <placeholder name="ViewExtrasFullscreenSlideshowPlaceholder" />
- </menu>
-
- <menu name="PhotosMenu" action="PhotosMenu">
- <placeholder name="PhotosExtrasEditsPlaceholder" />
- <separator />
- <menuitem name="Flag" action="Flag" />
- <menu name="Rate" action="Rate">
- <menuitem name="RateFive" action="RateFive" />
- <menuitem name="RateFour" action="RateFour" />
- <menuitem name="RateThree" action="RateThree" />
- <menuitem name="RateTwo" action="RateTwo" />
- <menuitem name="RateOne" action="RateOne" />
- <menuitem name="RateUnrated" action="RateUnrated" />
- <menuitem name="RateRejected" action="RateRejected" />
- <separator />
- <menuitem name="IncreaseRating" action="IncreaseRating" />
- <menuitem name="DecreaseRating" action="DecreaseRating" />
- </menu>
- <separator />
- <menuitem name="EditTitle" action="EditTitle" />
- <menuitem name="EditComment" action="EditComment" />
- <placeholder name="PhotosExtrasDateTimePlaceholder" />
- <separator />
- <menu name="RawDeveloper" action="RawDeveloper">
- <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
- <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
- </menu>
- <separator />
- <placeholder name="PhotosExtrasExternalsPlaceholder" />
- </menu>
-
- <menu name="EventsMenu" action="EventsMenu">
- <menuitem name="NewEvent" action="NewEvent" />
- <menuitem name="CommonJumpToEvent" action="CommonJumpToEvent" />
- </menu>
-
- <menu name="TagsMenu" action="TagsMenu">
- <menuitem name="AddTags" action="AddTags" />
- <menuitem name="ModifyTags" action="ModifyTags" />
- </menu>
-
- <placeholder name="FacesMenuPlaceholder" />
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Save _As…</attribute>
+ <attribute name="accel"><Primary><Shift>e</attribute>
+ <attribute name="action">win.Export</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">FileExtrasPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Find</attribute>
+ <attribute name="action">win.CommonFind</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">EditExtrasPlaceholder</attribute>
+ <item>
+ <attribute name="label" translatable="yes">R_emove from Library</attribute>
+ <attribute name="accel"><Shift>Delete</attribute>
+ <attribute name="action">win.RemoveFromLibrary</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Move to Trash</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.MoveToTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select _All</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.CommonSelectAll</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Search Bar</attribute>
+ <attribute name="accel">F8</attribute>
+ <attribute name="action">win.CommonDisplaySearchbar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Titles</attribute>
+ <attribute name="accel"><Primary><Shift>t</attribute>
+ <attribute name="action">win.ViewTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Comments</attribute>
+ <attribute name="accel"><Primary><Shift>c</attribute>
+ <attribute name="action">win.ViewComment</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <attribute name="accel"><Primary><Shift>g</attribute>
+ <attribute name="action">win.ViewTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Ratings</attribute>
+ <attribute name="accel"><Primary><Shift>n</attribute>
+ <attribute name="action">win.ViewRatings</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Filter Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">7</attribute>
+ <attribute name="accel"><Primary>5</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">6</attribute>
+ <attribute name="accel"><Primary>4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">5</attribute>
+ <attribute name="accel"><Primary>3</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">4</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">3</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_All Photos</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">2</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">All + _Rejected</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">1</attribute>
+ <attribute name="accel"><Primary>9</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rejected _Only</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">8</attribute>
+ <attribute name="accel"><Primary>8</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">By _Title</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By _Filename</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By Exposure _Date</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By _Rating</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">3</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.Sort</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">D_escending</attribute>
+ <attribute name="action">win.Sort</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Descending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _In</attribute>
+ <attribute name="accel"><Primary>plus</attribute>
+ <attribute name="action">win.IncreaseSize</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _Out</attribute>
+ <attribute name="accel"><Primary>minus</attribute>
+ <attribute name="action">win.DecreaseSize</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">ViewExtrasFullscreenSlideshowPlaceholder</attribute>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Photos</attribute>
+ <section>
+ <attribute name="id">PhotosExtrasEditsPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+ <attribute name="accel"><Primary>g</attribute>
+ <attribute name="action">win.Flag</attribute>
+ </item>
+ <submenu>
+ <attribute name="label" translatable="yes">_Set Rating</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="accel">5</attribute>
+ <attribute name="action">win.RateFive</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="accel">4</attribute>
+ <attribute name="action">win.RateFour</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="accel">3</attribute>
+ <attribute name="action">win.RateThree</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="accel">2</attribute>
+ <attribute name="action">win.RateTwo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="accel">1</attribute>
+ <attribute name="action">win.RateOne</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Unrated</attribute>
+ <attribute name="accel">0</attribute>
+ <attribute name="action">win.RateUnrated</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rejected</attribute>
+ <attribute name="accel">9</attribute>
+ <attribute name="action">win.RateRejected</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Increase</attribute>
+ <attribute name="accel">greater</attribute>
+ <attribute name="action">win.IncreaseRating</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Decrease</attribute>
+ <attribute name="accel">less</attribute>
+ <attribute name="action">win.DecreaseRating</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Title…</attribute>
+ <attribute name="action">win.EditTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ <attribute name="id">PhotosExtrasDateTimePlaceholder</attribute>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Developer</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Shotwell</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Shotwell</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Camera</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Camera</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <attribute name="id">PhotosExtrasExternalsPlaceholder</attribute>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Even_ts</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_New Event</attribute>
+ <attribute name="accel"><Primary>n</attribute>
+ <attribute name="action">win.NewEvent</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+ <attribute name="action">win.CommonJumpToEvent</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Add _Tags…</attribute>
+ <attribute name="accel"><Primary>t</attribute>
+ <attribute name="action">win.AddTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+ <attribute name="accel"><Primary>m</attribute>
+ <attribute name="action">win.ModifyTags</attribute>
+ </item>
+ </section>
+ </submenu>
+ <!-- Faces menu goes here FacesMenuPlaceholder -->
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+</interface>
diff --git a/ui/offline.ui b/ui/offline.ui
index ff56ae9..f886526 100644
--- a/ui/offline.ui
+++ b/ui/offline.ui
@@ -1,70 +1,249 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Import" action="CommonFileImport" />
- <menuitem name="ImportExternal" action="ExternalLibraryImport" />
- <separator />
- <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="EditMenu" action="EditMenu">
- <menuitem name="Undo" action="CommonUndo" />
- <menuitem name="Redo" action="CommonRedo" />
- <separator />
- <menuitem name="Find" action="CommonFind" />
- <menuitem name="NewSearch" action="CommonNewSearch" />
- <separator />
- <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
- <separator />
- <menuitem name="SelectAll" action="CommonSelectAll" />
- <separator />
- <menuitem name="Preferences" action="CommonPreferences" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
- <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
- <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
- <separator />
- <menu name="FilterPhotos" action="CommonFilterPhotos">
- <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
- <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
- <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
- <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
- <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
- <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
- <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
- <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
- </menu>
- <separator />
- <menu name="SortEvents" action="CommonSortEvents">
- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
- </menu>
- </menu>
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-
- <popup name="OfflineContextMenu">
- <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
- </popup>
-
- <toolbar name="OfflineToolbar">
- <toolitem name="ToolRemoveFromLibrary" action="RemoveFromLibrary" />
- <separator />
- <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
- </toolbar>
-
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Find</attribute>
+ <attribute name="action">win.CommonFind</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">R_emove from Library</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.RemoveFromLibrary</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select _All</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.CommonSelectAll</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Search Bar</attribute>
+ <attribute name="accel">F8</attribute>
+ <attribute name="action">win.CommonDisplaySearchbar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Filter Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">7</attribute>
+ <attribute name="accel"><Primary>5</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">6</attribute>
+ <attribute name="accel"><Primary>4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">5</attribute>
+ <attribute name="accel"><Primary>3</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">4</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">3</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_All Photos</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">2</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">All + _Rejected</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">1</attribute>
+ <attribute name="accel"><Primary>9</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rejected _Only</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">8</attribute>
+ <attribute name="accel"><Primary>8</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">D_escending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+ <menu id="OfflineContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">R_emove from Library</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.RemoveFromLibrary</attribute>
+ </item>
+ </section>
+ </menu>
+ <object class="GtkToolbar" id="OfflineToolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="ToolRemoveFromLibrary">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Remove the selected photos from the
library</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.RemoveFromLibrary</property>
+ <property name="label" translatable="yes">R_emove From Library</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToolFind">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Find an image by typing text that appears in its
name or tags</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.CommonDisplaySearchbar</property>
+ <property name="label" translatable="yes">Find</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">edit-find</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/ui/photo.ui b/ui/photo.ui
index a4c587e..6b662a5 100644
--- a/ui/photo.ui
+++ b/ui/photo.ui
@@ -1,129 +1,408 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Import" action="CommonFileImport" />
- <menuitem name="ImportExternal" action="ExternalLibraryImport" />
- <menuitem name="Export" action="Export" />
- <separator />
- <placeholder name="PrintPlaceholder" />
- <separator />
- <placeholder name="PublishPlaceholder" />
- <menuitem name="SendTo" action="SendTo" />
- <placeholder name="SetBackgroundPlaceholder" />
- <separator />
- <menuitem name="JumpToFile" action="CommonJumpToFile" />
- <separator />
- <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="EditMenu" action="EditMenu">
- <menuitem name="Undo" action="CommonUndo" />
- <menuitem name="Redo" action="CommonRedo" />
- <separator />
- <menuitem name="NewSearch" action="CommonNewSearch" />
- <separator />
- <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
- <menuitem name="MoveToTrash" action="MoveToTrash" />
- <separator />
- <menuitem name="Preferences" action="CommonPreferences" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
- <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
- <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
- <separator />
- <menuitem name="ViewRatings" action="ViewRatings" />
- <separator />
- <menu name="SortEvents" action="CommonSortEvents">
- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
- </menu>
- <separator />
- <menuitem name="IncreaseSize" action="IncreaseSize" />
- <menuitem name="DecreaseSize" action="DecreaseSize" />
- <separator />
- <menuitem name="ZoomFit" action="ZoomFit" />
- <menuitem name="Zoom100" action="Zoom100" />
- <menuitem name="Zoom200" action="Zoom200" />
- <separator />
- <menuitem name="Fullscreen" action="CommonFullscreen" />
- <separator />
- <menuitem name="Slideshow" action="Slideshow" />
- </menu>
-
- <menu name="PhotoMenu" action="PhotoMenu">
- <menuitem name="PrevPhoto" action="PrevPhoto" />
- <menuitem name="NextPhoto" action="NextPhoto" />
- <separator />
- <menuitem name="RotateClockwise" action="RotateClockwise" />
- <menuitem name="RotateCounterclockwise" action="RotateCounterclockwise" />
- <menuitem name="FlipHorizontally" action="FlipHorizontally" />
- <menuitem name="FlipVertically" action="FlipVertically" />
- <separator />
- <menu name="Tools" action="Tools">
- <menuitem name="Enhance" action="Enhance" />
- <menuitem name="Crop" action="Crop" />
- <menuitem name="Straighten" action="Straighten" />
- <menuitem name="RedEye" action="RedEye" />
- <menuitem name="Adjust" action="Adjust" />
- </menu>
- <menuitem name="Revert" action="Revert" />
- <separator />
- <menuitem name="CopyColorAdjustments" action="CopyColorAdjustments" />
- <menuitem name="PasteColorAdjustments" action="PasteColorAdjustments" />
- <separator/>
- <menuitem name="Flag" action="Flag" />
- <menu name="Rate" action="Rate">
- <menuitem name="RateFive" action="RateFive" />
- <menuitem name="RateFour" action="RateFour" />
- <menuitem name="RateThree" action="RateThree" />
- <menuitem name="RateTwo" action="RateTwo" />
- <menuitem name="RateOne" action="RateOne" />
- <menuitem name="RateUnrated" action="RateUnrated" />
- <menuitem name="RateRejected" action="RateRejected" />
- <separator />
- <menuitem name="IncreaseRating" action="IncreaseRating" />
- <menuitem name="DecreaseRating" action="DecreaseRating" />
- </menu>
- <separator />
- <menuitem name="EditTitle" action="EditTitle" />
- <menuitem name="EditComment" action="EditComment" />
- <menuitem name="AdjustDateTime" action="AdjustDateTime" />
- <separator />
- <menu name="RawDeveloper" action="RawDeveloper">
- <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
- <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
- </menu>
- <separator />
- <menuitem name="ExternalEdit" action="ExternalEdit" />
- <menuitem name="ExternalEditRAW" action="ExternalEditRAW" />
- </menu>
-
- <menu name="TagsMenu" action="TagsMenu">
- <menuitem name="AddTags" action="AddTags" />
- <menuitem name="ModifyTags" action="ModifyTags" />
- </menu>
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-
- <popup name="PhotoContextMenu">
- <placeholder name="ContextJumpPlaceholder">
- <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
- </placeholder>
- </popup>
-
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Save _As…</attribute>
+ <attribute name="accel"><Primary><Shift>e</attribute>
+ <attribute name="action">win.Export</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">PrintPlaceholder</attribute>
+ </section>
+ <section>
+ <attribute name="id">PublishPlaceholder</attribute>
+ <item>
+ <attribute name="label" translatable="yes">Send _To…</attribute>
+ <attribute name="action">win.SendTo</attribute>
+ </item>
+ <attribute name="id">SetBackgroundPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">R_emove from Library</attribute>
+ <attribute name="accel"><Shift>Delete</attribute>
+ <attribute name="action">win.RemoveFromLibrary</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Move to Trash</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.MoveToTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ratings</attribute>
+ <attribute name="accel"><Primary><Shift>n</attribute>
+ <attribute name="action">win.ViewRatings</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Descending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _In</attribute>
+ <attribute name="accel"><Primary>plus</attribute>
+ <attribute name="action">win.IncreaseSize</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _Out</attribute>
+ <attribute name="accel"><Primary>minus</attribute>
+ <attribute name="action">win.DecreaseSize</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Fit to _Page</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ <attribute name="action">win.ZoomFit</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _100%</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ <attribute name="action">win.Zoom100</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _200%</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ <attribute name="action">win.Zoom200</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Fulls_creen</attribute>
+ <attribute name="accel">F11</attribute>
+ <attribute name="action">win.CommonFullscreen</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">S_lideshow</attribute>
+ <attribute name="accel">F5</attribute>
+ <attribute name="action">win.Slideshow</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Photo</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Previous Photo</attribute>
+ <attribute name="action">win.PrevPhoto</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Next Photo</attribute>
+ <attribute name="action">win.NextPhoto</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Rotate _Right</attribute>
+ <attribute name="accel"><Primary>r</attribute>
+ <attribute name="action">win.RotateClockwise</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rotate _Left</attribute>
+ <attribute name="accel"><Primary><Shift>r</attribute>
+ <attribute name="action">win.RotateCounterclockwise</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Flip Hori_zontally</attribute>
+ <attribute name="action">win.FlipHorizontally</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Flip Verti_cally</attribute>
+ <attribute name="action">win.FlipVertically</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">T_ools</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Enhance</attribute>
+ <attribute name="accel"><Primary>e</attribute>
+ <attribute name="action">win.Enhance</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Crop</attribute>
+ <attribute name="accel"><Primary>o</attribute>
+ <attribute name="action">win.Crop</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Straighten</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.Straighten</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Red-eye</attribute>
+ <attribute name="accel"><Primary>y</attribute>
+ <attribute name="action">win.RedEye</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Adjust</attribute>
+ <attribute name="accel"><Primary>d</attribute>
+ <attribute name="action">win.Adjust</attribute>
+ </item>
+ </section>
+ </submenu>
+ <item>
+ <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+ <attribute name="action">win.Revert</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Copy Color Adjustments</attribute>
+ <attribute name="accel"><Primary><Shift>c</attribute>
+ <attribute name="action">win.CopyColorAdjustments</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Paste Color Adjustments</attribute>
+ <attribute name="accel"><Primary><Shift>v</attribute>
+ <attribute name="action">win.PasteColorAdjustments</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+ <attribute name="accel"><Primary>g</attribute>
+ <attribute name="action">win.Flag</attribute>
+ </item>
+ <submenu>
+ <attribute name="label" translatable="yes">_Set Rating</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="accel">5</attribute>
+ <attribute name="action">win.RateFive</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="accel">4</attribute>
+ <attribute name="action">win.RateFour</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="accel">3</attribute>
+ <attribute name="action">win.RateThree</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="accel">2</attribute>
+ <attribute name="action">win.RateTwo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="accel">1</attribute>
+ <attribute name="action">win.RateOne</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Unrated</attribute>
+ <attribute name="accel">0</attribute>
+ <attribute name="action">win.RateUnrated</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rejected</attribute>
+ <attribute name="accel">9</attribute>
+ <attribute name="action">win.RateRejected</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Increase</attribute>
+ <attribute name="accel">greater</attribute>
+ <attribute name="action">win.IncreaseRating</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Decrease</attribute>
+ <attribute name="accel">less</attribute>
+ <attribute name="action">win.DecreaseRating</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Title…</attribute>
+ <attribute name="action">win.EditTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Adjust Date and Time…</attribute>
+ <attribute name="action">win.AdjustDateTime</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Developer</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Shotwell</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Shotwell</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Camera</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Camera</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+ <attribute name="accel"><Primary>Return</attribute>
+ <attribute name="action">win.ExternalEdit</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+ <attribute name="action">win.ExternalEditRAW</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Add _Tags…</attribute>
+ <attribute name="accel"><Primary>t</attribute>
+ <attribute name="action">win.AddTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+ <attribute name="accel"><Primary>m</attribute>
+ <attribute name="action">win.ModifyTags</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+</interface>
diff --git a/ui/photo_context.ui b/ui/photo_context.ui
index f897022..10dcd3d 100644
--- a/ui/photo_context.ui
+++ b/ui/photo_context.ui
@@ -1,39 +1,145 @@
-<ui>
- <popup name="PhotoContextMenu">
- <menuitem name="ContextEnhance" action="Enhance" />
- <menuitem name="ContextRevert" action="Revert" />
- <separator />
- <menuitem name="ContextAddTags" action="AddTagsContextMenu" />
- <menuitem name="ContextModifyTags" action="ModifyTags" />
- <placeholder name="ContextTagsPlaceholder" />
- <separator />
- <menuitem name="ContextFlag" action="Flag" />
- <menu name="Rate" action="Rate">
- <menuitem name="RateFive" action="RateFive" />
- <menuitem name="RateFour" action="RateFour" />
- <menuitem name="RateThree" action="RateThree" />
- <menuitem name="RateTwo" action="RateTwo" />
- <menuitem name="RateOne" action="RateOne" />
- <menuitem name="RateUnrated" action="RateUnrated" />
- <menuitem name="RateRejected" action="RateRejected" />
- <separator />
- <menuitem name="IncreaseRating" action="IncreaseRating" />
- <menuitem name="DecreaseRating" action="DecreaseRating" />
- </menu>
- <menu name="RawDeveloper" action="RawDeveloper">
- <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
- <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
- </menu>
- <separator />
- <menuitem name="ContextEditTitle" action="EditTitle" />
- <menuitem name="ContextEditComment" action="EditComment" />
- <menuitem name="ContextExternalEdit" action="ExternalEdit" />
- <menuitem name="ContextExternalEditRAW" action="ExternalEditRAW" />
- <separator />
- <placeholder name="ContextJumpPlaceholder" />
- <menuitem name="ContextSendTo" action="SendToContextMenu" />
- <separator />
- <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
- </popup>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="PhotoContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Enhance</attribute>
+ <attribute name="accel"><Primary>e</attribute>
+ <attribute name="action">win.Enhance</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+ <attribute name="action">win.Revert</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Add Tags…</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.AddTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+ <attribute name="accel"><Primary>m</attribute>
+ <attribute name="action">win.ModifyTags</attribute>
+ </item>
+ <attribute name="id">ContextTagsPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+ <attribute name="accel"><Primary>g</attribute>
+ <attribute name="action">win.Flag</attribute>
+ </item>
+ <submenu>
+ <attribute name="label" translatable="yes">_Set Rating</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="accel">5</attribute>
+ <attribute name="action">win.RateFive</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="accel">4</attribute>
+ <attribute name="action">win.RateFour</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="accel">3</attribute>
+ <attribute name="action">win.RateThree</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="accel">2</attribute>
+ <attribute name="action">win.RateTwo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="accel">1</attribute>
+ <attribute name="action">win.RateOne</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Unrated</attribute>
+ <attribute name="accel">0</attribute>
+ <attribute name="action">win.RateUnrated</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rejected</attribute>
+ <attribute name="accel">9</attribute>
+ <attribute name="action">win.RateRejected</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Increase</attribute>
+ <attribute name="accel">greater</attribute>
+ <attribute name="action">win.IncreaseRating</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Decrease</attribute>
+ <attribute name="accel">less</attribute>
+ <attribute name="action">win.DecreaseRating</attribute>
+ </item>
+ </section>
+ </submenu>
-</ui>
+ <submenu>
+ <attribute name="label" translatable="yes">_Developer</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Shotwell</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Shotwell</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Camera</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Camera</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Title…</attribute>
+ <attribute name="action">win.EditTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+ <attribute name="accel"><Primary>Return</attribute>
+ <attribute name="action">win.ExternalEdit</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+ <attribute name="action">win.ExternalEditRAW</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+ <attribute name="action">win.CommonJumpToEvent</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Send T_o…</attribute>
+ <attribute name="action">win.SendTo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Move to Trash</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.MoveToTrash</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/savedsearch.ui b/ui/savedsearch.ui
index 4217cbc..fe0010e 100644
--- a/ui/savedsearch.ui
+++ b/ui/savedsearch.ui
@@ -1,8 +1,22 @@
-<ui>
- <popup name="SearchContextMenu">
- <menuitem name="ContextRenameSearch" action="RenameSearch" />
- <menuitem name="ContextEditSearch" action="EditSearch" />
- <menuitem name="ContextDeleteSearch" action="DeleteSearch" />
- </popup>
-
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="SearchContextMenu">
+ <submenu>
+ <attribute name="label" translatable="yes">SearchContextMenu</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Re_name…</attribute>
+ <attribute name="action">win.RenameSearch</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Edit…</attribute>
+ <attribute name="action">win.EditSearch</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Delete</attribute>
+ <attribute name="action">win.DeleteSearch</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+</interface>
diff --git a/ui/search_bar.ui b/ui/search_bar.ui
index 957c8b3..9d56962 100644
--- a/ui/search_bar.ui
+++ b/ui/search_bar.ui
@@ -1,12 +1,55 @@
-<ui>
- <popup name="FilterPopupMenu" action="CommonFilterPhotos">
- <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
- <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
- <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
- <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
- <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
- <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
- <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
- <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
- </popup>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+ <menu id='popup-menu'>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Rejected _Only</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">8</attribute>
+ <attribute name="accel"><Primary>8</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">All + _Rejected</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">1</attribute>
+ <attribute name="accel"><Primary>9</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_All Photos</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">2</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">3</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">4</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">5</attribute>
+ <attribute name="accel"><Primary>3</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">6</attribute>
+ <attribute name="accel"><Primary>4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">7</attribute>
+ <attribute name="accel"><Primary>5</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/search_sidebar_context.ui b/ui/search_sidebar_context.ui
index 9db976e..a925800 100644
--- a/ui/search_sidebar_context.ui
+++ b/ui/search_sidebar_context.ui
@@ -1,6 +1,12 @@
-<ui>
- <popup name="SidebarSearchContextMenu">
- <menuitem name="NewSearch" action="CommonNewSearch" />
- </popup>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+ <menu id='popup-menu'>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/set_background_dialog.ui b/ui/set_background_dialog.ui
index f857693..ee7106f 100644
--- a/ui/set_background_dialog.ui
+++ b/ui/set_background_dialog.ui
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.2 -->
-<interface>
- <requires lib="gtk+" version="3.0"/>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="shotwell">
+ <requires lib="gtk+" version="3.14"/>
<object class="GtkAdjustment" id="adjustment1">
<property name="upper">100</property>
<property name="step_increment">10</property>
@@ -78,8 +78,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5899999737739563</property>
+ <property name="halign">start</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@@ -94,7 +93,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
- <property name="xalign">0</property>
+ <property name="halign">start</property>
<property name="draw_indicator">True</property>
</object>
<packing>
diff --git a/ui/sidebar_default_context.ui b/ui/sidebar_default_context.ui
index 2e5ed87..644d8c7 100644
--- a/ui/sidebar_default_context.ui
+++ b/ui/sidebar_default_context.ui
@@ -1,7 +1,17 @@
-<ui>
- <popup name="SidebarDefaultContextMenu">
- <menuitem name="NewSearch" action="CommonNewSearch" />
- <menuitem name="NewTag" action="CommonNewTag" />
- </popup>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+ <menu id='popup-menu'>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">New _Tag…</attribute>
+ <attribute name="action">win.CommonNewTag</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/tag_sidebar_context.ui b/ui/tag_sidebar_context.ui
index 4a3d049..96b0f1e 100644
--- a/ui/tag_sidebar_context.ui
+++ b/ui/tag_sidebar_context.ui
@@ -1,6 +1,11 @@
-<ui>
- <popup name="SidebarTagContextMenu">
- <menuitem name="NewTag" action="CommonNewTag" />
- </popup>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+ <menu id='popup-menu'>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">New _Tag…</attribute>
+ <attribute name="action">win.CommonNewTag</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/ui/tags.ui b/ui/tags.ui
index d0373d6..c693e7f 100644
--- a/ui/tags.ui
+++ b/ui/tags.ui
@@ -1,25 +1,447 @@
-<ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Save _As…</attribute>
+ <attribute name="accel"><Primary><Shift>e</attribute>
+ <attribute name="action">win.Export</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">FileExtrasPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Find</attribute>
+ <attribute name="action">win.CommonFind</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">EditExtrasPlaceholder</attribute>
+ <item>
+ <attribute name="label" translatable="yes">R_emove from Library</attribute>
+ <attribute name="accel"><Shift>Delete</attribute>
+ <attribute name="action">win.RemoveFromLibrary</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Move to Trash</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.MoveToTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select _All</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.CommonSelectAll</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Search Bar</attribute>
+ <attribute name="accel">F8</attribute>
+ <attribute name="action">win.CommonDisplaySearchbar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Titles</attribute>
+ <attribute name="accel"><Primary><Shift>t</attribute>
+ <attribute name="action">win.ViewTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Comments</attribute>
+ <attribute name="accel"><Primary><Shift>c</attribute>
+ <attribute name="action">win.ViewComment</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <attribute name="accel"><Primary><Shift>g</attribute>
+ <attribute name="action">win.ViewTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Ratings</attribute>
+ <attribute name="accel"><Primary><Shift>n</attribute>
+ <attribute name="action">win.ViewRatings</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Filter Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">7</attribute>
+ <attribute name="accel"><Primary>5</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">6</attribute>
+ <attribute name="accel"><Primary>4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">5</attribute>
+ <attribute name="accel"><Primary>3</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">4</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">3</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_All Photos</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">2</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">All + _Rejected</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">1</attribute>
+ <attribute name="accel"><Primary>9</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rejected _Only</attribute>
+ <attribute name="action">win.display.rating</attribute>
+ <attribute name="target">8</attribute>
+ <attribute name="accel"><Primary>8</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">By _Title</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By _Filename</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By Exposure _Date</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">By _Rating</attribute>
+ <attribute name="action">win.SortBy</attribute>
+ <attribute name="target">3</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.Sort</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">D_escending</attribute>
+ <attribute name="action">win.Sort</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Descending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _In</attribute>
+ <attribute name="accel"><Primary>plus</attribute>
+ <attribute name="action">win.IncreaseSize</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Zoom _Out</attribute>
+ <attribute name="accel"><Primary>minus</attribute>
+ <attribute name="action">win.DecreaseSize</attribute>
+ </item>
+ </section>
+ <section>
+ <attribute name="id">ViewExtrasFullscreenSlideshowPlaceholder</attribute>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Photos</attribute>
+ <section>
+ <attribute name="id">PhotosExtrasEditsPlaceholder</attribute>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+ <attribute name="accel"><Primary>g</attribute>
+ <attribute name="action">win.Flag</attribute>
+ </item>
+ <submenu>
+ <attribute name="label" translatable="yes">_Set Rating</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="accel">5</attribute>
+ <attribute name="action">win.RateFive</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="accel">4</attribute>
+ <attribute name="action">win.RateFour</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="accel">3</attribute>
+ <attribute name="action">win.RateThree</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="accel">2</attribute>
+ <attribute name="action">win.RateTwo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="accel">1</attribute>
+ <attribute name="action">win.RateOne</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Unrated</attribute>
+ <attribute name="accel">0</attribute>
+ <attribute name="action">win.RateUnrated</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Rejected</attribute>
+ <attribute name="accel">9</attribute>
+ <attribute name="action">win.RateRejected</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Increase</attribute>
+ <attribute name="accel">greater</attribute>
+ <attribute name="action">win.IncreaseRating</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Decrease</attribute>
+ <attribute name="accel">less</attribute>
+ <attribute name="action">win.DecreaseRating</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Title…</attribute>
+ <attribute name="action">win.EditTitle</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+ <attribute name="action">win.EditComment</attribute>
+ </item>
+ <attribute name="id">PhotosExtrasDateTimePlaceholder</attribute>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Developer</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Shotwell</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="target">Shotwell</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Camera</attribute>
+ <attribute name="action">win.RawDeveloper</attribute>
+ <attribute name="action">Camera</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <attribute name="id">PhotosExtrasExternalsPlaceholder</attribute>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Even_ts</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_New Event</attribute>
+ <attribute name="accel"><Primary>n</attribute>
+ <attribute name="action">win.NewEvent</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+ <attribute name="action">win.CommonJumpToEvent</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Add _Tags…</attribute>
+ <attribute name="accel"><Primary>t</attribute>
+ <attribute name="action">win.AddTags</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+ <attribute name="accel"><Primary>m</attribute>
+ <attribute name="action">win.ModifyTags</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="id">RemoveTagFromPhotos</attribute>
+ <attribute name="label" translatable="yes"></attribute>
+ <attribute name="action">win.RemoveTagFromPhotos</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="id">RenameTag</attribute>
+ <attribute name="label" translatable="yes"></attribute>
+ <attribute name="action">win.RenameTag</attribute>
+ </item>
+ <item>
+ <attribute name="id">DeleteTag</attribute>
+ <attribute name="label" translatable="yes"></attribute>
+ <attribute name="action">win.DeleteTag</attribute>
+ </item>
+ </section>
+ </submenu>
+ <!-- Faces menu goes here FacesMenuPlaceholder -->
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
- <menubar name="MenuBar">
- <menu name="TagsMenu" action="TagsMenu">
- <menuitem name="RemoveTagFromPhotos" action="RemoveTagFromPhotos" />
- <separator />
- <menuitem name="RenameTag" action="RenameTag" />
- <menuitem name="DeleteTag" action="DeleteTag" />
- </menu>
- </menubar>
-
- <popup name="CollectionContextMenu">
- <placeholder name="ContextTagsPlaceholder">
- <menuitem name="ContextRemoveTagFromPhotos" action="RemoveTagFromPhotos" />
- </placeholder>
- </popup>
-
- <popup name="TagsContextMenu">
- <menuitem name="ContextNewChildTag" action="NewChildTagSidebar" />
- <separator />
- <menuitem name="ContextDeleteTag" action="RenameTagSidebar" />
- <menuitem name="ContextRenameTag" action="DeleteTagSidebar" />
- </popup>
-
-</ui>
+ <menu id="TagsContextMenu">
+ </menu>
+</interface>
diff --git a/ui/top.ui b/ui/top.ui
index 81d1006..683a2fa 100644
--- a/ui/top.ui
+++ b/ui/top.ui
@@ -1,12 +1,45 @@
-<ui>
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu" />
- <menu name="EditMenu" action="EditMenu" />
- <menu name="ViewMenu" action="ViewMenu" />
- <menu name="PhotoMenu" action="PhotoMenu" />
- <menu name="PhotosMenu" action="PhotosMenu" />
- <menu name="EventsMenu" action="EventsMenu" />
- <menu name="TagsMenu" action="TagsMenu" />
- <menu name="HelpMenu" action="HelpMenu" />
- </menubar>
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Photo</attribute>
+ <section>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Photos</attribute>
+ <section>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Even_ts</attribute>
+ <section>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">Ta_gs</attribute>
+ <section>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ </section>
+ </submenu>
+ </menu>
+</interface>
diff --git a/ui/trash.ui b/ui/trash.ui
index 9a464bb..2e68df8 100644
--- a/ui/trash.ui
+++ b/ui/trash.ui
@@ -1,83 +1,322 @@
-<ui>
-
- <menubar name="MenuBar">
- <menu name="FileMenu" action="FileMenu">
- <menuitem name="Import" action="CommonFileImport" />
- <menuitem name="ImportExternal" action="ExternalLibraryImport" />
- <separator />
- <menuitem name="JumpToFile" action="CommonJumpToFile" />
- <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <menuitem name="Quit" action="CommonQuit" />
- </menu>
-
- <menu name="EditMenu" action="EditMenu">
- <menuitem name="Undo" action="CommonUndo" />
- <menuitem name="Redo" action="CommonRedo" />
- <separator />
- <menuitem name="Find" action="CommonFind" />
- <menuitem name="NewSearch" action="CommonNewSearch" />
- <separator />
- <menuitem name="Delete" action="Delete" />
- <menuitem name="Restore" action="Restore" />
- <separator />
- <menuitem name="SelectAll" action="CommonSelectAll" />
- <separator />
- <menuitem name="Preferences" action="CommonPreferences" />
- </menu>
-
- <menu name="ViewMenu" action="ViewMenu">
- <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
- <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
- <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
- <separator />
- <menu name="FilterPhotos" action="CommonFilterPhotos">
- <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
- <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
- <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
- <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
- <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
- <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
- <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
- <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
- </menu>
- <separator />
- <menu name="SortEvents" action="CommonSortEvents">
- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
- </menu>
- </menu>
-
- <menu name="HelpMenu" action="HelpMenu">
- <menuitem name="Contents" action="CommonHelpContents" />
- <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
- <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
- <separator />
- <menuitem name="About" action="CommonAbout" />
- </menu>
- </menubar>
-
- <popup name="TrashContextMenu">
- <menuitem name="ContextDelete" action="Delete" />
- <menuitem name="ContextRestore" action="Restore" />
- <separator />
- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
- <separator />
- <menuitem name="ContextEmptyTrash" action="CommonEmptyTrash" />
- </popup>
-
- <popup name="TrashPageMenu">
- <menuitem name="ContextEmptyTrash" action="CommonEmptyTrash" />
- </popup>
-
- <toolbar name="TrashToolbar">
- <toolitem name="ToolDelete" action="Delete" />
- <toolitem name="ToolRestore" action="Restore" />
- <toolitem name="ToolEmptyTrash" action="CommonEmptyTrash" />
- <separator />
- <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
- </toolbar>
-
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+ <menu id="MenuBar">
+ <submenu>
+ <attribute name="label" translatable="yes">_File</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+ <attribute name="accel"><Primary>i</attribute>
+ <attribute name="action">win.CommonFileImport</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Import From _Application…</attribute>
+ <attribute name="action">win.ExternalLibraryImport</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="accel"><Primary>q</attribute>
+ <attribute name="action">win.CommonQuit</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Edit</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Undo</attribute>
+ <attribute name="accel"><Primary>z</attribute>
+ <attribute name="action">win.CommonUndo</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Redo</attribute>
+ <attribute name="accel"><Primary><Shift>z</attribute>
+ <attribute name="action">win.CommonRedo</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Find</attribute>
+ <attribute name="action">win.CommonFind</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+ <attribute name="accel"><Primary>s</attribute>
+ <attribute name="action">win.CommonNewSearch</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Delete</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.Delete</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Restore</attribute>
+ <attribute name="action">win.Restore</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Select _All</attribute>
+ <attribute name="accel"><Primary>a</attribute>
+ <attribute name="action">win.CommonSelectAll</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">win.CommonPreferences</attribute>
+ </item>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_View</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Basic Information</attribute>
+ <attribute name="accel"><Primary><Shift>i</attribute>
+ <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">E_xtended Information</attribute>
+ <attribute name="accel"><Primary><Shift>x</attribute>
+ <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Search Bar</attribute>
+ <attribute name="accel">F8</attribute>
+ <attribute name="action">win.CommonDisplaySearchbar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">S_idebar</attribute>
+ <attribute name="accel">F9</attribute>
+ <attribute name="action">win.CommonDisplaySidebar</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">T_oolbar</attribute>
+ <attribute name="accel"><Primary>F9</attribute>
+ <attribute name="action">win.CommonDisplayToolbar</attribute>
+ </item>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">_Filter Photos</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="no">★★★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">7</attribute>
+ <attribute name="accel"><Primary>5</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">6</attribute>
+ <attribute name="accel"><Primary>4</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">5</attribute>
+ <attribute name="accel"><Primary>3</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">4</attribute>
+ <attribute name="accel"><Primary>2</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="no">★</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">3</attribute>
+ <attribute name="accel"><Primary>1</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_All Photos</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">2</attribute>
+ <attribute name="accel"><Primary>0</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">All + _Rejected</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">1</attribute>
+ <attribute name="accel"><Primary>9</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Rejected _Only</attribute>
+ <attribute name="action">filterbar.display.rating</attribute>
+ <attribute name="target">8</attribute>
+ <attribute name="accel"><Primary>8</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ <section>
+ <submenu>
+ <attribute name="label" translatable="yes">Sort _Events</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Ascending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">D_escending</attribute>
+ <attribute name="action">win.CommonSortEvents</attribute>
+ <attribute name="target">descending</attribute>
+ </item>
+ </section>
+ </submenu>
+ </section>
+ </submenu>
+ <submenu>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Help</attribute>
+ <attribute name="accel">F1</attribute>
+ <attribute name="action">win.CommonHelpContents</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+ <attribute name="action">win.CommonHelpFAQ</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+ <attribute name="action">win.CommonHelpReportProblem</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_About</attribute>
+ <attribute name="action">win.CommonAbout</attribute>
+ </item>
+ </section>
+ </submenu>
+ </menu>
+ <menu id="TrashContextMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Delete</attribute>
+ <attribute name="accel">Delete</attribute>
+ <attribute name="action">win.Delete</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">_Restore</attribute>
+ <attribute name="action">win.Restore</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+ <attribute name="accel"><Primary><Shift>m</attribute>
+ <attribute name="action">win.CommonJumpToFile</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ </menu>
+ <menu id="TrashPageMenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Empty T_rash</attribute>
+ <attribute name="action">win.CommonEmptyTrash</attribute>
+ </item>
+ </section>
+ </menu>
+ <object class="GtkToolbar" id="TrashToolbar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">both-horiz</property>
+ <child>
+ <object class="GtkToolButton" id="ToolDelete">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Remove the selected photos from the trash</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.Delete</property>
+ <property name="label" translatable="yes">_Delete</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToolRestore">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Move the selected photos back into the
library</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.Restore</property>
+ <property name="label" translatable="yes">_Restore</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToolEmptyTrash">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Delete all photos in the trash</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.CommonEmptyTrash</property>
+ <property name="label" translatable="yes">Empty Trash</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="ToolFind">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Find an image by typing text that appears in its
name or tags</property>
+ <property name="is_important">True</property>
+ <property name="action_name">win.CommonDisplaySearchbar</property>
+ <property name="label" translatable="yes">Find</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">edit-find</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]