[shotwell/wip/dedeprecate] wip: Fix InjectionGroups for GtkBuilder
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [shotwell/wip/dedeprecate] wip: Fix InjectionGroups for GtkBuilder
- Date: Tue, 1 Nov 2016 18:03:47 +0000 (UTC)
commit 2126c558d19d3aa2b153281e7c14f2856504d15d
Author: Jens Georg <mail jensge org>
Date: Tue Nov 1 19:03:25 2016 +0100
wip: Fix InjectionGroups for GtkBuilder
Signed-off-by: Jens Georg <mail jensge org>
src/AppWindow.vala | 3 -
src/CollectionPage.vala | 12 ++--
src/Page.vala | 119 ++++++++++++++++++++++++++++----------
src/PhotoPage.vala | 8 +-
src/direct/DirectPhotoPage.vala | 4 +-
src/library/LibraryWindow.vala | 4 -
ui/media.ui | 4 +-
7 files changed, 101 insertions(+), 53 deletions(-)
---
diff --git a/src/AppWindow.vala b/src/AppWindow.vala
index 0103300..19894e8 100644
--- a/src/AppWindow.vala
+++ b/src/AppWindow.vala
@@ -760,9 +760,6 @@ public abstract class AppWindow : PageWindow {
return common_action_groups;
}
- public virtual void replace_common_placeholders(Gtk.UIManager ui) {
- }
-
public void go_fullscreen(Page page) {
// if already fullscreen, use that
if (fullscreen_window != null) {
diff --git a/src/CollectionPage.vala b/src/CollectionPage.vala
index e95f022..77d0d6c 100644
--- a/src/CollectionPage.vala
+++ b/src/CollectionPage.vala
@@ -69,7 +69,7 @@ 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_separator();
@@ -81,7 +81,7 @@ public abstract class CollectionPage : MediaPage {
}
private static InjectionGroup create_edit_menu_injectables() {
- InjectionGroup group = new InjectionGroup("/MenuBar/EditMenu/EditExtrasPlaceholder");
+ InjectionGroup group = new InjectionGroup("EditExtrasPlaceholder");
group.add_menu_item("Duplicate");
@@ -89,7 +89,7 @@ public abstract class CollectionPage : MediaPage {
}
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_separator();
@@ -99,7 +99,7 @@ public abstract class CollectionPage : MediaPage {
}
private static InjectionGroup create_photos_menu_edits_injectables() {
- InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasEditsPlaceholder");
+ InjectionGroup group = new InjectionGroup("PhotosExtrasEditsPlaceholder");
group.add_menu_item("RotateClockwise");
group.add_menu_item("RotateCounterclockwise");
@@ -116,7 +116,7 @@ public abstract class CollectionPage : MediaPage {
}
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");
@@ -124,7 +124,7 @@ public abstract class CollectionPage : MediaPage {
}
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");
diff --git a/src/Page.vala b/src/Page.vala
index 36dfc26..9da2dab 100644
--- a/src/Page.vala
+++ b/src/Page.vala
@@ -6,43 +6,49 @@
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 ItemType kind;
+
+ public Element(string name, string? action, ItemType kind) {
this.name = name;
this.action = action != null ? action : name;
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));
+ elements.add(new Element(name, action, 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, 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,
+ Element.ItemType.SEPARATOR));
}
}
@@ -201,11 +207,39 @@ public abstract class Page : Gtk.ScrolledWindow {
}
private Gtk.MenuBar menubar;
-
- public virtual Gtk.MenuBar get_menubar() {
+
+ public Gtk.MenuBar get_menubar() {
if (this.menubar == null) {
- var model = builder.get_object ("MenuBar") as GLib.MenuModel;
- this.menubar = new Gtk.MenuBar.from_model (model);
+ 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:
+ menu.append (element.name, element.action);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ this.menubar = new Gtk.MenuBar.from_model (model);
}
return this.menubar;
@@ -475,22 +509,8 @@ public abstract class Page : Gtk.ScrolledWindow {
init_load_ui(ui_filename);
//ui.insert_action_group(action_group, 0);
+ critical ("==> %p", 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) {
- foreach (InjectionGroup.Element element in group.get_elements()) {
- debug (element.name);
-/* 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() {
@@ -1168,6 +1188,39 @@ public abstract class Page : Gtk.ScrolledWindow {
return false;
}
+
+ private 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 {
@@ -2607,4 +2660,6 @@ public class DragAndDropHandler {
private void on_export_completed() {
exporter = null;
}
+
+
}
diff --git a/src/PhotoPage.vala b/src/PhotoPage.vala
index 603f5c9..48862ea 100644
--- a/src/PhotoPage.vala
+++ b/src/PhotoPage.vala
@@ -2669,18 +2669,18 @@ public class LibraryPhotoPage : EditingHostPage {
protected override InjectionGroup[] init_collect_injection_groups() {
InjectionGroup[] groups = base.init_collect_injection_groups();
-
- InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
+
+ InjectionGroup print_group = new InjectionGroup("PrintPlaceholder");
print_group.add_menu_item("Print");
groups += print_group;
- InjectionGroup publish_group = new InjectionGroup("/MenuBar/FileMenu/PublishPlaceholder");
+ InjectionGroup publish_group = new InjectionGroup("PublishPlaceholder");
publish_group.add_menu_item("Publish");
groups += publish_group;
- InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
+ InjectionGroup bg_group = new InjectionGroup("SetBackgroundPlaceholder");
bg_group.add_menu_item("SetBackground");
groups += bg_group;
diff --git a/src/direct/DirectPhotoPage.vala b/src/direct/DirectPhotoPage.vala
index ffeab51..7717f77 100644
--- a/src/direct/DirectPhotoPage.vala
+++ b/src/direct/DirectPhotoPage.vala
@@ -209,12 +209,12 @@ public class DirectPhotoPage : EditingHostPage {
protected override InjectionGroup[] init_collect_injection_groups() {
InjectionGroup[] groups = base.init_collect_injection_groups();
- InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
+ InjectionGroup print_group = new InjectionGroup("PrintPlaceholder");
print_group.add_menu_item("Print");
groups += print_group;
- InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
+ InjectionGroup bg_group = new InjectionGroup("SetBackgroundPlaceholder");
bg_group.add_menu_item("SetBackground");
groups += bg_group;
diff --git a/src/library/LibraryWindow.vala b/src/library/LibraryWindow.vala
index 5dad995..36c5c93 100644
--- a/src/library/LibraryWindow.vala
+++ b/src/library/LibraryWindow.vala
@@ -442,10 +442,6 @@ public class LibraryWindow : AppWindow {
return groups;
}
- public override void replace_common_placeholders(Gtk.UIManager ui) {
- base.replace_common_placeholders(ui);
- }
-
protected override void switched_pages(Page? old_page, Page? new_page) {
base.switched_pages(old_page, new_page);
diff --git a/ui/media.ui b/ui/media.ui
index bd3ba3c..1afe418 100644
--- a/ui/media.ui
+++ b/ui/media.ui
@@ -20,7 +20,7 @@
</item>
</section>
<section>
- <attribute name="id">FileExtrasPlaceholder</attribute>
+ <attribute name="id">FileExtrasPlaceholder</attribute>
</section>
<section>
<item>
@@ -69,7 +69,7 @@
</item>
</section>
<section>
- <attribute name="id">EditExtrasPlaceholder</attribute>
+ <attribute name="id">EditExtrasPlaceholder</attribute>
<item>
<attribute name="label" translatable="yes">R_emove from Library</attribute>
<attribute name="accel"><Shift>Delete</attribute>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]