1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/* Copyright 2016 Software Freedom Conservancy Inc.
*
* 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 | SearchFilterCriteria.SAVEDSEARCH;
}
}
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");
}
private const GLib.ActionEntry[] entries = {
{ "RemoveFromLibrary", on_remove_from_library }
};
protected override void add_actions () {
base.add_actions ();
AppWindow.get_instance ().add_action_entries (entries, this);
}
public override Core.ViewTracker? get_view_tracker() {
return tracker;
}
protected override void update_actions(int selected_count, int count) {
set_action_sensitive("RemoveFromLibrary", selected_count > 0);
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;
}
}
|