[GTK3] Migrate plugins to GTK3

Add a new Gtk3PluginBase to prevent problems with Gtk2 plugins.
This commit is contained in:
Calum Lind 2018-07-16 10:27:01 +01:00 committed by Calum Lind
commit c51e01ac46
37 changed files with 209 additions and 197 deletions

View file

@ -25,12 +25,12 @@ class CorePlugin(PluginInitBase):
super(CorePlugin, self).__init__(plugin_name) super(CorePlugin, self).__init__(plugin_name)
class GtkUIPlugin(PluginInitBase): class Gtk3UIPlugin(PluginInitBase):
def __init__(self, plugin_name): def __init__(self, plugin_name):
from .gtkui import GtkUI as _pluginCls from .gtkui import GtkUI as _pluginCls
self._plugin_cls = _pluginCls self._plugin_cls = _pluginCls
super(GtkUIPlugin, self).__init__(plugin_name) super(Gtk3UIPlugin, self).__init__(plugin_name)
class WebUIPlugin(PluginInitBase): class WebUIPlugin(PluginInitBase):

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkAdjustment" id="adjustment1"> <object class="GtkAdjustment" id="adjustment1">
<property name="lower">-1</property> <property name="lower">-1</property>

View file

@ -1,9 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="prefs_window"> <object class="GtkWindow" id="prefs_window">
<property name="can_focus">False</property> <property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child> <child>
<object class="GtkHBox" id="hbox9"> <object class="GtkHBox" id="hbox9">
<property name="visible">True</property> <property name="visible">True</property>

View file

@ -17,14 +17,21 @@ from __future__ import unicode_literals
import logging import logging
import os import os
import gtk import gi # isort:skip (Required before Gtk import).
gi.require_version('Gtk', '3.0') # NOQA: E402
# isort:imports-thirdparty
from gi.repository import Gtk
# isort:imports-firstparty
import deluge.common import deluge.common
import deluge.component as component import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
from deluge.ui.gtkui import dialogs from deluge.ui.gtk3 import dialogs
# isort:imports-localfolder
from .common import get_resource from .common import get_resource
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -47,14 +54,15 @@ class OptionsDialog(object):
] ]
def __init__(self): def __init__(self):
self.accounts = gtk.ListStore(str) log.critical('I')
self.labels = gtk.ListStore(str) self.accounts = Gtk.ListStore(str)
self.labels = Gtk.ListStore(str)
self.core_config = {} self.core_config = {}
def show(self, options=None, watchdir_id=None): def show(self, options=None, watchdir_id=None):
if options is None: if options is None:
options = {} options = {}
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('autoadd_options.ui')) self.builder.add_from_file(get_resource('autoadd_options.ui'))
self.builder.connect_signals( self.builder.connect_signals(
{ {
@ -103,7 +111,7 @@ class OptionsDialog(object):
self.accounts.clear() self.accounts.clear()
self.labels.clear() self.labels.clear()
combobox = self.builder.get_object('OwnerCombobox') combobox = self.builder.get_object('OwnerCombobox')
combobox_render = gtk.CellRendererText() combobox_render = Gtk.CellRendererText()
combobox.pack_start(combobox_render, True) combobox.pack_start(combobox_render, True)
combobox.add_attribute(combobox_render, 'text', 0) combobox.add_attribute(combobox_render, 'text', 0)
combobox.set_model(self.accounts) combobox.set_model(self.accounts)
@ -413,10 +421,11 @@ class OptionsDialog(object):
return options return options
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
log.critical('A')
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('config.ui')) self.builder.add_from_file(get_resource('config.ui'))
self.builder.connect_signals(self) self.builder.connect_signals(self)
self.opts_dialog = OptionsDialog() self.opts_dialog = OptionsDialog()
@ -434,15 +443,15 @@ class GtkUI(GtkPluginBase):
self.watchdirs = {} self.watchdirs = {}
vbox = self.builder.get_object('watchdirs_vbox') vbox = self.builder.get_object('watchdirs_vbox')
sw = gtk.ScrolledWindow() sw = Gtk.ScrolledWindow()
sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
vbox.pack_start(sw, True, True, 0) vbox.pack_start(sw, True, True, 0)
self.store = self.create_model() self.store = self.create_model()
self.treeView = gtk.TreeView(self.store) self.treeView = Gtk.TreeView(self.store)
self.treeView.connect('cursor-changed', self.on_listitem_activated) self.treeView.connect('cursor-changed', self.on_listitem_activated)
self.treeView.connect('row-activated', self.on_edit_button_clicked) self.treeView.connect('row-activated', self.on_edit_button_clicked)
self.treeView.set_rules_hint(True) self.treeView.set_rules_hint(True)
@ -464,7 +473,7 @@ class GtkUI(GtkPluginBase):
) )
def create_model(self): def create_model(self):
store = gtk.ListStore(str, bool, str, str) store = Gtk.ListStore(str, bool, str, str)
for watchdir_id, watchdir in self.watchdirs.items(): for watchdir_id, watchdir in self.watchdirs.items():
store.append( store.append(
[ [
@ -477,29 +486,29 @@ class GtkUI(GtkPluginBase):
return store return store
def create_columns(self, treeview): def create_columns(self, treeview):
renderer_toggle = gtk.CellRendererToggle() renderer_toggle = Gtk.CellRendererToggle()
column = gtk.TreeViewColumn( column = Gtk.TreeViewColumn(
_('Active'), renderer_toggle, activatable=1, active=1 _('Active'), renderer_toggle, activatable=1, active=1
) )
column.set_sort_column_id(1) column.set_sort_column_id(1)
treeview.append_column(column) treeview.append_column(column)
tt = gtk.Tooltip() tt = Gtk.Tooltip()
tt.set_text(_('Double-click to toggle')) tt.set_text(_('Double-click to toggle'))
treeview.set_tooltip_cell(tt, None, None, renderer_toggle) treeview.set_tooltip_cell(tt, None, None, renderer_toggle)
renderertext = gtk.CellRendererText() renderertext = Gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Owner'), renderertext, text=2) column = Gtk.TreeViewColumn(_('Owner'), renderertext, text=2)
column.set_sort_column_id(2) column.set_sort_column_id(2)
treeview.append_column(column) treeview.append_column(column)
tt2 = gtk.Tooltip() tt2 = Gtk.Tooltip()
tt2.set_text(_('Double-click to edit')) tt2.set_text(_('Double-click to edit'))
treeview.set_has_tooltip(True) treeview.set_has_tooltip(True)
renderertext = gtk.CellRendererText() renderertext = Gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Path'), renderertext, text=3) column = Gtk.TreeViewColumn(_('Path'), renderertext, text=3)
column.set_sort_column_id(3) column.set_sort_column_id(3)
treeview.append_column(column) treeview.append_column(column)
tt2 = gtk.Tooltip() tt2 = Gtk.Tooltip()
tt2.set_text(_('Double-click to edit')) tt2.set_text(_('Double-click to edit'))
treeview.set_has_tooltip(True) treeview.set_has_tooltip(True)

View file

@ -18,7 +18,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'AutoAdd' __plugin_name__ = 'AutoAdd'
__author__ = 'Chase Sterling, Pedro Algarvio' __author__ = 'Chase Sterling, Pedro Algarvio'
__author_email__ = 'chase.sterling@gmail.com, pedro@algarvio.me' __author_email__ = 'chase.sterling@gmail.com, pedro@algarvio.me'
__version__ = '1.7' __version__ = '1.8'
__url__ = 'http://dev.deluge-torrent.org/wiki/Plugins/AutoAdd' __url__ = 'http://dev.deluge-torrent.org/wiki/Plugins/AutoAdd'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Monitors folders for .torrent files.' __description__ = 'Monitors folders for .torrent files.'
@ -42,8 +42,8 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:Gtk3UIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin
""" """

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkAdjustment" id="adjustment1"> <object class="GtkAdjustment" id="adjustment1">
<property name="lower">1</property> <property name="lower">1</property>

View file

@ -12,19 +12,26 @@ from __future__ import unicode_literals
import logging import logging
from datetime import datetime from datetime import datetime
import gtk import gi # isort:skip (Required before Gtk import).
gi.require_version('Gtk', '3.0') # NOQA: E402
# isort:imports-thirdparty
from gi.repository import Gtk
# isort:imports-firstparty
import deluge.common import deluge.common
import deluge.component as component import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
# isort:imports-localfolder
from . import common from . import common
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
log.debug('Blocklist GtkUI enable..') log.debug('Blocklist GtkUI enable..')
self.plugin = component.get('PluginManager') self.plugin = component.get('PluginManager')
@ -151,7 +158,7 @@ class GtkUI(GtkPluginBase):
def load_preferences_page(self): def load_preferences_page(self):
"""Initializes the preferences page and adds it to the preferences dialog""" """Initializes the preferences page and adds it to the preferences dialog"""
# Load the preferences page # Load the preferences page
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(common.get_resource('blocklist_pref.ui')) self.builder.add_from_file(common.get_resource('blocklist_pref.ui'))
self.whitelist_frame = self.builder.get_object('whitelist_frame') self.whitelist_frame = self.builder.get_object('whitelist_frame')
@ -203,12 +210,12 @@ class GtkUI(GtkPluginBase):
treeview_selection.connect( treeview_selection.connect(
'changed', self.on_whitelist_treeview_selection_changed 'changed', self.on_whitelist_treeview_selection_changed
) )
self.whitelist_model = gtk.ListStore(str, bool) self.whitelist_model = Gtk.ListStore(str, bool)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.connect('edited', self.on_cell_edited, self.whitelist_model) renderer.connect('edited', self.on_cell_edited, self.whitelist_model)
renderer.set_data('ip', 0) renderer.set_data('ip', 0)
column = gtk.TreeViewColumn('IPs', renderer, text=0, editable=1) column = Gtk.TreeViewColumn('IPs', renderer, text=0, editable=1)
column.set_expand(True) column.set_expand(True)
self.whitelist_treeview.append_column(column) self.whitelist_treeview.append_column(column)
self.whitelist_treeview.set_model(self.whitelist_model) self.whitelist_treeview.set_model(self.whitelist_model)

View file

@ -12,7 +12,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Blocklist' __plugin_name__ = 'Blocklist'
__author__ = 'John Garland' __author__ = 'John Garland'
__author_email__ = 'johnnybg+deluge@gmail.com' __author_email__ = 'johnnybg+deluge@gmail.com'
__version__ = '1.3' __version__ = '1.4'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Download and import IP blocklists' __description__ = 'Download and import IP blocklists'
@ -35,7 +35,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy project-wide --> <!-- interface-naming-policy project-wide -->
<object class="GtkListStore" id="liststore1"> <object class="GtkListStore" id="liststore1">
<columns> <columns>

View file

@ -11,16 +11,21 @@ from __future__ import unicode_literals
import logging import logging
import gtk import gi # isort:skip (Required before Gtk import).
gi.require_version('Gtk', '3.0') # NOQA: E402
# isort:imports-thirdparty
from gi.repository import Gtk
# isort:imports-firstparty
import deluge.component as component import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
# isort:imports-localfolder
from . import common from . import common
# Relative import
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
EXECUTE_ID = 0 EXECUTE_ID = 0
@ -42,13 +47,13 @@ class ExecutePreferences(object):
def load(self): def load(self):
log.debug('Adding Execute Preferences page') log.debug('Adding Execute Preferences page')
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(common.get_resource('execute_prefs.ui')) self.builder.add_from_file(common.get_resource('execute_prefs.ui'))
self.builder.connect_signals(self) self.builder.connect_signals(self)
events = self.builder.get_object('event_combobox') events = self.builder.get_object('event_combobox')
store = gtk.ListStore(str, str) store = Gtk.ListStore(str, str)
for event in EVENTS: for event in EVENTS:
event_label = EVENT_MAP[event] event_label = EVENT_MAP[event]
store.append((event_label, event)) store.append((event_label, event))
@ -78,17 +83,17 @@ class ExecutePreferences(object):
def add_command(self, command_id, event, command): def add_command(self, command_id, event, command):
log.debug('Adding command `%s`', command_id) log.debug('Adding command `%s`', command_id)
vbox = self.builder.get_object('commands_vbox') vbox = self.builder.get_object('commands_vbox')
hbox = gtk.HBox(False, 5) hbox = Gtk.HBox(False, 5)
hbox.set_name(command_id + '_' + event) hbox.set_name(command_id + '_' + event)
label = gtk.Label(EVENT_MAP[event]) label = Gtk.Label(EVENT_MAP[event])
entry = gtk.Entry() entry = Gtk.Entry()
entry.set_text(command) entry.set_text(command)
button = gtk.Button() button = Gtk.Button()
button.set_name('remove_%s' % command_id) button.set_name('remove_%s' % command_id)
button.connect('clicked', self.on_remove_button_clicked) button.connect('clicked', self.on_remove_button_clicked)
img = gtk.Image() img = Gtk.Image()
img.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_BUTTON) img.set_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.BUTTON)
button.set_image(img) button.set_image(img)
hbox.pack_start(label, False, False) hbox.pack_start(label, False, False)
@ -137,7 +142,7 @@ class ExecutePreferences(object):
for child in children: for child in children:
command_id, event = child.get_name().split('_') command_id, event = child.get_name().split('_')
for widget in child.get_children(): for widget in child.get_children():
if isinstance(widget, gtk.Entry): if isinstance(widget, Gtk.Entry):
command = widget.get_text() command = widget.get_text()
client.execute.save_command(command_id, event, command) client.execute.save_command(command_id, event, command)
@ -150,7 +155,7 @@ class ExecutePreferences(object):
self.remove_command(command_id) self.remove_command(command_id)
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
self.plugin = component.get('PluginManager') self.plugin = component.get('PluginManager')
self.preferences = ExecutePreferences(self.plugin) self.preferences = ExecutePreferences(self.plugin)

View file

@ -12,7 +12,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Execute' __plugin_name__ = 'Execute'
__author__ = 'Damien Churchill' __author__ = 'Damien Churchill'
__author_email__ = 'damoxc@gmail.com' __author_email__ = 'damoxc@gmail.com'
__version__ = '1.2' __version__ = '1.3'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Plugin to execute a command upon an event' __description__ = 'Plugin to execute a command upon an event'
@ -34,7 +34,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="window1"> <object class="GtkWindow" id="window1">
<property name="can_focus">False</property> <property name="can_focus">False</property>

View file

@ -15,20 +15,27 @@ from __future__ import unicode_literals
import logging import logging
import gtk import gi # isort:skip (Required before Gtk import).
gi.require_version('Gtk', '3.0') # NOQA: E402
# isort:imports-thirdparty
from gi.repository import Gtk
# isort:imports-firstparty
import deluge.component as component import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
# isort:imports-localfolder
from .common import get_resource from .common import get_resource
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('extractor_prefs.ui')) self.builder.add_from_file(get_resource('extractor_prefs.ui'))
component.get('Preferences').add_page( component.get('Preferences').add_page(

View file

@ -16,7 +16,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Extractor' __plugin_name__ = 'Extractor'
__author__ = 'Andrew Resch' __author__ = 'Andrew Resch'
__author_email__ = 'andrewresch@gmail.com' __author_email__ = 'andrewresch@gmail.com'
__version__ = '0.6' __version__ = '0.7'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Extract files upon torrent completion' __description__ = 'Extract files upon torrent completion'
@ -47,7 +47,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkDialog" id="dlg_label_add"> <object class="GtkDialog" id="dlg_label_add">
<property name="can_focus">False</property> <property name="can_focus">False</property>
@ -25,7 +25,6 @@
<child> <child>
<object class="GtkButton" id="button2"> <object class="GtkButton" id="button2">
<property name="label">gtk-cancel</property> <property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -41,7 +40,6 @@
<child> <child>
<object class="GtkButton" id="button1"> <object class="GtkButton" id="button1">
<property name="label">gtk-ok</property> <property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="can_default">True</property> <property name="can_default">True</property>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkAdjustment" id="adjustment1"> <object class="GtkAdjustment" id="adjustment1">
<property name="lower">-1</property> <property name="lower">-1</property>
@ -59,7 +59,6 @@
<child> <child>
<object class="GtkButton" id="button4"> <object class="GtkButton" id="button4">
<property name="label">gtk-cancel</property> <property name="label">gtk-cancel</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -75,7 +74,6 @@
<child> <child>
<object class="GtkButton" id="button3"> <object class="GtkButton" id="button3">
<property name="label">gtk-ok</property> <property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -379,7 +377,6 @@
<child type="label"> <child type="label">
<object class="GtkCheckButton" id="apply_max"> <object class="GtkCheckButton" id="apply_max">
<property name="label" translatable="yes">Apply per torrent max settings:</property> <property name="label" translatable="yes">Apply per torrent max settings:</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -432,7 +429,6 @@
<child> <child>
<object class="GtkCheckButton" id="is_auto_managed"> <object class="GtkCheckButton" id="is_auto_managed">
<property name="label" translatable="yes">Auto Managed</property> <property name="label" translatable="yes">Auto Managed</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -446,7 +442,6 @@
<child> <child>
<object class="GtkCheckButton" id="stop_at_ratio"> <object class="GtkCheckButton" id="stop_at_ratio">
<property name="label" translatable="yes">Stop seed at ratio:</property> <property name="label" translatable="yes">Stop seed at ratio:</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -462,7 +457,6 @@
<child> <child>
<object class="GtkCheckButton" id="remove_at_ratio"> <object class="GtkCheckButton" id="remove_at_ratio">
<property name="label" translatable="yes">Remove at ratio</property> <property name="label" translatable="yes">Remove at ratio</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -529,7 +523,6 @@
<child type="label"> <child type="label">
<object class="GtkCheckButton" id="apply_queue"> <object class="GtkCheckButton" id="apply_queue">
<property name="label" translatable="yes">Apply Queue settings:</property> <property name="label" translatable="yes">Apply Queue settings:</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -573,7 +566,6 @@
<child> <child>
<object class="GtkCheckButton" id="move_completed"> <object class="GtkCheckButton" id="move_completed">
<property name="label" translatable="yes">Move completed to:</property> <property name="label" translatable="yes">Move completed to:</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -631,7 +623,6 @@
<child type="label"> <child type="label">
<object class="GtkCheckButton" id="apply_move_completed"> <object class="GtkCheckButton" id="apply_move_completed">
<property name="label" translatable="yes">Apply folder settings:</property> <property name="label" translatable="yes">Apply folder settings:</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>
@ -711,7 +702,6 @@
<child type="label"> <child type="label">
<object class="GtkCheckButton" id="auto_add"> <object class="GtkCheckButton" id="auto_add">
<property name="label" translatable="yes">Automatically apply label:</property> <property name="label" translatable="yes">Automatically apply label:</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">False</property> <property name="receives_default">False</property>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="window1"> <object class="GtkWindow" id="window1">
<property name="can_focus">False</property> <property name="can_focus">False</property>

View file

@ -12,7 +12,7 @@ from __future__ import unicode_literals
import logging import logging
from deluge import component # for systray from deluge import component # for systray
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from . import label_config, sidebar_menu, submenu from . import label_config, sidebar_menu, submenu
@ -25,7 +25,7 @@ def cell_data_label(column, cell, model, row, data):
cell.set_property('text', str(model.get_value(row, data))) cell.set_property('text', str(model.get_value(row, data)))
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def start(self): def start(self):
if self.label_menu: if self.label_menu:
self.label_menu.on_show() self.label_menu.on_show()

View file

@ -11,7 +11,7 @@ from __future__ import unicode_literals
import logging import logging
from gtk import Builder from gi.repository.Gtk import Builder
from deluge.ui.client import client from deluge.ui.client import client

View file

@ -12,11 +12,18 @@ from __future__ import unicode_literals
import logging import logging
import gtk import gi # isort:skip (Required before Gtk import).
gi.require_version('Gtk', '3.0') # NOQA: E402
# isort:imports-thirdparty
from gi.repository import Gtk
# isort:imports-firstparty
import deluge.component as component import deluge.component as component
from deluge.ui.client import client from deluge.ui.client import client
# isort:imports-localfolder
from ..common import get_resource from ..common import get_resource
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -33,12 +40,12 @@ class LabelSidebarMenu(object):
self.items = [] self.items = []
# add items, in reverse order, because they are prepended. # add items, in reverse order, because they are prepended.
sep = gtk.SeparatorMenuItem() sep = Gtk.SeparatorMenuItem()
self.items.append(sep) self.items.append(sep)
self.menu.prepend(sep) self.menu.prepend(sep)
self._add_item('options', _('Label _Options'), gtk.STOCK_PREFERENCES) self._add_item('options', _('Label _Options'), Gtk.STOCK_PREFERENCES)
self._add_item('remove', _('_Remove Label'), gtk.STOCK_REMOVE) self._add_item('remove', _('_Remove Label'), Gtk.STOCK_REMOVE)
self._add_item('add', _('_Add Label'), gtk.STOCK_ADD) self._add_item('add', _('_Add Label'), Gtk.STOCK_ADD)
self.menu.show_all() self.menu.show_all()
# dialogs: # dialogs:
@ -52,7 +59,7 @@ class LabelSidebarMenu(object):
id is automatically-added as self.item_<id> id is automatically-added as self.item_<id>
""" """
func = getattr(self, 'on_%s' % item_id) func = getattr(self, 'on_%s' % item_id)
item = gtk.ImageMenuItem(stock) item = Gtk.ImageMenuItem(stock)
item.get_children()[0].set_label(label) item.get_children()[0].set_label(label)
item.connect('activate', func) item.connect('activate', func)
self.menu.prepend(item) self.menu.prepend(item)
@ -106,7 +113,7 @@ class AddDialog(object):
pass pass
def show(self): def show(self):
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('label_add.ui')) self.builder.add_from_file(get_resource('label_add.ui'))
self.dialog = self.builder.get_object('dlg_label_add') self.dialog = self.builder.get_object('dlg_label_add')
self.dialog.set_transient_for(component.get('MainWindow').window) self.dialog.set_transient_for(component.get('MainWindow').window)
@ -161,7 +168,7 @@ class OptionsDialog(object):
def show(self, label): def show(self, label):
self.label = label self.label = label
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('label_options.ui')) self.builder.add_from_file(get_resource('label_options.ui'))
self.dialog = self.builder.get_object('dlg_label_options') self.dialog = self.builder.get_object('dlg_label_options')
self.dialog.set_transient_for(component.get('MainWindow').window) self.dialog.set_transient_for(component.get('MainWindow').window)

View file

@ -12,7 +12,7 @@ from __future__ import unicode_literals
import logging import logging
import gtk from gi.repository.Gtk import Menu, MenuItem
from deluge import component # for systray from deluge import component # for systray
from deluge.ui.client import client from deluge.ui.client import client
@ -29,11 +29,11 @@ NO_LABEL = _('No Label')
del _ del _
class LabelMenu(gtk.MenuItem): class LabelMenu(MenuItem):
def __init__(self): def __init__(self):
gtk.MenuItem.__init__(self, _('Label')) MenuItem.__init__(self, _('Label'))
self.sub_menu = gtk.Menu() self.sub_menu = Menu()
self.set_submenu(self.sub_menu) self.set_submenu(self.sub_menu)
self.items = [] self.items = []
@ -52,9 +52,9 @@ class LabelMenu(gtk.MenuItem):
self.sub_menu.remove(child) self.sub_menu.remove(child)
for label in [NO_LABEL] + list(labels): for label in [NO_LABEL] + list(labels):
if label == NO_LABEL: if label == NO_LABEL:
item = gtk.MenuItem(_(NO_LABEL)) item = MenuItem(_(NO_LABEL))
else: else:
item = gtk.MenuItem(label.replace('_', '__')) item = MenuItem(label.replace('_', '__'))
item.connect('activate', self.on_select_label, label) item.connect('activate', self.on_select_label, label)
self.sub_menu.append(item) self.sub_menu.append(item)
self.show_all() self.show_all()

View file

@ -12,7 +12,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Label' __plugin_name__ = 'Label'
__author__ = 'Martijn Voncken' __author__ = 'Martijn Voncken'
__author_email__ = 'mvoncken@gmail.com' __author_email__ = 'mvoncken@gmail.com'
__version__ = '0.2' __version__ = '0.3'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Allows labels to be assigned to torrents' __description__ = 'Allows labels to be assigned to torrents'
@ -38,7 +38,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -23,7 +23,7 @@ from twisted.internet import defer
import deluge.common import deluge.common
import deluge.component as component import deluge.component as component
import deluge.configmanager import deluge.configmanager
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
from .common import CustomNotifications, get_resource from .common import CustomNotifications, get_resource
@ -245,9 +245,9 @@ class GtkUiNotifications(CustomNotifications):
return title, message return title, message
class GtkUI(GtkPluginBase, GtkUiNotifications): class GtkUI(Gtk3PluginBase, GtkUiNotifications):
def __init__(self, plugin_name): def __init__(self, plugin_name):
GtkPluginBase.__init__(self, plugin_name) Gtk3PluginBase.__init__(self, plugin_name)
GtkUiNotifications.__init__(self) GtkUiNotifications.__init__(self)
def enable(self): def enable(self):

View file

@ -17,7 +17,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Notifications' __plugin_name__ = 'Notifications'
__author__ = 'Pedro Algarvio' __author__ = 'Pedro Algarvio'
__author_email__ = 'pedro@algarvio.me' __author_email__ = 'pedro@algarvio.me'
__version__ = '0.2' __version__ = '0.3'
__url__ = 'http://dev.deluge-torrent.org/' __url__ = 'http://dev.deluge-torrent.org/'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Plugin which provides notifications to Deluge.' __description__ = 'Plugin which provides notifications to Deluge.'
@ -46,7 +46,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -18,7 +18,7 @@ import logging
import gtk import gtk
import deluge.component as component import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
from .common import get_resource from .common import get_resource
@ -167,7 +167,7 @@ class SchedulerSelectWidget(gtk.DrawingArea):
self.hover_point = [-1, -1] self.hover_point = [-1, -1]
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
self.create_prefs_page() self.create_prefs_page()

View file

@ -16,7 +16,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Scheduler' __plugin_name__ = 'Scheduler'
__author__ = 'Andrew Resch' __author__ = 'Andrew Resch'
__author_email__ = 'andrewresch@gmail.com' __author_email__ = 'andrewresch@gmail.com'
__version__ = '0.2' __version__ = '0.3'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Schedule limits on a per-hour per-day basis.' __description__ = 'Schedule limits on a per-hour per-day basis.'
@ -38,7 +38,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="window1"> <object class="GtkWindow" id="window1">
<property name="can_focus">False</property> <property name="can_focus">False</property>
@ -28,7 +28,6 @@
<property name="column_spacing">15</property> <property name="column_spacing">15</property>
<child> <child>
<object class="GtkColorButton" id="bandwidth_graph_download_rate_color"> <object class="GtkColorButton" id="bandwidth_graph_download_rate_color">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -68,7 +67,6 @@
</child> </child>
<child> <child>
<object class="GtkColorButton" id="bandwidth_graph_upload_rate_color"> <object class="GtkColorButton" id="bandwidth_graph_upload_rate_color">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -110,7 +108,6 @@
</child> </child>
<child> <child>
<object class="GtkColorButton" id="connections_graph_dht_nodes_color"> <object class="GtkColorButton" id="connections_graph_dht_nodes_color">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -138,7 +135,6 @@
</child> </child>
<child> <child>
<object class="GtkColorButton" id="connections_graph_dht_cache_nodes_color"> <object class="GtkColorButton" id="connections_graph_dht_cache_nodes_color">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -190,7 +186,6 @@
</child> </child>
<child> <child>
<object class="GtkColorButton" id="connections_graph_dht_torrents_color"> <object class="GtkColorButton" id="connections_graph_dht_torrents_color">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -206,7 +201,6 @@
</child> </child>
<child> <child>
<object class="GtkColorButton" id="connections_graph_num_connections_color"> <object class="GtkColorButton" id="connections_graph_num_connections_color">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -236,7 +230,6 @@
</child> </child>
<child> <child>
<object class="GtkColorButton" id="seeds_graph_num_peers_color"> <object class="GtkColorButton" id="seeds_graph_num_peers_color">
<property name="use_action_appearance">False</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>

View file

@ -20,7 +20,7 @@ import logging
import math import math
import time import time
import cairo from gi.repository import cairo
log = logging.getLogger(__name__) log = logging.getLogger(__name__)

View file

@ -16,34 +16,39 @@ from __future__ import division, unicode_literals
import logging import logging
import gtk from gi.repository import Gtk
from gi.repository.Gdk import RGBA
import deluge import deluge
from deluge import component from deluge import component
from deluge.common import fspeed from deluge.common import fspeed
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
from deluge.ui.gtkui.torrentdetails import Tab from deluge.ui.gtk3.torrentdetails import Tab
from .common import get_resource from .common import get_resource
from .graph import Graph, size_formatter_scale from .graph import Graph, size_formatter_scale
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
# Gdk.RGBA textual spec
RED = 'rgb(255,0,0)'
GREEN = 'rgb(0,128,0)'
BLUE = 'rgb(0,0,255)'
DARKRED = 'rgb(139,0,0)'
ORANGE = 'rgb(255,165,0)'
DEFAULT_CONF = { DEFAULT_CONF = {
'version': 1, 'version': 2,
'colors': { 'colors': {
'bandwidth_graph': { 'bandwidth_graph': {'upload_rate': BLUE, 'download_rate': GREEN},
'upload_rate': str(gtk.gdk.Color('blue')),
'download_rate': str(gtk.gdk.Color('green')),
},
'connections_graph': { 'connections_graph': {
'dht_nodes': str(gtk.gdk.Color('orange')), 'dht_nodes': ORANGE,
'dht_cache_nodes': str(gtk.gdk.Color('blue')), 'dht_cache_nodes': BLUE,
'dht_torrents': str(gtk.gdk.Color('green')), 'dht_torrents': GREEN,
'num_connections': str(gtk.gdk.Color('darkred')), 'num_connections': DARKRED,
}, },
'seeds_graph': {'num_peers': str(gtk.gdk.Color('blue'))}, 'seeds_graph': {'num_peers': BLUE},
}, },
} }
@ -71,20 +76,18 @@ def fspeed_shortform(value):
return fspeed(value, shortform=True) return fspeed(value, shortform=True)
def gtk_to_graph_color(color): def text_to_rgba(color):
"""Turns a gtk.gdk.Color into a tuple with range 0-1 as used by the graph""" """Turns a Color into a tuple with range 0-1 as used by the graph"""
gtk_color = gtk.gdk.Color(color) color_rgba = RGBA()
red = gtk_color.red / 65535 color_rgba.parse(color)
green = gtk_color.green / 65535 return color_rgba
blue = gtk_color.blue / 65535
return (red, green, blue)
class GraphsTab(Tab): class GraphsTab(Tab):
def __init__(self, colors): def __init__(self, colors):
super(GraphsTab, self).__init__() super(GraphsTab, self).__init__()
builder = gtk.Builder() builder = Gtk.Builder()
builder.add_from_file(get_resource('tabs.ui')) builder.add_from_file(get_resource('tabs.ui'))
self.window = builder.get_object('graph_tab') self.window = builder.get_object('graph_tab')
self.notebook = builder.get_object('graph_notebook') self.notebook = builder.get_object('graph_notebook')
@ -97,13 +100,13 @@ class GraphsTab(Tab):
self.colors = colors self.colors = colors
self.bandwidth_graph = builder.get_object('bandwidth_graph') self.bandwidth_graph = builder.get_object('bandwidth_graph')
self.bandwidth_graph.connect('expose_event', self.graph_expose) self.bandwidth_graph.connect('draw', self.on_graph_draw)
self.connections_graph = builder.get_object('connections_graph') self.connections_graph = builder.get_object('connections_graph')
self.connections_graph.connect('expose_event', self.graph_expose) self.connections_graph.connect('draw', self.on_graph_draw)
self.seeds_graph = builder.get_object('seeds_graph') self.seeds_graph = builder.get_object('seeds_graph')
self.seeds_graph.connect('expose_event', self.graph_expose) self.seeds_graph.connect('draw', self.on_graph_draw)
self.notebook.connect('switch-page', self._on_notebook_switch_page) self.notebook.connect('switch-page', self._on_notebook_switch_page)
@ -115,26 +118,20 @@ class GraphsTab(Tab):
self.intervals = None self.intervals = None
self.intervals_combo = builder.get_object('combo_intervals') self.intervals_combo = builder.get_object('combo_intervals')
cell = gtk.CellRendererText() cell = Gtk.CellRendererText()
self.intervals_combo.pack_start(cell, True) self.intervals_combo.pack_start(cell, True)
self.intervals_combo.set_cell_data_func(cell, neat_time) self.intervals_combo.set_cell_data_func(cell, neat_time)
self.intervals_combo.connect('changed', self._on_selected_interval_changed) self.intervals_combo.connect('changed', self._on_selected_interval_changed)
self.update_intervals() self.update_intervals()
def graph_expose(self, widget, event): def on_graph_draw(self, widget, context):
context = self.graph_widget.window.cairo_create()
# set a clip region
context.rectangle(
event.area.x, event.area.y, event.area.width, event.area.height
)
context.clip()
self.graph.draw_to_context( self.graph.draw_to_context(
context, context,
self.graph_widget.allocation.width, self.graph_widget.get_allocated_width(),
self.graph_widget.allocation.height, self.graph_widget.get_allocated_height(),
) )
# Do not propagate the event # Do not propagate the event
return False return True
def update(self): def update(self):
d1 = client.stats.get_stats(list(self.graph.stat_info), self.selected_interval) d1 = client.stats.get_stats(list(self.graph.stat_info), self.selected_interval)
@ -161,12 +158,12 @@ class GraphsTab(Tab):
self.graph.add_stat( self.graph.add_stat(
'download_rate', 'download_rate',
label='Download Rate', label='Download Rate',
color=gtk_to_graph_color(colors['download_rate']), color=text_to_rgba(colors['download_rate']),
) )
self.graph.add_stat( self.graph.add_stat(
'upload_rate', 'upload_rate',
label='Upload Rate', label='Upload Rate',
color=gtk_to_graph_color(colors['upload_rate']), color=text_to_rgba(colors['upload_rate']),
) )
self.graph.set_left_axis( self.graph.set_left_axis(
formatter=fspeed_shortform, min=10240, formatter_scale=size_formatter_scale formatter=fspeed_shortform, min=10240, formatter_scale=size_formatter_scale
@ -178,14 +175,10 @@ class GraphsTab(Tab):
g = Graph() g = Graph()
self.graph = g self.graph = g
colors = self.colors['connections_graph'] colors = self.colors['connections_graph']
g.add_stat('dht_nodes', color=gtk_to_graph_color(colors['dht_nodes'])) g.add_stat('dht_nodes', color=text_to_rgba(colors['dht_nodes']))
g.add_stat( g.add_stat('dht_cache_nodes', color=text_to_rgba(colors['dht_cache_nodes']))
'dht_cache_nodes', color=gtk_to_graph_color(colors['dht_cache_nodes']) g.add_stat('dht_torrents', color=text_to_rgba(colors['dht_torrents']))
) g.add_stat('num_connections', color=text_to_rgba(colors['num_connections']))
g.add_stat('dht_torrents', color=gtk_to_graph_color(colors['dht_torrents']))
g.add_stat(
'num_connections', color=gtk_to_graph_color(colors['num_connections'])
)
g.set_left_axis(formatter=int_str, min=10) g.set_left_axis(formatter=int_str, min=10)
def select_seeds_graph(self): def select_seeds_graph(self):
@ -193,7 +186,7 @@ class GraphsTab(Tab):
self.graph_widget = self.seeds_graph self.graph_widget = self.seeds_graph
self.graph = Graph() self.graph = Graph()
colors = self.colors['seeds_graph'] colors = self.colors['seeds_graph']
self.graph.add_stat('num_peers', color=gtk_to_graph_color(colors['num_peers'])) self.graph.add_stat('num_peers', color=text_to_rgba(colors['num_peers']))
self.graph.set_left_axis(formatter=int_str, min=10) self.graph.set_left_axis(formatter=int_str, min=10)
def set_colors(self, colors): def set_colors(self, colors):
@ -204,7 +197,7 @@ class GraphsTab(Tab):
) )
def _on_intervals_changed(self, intervals): def _on_intervals_changed(self, intervals):
liststore = gtk.ListStore(int) liststore = Gtk.ListStore(int)
for inter in intervals: for inter in intervals:
liststore.append([inter]) liststore.append([inter])
self.intervals_combo.set_model(liststore) self.intervals_combo.set_model(liststore)
@ -236,14 +229,14 @@ class GraphsTab(Tab):
return True return True
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
log.debug('Stats plugin enable called') log.debug('Stats plugin enable called')
self.config = deluge.configmanager.ConfigManager( self.config = deluge.configmanager.ConfigManager(
'stats.gtkui.conf', DEFAULT_CONF 'stats.gtk3ui.conf', DEFAULT_CONF
) )
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('config.ui')) self.builder.add_from_file(get_resource('config.ui'))
component.get('Preferences').add_page( component.get('Preferences').add_page(
@ -277,9 +270,9 @@ class GtkUI(GtkPluginBase):
for graph, colors in self.config['colors'].items(): for graph, colors in self.config['colors'].items():
gtkconf[graph] = {} gtkconf[graph] = {}
for value, color in colors.items(): for value, color in colors.items():
color_btn = self.builder.get_object('%s_%s_color' % (graph, value))
try: try:
color_btn = self.builder.get_object('%s_%s_color' % (graph, value)) gtkconf[graph][value] = color_btn.get_color().to_string()
gtkconf[graph][value] = str(color_btn.get_color())
except Exception: except Exception:
gtkconf[graph][value] = DEFAULT_CONF['colors'][graph][value] gtkconf[graph][value] = DEFAULT_CONF['colors'][graph][value]
self.config['colors'] = gtkconf self.config['colors'] = gtkconf
@ -293,9 +286,9 @@ class GtkUI(GtkPluginBase):
for value, color in colors.items(): for value, color in colors.items():
try: try:
color_btn = self.builder.get_object('%s_%s_color' % (graph, value)) color_btn = self.builder.get_object('%s_%s_color' % (graph, value))
color_btn.set_color(gtk.gdk.Color(color)) color_btn.set_rgba(text_to_rgba(color))
except Exception: except Exception as ex:
log.debug('Unable to set %s %s %s', graph, value, color) log.debug('Unable to set %s %s %s: %s', graph, value, color, ex)
client.stats.get_config().addCallback(self.cb_get_config) client.stats.get_config().addCallback(self.cb_get_config)
def cb_get_config(self, config): def cb_get_config(self, config):

View file

@ -17,7 +17,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Stats' __plugin_name__ = 'Stats'
__author__ = 'Ian Martin' __author__ = 'Ian Martin'
__author_email__ = 'ianmartin@cantab.net' __author_email__ = 'ianmartin@cantab.net'
__version__ = '0.3.2' __version__ = '0.4'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Display stats graphs' __description__ = 'Display stats graphs'
@ -42,7 +42,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -17,13 +17,13 @@ from __future__ import unicode_literals
import logging import logging
import deluge.component as component import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
self.core = client.toggle self.core = client.toggle
self.plugin = component.get('PluginManager') self.plugin = component.get('PluginManager')

View file

@ -17,7 +17,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'Toggle' __plugin_name__ = 'Toggle'
__author__ = 'John Garland' __author__ = 'John Garland'
__author_email__ = 'johnnybg+deluge@gmail.com' __author_email__ = 'johnnybg+deluge@gmail.com'
__version__ = '0.3' __version__ = '0.4'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Toggles the session' __description__ = 'Toggles the session'
@ -39,7 +39,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
[deluge.plugin.web] [deluge.plugin.web]
%s = deluge.plugins.%s:WebUIPlugin %s = deluge.plugins.%s:WebUIPlugin

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy toplevel-contextual --> <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkAdjustment" id="adjustment1"> <object class="GtkAdjustment" id="adjustment1">
<property name="upper">99999</property> <property name="upper">99999</property>

View file

@ -15,10 +15,10 @@ from __future__ import unicode_literals
import logging import logging
import gtk from gi.repository import Gtk
import deluge.component as component import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client from deluge.ui.client import client
from .common import get_resource from .common import get_resource
@ -26,9 +26,9 @@ from .common import get_resource
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class GtkUI(GtkPluginBase): class GtkUI(Gtk3PluginBase):
def enable(self): def enable(self):
self.builder = gtk.Builder() self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('config.ui')) self.builder.add_from_file(get_resource('config.ui'))
component.get('Preferences').add_page( component.get('Preferences').add_page(
@ -80,14 +80,14 @@ class GtkUI(GtkPluginBase):
vbox = self.builder.get_object('prefs_box') vbox = self.builder.get_object('prefs_box')
hbox = gtk.HBox() hbox = Gtk.HBox()
icon = gtk.image_new_from_stock( icon = Gtk.image_new_from_stock(
gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_SMALL_TOOLBAR Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.SMALL_TOOLBAR
) )
icon.set_padding(5, 5) icon.set_padding(5, 5)
hbox.pack_start(icon, False, False) hbox.pack_start(icon, False, False, 0)
label = gtk.Label( label = Gtk.Label(
_( _(
'The Deluge web interface is not installed, ' 'The Deluge web interface is not installed, '
'please install the\ninterface and try again' 'please install the\ninterface and try again'
@ -95,7 +95,7 @@ class GtkUI(GtkPluginBase):
) )
label.set_alignment(0, 0.5) label.set_alignment(0, 0.5)
label.set_padding(5, 5) label.set_padding(5, 5)
hbox.pack_start(label) hbox.pack_start(label, False, False, 0)
vbox.pack_start(hbox, False, False, 10) vbox.pack_start(hbox, False, False, 10)
vbox.reorder_child(hbox, 0) vbox.reorder_child(hbox, 0)

View file

@ -16,7 +16,7 @@ from setuptools import find_packages, setup
__plugin_name__ = 'WebUi' __plugin_name__ = 'WebUi'
__author__ = 'Damien Churchill' __author__ = 'Damien Churchill'
__author_email__ = 'damoxc@gmail.com' __author_email__ = 'damoxc@gmail.com'
__version__ = '0.1' __version__ = '0.2'
__url__ = 'http://deluge-torrent.org' __url__ = 'http://deluge-torrent.org'
__license__ = 'GPLv3' __license__ = 'GPLv3'
__description__ = 'Allows starting the web interface within the daemon.' __description__ = 'Allows starting the web interface within the daemon.'
@ -38,7 +38,7 @@ setup(
entry_points=""" entry_points="""
[deluge.plugin.core] [deluge.plugin.core]
%s = deluge.plugins.%s:CorePlugin %s = deluge.plugins.%s:CorePlugin
[deluge.plugin.gtkui] [deluge.plugin.gtk3ui]
%s = deluge.plugins.%s:GtkUIPlugin %s = deluge.plugins.%s:GtkUIPlugin
""" """
% ((__plugin_name__, __plugin_name__.lower()) * 2), % ((__plugin_name__, __plugin_name__.lower()) * 2),

View file

@ -47,16 +47,16 @@ class CorePluginBase(PluginBase):
super(CorePluginBase, self).disable() super(CorePluginBase, self).disable()
class GtkPluginBase(PluginBase): class Gtk3PluginBase(PluginBase):
def __init__(self, plugin_name): def __init__(self, plugin_name):
super(GtkPluginBase, self).__init__('GtkPlugin.' + plugin_name) super(Gtk3PluginBase, self).__init__('Gtk3Plugin.' + plugin_name)
log.debug('GtkPlugin initialized..') log.debug('Gtk3Plugin initialized..')
def enable(self): def enable(self):
super(GtkPluginBase, self).enable() super(Gtk3PluginBase, self).enable()
def disable(self): def disable(self):
super(GtkPluginBase, self).disable() super(Gtk3PluginBase, self).disable()
class WebPluginBase(PluginBase): class WebPluginBase(PluginBase):

View file

@ -24,7 +24,7 @@ class PluginManager(deluge.pluginmanagerbase.PluginManagerBase, component.Compon
component.Component.__init__(self, 'PluginManager') component.Component.__init__(self, 'PluginManager')
self.config = ConfigManager('gtk3ui.conf') self.config = ConfigManager('gtk3ui.conf')
deluge.pluginmanagerbase.PluginManagerBase.__init__( deluge.pluginmanagerbase.PluginManagerBase.__init__(
self, 'gtk3ui.conf', 'deluge.plugin.gtk3' self, 'gtk3ui.conf', 'deluge.plugin.gtk3ui'
) )
self.hooks = {'on_apply_prefs': [], 'on_show_prefs': []} self.hooks = {'on_apply_prefs': [], 'on_show_prefs': []}