Merge lp:~tintou/pantheon-photos/menu-to-vala into lp:~pantheon-photos/pantheon-photos/trunk

Proposed by Corentin Noël
Status: Merged
Approved by: Danielle Foré
Approved revision: 3151
Merged at revision: 3157
Proposed branch: lp:~tintou/pantheon-photos/menu-to-vala
Merge into: lp:~pantheon-photos/pantheon-photos/trunk
Diff against target: 2248 lines (+1012/-649)
32 files modified
data/ui/collection.ui (+0/-44)
data/ui/direct.ui (+0/-7)
data/ui/direct_context.ui (+0/-11)
data/ui/event.ui (+0/-12)
data/ui/events_directory.ui (+0/-24)
data/ui/import.ui (+0/-22)
data/ui/media.ui (+0/-27)
data/ui/offline.ui (+0/-23)
data/ui/photo.ui (+0/-27)
data/ui/photo_context.ui (+0/-31)
data/ui/savedsearch.ui (+0/-8)
data/ui/search_sidebar_context.ui (+0/-6)
data/ui/sidebar_default_context.ui (+0/-7)
data/ui/tag_sidebar_context.ui (+0/-6)
data/ui/tags.ui (+0/-16)
data/ui/trash.ui (+0/-28)
src/CollectionPage.vala (+222/-88)
src/MediaPage.vala (+126/-21)
src/Page.vala (+3/-40)
src/PhotoPage.vala (+136/-34)
src/camera/ImportPage.vala (+97/-10)
src/direct/DirectPhotoPage.vala (+48/-33)
src/direct/DirectWindow.vala (+1/-1)
src/events/EventPage.vala (+15/-10)
src/events/EventsDirectoryPage.vala (+83/-7)
src/library/OfflinePage.vala (+90/-8)
src/library/TrashPage.vala (+105/-8)
src/searches/Branch.vala (+9/-25)
src/searches/SavedSearchPage.vala (+26/-7)
src/sidebar/Tree.vala (+14/-28)
src/tags/Branch.vala (+9/-25)
src/tags/TagPage.vala (+28/-5)
To merge this branch: bzr merge lp:~tintou/pantheon-photos/menu-to-vala
Reviewer Review Type Date Requested Status
Danielle Foré Needs Fixing
Review via email: mp+316393@code.launchpad.net

Commit message

Move all the context menus to Vala

Description of the change

I hope this is close to a 1:1 conversion.

To post a comment you must log in.
Revision history for this message
Corentin Noël (tintou) wrote :

Note: The next step is to move from Gtk.Action to GLib.Action

Revision history for this message
Danielle Foré (danrabbit) wrote :

Okay after some testing I found:

* Toggling the places or metadata sidebar from two different views will cause photos to crash
* Fullscreen is a missing option in the main photos view
* I can't seem to figure out how to reliably reproduce this but sometimes when a menu closes the view sorting is reverted

review: Needs Fixing
Revision history for this message
Danielle Foré (danrabbit) wrote :

Oops I was wrong on the last one. Happens when the menu opens. So I guess that metadata_action.activate must get triggered when the menu is loaded maybe?

Revision history for this message
Danielle Foré (danrabbit) wrote :

"Empty Trash" from the trash context menu item seems to not do anything

Revision history for this message
Danielle Foré (danrabbit) wrote :

Not sure if this helps diagnose, but after using the menu to hide/reveal the sidebar, trying to do so with the button in the toolbar crashes Photos

Revision history for this message
Danielle Foré (danrabbit) wrote :

In the library view, the slideshow button appears at the end of the toolbar, but in the single photo view it appears at the beginning.

Revision history for this message
Danielle Foré (danrabbit) wrote :

Rotate, flip, and publish are sensitive in the library view when nothing is selected. Auto-adjust seems to be working properly

Revision history for this message
Corentin Noël (tintou) wrote :

I've applied the requested changes

Revision history for this message
Danielle Foré (danrabbit) wrote :

Right on! I can confirm that a number of the issues are fixed. But I found more ;p

* In Fullscreen, there is an empty context menu

* Sorting photos doesn't seem to work at all anymore :p

* Empty Trash in the places sidebar context menu still doesn't seem to do anything

* The "Show Info Panel" button in the toolbar doesn't always seem to update its icon state correctly. To reproduce:
    1. hide the panel (from the context menu)
    2. switch views
    3. reveal the panel (from the context menu)
    4. Switch back to the original view

3151. By Corentin Noël

Moved all the context menus to Vala

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== removed file 'data/ui/collection.ui'
2--- data/ui/collection.ui 2016-09-20 00:44:41 +0000
3+++ data/ui/collection.ui 1970-01-01 00:00:00 +0000
4@@ -1,44 +0,0 @@
5-<ui>
6- <popup name="CollectionContextMenu">
7- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
8- <separator />
9- <menuitem name="ContextRevert" action="Revert" />
10- <separator />
11- <menuitem name="ContextCopyColorAdjustments" action="CopyColorAdjustments" />
12- <menuitem name="ContextPasteColorAdjustments" action="PasteColorAdjustments" />
13- <separator />
14- <placeholder name="ContextFacesPlaceholder" />
15- <separator />
16- <menuitem name="ContextFlag" action="Flag" />
17- <menu name="RawDeveloper" action="RawDeveloper">
18- <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
19- <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
20- </menu>
21- <separator />
22- <menuitem name="AdjustDateTime" action="AdjustDateTime" />
23- <placeholder name="EditExtrasPlaceholder" />
24- <menu name="OpenWith" action="OpenWith">
25- </menu>
26- <menu name="OpenWithRaw" action="OpenWithRaw">
27- </menu>
28- <separator />
29- <menuitem name="NewEvent" action="NewEvent" />
30- <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
31- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
32- <menuitem name="ContextPrint" action="Print"/>
33- <menuitem name="ContextExport" action="Export" />
34- <placeholder name="ContractorPlaceholder" />
35- <separator />
36- <placeholder name="ContextTagsPlaceholder" />
37- <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
38- <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
39- </popup>
40-
41- <toolbar name="CollectionToolbar">
42- <toolitem name="ToolRotate" action="RotateClockwise" />
43- <toolitem name="ToolFlip" action="FlipHorizontally" />
44- <separator />
45- <toolitem name="ToolPublish" action="Publish" />
46- <separator />
47- </toolbar>
48-</ui>
49
50=== removed file 'data/ui/direct.ui'
51--- data/ui/direct.ui 2014-09-02 19:42:49 +0000
52+++ data/ui/direct.ui 1970-01-01 00:00:00 +0000
53@@ -1,7 +0,0 @@
54-<ui>
55- <popup name="DirectContextMenu">
56- <placeholder name="ContextJumpPlaceholder">
57- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
58- </placeholder>
59- </popup>
60-</ui>
61\ No newline at end of file
62
63=== removed file 'data/ui/direct_context.ui'
64--- data/ui/direct_context.ui 2015-09-05 09:05:13 +0000
65+++ data/ui/direct_context.ui 1970-01-01 00:00:00 +0000
66@@ -1,11 +0,0 @@
67-<ui>
68- <popup name="DirectContextMenu">
69- <menuitem name="ContextRevert" action="Revert" />
70- <separator />
71- <menuitem name="AdjustDateTime" action="AdjustDateTime" />
72- <separator />
73- <placeholder name="ContextJumpPlaceholder" />
74- <placeholder name="PrintPlaceholder"/>
75- <placeholder name="ContractorPlaceholder" />
76- </popup>
77-</ui>
78\ No newline at end of file
79
80=== removed file 'data/ui/event.ui'
81--- data/ui/event.ui 2014-09-02 19:42:49 +0000
82+++ data/ui/event.ui 1970-01-01 00:00:00 +0000
83@@ -1,12 +0,0 @@
84-<ui>
85- <popup name="CollectionContextMenu">
86- <separator />
87- <menuitem name="ContextMakePrimary" action="MakePrimary" />
88- </popup>
89-
90- <popup name="EventContextMenu">
91- <menuitem name="ContextRename" action="Rename" />
92- <menuitem name="EditEventComment" action="EditEventComment" />
93- </popup>
94-
95-</ui>
96\ No newline at end of file
97
98=== removed file 'data/ui/events_directory.ui'
99--- data/ui/events_directory.ui 2014-09-02 19:42:49 +0000
100+++ data/ui/events_directory.ui 1970-01-01 00:00:00 +0000
101@@ -1,24 +0,0 @@
102-<ui>
103- <popup name="EventsDirectoryContextMenu">
104- <menuitem name="ContextMerge" action="Merge" />
105- <menuitem name="ContextRename" action="Rename" />
106- </popup>
107-
108- <popup name="EventsDirectoryViewMenu" action="ViewMenu">
109- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
110- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
111- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
112- <separator />
113- <menuitem name="ViewComment" action="ViewComment" />
114- <separator />
115- <menu name="SortEvents" action="CommonSortEvents">
116- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
117- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
118- </menu>
119- <separator />
120- <menuitem name="Fullscreen" action="CommonFullscreen" />
121- <separator />
122- <menuitem name="SelectAll" action="CommonSelectAll" />
123- </popup>
124-
125-</ui>
126\ No newline at end of file
127
128=== removed file 'data/ui/import.ui'
129--- data/ui/import.ui 2017-01-27 00:06:44 +0000
130+++ data/ui/import.ui 1970-01-01 00:00:00 +0000
131@@ -1,22 +0,0 @@
132-<ui>
133- <popup name="ImportContextMenu">
134- <menuitem name="ContextImportSelected" action="ImportSelected" />
135- <menuitem name="ContextImportAll" action="ImportAll" />
136- </popup>
137-
138- <popup name="ImportViewMenu">
139- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
140- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
141- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
142- <separator />
143- <menuitem name="ViewTitle" action="ViewTitle" />
144- <separator />
145- <menu name="SortEvents" action="CommonSortEvents">
146- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
147- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
148- </menu>
149- <separator />
150- <menuitem name="SelectAll" action="CommonSelectAll" />
151- </popup>
152-
153-</ui>
154
155=== removed file 'data/ui/media.ui'
156--- data/ui/media.ui 2016-09-20 00:44:41 +0000
157+++ data/ui/media.ui 1970-01-01 00:00:00 +0000
158@@ -1,27 +0,0 @@
159-<ui>
160- <popup name="MediaViewMenu" action="ViewMenu">
161- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
162- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
163- <separator />
164- <menuitem name="ViewTitle" action="ViewTitle" />
165- <menuitem name="ViewComment" action="ViewComment" />
166- <menuitem name="ViewTags" action="ViewTags" />
167- <separator />
168- <menu name="SortPhotos" action="SortPhotos">
169- <menuitem name="SortByTitle" action="SortByTitle" />
170- <menuitem name="SortByExposureDate" action="SortByExposureDate" />
171- <separator />
172- <menuitem name="SortAscending" action="SortAscending" />
173- <menuitem name="SortDescending" action="SortDescending" />
174- </menu>
175- <menu name="SortEvents" action="CommonSortEvents">
176- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
177- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
178- </menu>
179- <separator />
180- <placeholder name="ViewExtrasFullscreenSlideshowPlaceholder" />
181- <separator />
182- <menuitem name="SelectAll" action="CommonSelectAll" />
183- </popup>
184-
185-</ui>
186
187=== removed file 'data/ui/offline.ui'
188--- data/ui/offline.ui 2017-01-27 00:06:44 +0000
189+++ data/ui/offline.ui 1970-01-01 00:00:00 +0000
190@@ -1,23 +0,0 @@
191-<ui>
192- <popup name="OfflineContextMenu">
193- <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
194- </popup>
195-
196- <toolbar name="OfflineToolbar">
197- <toolitem name="ToolRemoveFromLibrary" action="RemoveFromLibrary" />
198- <separator />
199- </toolbar>
200-
201- <popup name="OfflineViewMenu" action="ViewMenu">
202- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
203- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
204- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
205- <separator />
206- <menu name="SortEvents" action="CommonSortEvents">
207- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
208- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
209- </menu>
210- <separator />
211- <menuitem name="SelectAll" action="CommonSelectAll" />
212- </popup>
213-</ui>
214
215=== removed file 'data/ui/photo.ui'
216--- data/ui/photo.ui 2016-09-20 00:44:41 +0000
217+++ data/ui/photo.ui 1970-01-01 00:00:00 +0000
218@@ -1,27 +0,0 @@
219-<ui>
220- <popup name="PhotoContextMenu">
221- <placeholder name="ContextJumpPlaceholder">
222- <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
223- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
224- </placeholder>
225- </popup>
226-
227- <popup name="PhotoViewMenu" action="ViewMenu">
228- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
229- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
230- <separator />
231- <menu name="SortEvents" action="CommonSortEvents">
232- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
233- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
234- </menu>
235- <separator />
236- <menuitem name="ZoomFit" action="ZoomFit" />
237- <menuitem name="Zoom100" action="Zoom100" />
238- <menuitem name="Zoom200" action="Zoom200" />
239- <separator />
240- <menuitem name="Fullscreen" action="CommonFullscreen" />
241- <separator />
242- <menuitem name="Slideshow" action="Slideshow" />
243- </popup>
244-
245-</ui>
246
247=== removed file 'data/ui/photo_context.ui'
248--- data/ui/photo_context.ui 2016-09-20 00:44:41 +0000
249+++ data/ui/photo_context.ui 1970-01-01 00:00:00 +0000
250@@ -1,31 +0,0 @@
251-<ui>
252- <popup name="PhotoContextMenu">
253- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
254- <separator />
255- <menuitem name="ContextRevert" action="Revert" />
256- <separator />
257- <menuitem name="ContextCopyColorAdjustments" action="CopyColorAdjustments" />
258- <menuitem name="ContextPasteColorAdjustments" action="PasteColorAdjustments" />
259- <separator />
260- <menuitem name="ContextFlag" action="Flag" />
261- <menu name="RawDeveloper" action="RawDeveloper">
262- <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
263- <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
264- </menu>
265- <separator />
266- <menuitem name="AdjustDateTime" action="AdjustDateTime" />
267- <menu name="OpenWith" action="OpenWith">
268- </menu>
269- <menu name="OpenWithRaw" action="OpenWithRaw">
270- </menu>
271- <separator />
272- <placeholder name="ContextJumpPlaceholder" />
273- <placeholder name="PrintPlaceholder" />
274- <menuitem name="ContextExport" action="Export" />
275- <placeholder name="ContractorPlaceholder" />
276- <separator />
277- <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
278- <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
279- </popup>
280-
281-</ui>
282
283=== removed file 'data/ui/savedsearch.ui'
284--- data/ui/savedsearch.ui 2011-05-03 01:36:07 +0000
285+++ data/ui/savedsearch.ui 1970-01-01 00:00:00 +0000
286@@ -1,8 +0,0 @@
287-<ui>
288- <popup name="SearchContextMenu">
289- <menuitem name="ContextRenameSearch" action="RenameSearch" />
290- <menuitem name="ContextEditSearch" action="EditSearch" />
291- <menuitem name="ContextDeleteSearch" action="DeleteSearch" />
292- </popup>
293-
294-</ui>
295
296=== removed file 'data/ui/search_sidebar_context.ui'
297--- data/ui/search_sidebar_context.ui 2011-08-07 15:48:19 +0000
298+++ data/ui/search_sidebar_context.ui 1970-01-01 00:00:00 +0000
299@@ -1,6 +0,0 @@
300-<ui>
301- <popup name="SidebarSearchContextMenu">
302- <menuitem name="NewSearch" action="CommonNewSearch" />
303- </popup>
304-</ui>
305-
306
307=== removed file 'data/ui/sidebar_default_context.ui'
308--- data/ui/sidebar_default_context.ui 2011-11-21 20:50:56 +0000
309+++ data/ui/sidebar_default_context.ui 1970-01-01 00:00:00 +0000
310@@ -1,7 +0,0 @@
311-<ui>
312- <popup name="SidebarDefaultContextMenu">
313- <menuitem name="NewSearch" action="CommonNewSearch" />
314- <menuitem name="NewTag" action="CommonNewTag" />
315- </popup>
316-</ui>
317-
318
319=== removed file 'data/ui/tag_sidebar_context.ui'
320--- data/ui/tag_sidebar_context.ui 2011-08-07 15:48:19 +0000
321+++ data/ui/tag_sidebar_context.ui 1970-01-01 00:00:00 +0000
322@@ -1,6 +0,0 @@
323-<ui>
324- <popup name="SidebarTagContextMenu">
325- <menuitem name="NewTag" action="CommonNewTag" />
326- </popup>
327-</ui>
328-
329
330=== removed file 'data/ui/tags.ui'
331--- data/ui/tags.ui 2014-08-25 06:55:28 +0000
332+++ data/ui/tags.ui 1970-01-01 00:00:00 +0000
333@@ -1,16 +0,0 @@
334-<ui>
335-
336- <popup name="CollectionContextMenu">
337- <placeholder name="ContextTagsPlaceholder">
338- <menuitem name="ContextRemoveTagFromPhotos" action="RemoveTagFromPhotos" />
339- </placeholder>
340- </popup>
341-
342- <popup name="TagsContextMenu">
343- <menuitem name="ContextNewChildTag" action="NewChildTagSidebar" />
344- <separator />
345- <menuitem name="ContextDeleteTag" action="RenameTagSidebar" />
346- <menuitem name="ContextRenameTag" action="DeleteTagSidebar" />
347- </popup>
348-
349-</ui>
350\ No newline at end of file
351
352=== removed file 'data/ui/trash.ui'
353--- data/ui/trash.ui 2017-02-01 18:26:23 +0000
354+++ data/ui/trash.ui 1970-01-01 00:00:00 +0000
355@@ -1,28 +0,0 @@
356-<ui>
357- <popup name="TrashContextMenu">
358- <menuitem name="ContextDelete" action="Delete" />
359- <menuitem name="ContextRestore" action="Restore" />
360- <separator />
361- <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
362- <separator />
363- <menuitem name="ContextEmptyTrash" action="EmptyTrash" />
364- </popup>
365-
366- <popup name="TrashPageMenu">
367- <menuitem name="ContextEmptyTrash" action="EmptyTrash" />
368- </popup>
369-
370- <popup name="TrashViewMenu" action="ViewMenu">
371- <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
372- <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
373- <menuitem name="DisplayMetadataSidebar" action="CommonDisplayMetadataSidebar" />
374- <separator />
375- <menu name="SortEvents" action="CommonSortEvents">
376- <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
377- <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
378- </menu>
379- <separator />
380- <menuitem name="SelectAll" action="CommonSelectAll" />
381- </popup>
382-
383-</ui>
384
385=== modified file 'src/CollectionPage.vala'
386--- src/CollectionPage.vala 2017-01-27 00:06:44 +0000
387+++ src/CollectionPage.vala 2017-02-12 02:36:55 +0000
388@@ -42,51 +42,86 @@
389 private ExporterUI exporter = null;
390 private CollectionSearchViewFilter search_filter = new CollectionSearchViewFilter ();
391 private Gtk.ToggleToolButton enhance_button = null;
392+ private Gtk.Menu item_context_menu;
393+ private Gtk.Menu open_menu;
394+ private Gtk.Menu open_raw_menu;
395+ private Gtk.Menu contractor_menu;
396+ private Gtk.ToolButton rotate_button;
397+ private Gtk.ToolButton flip_button;
398+
399 public CollectionPage (string page_name) {
400 base (page_name);
401
402 get_view ().items_altered.connect (on_photos_altered);
403
404- init_item_context_menu ("/CollectionContextMenu");
405- init_toolbar ("/CollectionToolbar");
406- enhance_button = new Gtk.ToggleToolButton ();
407-
408 show_all ();
409 }
410
411 public override Gtk.Toolbar get_toolbar () {
412 if (toolbar == null) {
413- base.get_toolbar ();
414+ toolbar = new Gtk.Toolbar ();
415+ toolbar.get_style_context ().add_class ("bottom-toolbar"); // for elementary theme
416+ toolbar.set_style (Gtk.ToolbarStyle.ICONS);
417+
418+ var slideshow_button = new Gtk.ToolButton (null, _("S_lideshow"));
419+ slideshow_button.icon_name = "media-playback-start-symbolic";
420+ slideshow_button.tooltip_text = _("Play a slideshow");
421+ slideshow_button.clicked.connect (on_slideshow);
422+ toolbar.insert (slideshow_button, -1);
423+
424+ rotate_button = new Gtk.ToolButton (null, Resources.ROTATE_CW_MENU);
425+ rotate_button.icon_name = Resources.CLOCKWISE;
426+ rotate_button.tooltip_text = Resources.ROTATE_CW_TOOLTIP;
427+ rotate_button.clicked.connect (on_rotate_clockwise);
428+ var rotate_action = get_action ("RotateClockwise");
429+ rotate_action.bind_property ("sensitive", rotate_button, "sensitive", BindingFlags.SYNC_CREATE);
430+ toolbar.insert (rotate_button, -1);
431+
432+ flip_button = new Gtk.ToolButton (null, Resources.HFLIP_MENU);
433+ flip_button.icon_name = Resources.HFLIP;
434+ flip_button.tooltip_text = Resources.HFLIP_TOOLTIP;
435+ flip_button.clicked.connect (on_flip_horizontally);
436+ var flip_action = get_action ("FlipHorizontally");
437+ flip_action.bind_property ("sensitive", flip_button, "sensitive", BindingFlags.SYNC_CREATE);
438+ toolbar.insert (flip_button, -1);
439+
440+ toolbar.insert (new Gtk.SeparatorToolItem (), -1);
441+
442+ var publish_button = new Gtk.ToolButton (null, Resources.PUBLISH_MENU);
443+ publish_button.icon_name = Resources.PUBLISH;
444+ publish_button.tooltip_text = Resources.PUBLISH_TOOLTIP;
445+ publish_button.clicked.connect (on_publish);
446+ var publish_action = get_action ("Publish");
447+ publish_action.bind_property ("sensitive", publish_button, "sensitive", BindingFlags.SYNC_CREATE);
448+ toolbar.insert (publish_button, -1);
449+
450+ toolbar.insert (new Gtk.SeparatorToolItem (), -1);
451+
452 // enhance tool
453- enhance_button.icon_widget = new Gtk.Image.from_icon_name (Resources.ENHANCE, Gtk.IconSize.LARGE_TOOLBAR);
454- enhance_button.set_label (Resources.ENHANCE_LABEL);
455- enhance_button.set_tooltip_text (Resources.ENHANCE_TOOLTIP);
456+ enhance_button = new Gtk.ToggleToolButton ();
457+ enhance_button.icon_name = Resources.ENHANCE;
458+ enhance_button.label = Resources.ENHANCE_LABEL;
459+ enhance_button.tooltip_text = Resources.ENHANCE_TOOLTIP;
460 enhance_button.clicked.connect (on_enhance);
461 enhance_button.is_important = true;
462- toolbar.insert (enhance_button, 2);
463+ toolbar.insert (enhance_button, -1);
464
465 // separator to force slider to right side of toolbar
466 Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem ();
467 separator.set_expand (true);
468 separator.set_draw (false);
469- get_toolbar ().insert (separator, -1);
470+ toolbar.insert (separator, -1);
471
472 Gtk.SeparatorToolItem drawn_separator = new Gtk.SeparatorToolItem ();
473 drawn_separator.set_expand (false);
474 drawn_separator.set_draw (true);
475
476- get_toolbar ().insert (drawn_separator, -1);
477+ toolbar.insert (drawn_separator, -1);
478
479 // zoom slider assembly
480 MediaPage.ZoomSliderAssembly zoom_slider_assembly = create_zoom_slider_assembly ();
481 connect_slider (zoom_slider_assembly);
482- get_toolbar ().insert (zoom_slider_assembly, -1);
483-
484- Gtk.Image start_image = new Gtk.Image.from_icon_name ("media-playback-start-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
485- Gtk.ToolButton slideshow_button = new Gtk.ToolButton (start_image, _("S_lideshow"));
486- slideshow_button.set_tooltip_text (_("Play a slideshow"));
487- slideshow_button.clicked.connect (on_slideshow);
488- get_toolbar ().insert (slideshow_button, 0);
489+ toolbar.insert (zoom_slider_assembly, -1);
490
491 // show metadata sidebar button
492 show_sidebar_button = MediaPage.create_sidebar_button ();
493@@ -99,26 +134,151 @@
494 return toolbar;
495 }
496
497- private static InjectionGroup create_context_menu_injectables () {
498- InjectionGroup group = new InjectionGroup ("/CollectionContextMenu/EditExtrasPlaceholder");
499-
500- group.add_menu_item ("Duplicate");
501-
502- return group;
503- }
504-
505- private static InjectionGroup create_view_menu_fullscreen_injectables () {
506- InjectionGroup group = new InjectionGroup ("/MediaViewMenu/ViewExtrasFullscreenSlideshowPlaceholder");
507-
508- group.add_menu_item ("Fullscreen", "CommonFullscreen");
509-
510- return group;
511- }
512-
513- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
514- base.init_collect_ui_filenames (ui_filenames);
515-
516- ui_filenames.add ("collection.ui");
517+ public override Gtk.Menu? get_item_context_menu () {
518+ if (item_context_menu == null) {
519+ item_context_menu = new Gtk.Menu ();
520+
521+ var metadata_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Edit Photo In_fo"));
522+ var metadata_action = get_common_action ("CommonDisplayMetadataSidebar");
523+ metadata_action.bind_property ("active", metadata_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
524+
525+ var revert_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.REVERT_MENU);
526+ var revert_action = get_action ("Revert");
527+ revert_action.bind_property ("sensitive", revert_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
528+ revert_menu_item.activate.connect (() => revert_action.activate ());
529+
530+ var duplicate_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.DUPLICATE_PHOTO_MENU);
531+ var duplicate_action = get_action ("Duplicate");
532+ duplicate_action.bind_property ("sensitive", duplicate_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
533+ duplicate_menu_item.activate.connect (() => duplicate_action.activate ());
534+
535+ var copy_color_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.COPY_ADJUSTMENTS_MENU);
536+ var copy_color_action = get_action ("CopyColorAdjustments");
537+ copy_color_action.bind_property ("sensitive", copy_color_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
538+ copy_color_menu_item.activate.connect (() => copy_color_action.activate ());
539+
540+ var paste_color_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.PASTE_ADJUSTMENTS_MENU);
541+ var paste_color_action = get_action ("PasteColorAdjustments");
542+ paste_color_action.bind_property ("sensitive", paste_color_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
543+ paste_color_menu_item.activate.connect (() => paste_color_action.activate ());
544+
545+ var flag_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.FLAG_MENU);
546+ var flag_action = get_action ("Flag");
547+ flag_action.bind_property ("sensitive", flag_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
548+ flag_menu_item.activate.connect (() => flag_action.activate ());
549+
550+ var raw_developer_app_menu_item = new Gtk.MenuItem.with_mnemonic (RawDeveloper.SHOTWELL.get_label ());
551+ var raw_developer_app_action = get_action ("RawDeveloperShotwell");
552+ raw_developer_app_action.bind_property ("sensitive", raw_developer_app_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
553+ raw_developer_app_menu_item.activate.connect (() => raw_developer_app_action.activate ());
554+
555+ var raw_developer_camera_menu_item = new Gtk.MenuItem.with_mnemonic (RawDeveloper.CAMERA.get_label ());
556+ var raw_developer_camera_action = get_action ("RawDeveloperCamera");
557+ raw_developer_camera_action.bind_property ("sensitive", raw_developer_camera_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
558+ raw_developer_camera_menu_item.activate.connect (() => raw_developer_camera_action.activate ());
559+
560+ var raw_developer_menu_item = new Gtk.MenuItem.with_mnemonic (_("_Developer"));
561+ var raw_developer_action = get_action ("RawDeveloper");
562+ raw_developer_action.bind_property ("sensitive", raw_developer_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
563+ open_menu = new Gtk.Menu ();
564+ var raw_developer_menu = new Gtk.Menu ();
565+ raw_developer_menu.add (raw_developer_app_menu_item);
566+ raw_developer_menu.add (raw_developer_camera_menu_item);
567+ raw_developer_menu_item.set_submenu (raw_developer_menu);
568+
569+ var adjust_datetime_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.ADJUST_DATE_TIME_MENU);
570+ var adjust_datetime_action = get_action ("AdjustDateTime");
571+ adjust_datetime_action.bind_property ("sensitive", adjust_datetime_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
572+ adjust_datetime_menu_item.activate.connect (() => adjust_datetime_action.activate ());
573+
574+ var open_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.OPEN_WITH_MENU);
575+ var open_action = get_action ("OpenWith");
576+ open_action.bind_property ("sensitive", open_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
577+ open_menu = new Gtk.Menu ();
578+ open_menu_item.set_submenu (open_menu);
579+
580+ var open_raw_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.OPEN_WITH_RAW_MENU);
581+ var open_raw_action = get_action ("OpenWithRaw");
582+ open_raw_action.bind_property ("sensitive", open_raw_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
583+ open_raw_menu = new Gtk.Menu ();
584+ open_raw_menu_item.set_submenu (open_raw_menu);
585+
586+ var new_event_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.NEW_EVENT_MENU);
587+ var new_event_action = get_action ("NewEvent");
588+ new_event_action.bind_property ("sensitive", new_event_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
589+ new_event_menu_item.activate.connect (() => new_event_action.activate ());
590+
591+ var jump_event_menu_item = new Gtk.MenuItem.with_mnemonic (_("View Eve_nt for Photo"));
592+ var jump_event_action = get_common_action ("CommonJumpToEvent");
593+ jump_event_action.bind_property ("sensitive", jump_event_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
594+ jump_event_menu_item.activate.connect (() => jump_event_action.activate ());
595+
596+ var jump_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.JUMP_TO_FILE_MENU);
597+ var jump_action = get_common_action ("CommonJumpToFile");
598+ jump_action.bind_property ("sensitive", jump_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
599+ jump_menu_item.activate.connect (() => jump_action.activate ());
600+
601+ var print_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.PRINT_MENU);
602+ var print_action = get_action ("Print");
603+ print_action.bind_property ("sensitive", print_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
604+ print_menu_item.activate.connect (() => print_action.activate ());
605+
606+ var export_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.EXPORT_MENU);
607+ var export_action = get_action ("Export");
608+ export_action.bind_property ("sensitive", export_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
609+ export_menu_item.activate.connect (() => export_action.activate ());
610+
611+ var contractor_menu_item = new Gtk.MenuItem.with_mnemonic (_("Other Actions"));
612+ contractor_menu = new Gtk.Menu ();
613+ contractor_menu_item.set_submenu (contractor_menu);
614+
615+ var remove_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.REMOVE_FROM_LIBRARY_MENU);
616+ var remove_action = get_action ("RemoveFromLibrary");
617+ remove_action.bind_property ("sensitive", remove_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
618+ remove_menu_item.activate.connect (() => remove_action.activate ());
619+
620+ var trash_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.MOVE_TO_TRASH_MENU);
621+ var trash_action = get_action ("MoveToTrash");
622+ trash_action.bind_property ("sensitive", trash_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
623+ trash_menu_item.activate.connect (() => trash_action.activate ());
624+
625+ contractor_menu.add (print_menu_item);
626+ contractor_menu.add (export_menu_item);
627+
628+ item_context_menu.add (adjust_datetime_menu_item);
629+ item_context_menu.add (duplicate_menu_item);
630+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
631+ item_context_menu.add (jump_menu_item);
632+ item_context_menu.add (open_menu_item);
633+ item_context_menu.add (open_raw_menu_item);
634+ item_context_menu.add (contractor_menu_item);
635+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
636+ item_context_menu.add (copy_color_menu_item);
637+ item_context_menu.add (paste_color_menu_item);
638+ item_context_menu.add (revert_menu_item);
639+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
640+ item_context_menu.add (flag_menu_item);
641+ item_context_menu.add (raw_developer_menu_item);
642+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
643+ item_context_menu.add (new_event_menu_item);
644+ item_context_menu.add (jump_event_menu_item);
645+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
646+ item_context_menu.add (metadata_menu_item);
647+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
648+ item_context_menu.add (remove_menu_item);
649+ item_context_menu.add (trash_menu_item);
650+ item_context_menu.show_all ();
651+ }
652+
653+ populate_external_app_menu (open_menu, false);
654+
655+ Photo? photo = (get_view ().get_selected_at (0).get_source () as Photo);
656+ if (photo != null && photo.get_master_file_format () == PhotoFileFormat.RAW) {
657+ populate_external_app_menu (open_raw_menu, true);
658+ }
659+
660+ populate_contractor_menu (contractor_menu);
661+ return item_context_menu;
662 }
663
664 protected override Gtk.ActionEntry[] init_collect_action_entries () {
665@@ -198,35 +358,6 @@
666 return actions;
667 }
668
669- protected override InjectionGroup[] init_collect_injection_groups () {
670- InjectionGroup[] groups = base.init_collect_injection_groups ();
671-
672- groups += create_context_menu_injectables ();
673- groups += create_view_menu_fullscreen_injectables ();
674-
675- return groups;
676- }
677-
678- public override Gtk.Menu? get_item_context_menu () {
679- Gtk.Menu menu = (Gtk.Menu) ui.get_widget ("/CollectionContextMenu");
680- assert (menu != null);
681-
682- Gtk.MenuItem open_with_menu_item = (Gtk.MenuItem) ui.get_widget ("/CollectionContextMenu/OpenWith");
683- populate_external_app_menu ((Gtk.Menu)open_with_menu_item.get_submenu (), false);
684- open_with_menu_item.show ();
685-
686- Photo? photo = (get_view ().get_selected_at (0).get_source () as Photo);
687- if (photo != null && photo.get_master_file_format () == PhotoFileFormat.RAW) {
688- Gtk.MenuItem open_with_raw_menu_item = (Gtk.MenuItem) ui.get_widget ("/CollectionContextMenu/OpenWithRaw");
689- populate_external_app_menu ((Gtk.Menu)open_with_raw_menu_item.get_submenu (), true);
690- open_with_raw_menu_item.show ();
691- }
692-
693- populate_contractor_menu (menu, "/CollectionContextMenu/ContractorPlaceholder");
694- menu.show_all ();
695- return menu;
696- }
697-
698 private void populate_external_app_menu (Gtk.Menu menu, bool raw) {
699 Gtk.MenuItem parent = menu.get_attach_widget () as Gtk.MenuItem;
700 SortedList<AppInfo> external_apps;
701@@ -365,9 +496,10 @@
702 set_action_sensitive ("Slideshow", page_has_photos && (!primary_is_video));
703 set_action_sensitive ("Print", (!selection_has_videos) && has_selected);
704 set_action_sensitive ("Publish", has_selected);
705- enhance_button.sensitive = (!selection_has_videos) && has_selected;
706-
707- update_enhance_toggled ();
708+ if (enhance_button != null) {
709+ enhance_button.sensitive = (!selection_has_videos) && has_selected;
710+ update_enhance_toggled ();
711+ }
712 }
713
714 private void on_photos_altered (Gee.Map<DataObject, Alteration> altered) {
715@@ -791,29 +923,31 @@
716 }
717
718 protected override bool on_ctrl_pressed (Gdk.EventKey? event) {
719- Gtk.ToolButton? rotate_button = ui.get_widget ("/CollectionToolbar/ToolRotate")
720- as Gtk.ToolButton;
721- if (rotate_button != null)
722- rotate_button.set_related_action (get_action ("RotateCounterclockwise"));
723-
724- Gtk.ToolButton? flip_button = ui.get_widget ("/CollectionToolbar/ToolFlip")
725- as Gtk.ToolButton;
726- if (flip_button != null)
727- flip_button.set_related_action (get_action ("FlipVertically"));
728+ flip_button.label = Resources.VFLIP_MENU;
729+ flip_button.icon_name = Resources.VFLIP;
730+ flip_button.tooltip_text = Resources.VFLIP_TOOLTIP;
731+ rotate_button.label = Resources.ROTATE_CCW_MENU;
732+ rotate_button.icon_name = Resources.COUNTERCLOCKWISE;
733+ rotate_button.tooltip_text = Resources.ROTATE_CCW_TOOLTIP;
734+ flip_button.clicked.disconnect (on_flip_horizontally);
735+ flip_button.clicked.connect (on_flip_vertically);
736+ rotate_button.clicked.disconnect (on_rotate_clockwise);
737+ rotate_button.clicked.connect (on_rotate_counterclockwise);
738
739 return base.on_ctrl_pressed (event);
740 }
741
742 protected override bool on_ctrl_released (Gdk.EventKey? event) {
743- Gtk.ToolButton? rotate_button = ui.get_widget ("/CollectionToolbar/ToolRotate")
744- as Gtk.ToolButton;
745- if (rotate_button != null)
746- rotate_button.set_related_action (get_action ("RotateClockwise"));
747-
748- Gtk.ToolButton? flip_button = ui.get_widget ("/CollectionToolbar/ToolFlip")
749- as Gtk.ToolButton;
750- if (flip_button != null)
751- flip_button.set_related_action (get_action ("FlipHorizontally"));
752+ flip_button.label = Resources.HFLIP_MENU;
753+ flip_button.icon_name = Resources.HFLIP;
754+ flip_button.tooltip_text = Resources.HFLIP_TOOLTIP;
755+ rotate_button.label = Resources.ROTATE_CW_MENU;
756+ rotate_button.icon_name = Resources.CLOCKWISE;
757+ rotate_button.tooltip_text = Resources.ROTATE_CW_TOOLTIP;
758+ flip_button.clicked.disconnect (on_flip_vertically);
759+ flip_button.clicked.connect (on_flip_horizontally);
760+ rotate_button.clicked.disconnect (on_rotate_counterclockwise);
761+ rotate_button.clicked.connect (on_rotate_clockwise);
762
763 return base.on_ctrl_released (event);
764 }
765
766=== modified file 'src/MediaPage.vala'
767--- src/MediaPage.vala 2017-01-26 23:05:03 +0000
768+++ src/MediaPage.vala 2017-02-12 02:36:55 +0000
769@@ -156,12 +156,12 @@
770 private ZoomSliderAssembly? connected_slider = null;
771 private DragAndDropHandler dnd_handler = null;
772 private MediaViewTracker tracker;
773+ private Gtk.Menu page_context_menu;
774
775 public MediaPage (string page_name) {
776 base (page_name);
777
778 tracker = new MediaViewTracker (get_view ());
779- init_page_context_menu ("/MediaViewMenu");
780 get_view ().items_altered.connect (on_media_altered);
781
782 get_view ().freeze_notifications ();
783@@ -179,6 +179,131 @@
784 dnd_handler = new DragAndDropHandler (this);
785 }
786
787+ public override Gtk.Menu? get_page_context_menu () {
788+ if (page_context_menu == null) {
789+ page_context_menu = new Gtk.Menu ();
790+
791+ var sidebar_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("S_idebar"));
792+ var sidebar_action = get_common_action ("CommonDisplaySidebar");
793+ sidebar_action.bind_property ("active", sidebar_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
794+
795+ var metadata_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Edit Photo In_fo"));
796+ var metadata_action = get_common_action ("CommonDisplayMetadataSidebar");
797+ metadata_action.bind_property ("active", metadata_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
798+
799+ var title_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("_Titles"));
800+ var title_action = get_action ("ViewTitle");
801+ title_action.bind_property ("active", title_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
802+
803+ var comment_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("_Comments"));
804+ var comment_action = get_action ("ViewComment");
805+ comment_action.bind_property ("active", comment_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
806+
807+ var tags_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Ta_gs"));
808+ var tags_action = get_action ("ViewTags");
809+ tags_action.bind_property ("active", tags_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
810+
811+ var sort_photos_menu_item = new Gtk.MenuItem.with_mnemonic (_("Sort _Photos"));
812+
813+ var by_title_menu_item = new Gtk.RadioMenuItem.with_mnemonic (null, _("By _Title"));
814+ var by_title_action = get_action ("SortByTitle");
815+ by_title_action.bind_property ("active", by_title_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
816+ by_title_menu_item.activate.connect (() => {
817+ if (by_title_menu_item.active) {
818+ by_title_action.activate ();
819+ }
820+ });
821+
822+ var by_exposure_menu_item = new Gtk.RadioMenuItem.with_mnemonic_from_widget (by_title_menu_item, _("By Exposure _Date"));
823+ var by_exposure_action = get_action ("SortByExposureDate");
824+ by_exposure_action.bind_property ("active", by_exposure_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
825+ by_exposure_menu_item.activate.connect (() => {
826+ if (by_exposure_menu_item.active) {
827+ by_exposure_action.activate ();
828+ }
829+ });
830+
831+ var ascending_photos_menu_item = new Gtk.RadioMenuItem.with_mnemonic (null, _("_Ascending"));
832+ var ascending_photos_action = get_action ("SortAscending");
833+ ascending_photos_action.bind_property ("active", ascending_photos_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
834+ ascending_photos_menu_item.activate.connect (() => {
835+ if (ascending_photos_menu_item.active) {
836+ ascending_photos_action.activate ();
837+ }
838+ });
839+
840+ var descending_photos_menu_item = new Gtk.RadioMenuItem.with_mnemonic_from_widget (ascending_photos_menu_item, _("D_escending"));
841+ var descending_photos_action = get_action ("SortDescending");
842+ descending_photos_action.bind_property ("active", descending_photos_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
843+ descending_photos_menu_item.activate.connect (() => {
844+ if (descending_photos_menu_item.active) {
845+ descending_photos_action.activate ();
846+ }
847+ });
848+
849+ var sort_photos_menu = new Gtk.Menu ();
850+ sort_photos_menu.add (by_title_menu_item);
851+ sort_photos_menu.add (by_exposure_menu_item);
852+ sort_photos_menu.add (new Gtk.SeparatorMenuItem ());
853+ sort_photos_menu.add (ascending_photos_menu_item);
854+ sort_photos_menu.add (descending_photos_menu_item);
855+ sort_photos_menu_item.set_submenu (sort_photos_menu);
856+
857+ var sort_menu_item = new Gtk.MenuItem.with_mnemonic (_("Sort _Events"));
858+
859+ var ascending_menu_item = new Gtk.RadioMenuItem.with_mnemonic (null, _("_Ascending"));
860+ var ascending_action = get_common_action ("CommonSortEventsAscending");
861+ ascending_action.bind_property ("active", ascending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
862+ ascending_menu_item.activate.connect (() => {
863+ if (ascending_menu_item.active) {
864+ ascending_action.activate ();
865+ }
866+ });
867+
868+ var descending_menu_item = new Gtk.RadioMenuItem.with_mnemonic_from_widget (ascending_menu_item, _("D_escending"));
869+ var descending_action = get_common_action ("CommonSortEventsDescending");
870+ descending_action.bind_property ("active", descending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
871+ descending_menu_item.activate.connect (() => {
872+ if (descending_menu_item.active) {
873+ descending_action.activate ();
874+ }
875+ });
876+
877+ var sort_menu = new Gtk.Menu ();
878+ sort_menu.add (ascending_menu_item);
879+ sort_menu.add (descending_menu_item);
880+ sort_menu_item.set_submenu (sort_menu);
881+
882+ var fullscreen_menu_item = new Gtk.MenuItem.with_mnemonic (_("Fulls_creen"));
883+ var fullscreen_action = get_common_action ("CommonFullscreen");
884+ fullscreen_action.bind_property ("sensitive", fullscreen_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
885+ fullscreen_menu_item.activate.connect (() => fullscreen_action.activate ());
886+
887+ var select_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.SELECT_ALL_MENU);
888+ var select_action = get_common_action ("CommonSelectAll");
889+ select_action.bind_property ("sensitive", select_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
890+ select_menu_item.activate.connect (() => select_action.activate ());
891+
892+ page_context_menu.add (sidebar_menu_item);
893+ page_context_menu.add (metadata_menu_item);
894+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
895+ page_context_menu.add (title_menu_item);
896+ page_context_menu.add (comment_menu_item);
897+ page_context_menu.add (tags_menu_item);
898+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
899+ page_context_menu.add (sort_photos_menu_item);
900+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
901+ page_context_menu.add (sort_menu_item);
902+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
903+ page_context_menu.add (fullscreen_menu_item);
904+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
905+ page_context_menu.add (select_menu_item);
906+ page_context_menu.show_all ();
907+ }
908+
909+ return page_context_menu;
910+ }
911+
912 private static int compute_zoom_scale_increase (int current_scale) {
913 int new_scale = current_scale + MANUAL_STEPPING;
914 return new_scale.clamp (Thumbnail.MIN_SCALE, Thumbnail.MAX_SCALE);
915@@ -189,12 +314,6 @@
916 return new_scale.clamp (Thumbnail.MIN_SCALE, Thumbnail.MAX_SCALE);
917 }
918
919- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
920- base.init_collect_ui_filenames (ui_filenames);
921-
922- ui_filenames.add ("media.ui");
923- }
924-
925 protected override Gtk.ActionEntry[] init_collect_action_entries () {
926 Gtk.ActionEntry[] actions = base.init_collect_action_entries ();
927
928@@ -749,20 +868,6 @@
929 get_view ().set_comparator (comparator, predicate);
930 }
931
932- protected string get_sortby_path (int sort_by) {
933- switch (sort_by) {
934- case SortBy.TITLE:
935- return "/MediaViewMenu/SortPhotos/SortByTitle";
936-
937- case SortBy.EXPOSURE_DATE:
938- return "/MediaViewMenu/SortPhotos/SortByExposureDate";
939-
940- default:
941- debug ("Unknown sort criteria: %d", sort_by);
942- return "/MediaViewMenu/SortPhotos/SortByTitle";
943- }
944- }
945-
946 protected void sync_sort () {
947 // It used to be that the config and UI could both agree on what
948 // sort order and criteria were selected, but the sorting wouldn't
949
950=== modified file 'src/Page.vala'
951--- src/Page.vala 2017-01-12 18:13:48 +0000
952+++ src/Page.vala 2017-02-12 02:36:55 +0000
953@@ -118,7 +118,7 @@
954 #endif
955 }
956
957- protected void populate_contractor_menu (Gtk.Menu menu, string placeholder_ui) {
958+ protected void populate_contractor_menu (Gtk.Menu menu) {
959 File[] files = {};
960 Gee.List<Granite.Services.Contract> contracts = null;
961 try {
962@@ -131,17 +131,9 @@
963 }
964 // Remove old contracts
965 contractor_menu_items.foreach ((item) => {
966- if (item != null) item.destroy ();
967+ if (item != null && item is ContractMenuItem) item.destroy ();
968 });
969
970- //find where is contractor_placeholder in the menu
971- Gtk.Widget holder = ui.get_widget (placeholder_ui);
972- int pos = 0;
973- foreach (Gtk.Widget w in menu.get_children ()) {
974- if (w == holder)
975- break;
976- pos++;
977- }
978 //and replace it with menu_item from contractor
979 for (int i = 0; i < contracts.size; i++) {
980 var contract = contracts.get (i);
981@@ -149,7 +141,6 @@
982
983 menu_item = new ContractMenuItem (contract, get_view ().get_selected_sources ());
984 menu.append (menu_item);
985- menu.reorder_child (menu_item, pos);
986 contractor_menu_items.append (menu_item);
987 }
988 menu.show_all ();
989@@ -1251,8 +1242,6 @@
990 private const int AUTOSCROLL_TICKS_MSEC = 50;
991
992 private CheckerboardLayout layout;
993- private string item_context_menu_path = null;
994- private string page_context_menu_path = null;
995 private string page_sidebar_menu_path = null;
996 private Gtk.Viewport viewport = new Gtk.Viewport (null, null);
997 protected CheckerboardItem anchor = null;
998@@ -1313,18 +1302,10 @@
999 return get_page_name ();
1000 }
1001
1002- public void init_item_context_menu (string path) {
1003- item_context_menu_path = path;
1004- }
1005-
1006 public void init_page_sidebar_menu (string path) {
1007 page_sidebar_menu_path = path;
1008 }
1009
1010- public void init_page_context_menu (string path) {
1011- page_context_menu_path = path;
1012- }
1013-
1014 public Gtk.Menu? get_context_menu () {
1015 // show page context menu if nothing is selected
1016 return (get_view ().get_selected_count () != 0) ? get_item_context_menu () :
1017@@ -1332,25 +1313,7 @@
1018 }
1019
1020 public virtual Gtk.Menu? get_item_context_menu () {
1021- Gtk.Menu menu = (Gtk.Menu) ui.get_widget (item_context_menu_path);
1022- assert (menu != null);
1023- return menu;
1024- }
1025-
1026- public override Gtk.Menu? get_page_context_menu () {
1027- if (page_context_menu_path == null)
1028- return null;
1029- Gtk.Menu menu = (Gtk.Menu) ui.get_widget (page_context_menu_path);
1030- assert (menu != null);
1031- return menu;
1032- }
1033-
1034- public override Gtk.Menu? get_page_sidebar_menu () {
1035- if (page_sidebar_menu_path == null)
1036- return null;
1037- Gtk.Menu menu = (Gtk.Menu) ui.get_widget (page_sidebar_menu_path);
1038- assert (menu != null);
1039- return menu;
1040+ return null;
1041 }
1042
1043 protected override bool on_context_keypress () {
1044
1045=== modified file 'src/PhotoPage.vala'
1046--- src/PhotoPage.vala 2017-01-26 15:35:50 +0000
1047+++ src/PhotoPage.vala 2017-02-12 02:36:55 +0000
1048@@ -2416,6 +2416,10 @@
1049 private CollectionPage? return_page = null;
1050 private bool return_to_collection_on_release = false;
1051 private LibraryPhotoPageViewFilter filter = new LibraryPhotoPageViewFilter ();
1052+ private Gtk.Menu open_menu;
1053+ private Gtk.Menu open_raw_menu;
1054+ private Gtk.Menu contractor_menu;
1055+ private Gtk.Menu item_context_menu;
1056
1057 public LibraryPhotoPage () {
1058 base (LibraryPhoto.global, "Photo");
1059@@ -2486,13 +2490,6 @@
1060 filter.refresh ();
1061 }
1062
1063- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1064- base.init_collect_ui_filenames (ui_filenames);
1065-
1066- ui_filenames.add ("photo_context.ui");
1067- ui_filenames.add ("photo.ui");
1068- }
1069-
1070 protected override Gtk.ActionEntry[] init_collect_action_entries () {
1071 Gtk.ActionEntry[] actions = base.init_collect_action_entries ();
1072
1073@@ -2655,16 +2652,6 @@
1074 return toggle_actions;
1075 }
1076
1077- protected override InjectionGroup[] init_collect_injection_groups () {
1078- InjectionGroup[] groups = base.init_collect_injection_groups ();
1079-
1080- InjectionGroup print_group = new InjectionGroup ("/PhotoContextMenu/PrintPlaceholder");
1081- print_group.add_menu_item ("Print");
1082- groups += print_group;
1083-
1084- return groups;
1085- }
1086-
1087 protected override void register_radio_actions (Gtk.ActionGroup action_group) {
1088 // RAW developer.
1089 //get_config_photos_sort(out sort_order, out sort_by); // TODO: fetch default from config
1090@@ -2964,23 +2951,138 @@
1091 }
1092
1093 private Gtk.Menu get_context_menu () {
1094- Gtk.Menu menu = (Gtk.Menu) ui.get_widget ("/PhotoContextMenu");
1095- assert (menu != null);
1096-
1097- Gtk.MenuItem open_with_menu_item = (Gtk.MenuItem) ui.get_widget ("/PhotoContextMenu/OpenWith");
1098- populate_external_app_menu ((Gtk.Menu)open_with_menu_item.get_submenu (), false);
1099- open_with_menu_item.show ();
1100-
1101- if (has_photo () && get_photo ().get_master_file_format () == PhotoFileFormat.RAW) {
1102- Gtk.MenuItem open_with_raw_menu_item = (Gtk.MenuItem) ui.get_widget ("/PhotoContextMenu/OpenWithRaw");
1103- populate_external_app_menu ((Gtk.Menu)open_with_raw_menu_item.get_submenu (), true);
1104- open_with_raw_menu_item.show ();
1105- }
1106-
1107- populate_contractor_menu (menu, "/PhotoContextMenu/ContractorPlaceholder");
1108-
1109- menu.show_all ();
1110- return menu;
1111+ if (item_context_menu == null) {
1112+ item_context_menu = new Gtk.Menu ();
1113+
1114+ var metadata_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Edit Photo In_fo"));
1115+ var metadata_action = get_common_action ("CommonDisplayMetadataSidebar");
1116+ metadata_action.bind_property ("active", metadata_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1117+
1118+ var revert_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.REVERT_MENU);
1119+ var revert_action = get_action ("Revert");
1120+ revert_action.bind_property ("sensitive", revert_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1121+ revert_menu_item.activate.connect (() => revert_action.activate ());
1122+
1123+ var copy_color_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.COPY_ADJUSTMENTS_MENU);
1124+ var copy_color_action = get_action ("CopyColorAdjustments");
1125+ copy_color_action.bind_property ("sensitive", copy_color_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1126+ copy_color_menu_item.activate.connect (() => copy_color_action.activate ());
1127+
1128+ var paste_color_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.PASTE_ADJUSTMENTS_MENU);
1129+ var paste_color_action = get_action ("PasteColorAdjustments");
1130+ paste_color_action.bind_property ("sensitive", paste_color_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1131+ paste_color_menu_item.activate.connect (() => paste_color_action.activate ());
1132+
1133+ var flag_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.FLAG_MENU);
1134+ var flag_action = get_action ("Flag");
1135+ flag_action.bind_property ("sensitive", flag_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1136+ flag_menu_item.activate.connect (() => flag_action.activate ());
1137+
1138+ var raw_developer_app_menu_item = new Gtk.MenuItem.with_mnemonic (RawDeveloper.SHOTWELL.get_label ());
1139+ var raw_developer_app_action = get_action ("RawDeveloperShotwell");
1140+ raw_developer_app_action.bind_property ("sensitive", raw_developer_app_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1141+ raw_developer_app_menu_item.activate.connect (() => raw_developer_app_action.activate ());
1142+
1143+ var raw_developer_camera_menu_item = new Gtk.MenuItem.with_mnemonic (RawDeveloper.CAMERA.get_label ());
1144+ var raw_developer_camera_action = get_action ("RawDeveloperCamera");
1145+ raw_developer_camera_action.bind_property ("sensitive", raw_developer_camera_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1146+ raw_developer_camera_menu_item.activate.connect (() => raw_developer_camera_action.activate ());
1147+
1148+ var raw_developer_menu_item = new Gtk.MenuItem.with_mnemonic (_("_Developer"));
1149+ var raw_developer_action = get_action ("RawDeveloper");
1150+ raw_developer_action.bind_property ("sensitive", raw_developer_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1151+ open_menu = new Gtk.Menu ();
1152+ var raw_developer_menu = new Gtk.Menu ();
1153+ raw_developer_menu.add (raw_developer_app_menu_item);
1154+ raw_developer_menu.add (raw_developer_camera_menu_item);
1155+ raw_developer_menu_item.set_submenu (raw_developer_menu);
1156+
1157+ var adjust_datetime_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.ADJUST_DATE_TIME_MENU);
1158+ var adjust_datetime_action = get_action ("AdjustDateTime");
1159+ adjust_datetime_action.bind_property ("sensitive", adjust_datetime_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1160+ adjust_datetime_menu_item.activate.connect (() => adjust_datetime_action.activate ());
1161+
1162+ var open_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.OPEN_WITH_MENU);
1163+ var open_action = get_action ("OpenWith");
1164+ open_action.bind_property ("sensitive", open_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1165+ open_menu = new Gtk.Menu ();
1166+ open_menu_item.set_submenu (open_menu);
1167+
1168+ var open_raw_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.OPEN_WITH_RAW_MENU);
1169+ var open_raw_action = get_action ("OpenWithRaw");
1170+ open_raw_action.bind_property ("sensitive", open_raw_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1171+ open_raw_menu = new Gtk.Menu ();
1172+ open_raw_menu_item.set_submenu (open_raw_menu);
1173+
1174+ var jump_event_menu_item = new Gtk.MenuItem.with_mnemonic (_("View Eve_nt for Photo"));
1175+ var jump_event_action = get_common_action ("CommonJumpToEvent");
1176+ jump_event_action.bind_property ("sensitive", jump_event_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1177+ jump_event_menu_item.activate.connect (() => jump_event_action.activate ());
1178+
1179+ var jump_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.JUMP_TO_FILE_MENU);
1180+ var jump_action = get_common_action ("CommonJumpToFile");
1181+ jump_action.bind_property ("sensitive", jump_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1182+ jump_menu_item.activate.connect (() => jump_action.activate ());
1183+
1184+ var print_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.PRINT_MENU);
1185+ var print_action = get_action ("Print");
1186+ print_action.bind_property ("sensitive", print_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1187+ print_menu_item.activate.connect (() => print_action.activate ());
1188+
1189+ var export_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.EXPORT_MENU);
1190+ var export_action = get_action ("Export");
1191+ export_action.bind_property ("sensitive", export_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1192+ export_menu_item.activate.connect (() => export_action.activate ());
1193+
1194+ var contractor_menu_item = new Gtk.MenuItem.with_mnemonic (_("Other Actions"));
1195+ contractor_menu = new Gtk.Menu ();
1196+ contractor_menu_item.set_submenu (contractor_menu);
1197+
1198+ var remove_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.REMOVE_FROM_LIBRARY_MENU);
1199+ var remove_action = get_action ("RemoveFromLibrary");
1200+ remove_action.bind_property ("sensitive", remove_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1201+ remove_menu_item.activate.connect (() => remove_action.activate ());
1202+
1203+ var trash_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.MOVE_TO_TRASH_MENU);
1204+ var trash_action = get_action ("MoveToTrash");
1205+ trash_action.bind_property ("sensitive", trash_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1206+ trash_menu_item.activate.connect (() => trash_action.activate ());
1207+
1208+ contractor_menu.add (print_menu_item);
1209+ contractor_menu.add (export_menu_item);
1210+
1211+ item_context_menu.add (adjust_datetime_menu_item);
1212+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1213+ item_context_menu.add (jump_menu_item);
1214+ item_context_menu.add (open_menu_item);
1215+ item_context_menu.add (open_raw_menu_item);
1216+ item_context_menu.add (contractor_menu_item);
1217+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1218+ item_context_menu.add (copy_color_menu_item);
1219+ item_context_menu.add (paste_color_menu_item);
1220+ item_context_menu.add (revert_menu_item);
1221+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1222+ item_context_menu.add (flag_menu_item);
1223+ item_context_menu.add (raw_developer_menu_item);
1224+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1225+ item_context_menu.add (jump_event_menu_item);
1226+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1227+ item_context_menu.add (metadata_menu_item);
1228+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1229+ item_context_menu.add (remove_menu_item);
1230+ item_context_menu.add (trash_menu_item);
1231+ item_context_menu.show_all ();
1232+ }
1233+
1234+ populate_external_app_menu (open_menu, false);
1235+
1236+ Photo? photo = (get_view ().get_selected_at (0).get_source () as Photo);
1237+ if (photo != null && photo.get_master_file_format () == PhotoFileFormat.RAW) {
1238+ populate_external_app_menu (open_raw_menu, true);
1239+ }
1240+
1241+ populate_contractor_menu (contractor_menu);
1242+ return item_context_menu;
1243 }
1244
1245 protected override bool on_context_buttonpress (Gdk.EventButton event) {
1246
1247=== modified file 'src/camera/ImportPage.vala'
1248--- src/camera/ImportPage.vala 2017-01-26 15:35:50 +0000
1249+++ src/camera/ImportPage.vala 2017-02-12 02:36:55 +0000
1250@@ -721,6 +721,9 @@
1251 private HideImportedViewFilter hide_imported_filter = new HideImportedViewFilter ();
1252 private CameraViewTracker tracker;
1253
1254+ private Gtk.Menu page_context_menu;
1255+ private Gtk.Menu import_context_menu;
1256+
1257 #if UNITY_SUPPORT
1258 UnityProgressBar uniprobar = UnityProgressBar.get_instance ();
1259 #endif
1260@@ -783,10 +786,6 @@
1261 // monitor Photos for removals, as that will change the result of the ViewFilter
1262 LibraryPhoto.global.contents_altered.connect (on_media_added_removed);
1263 Video.global.contents_altered.connect (on_media_added_removed);
1264-
1265- init_item_context_menu ("/ImportContextMenu");
1266- init_page_sidebar_menu ("/ImportContextMenu");
1267- init_page_context_menu ("/ImportViewMenu");
1268 }
1269
1270 ~ImportPage () {
1271@@ -859,6 +858,100 @@
1272 return toolbar;
1273 }
1274
1275+ public override Gtk.Menu? get_item_context_menu () {
1276+ if (import_context_menu == null) {
1277+ create_import_context_menu ();
1278+ }
1279+
1280+ return import_context_menu;
1281+ }
1282+
1283+ public override Gtk.Menu? get_page_context_menu () {
1284+ if (page_context_menu == null) {
1285+ page_context_menu = new Gtk.Menu ();
1286+
1287+ var sidebar_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("S_idebar"));
1288+ var sidebar_action = get_common_action ("CommonDisplaySidebar");
1289+ sidebar_action.bind_property ("active", sidebar_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1290+
1291+ var metadata_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Edit Photo In_fo"));
1292+ var metadata_action = get_common_action ("CommonDisplayMetadataSidebar");
1293+ metadata_action.bind_property ("active", metadata_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1294+
1295+ var viewtitle_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("_Titles"));
1296+ var viewtitle_action = get_action ("ViewTitle");
1297+ viewtitle_action.bind_property ("active", viewtitle_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1298+
1299+ var sort_menu_item = new Gtk.MenuItem.with_mnemonic (_("Sort _Events"));
1300+
1301+ var ascending_menu_item = new Gtk.RadioMenuItem.with_mnemonic (null, _("_Ascending"));
1302+ var ascending_action = get_common_action ("CommonSortEventsAscending");
1303+ ascending_action.bind_property ("active", ascending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1304+ ascending_menu_item.activate.connect (() => {
1305+ if (ascending_menu_item.active) {
1306+ ascending_action.activate ();
1307+ }
1308+ });
1309+
1310+ var descending_menu_item = new Gtk.RadioMenuItem.with_mnemonic_from_widget (ascending_menu_item, _("D_escending"));
1311+ var descending_action = get_common_action ("CommonSortEventsDescending");
1312+ descending_action.bind_property ("active", descending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1313+ descending_menu_item.activate.connect (() => {
1314+ if (descending_menu_item.active) {
1315+ descending_action.activate ();
1316+ }
1317+ });
1318+
1319+ var sort_menu = new Gtk.Menu ();
1320+ sort_menu.add (ascending_menu_item);
1321+ sort_menu.add (descending_menu_item);
1322+ sort_menu_item.set_submenu (sort_menu);
1323+
1324+ var select_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.SELECT_ALL_MENU);
1325+ var select_action = get_common_action ("CommonSelectAll");
1326+ select_action.bind_property ("sensitive", select_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1327+ select_menu_item.activate.connect (() => select_action.activate ());
1328+
1329+ page_context_menu.add (sidebar_menu_item);
1330+ page_context_menu.add (metadata_menu_item);
1331+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1332+ page_context_menu.add (viewtitle_menu_item);
1333+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1334+ page_context_menu.add (sort_menu_item);
1335+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1336+ page_context_menu.add (select_menu_item);
1337+ page_context_menu.show_all ();
1338+ }
1339+
1340+ return page_context_menu;
1341+ }
1342+
1343+ public override Gtk.Menu? get_page_sidebar_menu () {
1344+ if (import_context_menu == null) {
1345+ create_import_context_menu ();
1346+ }
1347+
1348+ return import_context_menu;
1349+ }
1350+
1351+ private void create_import_context_menu () {
1352+ import_context_menu = new Gtk.Menu ();
1353+
1354+ var selected_menu_item = new Gtk.MenuItem.with_mnemonic (_("Import _Selected"));
1355+ var selected_action = get_common_action ("ImportSelected");
1356+ selected_action.bind_property ("sensitive", selected_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1357+ selected_menu_item.activate.connect (() => selected_action.activate ());
1358+
1359+ var all_menu_item = new Gtk.MenuItem.with_mnemonic (_("Import _All"));
1360+ var all_action = get_common_action ("ImportAll");
1361+ all_action.bind_property ("sensitive", all_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1362+ all_menu_item.activate.connect (() => all_action.activate ());
1363+
1364+ import_context_menu.add (selected_menu_item);
1365+ import_context_menu.add (all_menu_item);
1366+ import_context_menu.show_all ();
1367+ }
1368+
1369 public override Core.ViewTracker? get_view_tracker () {
1370 return tracker;
1371 }
1372@@ -884,12 +977,6 @@
1373 return ((CameraImportJob *) a)->get_exposure_time () - ((CameraImportJob *) b)->get_exposure_time ();
1374 }
1375
1376- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1377- base.init_collect_ui_filenames (ui_filenames);
1378-
1379- ui_filenames.add ("import.ui");
1380- }
1381-
1382 protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries () {
1383 Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries ();
1384
1385
1386=== modified file 'src/direct/DirectPhotoPage.vala'
1387--- src/direct/DirectPhotoPage.vala 2017-01-27 23:22:56 +0000
1388+++ src/direct/DirectPhotoPage.vala 2017-02-12 02:36:55 +0000
1389@@ -22,9 +22,13 @@
1390 private DirectViewCollection? view_controller = null;
1391 private File current_save_dir;
1392 private bool drop_if_dirty = false;
1393+ private Gtk.Menu contractor_menu;
1394+ private Gtk.Menu context_menu;
1395+ private bool fullscreen;
1396
1397- public DirectPhotoPage (File file) {
1398+ public DirectPhotoPage (File file, bool fullscreen = false) {
1399 base (DirectPhoto.global, file.get_basename ());
1400+ this.fullscreen = fullscreen;
1401
1402 if (!check_editable_file (file)) {
1403 Application.get_instance ().panic ();
1404@@ -46,13 +50,6 @@
1405 DirectPhoto.global.items_altered.disconnect (on_photos_altered);
1406 }
1407
1408- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1409- base.init_collect_ui_filenames (ui_filenames);
1410-
1411- ui_filenames.add ("direct_context.ui");
1412- ui_filenames.add ("direct.ui");
1413- }
1414-
1415 protected override Gtk.ActionEntry[] init_collect_action_entries () {
1416 Gtk.ActionEntry[] actions = base.init_collect_action_entries ();
1417
1418@@ -184,16 +181,6 @@
1419 return actions;
1420 }
1421
1422- protected override InjectionGroup[] init_collect_injection_groups () {
1423- InjectionGroup[] groups = base.init_collect_injection_groups ();
1424-
1425- InjectionGroup print_group = new InjectionGroup ("/DirectContextMenu/PrintPlaceholder");
1426- print_group.add_menu_item ("Print");
1427- groups += print_group;
1428-
1429- return groups;
1430- }
1431-
1432 private static bool check_editable_file (File file) {
1433 if (!FileUtils.test (file.get_path (), FileTest.EXISTS))
1434 AppWindow.error_message (_ ("%s does not exist.").printf (file.get_path ()));
1435@@ -227,8 +214,48 @@
1436 }
1437
1438 protected override bool on_context_buttonpress (Gdk.EventButton event) {
1439- Gtk.Menu context_menu = (Gtk.Menu) ui.get_widget ("/DirectContextMenu");
1440- populate_contractor_menu (context_menu, "/DirectContextMenu/ContractorPlaceholder");
1441+ if (context_menu == null) {
1442+ context_menu = new Gtk.Menu ();
1443+
1444+ var revert_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.REVERT_MENU);
1445+ var revert_action = get_action ("Revert");
1446+ revert_action.bind_property ("sensitive", revert_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1447+ revert_menu_item.activate.connect (() => revert_action.activate ());
1448+
1449+ var adjust_datetime_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.ADJUST_DATE_TIME_MENU);
1450+ var adjust_datetime_action = get_action ("AdjustDateTime");
1451+ adjust_datetime_action.bind_property ("sensitive", adjust_datetime_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1452+ adjust_datetime_menu_item.activate.connect (() => adjust_datetime_action.activate ());
1453+
1454+ context_menu.add (revert_menu_item);
1455+ context_menu.add (new Gtk.SeparatorMenuItem ());
1456+ context_menu.add (adjust_datetime_menu_item);
1457+
1458+ if (fullscreen == false) {
1459+ var jump_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.JUMP_TO_FILE_MENU);
1460+ var jump_action = get_common_action ("CommonJumpToFile");
1461+ jump_action.bind_property ("sensitive", jump_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1462+ jump_menu_item.activate.connect (() => jump_action.activate ());
1463+
1464+ var print_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.PRINT_MENU);
1465+ var print_action = get_action ("Print");
1466+ print_action.bind_property ("sensitive", print_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1467+ print_menu_item.activate.connect (() => print_action.activate ());
1468+
1469+ var contractor_menu_item = new Gtk.MenuItem.with_mnemonic (_("Other Actions"));
1470+ contractor_menu = new Gtk.Menu ();
1471+ contractor_menu.add (print_menu_item);
1472+ contractor_menu_item.set_submenu (contractor_menu);
1473+
1474+ context_menu.add (new Gtk.SeparatorMenuItem ());
1475+ context_menu.add (jump_menu_item);
1476+ context_menu.add (contractor_menu_item);
1477+ }
1478+
1479+ context_menu.show_all ();
1480+ }
1481+
1482+ populate_contractor_menu (contractor_menu);
1483 popup_context_menu (context_menu, event);
1484
1485 return true;
1486@@ -287,7 +314,7 @@
1487 AppWindow.get_instance ().end_fullscreen ();
1488 } else {
1489 File file = get_current_file ();
1490- AppWindow.get_instance ().go_fullscreen (new DirectFullscreenPhotoPage (file));
1491+ AppWindow.get_instance ().go_fullscreen (new DirectPhotoPage (file, true));
1492 }
1493 return true;
1494 }
1495@@ -547,15 +574,3 @@
1496 return new DirectView ((DirectPhoto) source);
1497 }
1498 }
1499-
1500-public class DirectFullscreenPhotoPage : DirectPhotoPage {
1501- public DirectFullscreenPhotoPage (File file) {
1502- base (file);
1503- }
1504-
1505- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1506- // We intentionally avoid calling the base class implementation since we don't want
1507- // direct.ui.
1508- ui_filenames.add ("direct_context.ui");
1509- }
1510-}
1511
1512=== modified file 'src/direct/DirectWindow.vala'
1513--- src/direct/DirectWindow.vala 2017-01-12 18:13:48 +0000
1514+++ src/direct/DirectWindow.vala 2017-02-12 02:36:55 +0000
1515@@ -67,7 +67,7 @@
1516 protected override void on_fullscreen () {
1517 File file = get_direct_page ().get_current_file ();
1518
1519- go_fullscreen (new DirectFullscreenPhotoPage (file));
1520+ go_fullscreen (new DirectPhotoPage (file, true));
1521 }
1522
1523 public override string get_app_role () {
1524
1525=== modified file 'src/events/EventPage.vala'
1526--- src/events/EventPage.vala 2017-01-26 15:35:50 +0000
1527+++ src/events/EventPage.vala 2017-02-12 02:36:55 +0000
1528@@ -19,6 +19,7 @@
1529
1530 public class EventPage : CollectionPage {
1531 private Event page_event;
1532+ private Gtk.Menu page_sidebar_menu;
1533
1534 public EventPage (Event page_event) {
1535 base (page_event.get_name ());
1536@@ -26,8 +27,6 @@
1537 this.page_event = page_event;
1538 page_event.mirror_photos (get_view (), create_thumbnail);
1539
1540- init_page_sidebar_menu ("/EventContextMenu");
1541-
1542 Event.global.items_altered.connect (on_events_altered);
1543 }
1544
1545@@ -54,10 +53,20 @@
1546 get_view ().halt_mirroring ();
1547 }
1548
1549- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1550- base.init_collect_ui_filenames (ui_filenames);
1551-
1552- ui_filenames.add ("event.ui");
1553+ public override Gtk.Menu? get_page_sidebar_menu () {
1554+ if (page_sidebar_menu == null) {
1555+ page_sidebar_menu = new Gtk.Menu ();
1556+
1557+ var rename_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.RENAME_EVENT_MENU);
1558+ var rename_action = get_action ("Rename");
1559+ rename_action.bind_property ("sensitive", rename_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1560+ rename_menu_item.activate.connect (() => rename_action.activate ());
1561+
1562+ page_sidebar_menu.add (rename_menu_item);
1563+ page_sidebar_menu.show_all ();
1564+ }
1565+
1566+ return page_sidebar_menu;
1567 }
1568
1569 protected override Gtk.ActionEntry[] init_collect_action_entries () {
1570@@ -85,10 +94,6 @@
1571 set_action_visible ("CommonJumpToEvent", false);
1572
1573 base.update_actions (selected_count, count);
1574-
1575- // this is always valid; if the user has right-clicked in an empty area,
1576- // change the comment on the event itself.
1577- set_action_sensitive ("EditEventComment", true);
1578 }
1579
1580 protected override void get_config_photos_sort (out bool sort_order, out int sort_by) {
1581
1582=== modified file 'src/events/EventsDirectoryPage.vala'
1583--- src/events/EventsDirectoryPage.vala 2017-01-26 15:35:50 +0000
1584+++ src/events/EventsDirectoryPage.vala 2017-02-12 02:36:55 +0000
1585@@ -54,6 +54,8 @@
1586 protected ViewManager view_manager;
1587
1588 private EventsDirectorySearchViewFilter search_filter = new EventsDirectorySearchViewFilter ();
1589+ private Gtk.Menu page_context_menu;
1590+ private Gtk.Menu item_context_menu;
1591
1592 public EventsDirectoryPage (string page_name, ViewManager view_manager,
1593 Gee.Collection<Event>? initial_events) {
1594@@ -67,9 +69,6 @@
1595 get_view ().set_property (Event.PROP_SHOW_COMMENTS,
1596 Config.Facade.get_instance ().get_display_event_comments ());
1597
1598- init_item_context_menu ("/EventsDirectoryContextMenu");
1599- init_page_context_menu ("/EventsDirectoryViewMenu");
1600-
1601 this.view_manager = view_manager;
1602
1603 // set up page's toolbar (used by AppWindow for layout and FullscreenWindow as a popup)
1604@@ -109,10 +108,87 @@
1605 action.changed.disconnect (on_sort_changed);
1606 }
1607
1608- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1609- ui_filenames.add ("events_directory.ui");
1610-
1611- base.init_collect_ui_filenames (ui_filenames);
1612+ public override Gtk.Menu? get_item_context_menu () {
1613+ if (item_context_menu == null) {
1614+ item_context_menu = new Gtk.Menu ();
1615+
1616+ var merge_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.MERGE_MENU);
1617+ var merge_action = get_action ("Merge");
1618+ merge_action.bind_property ("sensitive", merge_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1619+ merge_menu_item.activate.connect (() => merge_action.activate ());
1620+
1621+ var rename_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.RENAME_EVENT_MENU);
1622+ var rename_action = get_action ("Rename");
1623+ rename_action.bind_property ("sensitive", rename_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1624+ rename_menu_item.activate.connect (() => rename_action.activate ());
1625+
1626+ item_context_menu.add (merge_menu_item);
1627+ item_context_menu.add (rename_menu_item);
1628+ item_context_menu.show_all ();
1629+ }
1630+
1631+ return item_context_menu;
1632+ }
1633+
1634+ public override Gtk.Menu? get_page_context_menu () {
1635+ if (page_context_menu == null) {
1636+ page_context_menu = new Gtk.Menu ();
1637+
1638+ var sidebar_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("S_idebar"));
1639+ var sidebar_action = get_common_action ("CommonDisplaySidebar");
1640+ sidebar_action.bind_property ("active", sidebar_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1641+
1642+ var metadata_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Edit Photo In_fo"));
1643+ var metadata_action = get_common_action ("CommonDisplayMetadataSidebar");
1644+ metadata_action.bind_property ("active", metadata_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1645+
1646+ var sort_menu_item = new Gtk.MenuItem.with_mnemonic (_("Sort _Events"));
1647+
1648+ var ascending_menu_item = new Gtk.RadioMenuItem.with_mnemonic (null, _("_Ascending"));
1649+ var ascending_action = get_common_action ("CommonSortEventsAscending");
1650+ ascending_action.bind_property ("active", ascending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1651+ ascending_menu_item.activate.connect (() => {
1652+ if (ascending_menu_item.active) {
1653+ ascending_action.activate ();
1654+ }
1655+ });
1656+
1657+ var descending_menu_item = new Gtk.RadioMenuItem.with_mnemonic_from_widget (ascending_menu_item, _("D_escending"));
1658+ var descending_action = get_common_action ("CommonSortEventsDescending");
1659+ descending_action.bind_property ("active", descending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1660+ descending_menu_item.activate.connect (() => {
1661+ if (descending_menu_item.active) {
1662+ descending_action.activate ();
1663+ }
1664+ });
1665+
1666+ var sort_menu = new Gtk.Menu ();
1667+ sort_menu.add (ascending_menu_item);
1668+ sort_menu.add (descending_menu_item);
1669+ sort_menu_item.set_submenu (sort_menu);
1670+
1671+ var fullscreen_menu_item = new Gtk.MenuItem.with_mnemonic (_("Fulls_creen"));
1672+ var fullscreen_action = get_common_action ("CommonFullscreen");
1673+ fullscreen_action.bind_property ("sensitive", fullscreen_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1674+ fullscreen_menu_item.activate.connect (() => fullscreen_action.activate ());
1675+
1676+ var select_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.SELECT_ALL_MENU);
1677+ var select_action = get_common_action ("CommonSelectAll");
1678+ select_action.bind_property ("sensitive", select_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1679+ select_menu_item.activate.connect (() => select_action.activate ());
1680+
1681+ page_context_menu.add (sidebar_menu_item);
1682+ page_context_menu.add (metadata_menu_item);
1683+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1684+ page_context_menu.add (sort_menu_item);
1685+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1686+ page_context_menu.add (fullscreen_menu_item);
1687+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1688+ page_context_menu.add (select_menu_item);
1689+ page_context_menu.show_all ();
1690+ }
1691+
1692+ return page_context_menu;
1693 }
1694
1695 protected static bool event_comparator_predicate (DataObject object, Alteration alteration) {
1696
1697=== modified file 'src/library/OfflinePage.vala'
1698--- src/library/OfflinePage.vala 2017-01-26 15:35:50 +0000
1699+++ src/library/OfflinePage.vala 2017-02-12 02:36:55 +0000
1700@@ -37,14 +37,12 @@
1701
1702 private OfflineSearchViewFilter search_filter = new OfflineSearchViewFilter ();
1703 private MediaViewTracker tracker;
1704+ private Gtk.Menu page_context_menu;
1705+ private Gtk.Menu page_sidebar_menu;
1706
1707 public OfflinePage () {
1708 base (NAME);
1709
1710- init_item_context_menu ("/OfflineContextMenu");
1711- init_page_context_menu ("/OfflineViewMenu");
1712- init_toolbar ("/OfflineToolbar");
1713-
1714 tracker = new MediaViewTracker (get_view ());
1715
1716 // monitor offline and initialize view with all items in it
1717@@ -60,10 +58,94 @@
1718 Video.global.offline_contents_altered.disconnect (on_offline_contents_altered);
1719 }
1720
1721- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1722- base.init_collect_ui_filenames (ui_filenames);
1723-
1724- ui_filenames.add ("offline.ui");
1725+ public override Gtk.Toolbar get_toolbar () {
1726+ if (toolbar == null) {
1727+ toolbar = new Gtk.Toolbar ();
1728+ toolbar.get_style_context ().add_class ("bottom-toolbar"); // for elementary theme
1729+ toolbar.set_style (Gtk.ToolbarStyle.ICONS);
1730+
1731+ var remove_button = new Gtk.Button.with_mnemonic (Resources.REMOVE_FROM_LIBRARY_MENU);
1732+ remove_button.margin_start = remove_button.margin_end = 3;
1733+ remove_button.tooltip_text = Resources.DELETE_FROM_LIBRARY_TOOLTIP;
1734+ var remove_tool = new Gtk.ToolItem ();
1735+ remove_tool.add (remove_button);
1736+ toolbar.insert (remove_tool, -1);
1737+ var remove_action = get_action ("RemoveFromLibrary");
1738+ remove_action.bind_property ("sensitive", remove_button, "sensitive", BindingFlags.SYNC_CREATE);
1739+ remove_button.clicked.connect (() => remove_action.activate ());
1740+ }
1741+
1742+ return toolbar;
1743+ }
1744+
1745+ public override Gtk.Menu? get_page_sidebar_menu () {
1746+ if (page_sidebar_menu == null) {
1747+ page_sidebar_menu = new Gtk.Menu ();
1748+
1749+ var remove_menu_item = new Gtk.CheckMenuItem.with_mnemonic (Resources.REMOVE_FROM_LIBRARY_MENU);
1750+ var remove_action = get_action ("RemoveFromLibrary");
1751+ remove_action.bind_property ("sensitive", remove_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1752+ remove_menu_item.activate.connect (() => remove_action.activate ());
1753+
1754+ page_sidebar_menu.add (remove_menu_item);
1755+ page_sidebar_menu.show_all ();
1756+ }
1757+
1758+ return page_sidebar_menu;
1759+ }
1760+
1761+ public override Gtk.Menu? get_page_context_menu () {
1762+ if (page_context_menu == null) {
1763+ page_context_menu = new Gtk.Menu ();
1764+
1765+ var sidebar_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("S_idebar"));
1766+ var sidebar_action = get_common_action ("CommonDisplaySidebar");
1767+ sidebar_action.bind_property ("active", sidebar_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1768+
1769+ var metadata_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Edit Photo In_fo"));
1770+ var metadata_action = get_common_action ("CommonDisplayMetadataSidebar");
1771+ metadata_action.bind_property ("active", metadata_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1772+
1773+ var sort_menu_item = new Gtk.MenuItem.with_mnemonic (_("Sort _Events"));
1774+
1775+ var ascending_menu_item = new Gtk.RadioMenuItem.with_mnemonic (null, _("_Ascending"));
1776+ var ascending_action = get_common_action ("CommonSortEventsAscending");
1777+ ascending_action.bind_property ("active", ascending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1778+ ascending_menu_item.activate.connect (() => {
1779+ if (ascending_menu_item.active) {
1780+ ascending_action.activate ();
1781+ }
1782+ });
1783+
1784+ var descending_menu_item = new Gtk.RadioMenuItem.with_mnemonic_from_widget (ascending_menu_item, _("D_escending"));
1785+ var descending_action = get_common_action ("CommonSortEventsDescending");
1786+ descending_action.bind_property ("active", descending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1787+ descending_menu_item.activate.connect (() => {
1788+ if (descending_menu_item.active) {
1789+ descending_action.activate ();
1790+ }
1791+ });
1792+
1793+ var sort_menu = new Gtk.Menu ();
1794+ sort_menu.add (ascending_menu_item);
1795+ sort_menu.add (descending_menu_item);
1796+ sort_menu_item.set_submenu (sort_menu);
1797+
1798+ var select_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.SELECT_ALL_MENU);
1799+ var select_action = get_common_action ("CommonSelectAll");
1800+ select_action.bind_property ("sensitive", select_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1801+ select_menu_item.activate.connect (() => select_action.activate ());
1802+
1803+ page_context_menu.add (sidebar_menu_item);
1804+ page_context_menu.add (metadata_menu_item);
1805+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1806+ page_context_menu.add (sort_menu_item);
1807+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1808+ page_context_menu.add (select_menu_item);
1809+ page_context_menu.show_all ();
1810+ }
1811+
1812+ return page_context_menu;
1813 }
1814
1815 protected override Gtk.ActionEntry[] init_collect_action_entries () {
1816
1817=== modified file 'src/library/TrashPage.vala'
1818--- src/library/TrashPage.vala 2017-02-01 18:26:23 +0000
1819+++ src/library/TrashPage.vala 2017-02-12 02:36:55 +0000
1820@@ -37,14 +37,13 @@
1821
1822 private TrashSearchViewFilter search_filter = new TrashSearchViewFilter ();
1823 private MediaViewTracker tracker;
1824+ private Gtk.Menu page_sidebar_menu;
1825+ private Gtk.Menu item_context_menu;
1826+ private Gtk.Menu page_context_menu;
1827
1828 public TrashPage () {
1829 base (NAME);
1830
1831- init_item_context_menu ("/TrashContextMenu");
1832- init_page_sidebar_menu ("/TrashPageMenu");
1833- init_page_context_menu ("/TrashViewMenu");
1834-
1835 tracker = new MediaViewTracker (get_view ());
1836
1837 // monitor trashcans and initialize view with all items in them
1838@@ -113,10 +112,108 @@
1839 return toolbar;
1840 }
1841
1842- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
1843- base.init_collect_ui_filenames (ui_filenames);
1844-
1845- ui_filenames.add ("trash.ui");
1846+ public override Gtk.Menu? get_item_context_menu () {
1847+ if (item_context_menu == null) {
1848+ item_context_menu = new Gtk.Menu ();
1849+
1850+ var delete_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.DELETE_PHOTOS_MENU);
1851+ var delete_action = get_action ("Delete");
1852+ delete_action.bind_property ("sensitive", delete_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1853+ delete_menu_item.activate.connect (() => delete_action.activate ());
1854+
1855+ var restore_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.RESTORE_PHOTOS_MENU);
1856+ var restore_action = get_action ("Restore");
1857+ restore_action.bind_property ("sensitive", restore_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1858+ restore_menu_item.activate.connect (() => restore_action.activate ());
1859+
1860+ var jump_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.JUMP_TO_FILE_MENU);
1861+ var jump_action = get_common_action ("CommonJumpToFile");
1862+ jump_action.bind_property ("sensitive", jump_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1863+ jump_menu_item.activate.connect (() => jump_action.activate ());
1864+
1865+ var empty_menu_item = new Gtk.MenuItem.with_mnemonic (_("_Empty Trash"));
1866+ var empty_trash_action = get_action ("EmptyTrash");
1867+ empty_trash_action.bind_property ("sensitive", empty_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1868+ empty_menu_item.activate.connect (() => empty_trash_action.activate ());
1869+
1870+ item_context_menu.add (delete_menu_item);
1871+ item_context_menu.add (restore_menu_item);
1872+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1873+ item_context_menu.add (jump_menu_item);
1874+ item_context_menu.add (new Gtk.SeparatorMenuItem ());
1875+ item_context_menu.add (empty_menu_item);
1876+ item_context_menu.show_all ();
1877+ }
1878+
1879+ return item_context_menu;
1880+ }
1881+
1882+ public override Gtk.Menu? get_page_context_menu () {
1883+ if (page_context_menu == null) {
1884+ page_context_menu = new Gtk.Menu ();
1885+
1886+ var sidebar_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("S_idebar"));
1887+ var sidebar_action = get_common_action ("CommonDisplaySidebar");
1888+ sidebar_action.bind_property ("active", sidebar_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1889+
1890+ var metadata_menu_item = new Gtk.CheckMenuItem.with_mnemonic (_("Edit Photo In_fo"));
1891+ var metadata_action = (Gtk.ToggleAction)get_common_action ("CommonDisplayMetadataSidebar");
1892+ metadata_action.bind_property ("active", metadata_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1893+
1894+ var sort_menu_item = new Gtk.MenuItem.with_mnemonic (_("Sort _Events"));
1895+
1896+ var ascending_menu_item = new Gtk.RadioMenuItem.with_mnemonic (null, _("_Ascending"));
1897+ var ascending_action = get_common_action ("CommonSortEventsAscending");
1898+ ascending_action.bind_property ("active", ascending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1899+ ascending_menu_item.activate.connect (() => {
1900+ if (ascending_menu_item.active) {
1901+ ascending_action.activate ();
1902+ }
1903+ });
1904+
1905+ var descending_menu_item = new Gtk.RadioMenuItem.with_mnemonic_from_widget (ascending_menu_item, _("D_escending"));
1906+ var descending_action = get_common_action ("CommonSortEventsDescending");
1907+ descending_action.bind_property ("active", descending_menu_item, "active", BindingFlags.SYNC_CREATE|BindingFlags.BIDIRECTIONAL);
1908+ descending_menu_item.activate.connect (() => {
1909+ if (descending_menu_item.active) {
1910+ descending_action.activate ();
1911+ }
1912+ });
1913+
1914+ var sort_menu = new Gtk.Menu ();
1915+ sort_menu.add (ascending_menu_item);
1916+ sort_menu.add (descending_menu_item);
1917+ sort_menu_item.set_submenu (sort_menu);
1918+
1919+ var select_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.SELECT_ALL_MENU);
1920+ var select_action = get_common_action ("CommonSelectAll");
1921+ select_action.bind_property ("sensitive", select_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1922+ select_menu_item.activate.connect (() => select_action.activate ());
1923+
1924+ page_context_menu.add (sidebar_menu_item);
1925+ page_context_menu.add (metadata_menu_item);
1926+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1927+ page_context_menu.add (sort_menu_item);
1928+ page_context_menu.add (new Gtk.SeparatorMenuItem ());
1929+ page_context_menu.add (select_menu_item);
1930+ page_context_menu.show_all ();
1931+ }
1932+
1933+ return page_context_menu;
1934+ }
1935+
1936+ public override Gtk.Menu? get_page_sidebar_menu () {
1937+ if (page_sidebar_menu == null) {
1938+ page_sidebar_menu = new Gtk.Menu ();
1939+ var empty_menu_item = new Gtk.MenuItem.with_mnemonic (_("_Empty Trash"));
1940+ var empty_trash_action = get_action ("EmptyTrash");
1941+ empty_trash_action.bind_property ("sensitive", empty_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
1942+ empty_menu_item.activate.connect (() => empty_trash_action.activate ());
1943+ page_sidebar_menu.add (empty_menu_item);
1944+ page_sidebar_menu.show_all ();
1945+ }
1946+
1947+ return page_sidebar_menu;
1948 }
1949
1950 protected override Gtk.ActionEntry[] init_collect_action_entries () {
1951
1952=== modified file 'src/searches/Branch.vala'
1953--- src/searches/Branch.vala 2017-01-26 15:35:50 +0000
1954+++ src/searches/Branch.vala 2017-02-12 02:36:55 +0000
1955@@ -74,38 +74,22 @@
1956 }
1957
1958 public class Searches.Grouping : Sidebar.Grouping, Sidebar.Contextable {
1959- private Gtk.UIManager ui = new Gtk.UIManager ();
1960 private Gtk.Menu? context_menu = null;
1961
1962 public Grouping () {
1963 base (_ ("Smart Albums"), new ThemedIcon ("playlist-automatic"));
1964- setup_context_menu ();
1965 }
1966
1967- private void setup_context_menu () {
1968- Gtk.ActionGroup group = new Gtk.ActionGroup ("SidebarDefault");
1969- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
1970-
1971- Gtk.ActionEntry new_search = { "CommonNewSearch", null, _("New Smart Album…"), null, null, on_new_search };
1972- actions += new_search;
1973-
1974- group.add_actions (actions, this);
1975- ui.insert_action_group (group, 0);
1976-
1977- File ui_file = Resources.get_ui ("search_sidebar_context.ui");
1978- try {
1979- ui.add_ui_from_file (ui_file.get_path ());
1980- } catch (Error err) {
1981- AppWindow.error_message ("Error loading UI file %s: %s".printf (
1982- ui_file.get_path (), err.message));
1983- Application.get_instance ().panic ();
1984+ public Gtk.Menu? get_sidebar_context_menu (Gdk.EventButton? event) {
1985+ if (context_menu == null) {
1986+ context_menu = new Gtk.Menu ();
1987+
1988+ var new_search_menu_item = new Gtk.MenuItem.with_mnemonic (_("New Smart Album…"));
1989+ new_search_menu_item.activate.connect (() => on_new_search);
1990+ context_menu.add (new_search_menu_item);
1991+ context_menu.show_all ();
1992 }
1993- context_menu = (Gtk.Menu) ui.get_widget ("/SidebarSearchContextMenu");
1994-
1995- ui.ensure_update ();
1996- }
1997-
1998- public Gtk.Menu? get_sidebar_context_menu (Gdk.EventButton? event) {
1999+
2000 return context_menu;
2001 }
2002
2003
2004=== modified file 'src/searches/SavedSearchPage.vala'
2005--- src/searches/SavedSearchPage.vala 2017-01-12 18:13:48 +0000
2006+++ src/searches/SavedSearchPage.vala 2017-02-12 02:36:55 +0000
2007@@ -35,6 +35,7 @@
2008
2009 // The search logic and parameters are contained in the SavedSearch.
2010 private SavedSearch search;
2011+ private Gtk.Menu page_sidebar_menu;
2012
2013 public SavedSearchPage (SavedSearch search) {
2014 base (search.get_name ());
2015@@ -43,8 +44,31 @@
2016
2017 foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance ().get_all ())
2018 get_view ().monitor_source_collection (sources, new SavedSearchManager (this, search), null);
2019-
2020- init_page_sidebar_menu ("/SearchContextMenu");
2021+ }
2022+
2023+ public override Gtk.Menu? get_page_sidebar_menu () {
2024+ if (page_sidebar_menu == null) {
2025+ page_sidebar_menu = new Gtk.Menu ();
2026+
2027+ var rename_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.RENAME_SEARCH_MENU);
2028+ var rename_action = get_action ("RenameSearch");
2029+ rename_menu_item.activate.connect (() => rename_action.activate ());
2030+
2031+ var edit_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.EDIT_SEARCH_MENU);
2032+ var edit_action = get_action ("EditSearch");
2033+ edit_menu_item.activate.connect (() => edit_action.activate ());
2034+
2035+ var delete_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.DELETE_SEARCH_MENU);
2036+ var delete_action = get_action ("DeleteSearch");
2037+ delete_menu_item.activate.connect (() => delete_action.activate ());
2038+
2039+ page_sidebar_menu.add (rename_menu_item);
2040+ page_sidebar_menu.add (edit_menu_item);
2041+ page_sidebar_menu.add (delete_menu_item);
2042+ page_sidebar_menu.show_all ();
2043+ }
2044+
2045+ return page_sidebar_menu;
2046 }
2047
2048 protected override void get_config_photos_sort (out bool sort_order, out int sort_by) {
2049@@ -55,11 +79,6 @@
2050 Config.Facade.get_instance ().set_library_photos_sort (sort_order, sort_by);
2051 }
2052
2053- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
2054- base.init_collect_ui_filenames (ui_filenames);
2055- ui_filenames.add ("savedsearch.ui");
2056- }
2057-
2058 protected override Gtk.ActionEntry[] init_collect_action_entries () {
2059 Gtk.ActionEntry[] actions = base.init_collect_action_entries ();
2060
2061
2062=== modified file 'src/sidebar/Tree.vala'
2063--- src/sidebar/Tree.vala 2017-01-26 15:35:50 +0000
2064+++ src/sidebar/Tree.vala 2017-02-12 02:36:55 +0000
2065@@ -77,7 +77,6 @@
2066 typeof (bool) // PIXBUF_VISIBLE
2067 );
2068
2069- private Gtk.UIManager ui = new Gtk.UIManager ();
2070 private Gtk.IconTheme icon_theme;
2071 private Gtk.CellRendererText text_renderer;
2072 private unowned ExternalDropHandler drop_handler;
2073@@ -163,7 +162,6 @@
2074 icon_theme = Resources.get_icon_theme_engine ();
2075 icon_theme.changed.connect (on_theme_change);
2076
2077- setup_default_context_menu ();
2078 get_style_context ().add_class (Granite.StyleClass.SOURCE_LIST);
2079
2080 drag_begin.connect (on_drag_begin);
2081@@ -202,32 +200,6 @@
2082 return false;
2083 }
2084
2085- private void setup_default_context_menu () {
2086- Gtk.ActionGroup group = new Gtk.ActionGroup ("SidebarDefault");
2087- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
2088-
2089- Gtk.ActionEntry new_search = { "CommonNewSearch", null, _("New Smart Album…"), null, null, on_new_search };
2090- actions += new_search;
2091-
2092- Gtk.ActionEntry new_tag = { "CommonNewTag", null, _("New _Tag..."), null, null, on_new_tag };
2093- actions += new_tag;
2094-
2095- group.add_actions (actions, this);
2096- ui.insert_action_group (group, 0);
2097-
2098- File ui_file = Resources.get_ui ("sidebar_default_context.ui");
2099- try {
2100- ui.add_ui_from_file (ui_file.get_path ());
2101- } catch (Error err) {
2102- AppWindow.error_message ("Error loading UI file %s: %s".printf (
2103- ui_file.get_path (), err.message));
2104- Application.get_instance ().panic ();
2105- }
2106- default_context_menu = (Gtk.Menu) ui.get_widget ("/SidebarDefaultContextMenu");
2107-
2108- ui.ensure_update ();
2109- }
2110-
2111 private bool has_wrapper (Sidebar.Entry entry) {
2112 return entry_map.has_key (entry);
2113 }
2114@@ -901,6 +873,20 @@
2115 }
2116
2117 private bool popup_default_context_menu (Gdk.EventButton event) {
2118+ if (default_context_menu == null) {
2119+ default_context_menu = new Gtk.Menu ();
2120+
2121+ var new_search_menu_item = new Gtk.MenuItem.with_mnemonic (_("New Smart Album…"));
2122+ new_search_menu_item.activate.connect (() => on_new_search);
2123+
2124+ var new_tag_menu_item = new Gtk.MenuItem.with_mnemonic (_("New _Tag..."));
2125+ new_tag_menu_item.activate.connect (() => on_new_tag);
2126+
2127+ default_context_menu.add (new_search_menu_item);
2128+ default_context_menu.add (new_tag_menu_item);
2129+ default_context_menu.show_all ();
2130+ }
2131+
2132 default_context_menu.popup (null, null, null, event.button, event.time);
2133 return true;
2134 }
2135
2136=== modified file 'src/tags/Branch.vala'
2137--- src/tags/Branch.vala 2017-01-26 15:35:50 +0000
2138+++ src/tags/Branch.vala 2017-02-12 02:36:55 +0000
2139@@ -133,35 +133,10 @@
2140
2141 public class Tags.Grouping : Sidebar.Grouping, Sidebar.InternalDropTargetEntry,
2142 Sidebar.InternalDragSourceEntry, Sidebar.Contextable {
2143- private Gtk.UIManager ui = new Gtk.UIManager ();
2144 private Gtk.Menu? context_menu = null;
2145
2146 public Grouping () {
2147 base (_ ("Tags"), new ThemedIcon (Resources.ICON_TAGS));
2148- setup_context_menu ();
2149- }
2150-
2151- private void setup_context_menu () {
2152- Gtk.ActionGroup group = new Gtk.ActionGroup ("SidebarDefault");
2153- Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
2154-
2155- Gtk.ActionEntry new_tag = { "CommonNewTag", null, Resources.NEW_CHILD_TAG_SIDEBAR_MENU, null, null, on_new_tag };
2156- actions += new_tag;
2157-
2158- group.add_actions (actions, this);
2159- ui.insert_action_group (group, 0);
2160-
2161- File ui_file = Resources.get_ui ("tag_sidebar_context.ui");
2162- try {
2163- ui.add_ui_from_file (ui_file.get_path ());
2164- } catch (Error err) {
2165- AppWindow.error_message ("Error loading UI file %s: %s".printf (
2166- ui_file.get_path (), err.message));
2167- Application.get_instance ().panic ();
2168- }
2169- context_menu = (Gtk.Menu) ui.get_widget ("/SidebarTagContextMenu");
2170-
2171- ui.ensure_update ();
2172 }
2173
2174 public bool internal_drop_received (Gee.List<MediaSource> media) {
2175@@ -191,6 +166,15 @@
2176 }
2177
2178 public Gtk.Menu? get_sidebar_context_menu (Gdk.EventButton? event) {
2179+ if (context_menu == null) {
2180+ context_menu = new Gtk.Menu ();
2181+
2182+ var new_tag_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.NEW_CHILD_TAG_SIDEBAR_MENU);
2183+ new_tag_menu_item.activate.connect (() => on_new_tag);
2184+ context_menu.add (new_tag_menu_item);
2185+ context_menu.show_all ();
2186+ }
2187+
2188 return context_menu;
2189 }
2190
2191
2192=== modified file 'src/tags/TagPage.vala'
2193--- src/tags/TagPage.vala 2017-01-12 18:13:48 +0000
2194+++ src/tags/TagPage.vala 2017-02-12 02:36:55 +0000
2195@@ -19,6 +19,7 @@
2196
2197 public class TagPage : CollectionPage {
2198 private Tag tag;
2199+ private Gtk.Menu page_sidebar_menu;
2200
2201 public TagPage (Tag tag) {
2202 base (tag.get_name ());
2203@@ -27,8 +28,6 @@
2204
2205 Tag.global.items_altered.connect (on_tags_altered);
2206 tag.mirror_sources (get_view (), create_thumbnail);
2207-
2208- init_page_sidebar_menu ("/TagsContextMenu");
2209 }
2210
2211 ~TagPage () {
2212@@ -36,9 +35,33 @@
2213 Tag.global.items_altered.disconnect (on_tags_altered);
2214 }
2215
2216- protected override void init_collect_ui_filenames (Gee.List<string> ui_filenames) {
2217- base.init_collect_ui_filenames (ui_filenames);
2218- ui_filenames.add ("tags.ui");
2219+ public override Gtk.Menu? get_page_sidebar_menu () {
2220+ if (page_sidebar_menu == null) {
2221+ page_sidebar_menu = new Gtk.Menu ();
2222+
2223+ var new_child_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.NEW_CHILD_TAG_SIDEBAR_MENU);
2224+ var new_child_action = get_action ("NewChildTagSidebar");
2225+ new_child_action.bind_property ("sensitive", new_child_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
2226+ new_child_menu_item.activate.connect (() => new_child_action.activate ());
2227+
2228+ var rename_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.RENAME_TAG_SIDEBAR_MENU);
2229+ var rename_action = get_action ("RenameTagSidebar");
2230+ rename_action.bind_property ("sensitive", rename_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
2231+ rename_menu_item.activate.connect (() => rename_action.activate ());
2232+
2233+ var delete_menu_item = new Gtk.MenuItem.with_mnemonic (Resources.DELETE_TAG_SIDEBAR_MENU);
2234+ var delete_action = get_action ("DeleteTagSidebar");
2235+ delete_action.bind_property ("sensitive", delete_menu_item, "sensitive", BindingFlags.SYNC_CREATE);
2236+ delete_menu_item.activate.connect (() => delete_action.activate ());
2237+
2238+ page_sidebar_menu.add (new_child_menu_item);
2239+ page_sidebar_menu.add (new Gtk.SeparatorToolItem ());
2240+ page_sidebar_menu.add (rename_menu_item);
2241+ page_sidebar_menu.add (delete_menu_item);
2242+ page_sidebar_menu.show_all ();
2243+ }
2244+
2245+ return page_sidebar_menu;
2246 }
2247
2248 public Tag get_tag () {

Subscribers

People subscribed via source and target branches

to all changes: