summaryrefslogtreecommitdiff
path: root/src/MediaViewTracker.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/MediaViewTracker.vala')
-rw-r--r--src/MediaViewTracker.vala114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/MediaViewTracker.vala b/src/MediaViewTracker.vala
new file mode 100644
index 0000000..879dc84
--- /dev/null
+++ b/src/MediaViewTracker.vala
@@ -0,0 +1,114 @@
+/* Copyright 2011-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 MediaViewTracker : Core.ViewTracker {
+ public MediaAccumulator all = new MediaAccumulator();
+ public MediaAccumulator visible = new MediaAccumulator();
+ public MediaAccumulator selected = new MediaAccumulator();
+
+ public MediaViewTracker(ViewCollection collection) {
+ base (collection);
+
+ start(all, visible, selected);
+ }
+}
+
+public class MediaAccumulator : Object, Core.TrackerAccumulator {
+ public int total = 0;
+ public int photos = 0;
+ public int videos = 0;
+ public int raw = 0;
+ public int flagged = 0;
+
+ public bool include(DataObject object) {
+ DataSource source = ((DataView) object).get_source();
+
+ total++;
+
+ Photo? photo = source as Photo;
+ if (photo != null) {
+ if (photo.get_master_file_format() == PhotoFileFormat.RAW) {
+ raw++;
+ }
+
+ if (photo.get_master_file_format() != PhotoFileFormat.RAW ||
+ photo.is_raw_developer_available(RawDeveloper.CAMERA)) {
+ photos++;
+ }
+ } else if (source is VideoSource) {
+ videos++;
+ }
+
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null && flaggable.is_flagged())
+ flagged++;
+
+ // because of total, always fire "updated"
+ return true;
+ }
+
+ public bool uninclude(DataObject object) {
+ DataSource source = ((DataView) object).get_source();
+
+ if (total < 1) {
+ warning("Tried to remove DataObject %s from empty %s (%s)".printf(object.to_string(),
+ get_type().name(), to_string()));
+ return false;
+ }
+ total--;
+
+ Photo? photo = source as Photo;
+ if (photo != null) {
+ if (photo.get_master_file_format() == PhotoFileFormat.RAW) {
+ assert(raw > 0);
+ raw--;
+ }
+
+ if (photo.get_master_file_format() != PhotoFileFormat.RAW ||
+ photo.is_raw_developer_available(RawDeveloper.CAMERA)) {
+ assert(photos > 0);
+ photos--;
+ }
+ } else if (source is Video) {
+ assert(videos > 0);
+ videos--;
+ }
+
+ Flaggable? flaggable = source as Flaggable;
+ if (flaggable != null && flaggable.is_flagged()) {
+ assert(flagged > 0);
+ flagged--;
+ }
+
+ // because of total, always fire "updated"
+ return true;
+ }
+
+ public bool altered(DataObject object, Alteration alteration) {
+ // the only alteration that can happen to MediaSources this accumulator is concerned with is
+ // flagging; typeness and raw-ness don't change at runtime
+ if (!alteration.has_detail("metadata", "flagged"))
+ return false;
+
+ Flaggable? flaggable = ((DataView) object).get_source() as Flaggable;
+ if (flaggable == null)
+ return false;
+
+ if (flaggable.is_flagged()) {
+ flagged++;
+ } else {
+ assert(flagged > 0);
+ flagged--;
+ }
+
+ return true;
+ }
+
+ public string to_string() {
+ return "%d photos/%d videos/%d raw/%d flagged".printf(photos, videos, raw, flagged);
+ }
+}
+