diff options
Diffstat (limited to 'src/core/ViewCollection.vala')
-rw-r--r-- | src/core/ViewCollection.vala | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/core/ViewCollection.vala b/src/core/ViewCollection.vala index 7e13fb0..c3848c1 100644 --- a/src/core/ViewCollection.vala +++ b/src/core/ViewCollection.vala @@ -298,6 +298,33 @@ public class ViewCollection : DataCollection { add_many(copy_view); } + // for use in shuffled slideshow + public ViewCollection shuffled_copy(Photo? start = null) { + ViewCollection shuffled = new ViewCollection("shuffled copy of " + to_string()); + + Gee.Collection<DataObject> data = get_all(); + Gee.ArrayList<DataObject> data_copy = new Gee.ArrayList<DataObject>(); + foreach (DataObject object in data) { + DataView view = (DataView) object; + if (view.get_source() is PhotoSource && + (start == null || view.get_source() != start)) { + data_copy.add(new PhotoView((PhotoSource) ((DataView) object).get_source())); + } + } + + for (int ctr = data_copy.size - 1; ctr > 0; ctr--) { + int rand = GLib.Random.int_range(0, ctr + 1); + DataObject temp = data_copy.get(rand); + data_copy.set(rand, data_copy.get(ctr)); + data_copy.set(ctr, temp); + } + + if (start != null) + shuffled.add(new PhotoView(start)); + shuffled.add_many(data_copy); + return shuffled; + } + public bool is_view_filter_installed(ViewFilter f) { return filters.contains(f); } @@ -740,12 +767,30 @@ public class ViewCollection : DataCollection { // _something_... return get_first(); } + + public virtual DataView? get_first_photo() { + if (get_count() < 1) + return null; + + DataView dv = get_first(); + int num_views = get_count(); + + while ((dv != null) && (index_of(dv) < (num_views))) { + if (dv.get_source() is PhotoSource) + return dv; + else + dv = get_next(dv); + } + + return null; + } public virtual DataView? get_last() { return (get_count() > 0) ? (DataView?) get_at(get_count() - 1) : null; } - public virtual DataView? get_next(DataView view) { + public virtual DataView? get_next(DataView view, out bool? wrapped = null) { + wrapped = false; if (get_count() == 0) return null; @@ -754,8 +799,10 @@ public class ViewCollection : DataCollection { return null; index++; - if (index >= get_count()) + if (index >= get_count()) { index = 0; + wrapped = true; + } return (DataView?) get_at(index); } |