diff options
Diffstat (limited to 'src/library/LibraryBranch.vala')
| -rw-r--r-- | src/library/LibraryBranch.vala | 147 | 
1 files changed, 147 insertions, 0 deletions
| diff --git a/src/library/LibraryBranch.vala b/src/library/LibraryBranch.vala new file mode 100644 index 0000000..f9113f5 --- /dev/null +++ b/src/library/LibraryBranch.vala @@ -0,0 +1,147 @@ +/* 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 Library.Branch : Sidebar.Branch { +    private const string POSITION_DATA = "x-photos-entry-position"; + +    public Library.PhotosEntry photos_entry { get; private set; } +    public Library.FlaggedSidebarEntry flagged_entry { get; private set; } +    public Library.LastImportSidebarEntry last_imported_entry { get; private set; } +    public Library.ImportQueueSidebarEntry import_queue_entry { get; private set; } +    public Library.OfflineSidebarEntry offline_entry { get; private set; } +    public Library.TrashSidebarEntry trash_entry { get; private set; } +     +    // This lists the order of the library items in the sidebar. To re-order, simply move +    // the item in this list to a new position. These numbers should *not* persist anywhere +    // outside the app. +    private enum EntryPosition { +        PHOTOS, +        FLAGGED, +        LAST_IMPORTED, +        IMPORT_QUEUE, +        OFFLINE, +        TRASH +    } +     +    public Branch() { +        base(new Sidebar.Header(_("Library"), _("Organize and browse your photos")), +            Sidebar.Branch.Options.STARTUP_OPEN_GROUPING, comparator); + +        photos_entry = new Library.PhotosEntry(); +        trash_entry = new Library.TrashSidebarEntry(); +        last_imported_entry = new Library.LastImportSidebarEntry(); +        flagged_entry = new Library.FlaggedSidebarEntry(); +        offline_entry = new Library.OfflineSidebarEntry(); +        import_queue_entry = new Library.ImportQueueSidebarEntry(); + +        insert(photos_entry, EntryPosition.PHOTOS); +        insert(trash_entry, EntryPosition.TRASH); + +        flagged_entry.visibility_changed.connect(on_flagged_visibility_changed); +        on_flagged_visibility_changed(); + +        last_imported_entry.visibility_changed.connect(on_last_imported_visibility_changed); +        on_last_imported_visibility_changed(); + +        import_queue_entry.visibility_changed.connect(on_import_queue_visibility_changed); +        on_import_queue_visibility_changed(); + +        offline_entry.visibility_changed.connect(on_offline_visibility_changed); +        on_offline_visibility_changed(); +    } +     +    private void insert(Sidebar.Entry entry, int position) { +        entry.set_data<int>(POSITION_DATA, position); +        graft(get_root(), entry); +    } + +    private void on_flagged_visibility_changed() { +        update_entry_visibility(flagged_entry, EntryPosition.FLAGGED); +    } + +    private void on_last_imported_visibility_changed() { +        update_entry_visibility(last_imported_entry, EntryPosition.LAST_IMPORTED); +    } + +    private void on_import_queue_visibility_changed() { +        update_entry_visibility(import_queue_entry, EntryPosition.IMPORT_QUEUE); +    } + +    private void on_offline_visibility_changed() { +        update_entry_visibility(offline_entry, EntryPosition.OFFLINE); +    } + +    private void update_entry_visibility(Library.HideablePageEntry entry, int position) { +        if (entry.visible) { +            if (!has_entry(entry)) +                insert(entry, position); +        } else if (has_entry(entry)) { +            prune(entry); +        } +    } + +    private static int comparator(Sidebar.Entry a, Sidebar.Entry b) { +        return a.get_data<int>(POSITION_DATA) - b.get_data<int>(POSITION_DATA); +    } +} + +public class Library.PhotosEntry : Sidebar.SimplePageEntry { +     +    public PhotosEntry() { +    } +     +    public override string get_sidebar_name() { +        return _("Photos"); +    } +     +    public override string? get_sidebar_icon() { +        return Resources.ICON_PHOTOS; +    } +     +    protected override Page create_page() { +        return new Library.MainPage(); +    } +} + +public abstract class Library.HideablePageEntry : Sidebar.SimplePageEntry { +    // container branch should listen to this signal +    public signal void visibility_changed(bool visible); + +    private bool show_entry = false; +    public bool visible { +        get { return show_entry; } +        set { +            if (value == show_entry) +                return; + +            show_entry = value; +            visibility_changed(value); +        } +    } + +    public HideablePageEntry() { +    } +} + +public class Library.MainPage : CollectionPage { +    public const string NAME = _("Library"); +     +    public MainPage(ProgressMonitor? monitor = null) { +        base (NAME); +         +        foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all()) +            get_view().monitor_source_collection(sources, new CollectionViewManager(this), null, null, monitor); +    } +     +    protected override void get_config_photos_sort(out bool sort_order, out int sort_by) { +        Config.Facade.get_instance().get_library_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_library_photos_sort(sort_order, sort_by); +    } +} + | 
