From b0ce535ca9ba2018d04218809b88f448e2030d30 Mon Sep 17 00:00:00 2001 From: auouymous Date: Sat, 29 Apr 2023 21:10:33 -0600 Subject: [PATCH 1/3] Add a View menu option to show time in the episode released column. --- share/gpodder/ui/gtk/menus.ui | 4 ++++ src/gpodder/config.py | 1 + src/gpodder/gtkui/main.py | 17 +++++++++++++++-- src/gpodder/gtkui/model.py | 4 +++- src/gpodder/model.py | 11 +++++++++-- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/share/gpodder/ui/gtk/menus.ui b/share/gpodder/ui/gtk/menus.ui index c3f3d2f7..a993a049 100644 --- a/share/gpodder/ui/gtk/menus.ui +++ b/share/gpodder/ui/gtk/menus.ui @@ -241,6 +241,10 @@ Episode descriptions <Primary>d + + win.viewShowEpisodeReleasedTime + Show episode released time + win.viewCtrlClickToSortEpisodes Require control click to sort episodes diff --git a/src/gpodder/config.py b/src/gpodder/config.py index 36350fbd..b5b6902f 100644 --- a/src/gpodder/config.py +++ b/src/gpodder/config.py @@ -171,6 +171,7 @@ defaults = { 'always_show_new': True, 'trim_title_prefix': True, 'descriptions': True, + 'show_released_time': False, 'ctrl_click_to_sort': False, 'columns': int('110', 2), # bitfield of visible columns }, diff --git a/src/gpodder/gtkui/main.py b/src/gpodder/gtkui/main.py index 9a7dfb3f..8b53b7d3 100644 --- a/src/gpodder/gtkui/main.py +++ b/src/gpodder/gtkui/main.py @@ -319,6 +319,11 @@ class gPodder(BuilderWidget, dbus.service.Object): action.connect('activate', self.on_item_view_show_episode_description_toggled) g.add_action(action) + action = Gio.SimpleAction.new_stateful( + 'viewShowEpisodeReleasedTime', None, GLib.Variant.new_boolean(self.config.ui.gtk.episode_list.show_released_time)) + action.connect('activate', self.on_item_view_show_episode_released_time_toggled) + g.add_action(action) + action = Gio.SimpleAction.new_stateful( 'viewCtrlClickToSortEpisodes', None, GLib.Variant.new_boolean(self.config.ui.gtk.episode_list.ctrl_click_to_sort)) action.connect('activate', self.on_item_view_ctrl_click_to_sort_episodes_toggled) @@ -926,7 +931,9 @@ class gPodder(BuilderWidget, dbus.service.Object): timecolumn.set_sort_column_id(EpisodeListModel.C_TOTAL_TIME) releasecell = Gtk.CellRendererText() - releasecolumn = Gtk.TreeViewColumn(_('Released'), releasecell, text=EpisodeListModel.C_PUBLISHED_TEXT) + releasecolumn = Gtk.TreeViewColumn(_('Released')) + releasecolumn.pack_start(releasecell, True) + releasecolumn.add_attribute(releasecell, 'markup', EpisodeListModel.C_PUBLISHED_TEXT) releasecolumn.set_sort_column_id(EpisodeListModel.C_PUBLISHED) sizetimecell = Gtk.CellRendererText() @@ -1365,7 +1372,8 @@ class gPodder(BuilderWidget, dbus.service.Object): def _on_config_changed(self, name, old_value, new_value): if name == 'ui.gtk.toolbar': self.toolbar.set_property('visible', new_value) - elif name in ('ui.gtk.episode_list.descriptions', + elif name in ('ui.gtk.episode_list.show_released_time', + 'ui.gtk.episode_list.descriptions', 'ui.gtk.episode_list.trim_title_prefix', 'ui.gtk.episode_list.always_show_new'): self.update_episode_list_model() @@ -3507,6 +3515,11 @@ class gPodder(BuilderWidget, dbus.service.Object): self.config.ui.gtk.episode_list.descriptions = not state action.set_state(GLib.Variant.new_boolean(not state)) + def on_item_view_show_episode_released_time_toggled(self, action, param): + state = action.get_state() + self.config.ui.gtk.episode_list.show_released_time = not state + action.set_state(GLib.Variant.new_boolean(not state)) + def on_item_view_ctrl_click_to_sort_episodes_toggled(self, action, param): state = action.get_state() self.config.ui.gtk.episode_list.ctrl_click_to_sort = not state diff --git a/src/gpodder/gtkui/model.py b/src/gpodder/gtkui/model.py index df2d4c22..1c278df6 100644 --- a/src/gpodder/gtkui/model.py +++ b/src/gpodder/gtkui/model.py @@ -128,7 +128,7 @@ class BackgroundUpdate(object): model.C_URL, episode.url, model.C_TITLE, episode.title, model.C_EPISODE, episode, - model.C_PUBLISHED_TEXT, episode.cute_pubdate(), + model.C_PUBLISHED_TEXT, episode.cute_pubdate(show_time=self.model._config_ui_gtk_episode_list_show_released_time), model.C_PUBLISHED, episode.published, ) update_fields = model.get_update_fields(episode) @@ -215,11 +215,13 @@ class EpisodeListModel(Gtk.ListStore): self._config_ui_gtk_episode_list_always_show_new = False self._config_ui_gtk_episode_list_trim_title_prefix = False self._config_ui_gtk_episode_list_descriptions = False + self._config_ui_gtk_episode_list_show_released_time = False def cache_config(self, config): self._config_ui_gtk_episode_list_always_show_new = config.ui.gtk.episode_list.always_show_new self._config_ui_gtk_episode_list_trim_title_prefix = config.ui.gtk.episode_list.trim_title_prefix self._config_ui_gtk_episode_list_descriptions = config.ui.gtk.episode_list.descriptions + self._config_ui_gtk_episode_list_show_released_time = config.ui.gtk.episode_list.show_released_time def _format_filesize(self, episode): if episode.file_size > 0: diff --git a/src/gpodder/model.py b/src/gpodder/model.py index fed62f84..0b07d4d7 100644 --- a/src/gpodder/model.py +++ b/src/gpodder/model.py @@ -842,11 +842,18 @@ class PodcastEpisode(PodcastModelObject): self.title, self.cute_pubdate()) - def cute_pubdate(self): + def cute_pubdate(self, show_time=False): result = util.format_date(self.published) if result is None: return '(%s)' % _('unknown') - else: + + try: + if show_time: + timestamp = datetime.datetime.fromtimestamp(self.published) + return '{}\n{}'.format(timestamp.strftime('%H:%M'), result) + else: + return result + except: return result pubdate_prop = property(fget=cute_pubdate) From df4195dc5cc527c41ed3c6a1f798a61478728a0c Mon Sep 17 00:00:00 2001 From: auouymous Date: Sat, 29 Apr 2023 21:41:38 -0600 Subject: [PATCH 2/3] Add a View menu option to right align the episode released column. --- share/gpodder/ui/gtk/menus.ui | 4 ++++ src/gpodder/config.py | 1 + src/gpodder/gtkui/main.py | 30 +++++++++++++++++++++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/share/gpodder/ui/gtk/menus.ui b/share/gpodder/ui/gtk/menus.ui index a993a049..080563e0 100644 --- a/share/gpodder/ui/gtk/menus.ui +++ b/share/gpodder/ui/gtk/menus.ui @@ -245,6 +245,10 @@ win.viewShowEpisodeReleasedTime Show episode released time + + win.viewRightAlignEpisodeReleasedColumn + Right align episode released column + win.viewCtrlClickToSortEpisodes Require control click to sort episodes diff --git a/src/gpodder/config.py b/src/gpodder/config.py index b5b6902f..485b392e 100644 --- a/src/gpodder/config.py +++ b/src/gpodder/config.py @@ -172,6 +172,7 @@ defaults = { 'trim_title_prefix': True, 'descriptions': True, 'show_released_time': False, + 'right_align_released_column': False, 'ctrl_click_to_sort': False, 'columns': int('110', 2), # bitfield of visible columns }, diff --git a/src/gpodder/gtkui/main.py b/src/gpodder/gtkui/main.py index 8b53b7d3..ea9c58ce 100644 --- a/src/gpodder/gtkui/main.py +++ b/src/gpodder/gtkui/main.py @@ -194,6 +194,8 @@ class gPodder(BuilderWidget, dbus.service.Object): self.create_actions() + self.releasecell = None + # Init the treeviews that we use self.init_podcast_list_treeview() self.init_episode_list_treeview() @@ -324,6 +326,12 @@ class gPodder(BuilderWidget, dbus.service.Object): action.connect('activate', self.on_item_view_show_episode_released_time_toggled) g.add_action(action) + action = Gio.SimpleAction.new_stateful( + 'viewRightAlignEpisodeReleasedColumn', None, + GLib.Variant.new_boolean(self.config.ui.gtk.episode_list.right_align_released_column)) + action.connect('activate', self.on_item_view_right_align_episode_released_column_toggled) + g.add_action(action) + action = Gio.SimpleAction.new_stateful( 'viewCtrlClickToSortEpisodes', None, GLib.Variant.new_boolean(self.config.ui.gtk.episode_list.ctrl_click_to_sort)) action.connect('activate', self.on_item_view_ctrl_click_to_sort_episodes_toggled) @@ -879,6 +887,14 @@ class gPodder(BuilderWidget, dbus.service.Object): return False + def align_releasecell(self): + if self.config.ui.gtk.episode_list.right_align_released_column: + self.releasecell.set_property('xalign', 1) + self.releasecell.set_property('alignment', Pango.Alignment.RIGHT) + else: + self.releasecell.set_property('xalign', 0) + self.releasecell.set_property('alignment', Pango.Alignment.LEFT) + def init_episode_list_treeview(self): self.episode_list_model.set_view_mode(self.config.ui.gtk.episode_list.view_mode) @@ -930,10 +946,11 @@ class gPodder(BuilderWidget, dbus.service.Object): timecolumn = Gtk.TreeViewColumn(_('Duration'), timecell, text=EpisodeListModel.C_TIME) timecolumn.set_sort_column_id(EpisodeListModel.C_TOTAL_TIME) - releasecell = Gtk.CellRendererText() + self.releasecell = Gtk.CellRendererText() + self.align_releasecell() releasecolumn = Gtk.TreeViewColumn(_('Released')) - releasecolumn.pack_start(releasecell, True) - releasecolumn.add_attribute(releasecell, 'markup', EpisodeListModel.C_PUBLISHED_TEXT) + releasecolumn.pack_start(self.releasecell, True) + releasecolumn.add_attribute(self.releasecell, 'markup', EpisodeListModel.C_PUBLISHED_TEXT) releasecolumn.set_sort_column_id(EpisodeListModel.C_PUBLISHED) sizetimecell = Gtk.CellRendererText() @@ -3520,6 +3537,13 @@ class gPodder(BuilderWidget, dbus.service.Object): self.config.ui.gtk.episode_list.show_released_time = not state action.set_state(GLib.Variant.new_boolean(not state)) + def on_item_view_right_align_episode_released_column_toggled(self, action, param): + state = action.get_state() + self.config.ui.gtk.episode_list.right_align_released_column = not state + action.set_state(GLib.Variant.new_boolean(not state)) + self.align_releasecell() + self.treeAvailable.queue_draw() + def on_item_view_ctrl_click_to_sort_episodes_toggled(self, action, param): state = action.get_state() self.config.ui.gtk.episode_list.ctrl_click_to_sort = not state From 5224565642c6d9ccfa059a653d63d310a2889d95 Mon Sep 17 00:00:00 2001 From: auouymous Date: Sat, 29 Apr 2023 22:11:27 -0600 Subject: [PATCH 3/3] Always show released time in shownotes. --- src/gpodder/gtkui/shownotes.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gpodder/gtkui/shownotes.py b/src/gpodder/gtkui/shownotes.py index a906e835..94dba29f 100644 --- a/src/gpodder/gtkui/shownotes.py +++ b/src/gpodder/gtkui/shownotes.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # +import datetime import html import logging from urllib.parse import urlparse @@ -201,7 +202,8 @@ class gPodderShownotesText(gPodderShownotes): heading = episode.title subheading = _('from %s') % (episode.channel.title) details = self.details_fmt % { - 'date': util.format_date(episode.published), + 'date': '{} {}'.format(datetime.datetime.fromtimestamp(episode.published).strftime('%H:%M'), + util.format_date(episode.published)), 'size': util.format_filesize(episode.file_size, digits=1) if episode.file_size > 0 else "-", 'duration': episode.get_play_info_string()} @@ -342,7 +344,8 @@ class gPodderShownotesHTML(gPodderShownotes): heading = '

%s

' % html.escape(episode.title) subheading = _('from %s') % html.escape(episode.channel.title) details = '%s' % html.escape(self.details_fmt % { - 'date': util.format_date(episode.published), + 'date': '{} {}'.format(datetime.datetime.fromtimestamp(episode.published).strftime('%H:%M'), + util.format_date(episode.published)), 'size': util.format_filesize(episode.file_size, digits=1) if episode.file_size > 0 else "-", 'duration': episode.get_play_info_string()})