def _filter_visible_func(self, model, iter): # If searching is active, set visibility based on search text if self._search_term is not None: key = self._search_term.lower() return any((key in (model.get_value(iter, column) or '').lower()) for column in self.SEARCH_COLUMNS) if self._view_mode == self.VIEW_ALL: return True elif self._view_mode == self.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == self.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == self.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True
def _filter_visible_func(self, model, iter, misc): channel = model.get_value(iter, self.C_CHANNEL) # If searching is active, set visibility based on search text if self._search_term is not None and self._search_term != '': key = self._search_term.lower() if isinstance(channel, PodcastChannelProxy): if channel.ALL_EPISODES_PROXY: return False return any(key in getattr(ch, c).lower() for c in PodcastListModel.SEARCH_ATTRS for ch in channel.channels) columns = (model.get_value(iter, c) for c in self.SEARCH_COLUMNS) return any((key in c.lower() for c in columns if c is not None)) # Show section if any of its channels have an update error if isinstance(channel, PodcastChannelProxy) and not channel.ALL_EPISODES_PROXY: if any(c._update_error is not None for c in channel.channels): return True if model.get_value(iter, self.C_SEPARATOR): return True elif getattr(channel, '_update_error', None) is not None: return True elif self._view_mode == EpisodeListModel.VIEW_ALL: return model.get_value(iter, self.C_HAS_EPISODES) elif self._view_mode == EpisodeListModel.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == EpisodeListModel.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == EpisodeListModel.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True
def _filter_visible_func(self, model, iter, misc): channel = model.get_value(iter, self.C_CHANNEL) # If searching is active, set visibility based on search text if self._search_term is not None: if isinstance(channel, PodcastChannelProxy): return True key = self._search_term.lower() columns = (model.get_value(iter, c) for c in self.SEARCH_COLUMNS) return any((key in c.lower() for c in columns if c is not None)) if model.get_value(iter, self.C_SEPARATOR): return True elif getattr(channel, '_update_error', None) is not None: return True elif self._view_mode == EpisodeListModel.VIEW_ALL: return model.get_value(iter, self.C_HAS_EPISODES) elif self._view_mode == EpisodeListModel.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == EpisodeListModel.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == EpisodeListModel.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True
def _filter_visible_func(self, model, iter): # If searching is active, set visibility based on search text if self._search_term is not None: episode = model.get_value(iter, self.C_EPISODE) if episode is None: return False try: return self._search_term_eql.match(episode) except Exception, e: return True
def _filter_visible_func(self, model, iter, misc): # If searching is active, set visibility based on search text if self._search_term is not None: episode = model.get_value(iter, self.C_EPISODE) if episode is None: return False try: return self._search_term_eql.match(episode) except Exception as e: return True if self._view_mode == self.VIEW_ALL: return True elif self._view_mode == self.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == self.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == self.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True
def _filter_visible_func(self, model, iter, misc): # If searching is active, set visibility based on search text if self._search_term is not None: if model.get_value(iter, self.C_CHANNEL) == SectionMarker: return True key = self._search_term.lower() columns = (model.get_value(iter, c) for c in self.SEARCH_COLUMNS) return any((key in c.lower() for c in columns if c is not None)) if model.get_value(iter, self.C_SEPARATOR): return True elif self._view_mode == EpisodeListModel.VIEW_ALL: return model.get_value(iter, self.C_HAS_EPISODES) elif self._view_mode == EpisodeListModel.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == EpisodeListModel.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == EpisodeListModel.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True
def _show_row_separator(self, model, iter): return model.get_value(iter, self.C_SEPARATOR)
def row_separator_func(cls, model, iter): return model.get_value(iter, cls.C_SEPARATOR)
class EpisodeListModel(gtk.ListStore): C_URL, C_TITLE, C_FILESIZE_TEXT, C_EPISODE, C_STATUS_ICON, \ C_PUBLISHED_TEXT, C_DESCRIPTION, C_TOOLTIP, \ C_VIEW_SHOW_UNDELETED, C_VIEW_SHOW_DOWNLOADED, \ C_VIEW_SHOW_UNPLAYED, C_FILESIZE, C_PUBLISHED, \ C_TIME, C_TIME_VISIBLE, C_TOTAL_TIME, \ C_LOCKED = range(17) VIEW_ALL, VIEW_UNDELETED, VIEW_DOWNLOADED, VIEW_UNPLAYED = range(4) # In which steps the UI is updated for "loading" animations _UI_UPDATE_STEP = .03 # Steps for the "downloading" icon progress PROGRESS_STEPS = 20 def __init__(self, config, on_filter_changed=lambda has_episodes: None): gtk.ListStore.__init__(self, str, str, str, object, \ str, str, str, str, bool, bool, bool, \ gobject.TYPE_INT64, int, str, bool, int, bool) self._config = config # Callback for when the filter / list changes, gets one parameter # (has_episodes) that is True if the list has any episodes self._on_filter_changed = on_filter_changed # Filter to allow hiding some episodes self._filter = self.filter_new() self._sorter = gtk.TreeModelSort(self._filter) self._view_mode = self.VIEW_ALL self._search_term = None self._search_term_eql = None self._filter.set_visible_func(self._filter_visible_func) # Are we currently showing the "all episodes" view? self._all_episodes_view = False self.ICON_AUDIO_FILE = 'audio-x-generic' self.ICON_VIDEO_FILE = 'video-x-generic' self.ICON_IMAGE_FILE = 'image-x-generic' self.ICON_GENERIC_FILE = 'text-x-generic' self.ICON_DOWNLOADING = gtk.STOCK_GO_DOWN self.ICON_DELETED = gtk.STOCK_DELETE if 'KDE_FULL_SESSION' in os.environ: # Workaround until KDE adds all the freedesktop icons # See https://bugs.kde.org/show_bug.cgi?id=233505 and # http://gpodder.org/bug/553 self.ICON_DELETED = 'archive-remove' def _format_filesize(self, episode): if episode.file_size > 0: return util.format_filesize(episode.file_size, digits=1) else: return None def _filter_visible_func(self, model, iter): # If searching is active, set visibility based on search text if self._search_term is not None: episode = model.get_value(iter, self.C_EPISODE) if episode is None: return False try: return self._search_term_eql.match(episode) except Exception, e: return True if self._view_mode == self.VIEW_ALL: return True elif self._view_mode == self.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == self.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == self.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True