summaryrefslogtreecommitdiff
path: root/src/library/OfflinePage.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/OfflinePage.vala')
-rw-r--r--src/library/OfflinePage.vala130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/library/OfflinePage.vala b/src/library/OfflinePage.vala
new file mode 100644
index 0000000..cb6af2d
--- /dev/null
+++ b/src/library/OfflinePage.vala
@@ -0,0 +1,130 @@
+/* Copyright 2010-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 OfflinePage : CheckerboardPage {
+ public const string NAME = _("Missing Files");
+
+ private class OfflineView : Thumbnail {
+ public OfflineView(MediaSource source) {
+ base (source);
+
+ assert(source.is_offline());
+ }
+ }
+
+ private class OfflineSearchViewFilter : DefaultSearchViewFilter {
+ public override uint get_criteria() {
+ return SearchFilterCriteria.TEXT | SearchFilterCriteria.FLAG |
+ SearchFilterCriteria.MEDIA | SearchFilterCriteria.RATING;
+ }
+ }
+
+ private OfflineSearchViewFilter search_filter = new OfflineSearchViewFilter();
+ private MediaViewTracker tracker;
+
+ public OfflinePage() {
+ base (NAME);
+
+ init_item_context_menu("/OfflineContextMenu");
+ init_toolbar("/OfflineToolbar");
+
+ tracker = new MediaViewTracker(get_view());
+
+ // monitor offline and initialize view with all items in it
+ LibraryPhoto.global.offline_contents_altered.connect(on_offline_contents_altered);
+ Video.global.offline_contents_altered.connect(on_offline_contents_altered);
+
+ on_offline_contents_altered(LibraryPhoto.global.get_offline_bin_contents(), null);
+ on_offline_contents_altered(Video.global.get_offline_bin_contents(), null);
+ }
+
+ ~OfflinePage() {
+ LibraryPhoto.global.offline_contents_altered.disconnect(on_offline_contents_altered);
+ Video.global.offline_contents_altered.disconnect(on_offline_contents_altered);
+ }
+
+ protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
+ base.init_collect_ui_filenames(ui_filenames);
+
+ ui_filenames.add("offline.ui");
+ }
+
+ protected override Gtk.ActionEntry[] init_collect_action_entries() {
+ Gtk.ActionEntry[] actions = base.init_collect_action_entries();
+
+ Gtk.ActionEntry remove = { "RemoveFromLibrary", Gtk.Stock.REMOVE, TRANSLATABLE, "Delete",
+ TRANSLATABLE, on_remove_from_library };
+ remove.label = Resources.REMOVE_FROM_LIBRARY_MENU;
+ remove.tooltip = Resources.DELETE_FROM_LIBRARY_TOOLTIP;
+ actions += remove;
+
+ return actions;
+ }
+
+ public override Core.ViewTracker? get_view_tracker() {
+ return tracker;
+ }
+
+ protected override void update_actions(int selected_count, int count) {
+ set_action_sensitive("RemoveFromLibrary", selected_count > 0);
+ set_action_important("RemoveFromLibrary", true);
+
+ base.update_actions(selected_count, count);
+ }
+
+ private void on_offline_contents_altered(Gee.Collection<MediaSource>? added,
+ Gee.Collection<MediaSource>? removed) {
+ if (added != null) {
+ foreach (MediaSource source in added)
+ get_view().add(new OfflineView(source));
+ }
+
+ if (removed != null) {
+ Marker marker = get_view().start_marking();
+ foreach (MediaSource source in removed)
+ marker.mark(get_view().get_view_for_source(source));
+ get_view().remove_marked(marker);
+ }
+ }
+
+ private void on_remove_from_library() {
+ Gee.Collection<MediaSource> sources =
+ (Gee.Collection<MediaSource>) get_view().get_selected_sources();
+ if (sources.size == 0)
+ return;
+
+ if (!remove_offline_dialog(AppWindow.get_instance(), sources.size))
+ return;
+
+ AppWindow.get_instance().set_busy_cursor();
+
+ ProgressDialog progress = null;
+ if (sources.size >= 20)
+ progress = new ProgressDialog(AppWindow.get_instance(), _("Deleting..."));
+
+ Gee.ArrayList<LibraryPhoto> photos = new Gee.ArrayList<LibraryPhoto>();
+ Gee.ArrayList<Video> videos = new Gee.ArrayList<Video>();
+ MediaSourceCollection.filter_media(sources, photos, videos);
+
+ if (progress != null) {
+ LibraryPhoto.global.remove_from_app(photos, false, progress.monitor);
+ Video.global.remove_from_app(videos, false, progress.monitor);
+ } else {
+ LibraryPhoto.global.remove_from_app(photos, false);
+ Video.global.remove_from_app(videos, false);
+ }
+
+ if (progress != null)
+ progress.close();
+
+ AppWindow.get_instance().set_normal_cursor();
+ }
+
+ public override SearchViewFilter get_search_view_filter() {
+ return search_filter;
+ }
+}
+