[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
parent 4df5bd05ec
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)
class GtkUIPlugin(PluginInitBase):
class Gtk3UIPlugin(PluginInitBase):
def __init__(self, plugin_name):
from .gtkui import GtkUI as _pluginCls
self._plugin_cls = _pluginCls
super(GtkUIPlugin, self).__init__(plugin_name)
super(Gtk3UIPlugin, self).__init__(plugin_name)
class WebUIPlugin(PluginInitBase):

View File

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

View File

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

View File

@ -17,14 +17,21 @@ from __future__ import unicode_literals
import logging
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.component as component
from deluge.plugins.pluginbase import GtkPluginBase
from deluge.plugins.pluginbase import Gtk3PluginBase
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
log = logging.getLogger(__name__)
@ -47,14 +54,15 @@ class OptionsDialog(object):
]
def __init__(self):
self.accounts = gtk.ListStore(str)
self.labels = gtk.ListStore(str)
log.critical('I')
self.accounts = Gtk.ListStore(str)
self.labels = Gtk.ListStore(str)
self.core_config = {}
def show(self, options=None, watchdir_id=None):
if options is None:
options = {}
self.builder = gtk.Builder()
self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('autoadd_options.ui'))
self.builder.connect_signals(
{
@ -103,7 +111,7 @@ class OptionsDialog(object):
self.accounts.clear()
self.labels.clear()
combobox = self.builder.get_object('OwnerCombobox')
combobox_render = gtk.CellRendererText()
combobox_render = Gtk.CellRendererText()
combobox.pack_start(combobox_render, True)
combobox.add_attribute(combobox_render, 'text', 0)
combobox.set_model(self.accounts)
@ -413,10 +421,11 @@ class OptionsDialog(object):
return options
class GtkUI(GtkPluginBase):
class GtkUI(Gtk3PluginBase):
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.connect_signals(self)
self.opts_dialog = OptionsDialog()
@ -434,15 +443,15 @@ class GtkUI(GtkPluginBase):
self.watchdirs = {}
vbox = self.builder.get_object('watchdirs_vbox')
sw = gtk.ScrolledWindow()
sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
sw = Gtk.ScrolledWindow()
sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
vbox.pack_start(sw, True, True, 0)
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('row-activated', self.on_edit_button_clicked)
self.treeView.set_rules_hint(True)
@ -464,7 +473,7 @@ class GtkUI(GtkPluginBase):
)
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():
store.append(
[
@ -477,29 +486,29 @@ class GtkUI(GtkPluginBase):
return store
def create_columns(self, treeview):
renderer_toggle = gtk.CellRendererToggle()
column = gtk.TreeViewColumn(
renderer_toggle = Gtk.CellRendererToggle()
column = Gtk.TreeViewColumn(
_('Active'), renderer_toggle, activatable=1, active=1
)
column.set_sort_column_id(1)
treeview.append_column(column)
tt = gtk.Tooltip()
tt = Gtk.Tooltip()
tt.set_text(_('Double-click to toggle'))
treeview.set_tooltip_cell(tt, None, None, renderer_toggle)
renderertext = gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Owner'), renderertext, text=2)
renderertext = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(_('Owner'), renderertext, text=2)
column.set_sort_column_id(2)
treeview.append_column(column)
tt2 = gtk.Tooltip()
tt2 = Gtk.Tooltip()
tt2.set_text(_('Double-click to edit'))
treeview.set_has_tooltip(True)
renderertext = gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Path'), renderertext, text=3)
renderertext = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(_('Path'), renderertext, text=3)
column.set_sort_column_id(3)
treeview.append_column(column)
tt2 = gtk.Tooltip()
tt2 = Gtk.Tooltip()
tt2.set_text(_('Double-click to edit'))
treeview.set_has_tooltip(True)

View File

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

View File

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

View File

@ -12,19 +12,26 @@ from __future__ import unicode_literals
import logging
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.component as component
from deluge.plugins.pluginbase import GtkPluginBase
from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client
# isort:imports-localfolder
from . import common
log = logging.getLogger(__name__)
class GtkUI(GtkPluginBase):
class GtkUI(Gtk3PluginBase):
def enable(self):
log.debug('Blocklist GtkUI enable..')
self.plugin = component.get('PluginManager')
@ -151,7 +158,7 @@ class GtkUI(GtkPluginBase):
def load_preferences_page(self):
"""Initializes the preferences page and adds it to the preferences dialog"""
# Load the preferences page
self.builder = gtk.Builder()
self.builder = Gtk.Builder()
self.builder.add_from_file(common.get_resource('blocklist_pref.ui'))
self.whitelist_frame = self.builder.get_object('whitelist_frame')
@ -203,12 +210,12 @@ class GtkUI(GtkPluginBase):
treeview_selection.connect(
'changed', self.on_whitelist_treeview_selection_changed
)
self.whitelist_model = gtk.ListStore(str, bool)
renderer = gtk.CellRendererText()
self.whitelist_model = Gtk.ListStore(str, bool)
renderer = Gtk.CellRendererText()
renderer.connect('edited', self.on_cell_edited, self.whitelist_model)
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)
self.whitelist_treeview.append_column(column)
self.whitelist_treeview.set_model(self.whitelist_model)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,20 +15,27 @@ from __future__ import unicode_literals
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
from deluge.plugins.pluginbase import GtkPluginBase
from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client
# isort:imports-localfolder
from .common import get_resource
log = logging.getLogger(__name__)
class GtkUI(GtkPluginBase):
class GtkUI(Gtk3PluginBase):
def enable(self):
self.builder = gtk.Builder()
self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('extractor_prefs.ui'))
component.get('Preferences').add_page(

View File

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

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ from __future__ import unicode_literals
import logging
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
@ -25,7 +25,7 @@ def cell_data_label(column, cell, model, row, data):
cell.set_property('text', str(model.get_value(row, data)))
class GtkUI(GtkPluginBase):
class GtkUI(Gtk3PluginBase):
def start(self):
if self.label_menu:
self.label_menu.on_show()

View File

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

View File

@ -12,11 +12,18 @@ from __future__ import unicode_literals
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
from deluge.ui.client import client
# isort:imports-localfolder
from ..common import get_resource
log = logging.getLogger(__name__)
@ -33,12 +40,12 @@ class LabelSidebarMenu(object):
self.items = []
# add items, in reverse order, because they are prepended.
sep = gtk.SeparatorMenuItem()
sep = Gtk.SeparatorMenuItem()
self.items.append(sep)
self.menu.prepend(sep)
self._add_item('options', _('Label _Options'), gtk.STOCK_PREFERENCES)
self._add_item('remove', _('_Remove Label'), gtk.STOCK_REMOVE)
self._add_item('add', _('_Add Label'), gtk.STOCK_ADD)
self._add_item('options', _('Label _Options'), Gtk.STOCK_PREFERENCES)
self._add_item('remove', _('_Remove Label'), Gtk.STOCK_REMOVE)
self._add_item('add', _('_Add Label'), Gtk.STOCK_ADD)
self.menu.show_all()
# dialogs:
@ -52,7 +59,7 @@ class LabelSidebarMenu(object):
id is automatically-added as self.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.connect('activate', func)
self.menu.prepend(item)
@ -106,7 +113,7 @@ class AddDialog(object):
pass
def show(self):
self.builder = gtk.Builder()
self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('label_add.ui'))
self.dialog = self.builder.get_object('dlg_label_add')
self.dialog.set_transient_for(component.get('MainWindow').window)
@ -161,7 +168,7 @@ class OptionsDialog(object):
def show(self, label):
self.label = label
self.builder = gtk.Builder()
self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('label_options.ui'))
self.dialog = self.builder.get_object('dlg_label_options')
self.dialog.set_transient_for(component.get('MainWindow').window)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,10 +15,10 @@ from __future__ import unicode_literals
import logging
import gtk
from gi.repository import Gtk
import deluge.component as component
from deluge.plugins.pluginbase import GtkPluginBase
from deluge.plugins.pluginbase import Gtk3PluginBase
from deluge.ui.client import client
from .common import get_resource
@ -26,9 +26,9 @@ from .common import get_resource
log = logging.getLogger(__name__)
class GtkUI(GtkPluginBase):
class GtkUI(Gtk3PluginBase):
def enable(self):
self.builder = gtk.Builder()
self.builder = Gtk.Builder()
self.builder.add_from_file(get_resource('config.ui'))
component.get('Preferences').add_page(
@ -80,14 +80,14 @@ class GtkUI(GtkPluginBase):
vbox = self.builder.get_object('prefs_box')
hbox = gtk.HBox()
icon = gtk.image_new_from_stock(
gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_SMALL_TOOLBAR
hbox = Gtk.HBox()
icon = Gtk.image_new_from_stock(
Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.SMALL_TOOLBAR
)
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, '
'please install the\ninterface and try again'
@ -95,7 +95,7 @@ class GtkUI(GtkPluginBase):
)
label.set_alignment(0, 0.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.reorder_child(hbox, 0)

View File

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

View File

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

View File

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