diff options
Diffstat (limited to 'src/events/EventPage.vala')
-rw-r--r-- | src/events/EventPage.vala | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/events/EventPage.vala b/src/events/EventPage.vala new file mode 100644 index 0000000..3d23f25 --- /dev/null +++ b/src/events/EventPage.vala @@ -0,0 +1,162 @@ +/* Copyright 2009-2014 Yorba Foundation + * + * This software is licensed under the GNU Lesser General Public License + * (version 2.1 or later). See the COPYING file in this distribution. + */ + +public class EventPage : CollectionPage { + private Event page_event; + + public EventPage(Event page_event) { + base (page_event.get_name()); + + this.page_event = page_event; + page_event.mirror_photos(get_view(), create_thumbnail); + + init_page_context_menu("/EventContextMenu"); + + Event.global.items_altered.connect(on_events_altered); + } + + public Event get_event() { + return page_event; + } + + protected override bool on_app_key_pressed(Gdk.EventKey event) { + // If and only if one image is selected, propagate F2 to the rest of + // the window, otherwise, consume it here - if we don't do this, it'll + // either let us re-title multiple images at the same time or + // spuriously highlight the event name in the sidebar for editing... + if (Gdk.keyval_name(event.keyval) == "F2") { + if (get_view().get_selected_count() != 1) { + return true; + } + } + + return base.on_app_key_pressed(event); + } + + ~EventPage() { + Event.global.items_altered.disconnect(on_events_altered); + get_view().halt_mirroring(); + } + + protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) { + base.init_collect_ui_filenames(ui_filenames); + + ui_filenames.add("event.ui"); + } + + protected override Gtk.ActionEntry[] init_collect_action_entries() { + Gtk.ActionEntry[] new_actions = base.init_collect_action_entries(); + + Gtk.ActionEntry make_primary = { "MakePrimary", Resources.MAKE_PRIMARY, + TRANSLATABLE, null, TRANSLATABLE, on_make_primary }; + make_primary.label = Resources.MAKE_KEY_PHOTO_MENU; + new_actions += make_primary; + + Gtk.ActionEntry rename = { "Rename", null, TRANSLATABLE, null, TRANSLATABLE, on_rename }; + rename.label = Resources.RENAME_EVENT_MENU; + new_actions += rename; + + Gtk.ActionEntry comment = { "EditEventComment", null, TRANSLATABLE, null, + Resources.EDIT_EVENT_COMMENT_MENU, on_edit_comment}; + comment.label = Resources.EDIT_EVENT_COMMENT_MENU; + new_actions += comment; + + return new_actions; + } + + protected override void init_actions(int selected_count, int count) { + base.init_actions(selected_count, count); + } + + protected override void update_actions(int selected_count, int count) { + set_action_sensitive("MakePrimary", selected_count == 1); + + // hide this command in CollectionPage, as it does not apply here + set_action_visible("CommonJumpToEvent", false); + + base.update_actions(selected_count, count); + + // this is always valid; if the user has right-clicked in an empty area, + // change the comment on the event itself. + set_action_sensitive("EditEventComment", true); + } + + protected override void get_config_photos_sort(out bool sort_order, out int sort_by) { + Config.Facade.get_instance().get_event_photos_sort(out sort_order, out sort_by); + } + + protected override void set_config_photos_sort(bool sort_order, int sort_by) { + Config.Facade.get_instance().set_event_photos_sort(sort_order, sort_by); + } + + private void on_events_altered(Gee.Map<DataObject, Alteration> map) { + if (map.has_key(page_event)) + set_page_name(page_event.get_name()); + } + + protected override void on_edit_comment() { + if (get_view().get_selected_count() == 0) { + EditCommentDialog edit_comment_dialog = new EditCommentDialog(page_event.get_comment(), + true); + string? new_comment = edit_comment_dialog.execute(); + if (new_comment == null) + return; + + EditEventCommentCommand command = new EditEventCommentCommand(page_event, new_comment); + get_command_manager().execute(command); + return; + } + + base.on_edit_comment(); + } + + private void on_make_primary() { + if (get_view().get_selected_count() != 1) + return; + + page_event.set_primary_source((MediaSource) get_view().get_selected_at(0).get_source()); + } + + private void on_rename() { + LibraryWindow.get_app().rename_event_in_sidebar(page_event); + } +} + +public class NoEventPage : CollectionPage { + public const string NAME = _("No Event"); + + // This seems very similar to EventSourceCollection -> ViewManager + private class NoEventViewManager : CollectionViewManager { + public NoEventViewManager(NoEventPage page) { + base (page); + } + + // this is not threadsafe + public override bool include_in_view(DataSource source) { + return (((MediaSource) source).get_event_id().id != EventID.INVALID) ? false : + base.include_in_view(source); + } + } + + private static Alteration no_event_page_alteration = new Alteration("metadata", "event"); + + public NoEventPage() { + base (NAME); + + ViewManager filter = new NoEventViewManager(this); + get_view().monitor_source_collection(LibraryPhoto.global, filter, no_event_page_alteration); + get_view().monitor_source_collection(Video.global, filter, no_event_page_alteration); + } + + protected override void get_config_photos_sort(out bool sort_order, out int sort_by) { + Config.Facade.get_instance().get_event_photos_sort(out sort_order, out sort_by); + } + + protected override void set_config_photos_sort(bool sort_order, int sort_by) { + Config.Facade.get_instance().set_event_photos_sort(sort_order, sort_by); + } +} + |