diff --git a/media/css/reader.css b/media/css/reader.css index 6df4b0420..69eae7d84 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -784,6 +784,7 @@ body.NB-theme-serif #story_pane .NB-feed-story-content { opacity: 1; } .NB-feedlist.NB-selector-active .NB-folder-collapsed .folder, +.NB-feedlist.NB-selector-active .NB-hidden, .NB-socialfeeds-folder.NB-selector-active { display: block !important; opacity: 1 !important; diff --git a/media/js/newsblur/models/feeds.js b/media/js/newsblur/models/feeds.js index ea82e6938..86c6bbbc3 100644 --- a/media/js/newsblur/models/feeds.js +++ b/media/js/newsblur/models/feeds.js @@ -6,6 +6,7 @@ NEWSBLUR.Models.Feed = Backbone.Model.extend({ this.bind('change:ps', this.update_folder_counts); this.bind('change:nt', this.update_folder_counts); this.bind('change:ng', this.update_folder_counts); + this.bind('change:selected', this.update_folder_visibility); this.views = []; this.folders = []; }, @@ -19,9 +20,12 @@ NEWSBLUR.Models.Feed = Backbone.Model.extend({ update_folder_counts: function() { _.each(this.folders, function(folder) { folder.trigger('change:counts'); - if (folder.parent_folder) { - folder.parent_folder.trigger('change:counts'); - } + }); + }, + + update_folder_visibility: function() { + _.each(this.folders, function(folder) { + folder.trigger('change:feed_selected'); }); }, @@ -106,6 +110,23 @@ NEWSBLUR.Models.Feed = Backbone.Model.extend({ nt: this.get('nt'), ng: this.get('ng') }; + }, + + has_unreads: function(options) { + options = options || {}; + var unread_view = NEWSBLUR.assets.preference('unread_view'); + + if (options.include_selected && this.get('selected')) { + return true; + } + + if (unread_view <= -1) { + return !!(this.get('ng') || this.get('nt') || this.get('ps')); + } else if (unread_view == 0) { + return !!(this.get('nt') || this.get('ps')); + } else if (unread_view > 0) { + return !!(this.get('ps')); + } } }); diff --git a/media/js/newsblur/models/folders.js b/media/js/newsblur/models/folders.js index 3613a96cd..ff73a329b 100644 --- a/media/js/newsblur/models/folders.js +++ b/media/js/newsblur/models/folders.js @@ -84,6 +84,16 @@ NEWSBLUR.Models.FeedOrFolder = Backbone.Model.extend({ var feed_ids_in_folder = this.feed_ids_in_folder(); NEWSBLUR.assets.delete_folder(folder_title, in_folder, feed_ids_in_folder); this.trigger('delete'); + }, + + has_unreads: function(options) { + options = options || {}; + + if (options.include_selected && this.get('selected')) { + return true; + } + + return this.folders.has_unreads(options); } }); @@ -95,9 +105,12 @@ NEWSBLUR.Collections.Folders = Backbone.Collection.extend({ }, initialize: function(models, options) { + _.bindAll(this, 'propagate_feed_selected'); this.options = options || {}; this.parent_folder = options && options.parent_folder; this.comparator = NEWSBLUR.Collections.Folders.comparator; + this.bind('change:feed_selected', this.propagate_feed_selected); + this.bind('change:counts', this.propagate_change_counts); }, model: NEWSBLUR.Models.FeedOrFolder, @@ -199,12 +212,46 @@ NEWSBLUR.Collections.Folders = Backbone.Collection.extend({ ng: 0 }); + this.counts = counts; + return counts; + }, + + has_unreads: function(options) { + options = options || {}; + + return this.any(function(item) { + if (item.is_feed()) { + return item.feed.has_unreads(options); + } else if (item.is_folder()) { + return item.has_unreads(options); + } + }); + }, + + propagate_feed_selected: function() { + if (this.parent_folder) { + this.parent_folder.trigger('change:feed_selected'); + } + }, + + propagate_change_counts: function() { + if (this.parent_folder) { + this.parent_folder.trigger('change:counts'); + } + }, + + update_all_folder_visibility: function() { + this.each(function(item) { + if (item.is_folder()) { + item.folders.trigger('change:counts'); + item.folders.update_all_folder_visibility(); + } + }); } - }, { - + comparator: function(modelA, modelB) { var sort_order = NEWSBLUR.assets.preference('feed_order'); diff --git a/media/js/newsblur/reader/reader.js b/media/js/newsblur/reader/reader.js index 0c51c0707..aa8372f17 100644 --- a/media/js/newsblur/reader/reader.js +++ b/media/js/newsblur/reader/reader.js @@ -3544,6 +3544,7 @@ } this.show_story_titles_above_intelligence_level({'animate': true, 'follow': true}); NEWSBLUR.app.sidebar_header.toggle_hide_read_preference(); + NEWSBLUR.assets.folders.update_all_folder_visibility(); NEWSBLUR.app.feed_list.scroll_to_show_selected_feed(); NEWSBLUR.app.feed_list.scroll_to_show_selected_folder(); diff --git a/media/js/newsblur/views/feed_title_view.js b/media/js/newsblur/views/feed_title_view.js index 912509c0f..890110100 100644 --- a/media/js/newsblur/views/feed_title_view.js +++ b/media/js/newsblur/views/feed_title_view.js @@ -197,6 +197,10 @@ NEWSBLUR.Views.FeedTitleView = Backbone.View.extend({ select_feed: function() { this.$el.toggleClass('selected', this.model.get('selected')); this.$el.toggleClass('NB-selected', this.model.get('selected')); + + _.each(this.folders, function(folder) { + folder.view.update_hidden(); + }); }, flash_changes: function() { diff --git a/media/js/newsblur/views/folder_view.js b/media/js/newsblur/views/folder_view.js index 12bf09c1c..55a424164 100644 --- a/media/js/newsblur/views/folder_view.js +++ b/media/js/newsblur/views/folder_view.js @@ -23,7 +23,8 @@ NEWSBLUR.Views.Folder = Backbone.View.extend({ }, initialize: function() { - _.bindAll(this, 'update_title', 'update_selected', 'delete_folder', 'check_collapsed'); + _.bindAll(this, 'update_title', 'update_selected', 'delete_folder', 'check_collapsed', + 'update_hidden'); this.options.folder_title = this.model && this.model.get('folder_title'); @@ -31,6 +32,9 @@ NEWSBLUR.Views.Folder = Backbone.View.extend({ // Root folder does not have a model. this.model.bind('change:folder_title', this.update_title); this.model.bind('change:selected', this.update_selected); + this.model.bind('change:selected', this.update_hidden); + this.collection.bind('change:feed_selected', this.update_hidden); + this.collection.bind('change:counts', this.update_hidden); this.model.bind('delete', this.delete_folder); if (!this.options.feedbar) { this.model.folder_view = this; @@ -85,6 +89,7 @@ NEWSBLUR.Views.Folder = Backbone.View.extend({ } this.check_collapsed({skip_animation: true}); + this.update_hidden(); this.$('.folder_title').eq(0).bind('contextmenu', _.bind(this.show_manage_menu, this)); return this; @@ -140,6 +145,17 @@ NEWSBLUR.Views.Folder = Backbone.View.extend({ this.$el.toggleClass('NB-selected', this.model.get('selected')); }, + update_hidden: function() { + if (!this.model) return; + + var has_unreads = this.model.has_unreads({include_selected: true}); + if (has_unreads || !NEWSBLUR.assets.preference('hide_read_feeds')) { + this.$el.removeClass('NB-hidden'); + } else { + this.$el.addClass('NB-hidden'); + } + }, + // =========== // = Actions = // =========== @@ -174,7 +190,10 @@ NEWSBLUR.Views.Folder = Backbone.View.extend({ }); } - var $counts = new NEWSBLUR.Views.FolderCount({collection: this.collection}).render().$el; + this.folder_count = new NEWSBLUR.Views.FolderCount({ + collection: this.collection + }).render(); + var $counts = this.folder_count.$el; if (this.options.feedbar) { this.$('.NB-story-title-indicator-count').html($counts.clone()); } else {