RSS plugin by Mark Adamson with some gui tweaks from me

This commit is contained in:
Marcos Pinto 2007-07-15 18:49:45 +00:00
parent ede8627b77
commit db32e74895
5 changed files with 4198 additions and 0 deletions

24
plugins/RSS/__init__.py Normal file
View File

@ -0,0 +1,24 @@
plugin_name = "RSS Broadcatcher"
plugin_author = "Mark Adamson"
plugin_version = "1.0"
plugin_description = """
Download Torrents automatically from RSS Feeds
The latest version of my RSS autodownloader, which uses the Universal Feed parser (http://feedparser.org/). Add RSS feeds on the 'Feeds' tab, then add filters for TV shows (or whatever) on the 'Filters' tab. Double-click entries on the 'Torrents' tab to download extra torrents from the feeds. The Options are pretty self-explanatary.
Please message me (SatNav) on the forums and let me know how you get on..
Enjoy!"""
def deluge_init(deluge_path):
global path
path = deluge_path
from RSS.plugin import plugin_RSS
def enable(core, interface):
global path
return plugin_RSS(path, core, interface)

2858
plugins/RSS/feedparser.py Executable file

File diff suppressed because it is too large Load Diff

433
plugins/RSS/plugin.py Normal file
View File

@ -0,0 +1,433 @@
class plugin_RSS:
def __init__(self, path, deluge_core, deluge_interface):
#set up system thingies
import gtk, gtk.glade, os, ConfigParser, feedparser
import deluge.common, deluge.dgtk, deluge.pref
from time import asctime
self.path = path
self.core = deluge_core
self.interface = deluge_interface
#set up feeds file
self.feeds_config = ConfigParser.ConfigParser()
self.feeds_file = deluge.common.CONFIG_DIR + "/feeds.conf"
if not os.path.isfile(self.feeds_file):
f = open(self.feeds_file, mode='w')
f.flush()
f.close()
self.feeds_config.read(self.feeds_file)
#set up filters file
self.filters_config = ConfigParser.ConfigParser()
self.filters_file = deluge.common.CONFIG_DIR + "/filters.conf"
if not os.path.isfile(self.filters_file):
f = open(self.filters_file, mode='w')
f.flush()
f.close()
self.filters_config.read(self.filters_file)
#set up the preferences dialog
glade = gtk.glade.XML(path + "/rss.glade")
self.dlg = glade.get_widget("dialog")
self.dlg.set_icon_from_file(self.path + "/rss.png")
#set up the feeds list viewer
self.feeds_view = glade.get_widget("feeds_view")
model = gtk.ListStore(str, str, str)
self.feeds_view.set_model(model)
deluge.dgtk.add_text_column(self.feeds_view, "Name", 0)
deluge.dgtk.add_text_column(self.feeds_view, "URL", 1)
deluge.dgtk.add_text_column(self.feeds_view, "Last Entry Date", 2)
#set up the torrents list viewer
self.torrents_view = glade.get_widget("torrents_view")
model = gtk.ListStore(str, str, str, str)
self.torrents_view.set_model(model)
deluge.dgtk.add_text_column(self.torrents_view, "Feed", 0)
deluge.dgtk.add_text_column(self.torrents_view, "Name", 1)
deluge.dgtk.add_text_column(self.torrents_view, "URL", 2)
deluge.dgtk.add_text_column(self.torrents_view, "Date", 3)
# Setup the filters list viewer
self.filters_view = glade.get_widget("filters_view")
model = gtk.ListStore(str)
self.filters_view.set_model(model)
deluge.dgtk.add_text_column(self.filters_view, "Name", 0)
# set up the feed choice combobox
self.feedchoice_combo = glade.get_widget("feedchoice_combo")
model = gtk.ListStore(str)
self.feedchoice_combo.set_model(model)
cell = gtk.CellRendererText()
self.feedchoice_combo.pack_start(cell, True)
self.feedchoice_combo.add_attribute(cell, 'text', 0)
# set up the torrents feed choice combobox
self.torrents_fcc = glade.get_widget("torrents_fcc")
model = gtk.ListStore(str)
self.torrents_fcc.set_model(model)
cell = gtk.CellRendererText()
self.torrents_fcc.pack_start(cell, True)
self.torrents_fcc.add_attribute(cell, 'text', 0)
#set up the rest of the GUI elements
self.name_entry = glade.get_widget("name_entry")
self.url_entry = glade.get_widget("url_entry")
self.button_addfeed = glade.get_widget("button_addfeed")
self.button_delfeed = glade.get_widget("button_delfeed")
self.chkfeeds = glade.get_widget("chkfeeds")
self.filtername_entry = glade.get_widget("filtername_entry")
self.filterexp_entry = glade.get_widget("filterexp_entry")
self.checkonstart_button = glade.get_widget("checkonstart_button")
self.update_entry = glade.get_widget("update_entry")
#Connect event signals
self.filters_view.connect("cursor-changed", self.filter_row_clicked)
dic = { "addfeed_clicked" : self.addfeed_clicked,
"delfeed_clicked" : self.delfeed_clicked,
"addfilter_clicked" : self.addfilter_clicked,
"delfilter_clicked" : self.delfilter_clicked,
"row_clicked" : self.row_clicked,
"feedtext_changed" : self.feedtext_changed,
"filtername_lostfocus" : self.filtername_lostfocus,
"filterexp_lostfocus" : self.filterexp_lostfocus,
"feedchoice_combo_changed" : self.feedchoice_combo_changed,
"torrents_fcc_changed" : self.torrents_fcc_changed,
"torrents_view_row_activated" : self.torrents_view_row_activated,
"chkfeeds_clicked" : self.chkfeeds_clicked }
glade.signal_autoconnect(dic)
self.feeds_view.get_selection().set_select_function(self.row_clicked)
self.timer = 0
self.torrents_list = []
#self.checkfeeds()
# Access the interface's toolbar
self.toolbar = self.interface.toolbar
# Make a toolbar button
icon = gtk.Image()
icon.set_from_file(self.path + "/rss.png") # Toolbar items should be 22x22 pixel images
self.button = gtk.ToolButton(icon_widget=icon, label="RSS")
self.button.connect("clicked", self.rss_clicked) # Connect the signal handler for the button
self.toolbar.add(self.button) # Add button to toolbar
self.button.show_all() # Show the button
self.checkonstart = False
#load options
if self.feeds_config.has_option("DEFAULT", "interval"):
self.interval = self.feeds_config.getint("DEFAULT", "interval")
self.update_entry.set_text(self.feeds_config.get("DEFAULT", "interval"))
else:
self.interval = 900
self.feeds_config.set("DEFAULT", "interval", 900)
if self.feeds_config.has_option("DEFAULT", "checkonstart"):
self.checkonstart = self.feeds_config.getboolean("DEFAULT", "checkonstart")
self.checkonstart_button.set_active(self.checkonstart)
else:
self.checkonstart = False
self.feeds_config.set("DEFAULT", "checkonstart", False)
if self.checkonstart_button.get_active():
self.timer = self.interval - 5
def rss_clicked(self, button):
self.configure(self)
def unload(self):
self.toolbar.remove(self.button) # Remove the button from the toolbar
f = open(self.feeds_file, "w")
self.feeds_config.write(f)
f.close()
def feedtext_changed(self, args):
a = (self.name_entry.get_text() != "")
b = (self.url_entry.get_text() != "")
if(a and b):
self.button_addfeed.set_sensitive(1)
else:
self.button_addfeed.set_sensitive(0)
def addfeed_clicked(self, args):
self.feeds_view.get_model().append([self.name_entry.get_text(),
self.url_entry.get_text(), ""])
self.feedchoice_combo.append_text(self.name_entry.get_text())
self.torrents_fcc.append_text(self.name_entry.get_text())
self.feeds_config.add_section(self.name_entry.get_text())
self.feeds_config.set(self.name_entry.get_text(), "url", self.url_entry.get_text())
self.feeds_config.set(self.name_entry.get_text(), "lastchecked", "")
self.name_entry.set_text("")
self.url_entry.set_text("")
def delfeed_clicked(self, args):
(model, selection) = self.feeds_view.get_selection().get_selected()
text = self.feeds_view.get_model().get_value(selection, 0)
model2 = self.feedchoice_combo.get_model()
model3 = self.torrents_fcc.get_model()
the_iter = model2.get_iter_first()
print text
while the_iter is not None:
print model2.get_value(the_iter, 0)
if (model2.get_value(the_iter, 0) == text):
remove_iter = the_iter
the_iter = model2.iter_next(the_iter)
model2.remove(remove_iter)
the_iter = model3.get_iter_first()
while the_iter is not None:
print model3.get_value(the_iter, 0)
if (model3.get_value(the_iter, 0) == text):
remove_iter = the_iter
the_iter = model3.iter_next(the_iter)
model3.remove(remove_iter)
model.remove(selection)
for filt in self.filters_config.sections():
if self.filters_config.get(filt, "feed") == text:
self.filters_config.set(filt, "feed", "All")
self.feeds_config.remove_section(text)
self.button_delfeed.set_sensitive(0)
def row_clicked(self, args):
self.button_delfeed.set_sensitive(1)
return True
def addfilter_clicked(self, args):
unique = True
for filt in self.filters_config.sections():
if filt == "New Filter":
unique = False
if unique:
self.current_filter = "New Filter"
self.filters_config.add_section("New Filter")
new_iter = self.filters_view.get_model().append(["New Filter"])
self.filters_view.get_selection().select_iter(new_iter)
self.filters_config.set("New Filter", "filterexp", "")
self.filters_config.set("New Filter", "feed", "All")
self.filtername_entry.set_text("New Filter")
self.feedchoice_combo.set_active(0)
self.filtername_entry.set_sensitive(1)
self.filterexp_entry.set_sensitive(1)
self.feedchoice_combo.set_sensitive(1)
self.filterexp_entry.set_text("")
self.filtername_entry.grab_focus()
def delfilter_clicked(self, args):
model, selection = self.filters_view.get_selection().get_selected()
self.filters_config.remove_section(self.current_filter)
model.remove(selection)
self.current_filter = None
self.filtername_entry.set_text("")
self.filterexp_entry.set_text("")
self.feedchoice_combo.set_active(-1)
self.filtername_entry.set_sensitive(0)
self.filterexp_entry.set_sensitive(0)
self.feedchoice_combo.set_sensitive(0)
def filter_row_clicked(self, widget):
selection = self.filters_view.get_selection()
model, selection_iter = selection.get_selected()
print model
print selection_iter
self.current_filter = self.filters_view.get_model().get_value(selection_iter, 0)
self.filtername_entry.set_text(self.current_filter)
self.filterexp_entry.set_text(self.filters_config.get(self.current_filter, "filterexp"))
feed = self.filters_config.get(self.current_filter, "feed")
model2 = self.feedchoice_combo.get_model()
the_iter = model2.get_iter_first()
while the_iter is not None:
#print model2.get_value(the_iter, 0)
if (model2.get_value(the_iter, 0) == feed):
set_iter = the_iter
the_iter = model2.iter_next(the_iter)
self.feedchoice_combo.set_active_iter(set_iter)
self.filtername_entry.set_sensitive(1)
self.filterexp_entry.set_sensitive(1)
self.feedchoice_combo.set_sensitive(1)
def filtername_lostfocus(self, args, spare):
(model, selection) = self.filters_view.get_selection().get_selected()
old_filtername = self.filters_view.get_model().get_value(selection, 0)
self.filters_config.remove_section(old_filtername)
model.remove(selection)
self.current_filter = self.filtername_entry.get_text()
new_iter = self.filters_view.get_model().append([self.current_filter])
self.filters_view.get_selection().select_iter(new_iter)
self.filters_config.add_section(self.current_filter)
self.filters_config.set(self.current_filter, "filterexp", self.filterexp_entry.get_text())
self.filters_config.set(self.current_filter, "feed", self.feedchoice_combo.get_active_text())
def filterexp_lostfocus(self, args, spare):
self.filters_config.set(self.current_filter, "filterexp", self.filterexp_entry.get_text())
def feedchoice_combo_changed(self, args):
self.filters_config.set(self.current_filter, "feed", self.feedchoice_combo.get_active_text())
def torrents_fcc_changed(self, args):
model = self.torrents_view.get_model()
model.clear()
if self.torrents_fcc.get_active_text() == "All":
for (date, feed, title, link) in self.torrents_list:
self.torrents_view.get_model().append((feed, title, link, date))
else:
for (date, feed, title, link) in self.torrents_list:
if feed == self.torrents_fcc.get_active_text():
self.torrents_view.get_model().append((feed, title, link, date))
def torrents_view_row_activated(self, widget, spare1, spare2):
selection = widget.get_selection()
model, selection_iter = selection.get_selected()
self.interface.add_torrent_url(widget.get_model().get_value(selection_iter, 2))
def chkfeeds_clicked(self, args):
self.checkfeeds()
def checkfeeds(self):
import feedparser, datetime
from time import asctime, strptime
avail = {}
sorted = {}
self.torrents_list = []
for name in self.feeds_config.sections():
print "Attempting to parse " + name
tmp = feedparser.parse(self.feeds_config.get(name, "url"))
try:
print "Parsed " + tmp['feed']['title']
avail[name] = True
except:
print "Failed to download/parse " + name
avail[name] = False
if avail[name]:
entries = []
entries.extend( tmp[ "items" ] )
decorated = [(entry["date_parsed"], entry) for entry in entries]
tmplist = [(entry["date_parsed"], name, entry["title"], entry.enclosures[0].href) for entry in entries]
decorated.sort()
self.torrents_list.extend(tmplist)
#decorated.reverse() # for most recent entries first
sorted[name] = [entry for (date,entry) in decorated]
model = self.torrents_view.get_model()
model.clear()
self.torrents_list.sort()
self.torrents_list.reverse()
#self.torrents_view.get_model().append([entry for entry in self.torrents_list])
for (date,feed,title,link) in self.torrents_list:
self.torrents_view.get_model().append((feed, title, link, date))
#for key in sorted.keys():
# print "listing entries in " + key
#
# for entry in sorted[key]:
# print entry.title
# for enclosure in entry.enclosures:
# self.torrents_view.get_model().append( (key, entry.title, enclosure.href, entry.date_parsed) )
checked = {}
for name in self.filters_config.sections():
checkfiltername = name
checkfilterexp = self.filters_config.get(name, "filterexp")
checkfilterfeed = self.filters_config.get(name, "feed")
print "filter: " + checkfiltername
print "search: " + checkfilterexp
print "feed: " + checkfilterfeed
if checkfilterfeed == "All":
#print "made it to 'All'"
for feedname in sorted.keys():
if avail[feedname]:
print feedname + " last checked: " + self.feeds_config.get(feedname, "lastchecked")
if self.feeds_config.get(feedname, "lastchecked") != "":
lastchecked = strptime(self.feeds_config.get(feedname, "lastchecked"))
else:
lastchecked = strptime(asctime(sorted[feedname][0].date_parsed))
#print "searching feed: " + feedname
for entry in sorted[feedname]:
#print entry.title + ": " + asctime(entry.date_parsed)
if (strptime(asctime(entry.date_parsed)) > lastchecked):
#print entry.date_parsed
#print " > "
#print lastchecked
if entry.title.find(checkfilterexp) != -1:
#print "contains" + checkfilterexp
for enclosure in entry.enclosures:
print enclosure.href
self.interface.external_add_url(enclosure.href)
#self.feeds_config.set(feedname, "lastchecked", asctime(entry.date_parsed))
else:
if avail[checkfilterfeed]:
print "searching feed: " + checkfilterfeed
if self.feeds_config.get(checkfilterfeed, "lastchecked") != "":
lastchecked = strptime(self.feeds_config.get(checkfilterfeed, "lastchecked"))
else:
#print sorted[checkfilterfeed][1].date_parsed
lastchecked = strptime(asctime(sorted[checkfilterfeed][0].date_parsed))
print "lastchecked: " + asctime(lastchecked)
for entry in sorted[checkfilterfeed]:
#print entry.title + ": " + asctime(entry.date_parsed)
if (strptime(asctime(entry.date_parsed)) > lastchecked):
#print entry.date_parsed
#print " > "
#print lastchecked
if (entry.title.find(checkfilterexp) != -1):
#print "contains" + checkfilterexp
for enclosure in entry.enclosures:
print enclosure.href
self.interface.external_add_url(enclosure.href)
#self.feeds_config.set(checkfilterfeed, "lastchecked", asctime(entry.date_parsed))
for name in avail.keys():
if avail[name]:
self.feeds_config.set(name, "lastchecked", asctime(sorted[name][len(sorted[name])-1].date_parsed))
self.timer = 0
def configure(self, widget=None):
import gtk, gtk.glade
from deluge import common
self.dlg.show_all()
model = self.feeds_view.get_model()
model.clear()
model2 = self.feedchoice_combo.get_model()
model2.clear()
model3 = self.filters_view.get_model()
model3.clear()
model4 = self.torrents_fcc.get_model()
model4.clear()
self.filtername_entry.set_text("")
self.filterexp_entry.set_text("")
self.name_entry.set_text("")
self.url_entry.set_text("")
self.feedchoice_combo.append_text("All")
self.torrents_fcc.append_text("All")
self.torrents_fcc.set_active(0)
for name in self.feeds_config.sections():
self.feeds_view.get_model().append( (name, self.feeds_config.get(name, "url"), self.feeds_config.get(name, "lastchecked") ) )
self.feedchoice_combo.append_text(name)
self.torrents_fcc.append_text(name)
for filters in self.filters_config.sections():
self.filters_view.get_model().append( ([filters]) )
#self.checkfeeds()
self.button_addfeed.set_sensitive(0)
self.button_delfeed.set_sensitive(0)
self.filtername_entry.set_sensitive(0)
self.filterexp_entry.set_sensitive(0)
self.feedchoice_combo.set_sensitive(0)
self.update_entry.set_text(str(self.interval))
self.checkonstart_button.set_active(self.checkonstart)
result = self.dlg.run()
self.dlg.hide_all()
if result == 1:
self.timer = 0
self.interval = self.update_entry.get_text()
self.feeds_config.set("DEFAULT", "interval", self.update_entry.get_text())
self.feeds_config.set("DEFAULT", "checkonstart", self.checkonstart_button.get_active())
f = open(self.filters_file, "w")
self.filters_config.write(f)
f.close()
f = open(self.feeds_file, "w")
self.feeds_config.write(f)
f.close()
def update(self):
#print "tick"
self.timer += 1
if self.timer >= self.interval:
print "BONG!"
self.checkfeeds()
self.timer = 0

883
plugins/RSS/rss.glade Normal file
View File

@ -0,0 +1,883 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.2.2 on Sun Jul 15 13:48:13 2007 by markybob@peg-->
<glade-interface>
<widget class="GtkDialog" id="dialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">RSS Broadcatcher Settings</property>
<property name="default_width">512</property>
<property name="default_height">384</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<widget class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK</property>
<property name="spacing">2</property>
<child>
<widget class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkTreeView" id="feeds_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="headers_clickable">True</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkViewport" id="viewport9">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkViewport" id="viewport7">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label2">
<property name="width_request">80</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Feed Name:</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="name_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="changed" handler="feedtext_changed"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport8">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox7">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkViewport" id="viewport4">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label3">
<property name="width_request">80</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Feed URL:</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="url_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="changed" handler="feedtext_changed"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport5">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="homogeneous">True</property>
<child>
<widget class="GtkViewport" id="viewport1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button_addfeed">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">gtk-add</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="pressed" handler="addfeed_clicked"/>
<signal name="activate" handler="addfeed_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button_delfeed">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="delfeed_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="tab_expand">False</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Feeds</property>
</widget>
<packing>
<property name="type">tab</property>
<property name="tab_expand">False</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<widget class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="position">160</property>
<property name="position_set">True</property>
<child>
<widget class="GtkVPaned" id="vpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="position">200</property>
<property name="position_set">True</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkTreeView" id="filters_view">
<property name="height_request">285</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="headers_clickable">True</property>
</widget>
</child>
</widget>
<packing>
<property name="resize">True</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="resize">True</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
<widget class="GtkTable" id="table1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="n_rows">6</property>
<property name="n_columns">2</property>
<child>
<widget class="GtkButton" id="button_addfilter">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">gtk-add</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="pressed" handler="addfilter_clicked"/>
<signal name="activate" handler="addfilter_clicked"/>
</widget>
<packing>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button_delfilter">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">gtk-remove</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="delfilter_clicked"/>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Feed</property>
</widget>
<packing>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkComboBox" id="feedchoice_combo">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="changed" handler="feedchoice_combo_changed"/>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label6">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Filter Exp:</property>
</widget>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="filterexp_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="focus_out_event" handler="filterexp_lostfocus"/>
</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">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Filter Name:</property>
</widget>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="filtername_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="changed" handler="filtername_changed"/>
<signal name="focus_out_event" handler="filtername_lostfocus"/>
<signal name="editing_done" handler="filtername_editing_done"/>
</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="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport10">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
</child>
<child>
<widget class="GtkViewport" id="viewport12">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport13">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport14">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
</packing>
</child>
</widget>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
</packing>
</child>
</widget>
<packing>
<property name="position">1</property>
<property name="tab_expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Filters</property>
</widget>
<packing>
<property name="type">tab</property>
<property name="position">1</property>
<property name="tab_expand">False</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox4">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkLabel" id="label11">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes"> Feed: </property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkComboBox" id="torrents_fcc">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<signal name="changed" handler="torrents_fcc_changed"/>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkTreeView" id="torrents_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="headers_clickable">True</property>
<signal name="row_activated" handler="torrents_view_row_activated"/>
</widget>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">2</property>
<property name="tab_expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label8">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Torrents</property>
</widget>
<packing>
<property name="type">tab</property>
<property name="position">2</property>
<property name="tab_expand">False</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox5">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkViewport" id="viewport23">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
</child>
<child>
<widget class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkViewport" id="viewport15">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
</child>
<child>
<widget class="GtkLabel" id="label10">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Update Interval (seconds): </property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport19">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<widget class="GtkEntry" id="update_entry">
<property name="width_request">5</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="max_length">7</property>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport21">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox6">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkViewport" id="viewport17">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
</child>
<child>
<widget class="GtkCheckButton" id="checkonstart_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Check feeds on Deluge start</property>
<property name="response_id">0</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport18">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox8">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkViewport" id="viewport6">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
</child>
<child>
<widget class="GtkButton" id="chkfeeds">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Check Feeds Now</property>
<property name="response_id">0</property>
<signal name="clicked" handler="chkfeeds_clicked"/>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport11">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
<child>
<widget class="GtkViewport" id="viewport24">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="resize_mode">GTK_RESIZE_QUEUE</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">4</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
<property name="tab_expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Options</property>
</widget>
<packing>
<property name="type">tab</property>
<property name="position">3</property>
<property name="tab_expand">False</property>
<property name="tab_fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<widget class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="button_cancel">
<property name="visible">True</property>
<property name="label" translatable="yes">gtk-cancel</property>
<property name="use_stock">True</property>
<property name="response_id">0</property>
</widget>
</child>
<child>
<widget class="GtkButton" id="button_ok">
<property name="visible">True</property>
<property name="label" translatable="yes">gtk-ok</property>
<property name="use_stock">True</property>
<property name="response_id">1</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>

BIN
plugins/RSS/rss.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 B