new channel adding, bugfixes, more reliable channel editor, code cleanup for gpodderchannel

git-svn-id: svn://svn.berlios.de/gpodder/trunk@347 b0d088ad-0a06-0410-aad2-9ed5178a7e87
This commit is contained in:
Thomas Perl 2007-07-11 11:05:02 +00:00
parent 022917c6a7
commit 45a99ffb92
6 changed files with 444 additions and 409 deletions

View File

@ -1,3 +1,17 @@
Wed, 11 Jul 2007 12:59:53 +0200 <thp@perli.net>
* src/gpodder/libgpodder.py: New configuration defaults for new
installations: Use environment for proxy, download new episodes
after feed cache update, display channel navigator by default
* src/gpodder/gpodder.py: Fix some bugs with empty channel lists;
notify user of already-added channels; adapt the "add channel"
functionality for the new GUI; make editing channels work more
reliably (revert to old list if new channel URL cannot be fetched);
huge clean-up of the Gpodderchannel class
* bin/gpodder: Pushed version + release date
* data/gpodder.glade: Slipstream the gPodderChannel UI dialog and
add a channel URL adding entry + "add" button to the channel
navigator, adding channels is now done using these widgets
Sat, 07 Jul 2007 17:01:59 +0200 <thp@perli.net>
* src/gpodder/libipodsync.py: Added support for the new time_t
type of the "track_released" field from libgpod. This adds

View File

@ -32,8 +32,8 @@ or played back on the user's desktop.
# PLEASE DO NOT CHANGE FORMAT OF __version__ LINE (setup.py reads this)
__author__ = "Thomas Perl <thp@perli.net>"
__version__ = "0.9.3+svn20070707"
__date__ = "2007-07-07"
__version__ = "0.9.3+svn20070711"
__date__ = "2007-07-11"
__copyright__ = "Copyright (c) 2005-2007 %s. All rights reserved." % __author__
__licence__ = "GPL"

View File

@ -873,28 +873,92 @@
<property name="position">0</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow6">
<widget class="GtkVBox" id="vbox10">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<property name="homogeneous">False</property>
<property name="spacing">5</property>
<child>
<widget class="GtkTreeView" id="treeChannels">
<widget class="GtkScrolledWindow" id="scrolledwindow6">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">True</property>
<property name="rules_hint">False</property>
<property name="reorderable">False</property>
<property name="enable_search">True</property>
<property name="fixed_height_mode">False</property>
<property name="hover_selection">False</property>
<property name="hover_expand">False</property>
<signal name="row_activated" handler="on_treeChannels_row_activated" last_modification_time="Wed, 04 Jul 2007 13:23:55 GMT"/>
<signal name="cursor_changed" handler="on_treeChannels_cursor_changed" last_modification_time="Wed, 04 Jul 2007 13:25:12 GMT"/>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkTreeView" id="treeChannels">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">True</property>
<property name="rules_hint">False</property>
<property name="reorderable">False</property>
<property name="enable_search">True</property>
<property name="fixed_height_mode">False</property>
<property name="hover_selection">False</property>
<property name="hover_expand">False</property>
<signal name="row_activated" handler="on_treeChannels_row_activated" last_modification_time="Wed, 04 Jul 2007 13:23:55 GMT"/>
<signal name="cursor_changed" handler="on_treeChannels_cursor_changed" last_modification_time="Wed, 04 Jul 2007 13:25:12 GMT"/>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox24">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">5</property>
<child>
<widget class="GtkEntry" id="entryAddChannel">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">●</property>
<property name="activates_default">False</property>
<signal name="changed" handler="on_entryAddChannel_changed" last_modification_time="Wed, 11 Jul 2007 06:23:29 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="btnAddChannel">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="label">gtk-add</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_btnAddChannel_clicked" last_modification_time="Wed, 11 Jul 2007 06:22:07 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
@ -1151,350 +1215,147 @@
<property name="enable_popup">False</property>
<child>
<widget class="GtkVBox" id="vbox2">
<widget class="GtkTable" id="table1">
<property name="border_width">10</property>
<property name="visible">True</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="spacing">5</property>
<property name="row_spacing">10</property>
<property name="column_spacing">5</property>
<child>
<widget class="GtkTable" id="table1">
<widget class="GtkLabel" id="label11">
<property name="visible">True</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="row_spacing">10</property>
<property name="column_spacing">5</property>
<child>
<widget class="GtkLabel" id="labelDescription">
<property name="visible">True</property>
<property name="label" translatable="yes">Description:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">fill</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkTextView" id="channel_description">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="overwrite">False</property>
<property name="accepts_tab">True</property>
<property name="justification">GTK_JUSTIFY_LEFT</property>
<property name="wrap_mode">GTK_WRAP_WORD</property>
<property name="cursor_visible">True</property>
<property name="pixels_above_lines">0</property>
<property name="pixels_below_lines">0</property>
<property name="pixels_inside_wrap">0</property>
<property name="left_margin">0</property>
<property name="right_margin">0</property>
<property name="indent">0</property>
<property name="text" translatable="yes">(unknown)</property>
</widget>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">fill</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label11">
<property name="visible">True</property>
<property name="label" translatable="yes">Feed URL:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryURL">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="labelTitle">
<property name="visible">True</property>
<property name="label" translatable="yes">Title:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_RIGHT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryTitle">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<property name="label" translatable="yes">Feed URL:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkExpander" id="expander">
<widget class="GtkEntry" id="entryURL">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="expanded">False</property>
<property name="spacing">0</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="labelTitle">
<property name="visible">True</property>
<property name="label" translatable="yes">Title:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_RIGHT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entryTitle">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkTable" id="table3">
<property name="border_width">5</property>
<widget class="GtkTextView" id="channel_description">
<property name="visible">True</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="row_spacing">5</property>
<property name="column_spacing">5</property>
<child>
<widget class="GtkLabel" id="label29">
<property name="visible">True</property>
<property name="label" translatable="yes">Download to:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="LabelDownloadTo">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label">download to label</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">True</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_START</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label54">
<property name="visible">True</property>
<property name="label" translatable="yes">Website:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="LabelWebsite">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">website label</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">True</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_END</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="overwrite">False</property>
<property name="accepts_tab">True</property>
<property name="justification">GTK_JUSTIFY_LEFT</property>
<property name="wrap_mode">GTK_WRAP_WORD</property>
<property name="cursor_visible">True</property>
<property name="pixels_above_lines">0</property>
<property name="pixels_below_lines">0</property>
<property name="pixels_inside_wrap">0</property>
<property name="left_margin">0</property>
<property name="right_margin">0</property>
<property name="indent">0</property>
<property name="text" translatable="yes"></property>
</widget>
</child>
<child>
<widget class="GtkLabel" id="label52">
<property name="visible">True</property>
<property name="label" translatable="yes">Additional information</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="type">label_item</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="left_attach">0</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
</widget>
@ -1636,6 +1497,146 @@
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkHSeparator" id="hseparator12">
<property name="visible">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkTable" id="table3">
<property name="border_width">5</property>
<property name="visible">True</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="row_spacing">5</property>
<property name="column_spacing">5</property>
<child>
<widget class="GtkLabel" id="label29">
<property name="visible">True</property>
<property name="label" translatable="yes">Download to:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="LabelDownloadTo">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label">download to label</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">True</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_START</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label54">
<property name="visible">True</property>
<property name="label" translatable="yes">Website:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="LabelWebsite">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">website label</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">True</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_END</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="tab_expand">False</property>
@ -1646,7 +1647,7 @@
<child>
<widget class="GtkLabel" id="label37">
<property name="visible">True</property>
<property name="label" translatable="yes">Synchronization</property>
<property name="label" translatable="yes">Advanced</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
@ -1763,7 +1764,7 @@
<widget class="GtkButton" id="btnOK">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-ok</property>
<property name="label">gtk-close</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
@ -1779,7 +1780,6 @@
<child>
<widget class="GtkButton" id="btnCancel">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>

View File

@ -318,7 +318,8 @@ class Gpodder(SimpleGladeApp):
self.comboAvailable.set_model( channelsToModel( self.channels, download_status_manager = self.download_status_manager))
self.comboAvailable.set_active( old_active)
self.treeChannels.set_model( self.comboAvailable.get_model())
self.treeChannels.get_selection().select_path( old_active)
if old_active > -1:
self.treeChannels.get_selection().select_path( old_active)
except:
pass
@ -340,7 +341,9 @@ class Gpodder(SimpleGladeApp):
if self.treeAvailable.get_model():
self.treeAvailable.get_model().clear()
self.treeChannels.get_selection().select_path( self.comboAvailable.get_active())
index = self.comboAvailable.get_active()
if index > -1:
self.treeChannels.get_selection().select_path( index)
def show_message( self, message, title = None):
dlg = gtk.MessageDialog( self.gPodder, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK)
@ -392,6 +395,9 @@ class Gpodder(SimpleGladeApp):
title = _('Error adding channel')
message = _('The channel could not be added. Please check the spelling of the URL or try again later.')
self.show_message( message, title)
return False
return True
def add_new_channel( self, result = None):
gl = gPodderLib()
@ -399,6 +405,7 @@ class Gpodder(SimpleGladeApp):
if result:
for old_channel in self.channels:
if old_channel.url == result:
self.show_message( _('You have already subscribed to this channel: %s') % ( saxutils.escape( old_channel.title), ), _('Already added'))
log( 'Channel already exists: %s', result)
# Select the existing channel in combo box
for i in range( len( self.channels)):
@ -464,7 +471,8 @@ class Gpodder(SimpleGladeApp):
label.set_markup( '<i>%s</i>' % title)
progressbar.set_text( _('%d of %d channels updated') % ( position, count ))
progressbar.set_fraction( ((1.00*position) / (1.00*count)))
if count:
progressbar.set_fraction( ((1.00*position) / (1.00*count)))
def update_feed_cache_proc( self, reader, force_update, callback_proc, callback_error, finish_proc):
self.channels = reader.read( force_update, callback_proc = callback_proc, callback_error = callback_error)
@ -739,7 +747,10 @@ class Gpodder(SimpleGladeApp):
#-- Gpodder.on_itemAddChannel_activate {
def on_itemAddChannel_activate(self, widget, *args):
self.add_new_channel( Gpodderchannel( gpodderwindow = self.gPodder).requestURL())
if self.channelPaned.get_position() < 200:
self.channelPaned.set_position( 200)
self.entryAddChannel.set_text( _('Enter podcast URL'))
self.entryAddChannel.grab_focus()
#-- Gpodder.on_itemAddChannel_activate }
#-- Gpodder.on_itemEditChannel_activate {
@ -750,13 +761,20 @@ class Gpodder(SimpleGladeApp):
self.show_message( message, title)
return
result = Gpodderchannel( gpodderwindow = self.gPodder).requestURL( self.active_channel)
gpc = Gpodderchannel( gpodderwindow = self.gPodder)
result = gpc.edit_channel( self.active_channel)
self.updateComboBox()
active = self.comboAvailable.get_active()
if result != self.active_channel.url and result != None and result != "" and (result[:4] == "http" or result[:3] == "ftp"):
old_channels = self.channels
log( 'Changing channel #%d from "%s" to "%s"', active, self.active_channel.url, result)
self.channels = self.channels[0:active] + [ podcastChannel( url = result) ] + self.channels[active+1:]
self.refetch_channel_list()
if not self.refetch_channel_list():
# Revert to old channel list
self.show_message( _('I will now revert your channel list to its original state.'), _('Editing failed'))
self.channels = old_channels
self.refetch_channel_list()
#-- Gpodder.on_itemEditChannel_activate }
#-- Gpodder.on_itemRemoveChannel_activate {
@ -874,6 +892,19 @@ class Gpodder(SimpleGladeApp):
self.comboAvailable.set_active( pos)
#-- Gpodder.on_treeChannels_cursor_changed }
#-- Gpodder.on_entryAddChannel_changed {
def on_entryAddChannel_changed(self, widget, *args):
active = self.entryAddChannel.get_text() not in ('', _('Enter podcast URL'))
self.btnAddChannel.set_sensitive( active)
#-- Gpodder.on_entryAddChannel_changed }
#-- Gpodder.on_btnAddChannel_clicked {
def on_btnAddChannel_clicked(self, widget, *args):
url = self.entryAddChannel.get_text()
self.entryAddChannel.set_text('')
self.add_new_channel( url)
#-- Gpodder.on_btnAddChannel_clicked }
#-- Gpodder.on_comboAvailable_changed {
def on_comboAvailable_changed(self, widget, *args):
try:
@ -1073,19 +1104,17 @@ class Gpodder(SimpleGladeApp):
class Gpodderchannel(SimpleGladeApp):
event = None
channel = None
podcast = None
thread = None
def __init__(self, path="gpodder.glade",
root="gPodderChannel",
domain=app_name, **kwargs):
self.waiting = None
self.url = ""
self.result = False
self.waiting = Event()
self.channel = None
self.url = None
path = os.path.join(glade_dir, path)
SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
if 'gpodderwindow' in kwargs:
self.gPodderChannel.set_transient_for( kwargs['gpodderwindow'])
self.gPodderChannel.set_position( gtk.WIN_POS_CENTER_ON_PARENT)
@ -1096,54 +1125,39 @@ class Gpodderchannel(SimpleGladeApp):
#-- Gpodderchannel.new }
#-- Gpodderchannel custom methods {
def requestURL( self, channel = None):
if channel != None:
self.gPodderChannel.set_title( _('Channel: %s') % channel.title)
self.entryURL.set_text( channel.url)
self.entryTitle.set_text( channel.title)
self.LabelDownloadTo.set_text( channel.save_dir)
self.LabelWebsite.set_text( channel.link)
channel.set_metadata_from_localdb()
self.cbNoSync.set_active( not channel.sync_to_devices)
self.musicPlaylist.set_text( channel.device_playlist_name)
self.cbMusicChannel.set_active( channel.is_music_channel)
description = channel.description
gPodderLib().get_image_from_url( channel.image, self.imgCover.set_from_pixbuf, self.labelCoverStatus.set_text, self.labelCoverStatus.hide, channel.cover_file)
else:
# Remove all tabs except for the first one
while self.notebookChannelEditor.get_n_pages() > 1:
self.notebookChannelEditor.remove_page( -1)
for widget in ( self.labelDescription, self.scrolledwindow, self.expander, self.labelTitle, self.entryTitle ):
widget.hide_all()
self.gPodderChannel.set_title( _('Add a new channel'))
self.gPodderChannel.queue_resize()
description = _("(unknown)")
def edit_channel( self, channel):
self.channel = channel
self.gPodderChannel.set_title( channel.title)
self.entryTitle.set_text( channel.title)
self.entryURL.set_text( channel.url)
self.LabelDownloadTo.set_text( channel.save_dir)
self.LabelWebsite.set_text( channel.link)
channel.set_metadata_from_localdb()
self.cbNoSync.set_active( not channel.sync_to_devices)
self.musicPlaylist.set_text( channel.device_playlist_name)
self.cbMusicChannel.set_active( channel.is_music_channel)
gPodderLib().get_image_from_url( channel.image, self.imgCover.set_from_pixbuf, self.labelCoverStatus.set_text, self.labelCoverStatus.hide, channel.cover_file)
b = gtk.TextBuffer()
b.set_text( description)
b.set_text( channel.description)
self.channel_description.set_buffer( b)
self.waiting = Event()
while self.waiting.isSet() == False:
# Wait for the user to close the window
while not self.waiting.isSet():
self.waiting.wait( 0.01)
while gtk.events_pending():
gtk.main_iteration( False)
if self.result == True:
if channel != None:
channel.sync_to_devices = not self.cbNoSync.get_active()
channel.is_music_channel = self.cbMusicChannel.get_active()
channel.device_playlist_name = self.musicPlaylist.get_text()
channel.set_custom_title( self.entryTitle.get_text())
channel.save_metadata_to_localdb()
return self.url
else:
return None
return self.url
#-- Gpodderchannel custom methods }
#-- Gpodderchannel.on_gPodderChannel_destroy {
def on_gPodderChannel_destroy(self, widget, *args):
self.result = False
self.url = self.entryURL.get_text()
self.waiting.set()
#-- Gpodderchannel.on_gPodderChannel_destroy }
#-- Gpodderchannel.on_cbMusicChannel_toggled {
@ -1153,21 +1167,18 @@ class Gpodderchannel(SimpleGladeApp):
#-- Gpodderchannel.on_btnOK_clicked {
def on_btnOK_clicked(self, widget, *args):
self.url = self.entryURL.get_text()
self.gPodderChannel.destroy()
self.result = True
self.channel.sync_to_devices = not self.cbNoSync.get_active()
self.channel.is_music_channel = self.cbMusicChannel.get_active()
self.channel.device_playlist_name = self.musicPlaylist.get_text()
self.channel.set_custom_title( self.entryTitle.get_text())
self.channel.save_metadata_to_localdb()
if self.waiting != None:
self.waiting.set()
self.gPodderChannel.destroy()
#-- Gpodderchannel.on_btnOK_clicked }
#-- Gpodderchannel.on_btnCancel_clicked {
def on_btnCancel_clicked(self, widget, *args):
def on_btnCancel_clicked(self, widget, *args):
self.gPodderChannel.destroy()
self.result = False
if self.waiting != None:
self.waiting.set()
#-- Gpodderchannel.on_btnCancel_clicked }

View File

@ -170,6 +170,16 @@ class Gpodder(SimpleGladeApp):
print "on_treeChannels_cursor_changed called with self.%s" % widget.get_name()
#-- Gpodder.on_treeChannels_cursor_changed }
#-- Gpodder.on_entryAddChannel_changed {
def on_entryAddChannel_changed(self, widget, *args):
print "on_entryAddChannel_changed called with self.%s" % widget.get_name()
#-- Gpodder.on_entryAddChannel_changed }
#-- Gpodder.on_btnAddChannel_clicked {
def on_btnAddChannel_clicked(self, widget, *args):
print "on_btnAddChannel_clicked called with self.%s" % widget.get_name()
#-- Gpodder.on_btnAddChannel_clicked }
#-- Gpodder.on_comboAvailable_changed {
def on_comboAvailable_changed(self, widget, *args):
print "on_comboAvailable_changed called with self.%s" % widget.get_name()

View File

@ -120,12 +120,12 @@ class gPodderLibClass( object):
self.ftp_proxy = environ['ftp_proxy']
except:
self.ftp_proxy = ''
self.proxy_use_environment = False
self.proxy_use_environment = True
self.open_app = ""
self.ipod_mount = ""
self.opml_url = ""
self.update_on_startup = False
self.download_after_update = False
self.download_after_update = True
self.torrentdir = expanduser('~/gpodder-downloads/torrents')
self.use_gnome_bittorrent = True
self.limit_rate = False
@ -138,7 +138,7 @@ class gPodderLibClass( object):
self.main_window_height = 450
self.main_window_x = 0
self.main_window_y = 0
self.paned_position = 0
self.paned_position = 150
self.max_downloads = 3
self.max_downloads_enabled = False
self.default_new = 1
@ -397,7 +397,7 @@ class gPodderLibClass( object):
self.main_window_height = 450
self.main_window_x = 0
self.main_window_y = 0
self.paned_position = 0
self.paned_position = 150
self.mp3_player_folder = '/media/usbdisk'
self.opml_url = default_opml_directory
self.downloaddir = expanduser('~/gpodder-downloads')