[Notifications] Migrate to GTK3

- Switch from pynotify to gi libnotify binding.
  - Ideally would drop libnotify for [GNotification] but requires more
    work with the desktop file needing renamed to DNS format.
    e.g. `org.deluge-torrent.deluge`

[GNotification]: https://developer.gnome.org/GNotification/

Co-authored-by: Calum Lind calumlind+deluge@gmail.com
This commit is contained in:
kbdserver 2018-10-12 10:53:40 +01:00 committed by Calum Lind
parent ed1b2a50fa
commit d879ee06a3
2 changed files with 91 additions and 80 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<interface> <interface>
<requires lib="gtk+" version="2.24"/> <requires lib="gtk+" version="3.0"/>
<!-- 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>
<property name="upper">65535</property> <property name="upper">65535</property>
@ -29,10 +29,13 @@
<object class="GtkVBox" id="vbox2"> <object class="GtkVBox" id="vbox2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="valign">start</property>
<child> <child>
<object class="GtkFrame" id="frame2"> <object class="GtkFrame" id="frame2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="valign">start</property>
<property name="margin_left">9</property>
<property name="label_xalign">0</property> <property name="label_xalign">0</property>
<property name="shadow_type">none</property> <property name="shadow_type">none</property>
<child> <child>
@ -40,6 +43,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="left_padding">12</property> <property name="left_padding">12</property>
<property name="right_padding">10</property>
<child> <child>
<object class="GtkVBox" id="vbox1"> <object class="GtkVBox" id="vbox1">
<property name="visible">True</property> <property name="visible">True</property>
@ -82,6 +86,7 @@
<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>
<property name="halign">start</property>
<property name="draw_indicator">True</property> <property name="draw_indicator">True</property>
<signal name="toggled" handler="on_sound_enabled_toggled" swapped="no"/> <signal name="toggled" handler="on_sound_enabled_toggled" swapped="no"/>
</object> </object>
@ -120,6 +125,8 @@
<object class="GtkLabel" id="label6"> <object class="GtkLabel" id="label6">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">start</property>
<property name="margin_top">5</property>
<property name="xpad">5</property> <property name="xpad">5</property>
<property name="label" translatable="yes">&lt;b&gt;UI Notifications&lt;/b&gt;</property> <property name="label" translatable="yes">&lt;b&gt;UI Notifications&lt;/b&gt;</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
@ -136,6 +143,9 @@
<object class="GtkFrame" id="frame3"> <object class="GtkFrame" id="frame3">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="valign">start</property>
<property name="margin_left">10</property>
<property name="margin_top">7</property>
<property name="label_xalign">0</property> <property name="label_xalign">0</property>
<property name="shadow_type">none</property> <property name="shadow_type">none</property>
<child> <child>
@ -143,6 +153,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="left_padding">12</property> <property name="left_padding">12</property>
<property name="right_padding">10</property>
<child> <child>
<object class="GtkTable" id="prefs_table"> <object class="GtkTable" id="prefs_table">
<property name="visible">True</property> <property name="visible">True</property>
@ -151,15 +162,12 @@
<property name="n_columns">4</property> <property name="n_columns">4</property>
<property name="column_spacing">2</property> <property name="column_spacing">2</property>
<property name="row_spacing">2</property> <property name="row_spacing">2</property>
<child>
<placeholder/>
</child>
<child> <child>
<object class="GtkLabel" id="label1"> <object class="GtkLabel" id="label1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Hostname:</property> <property name="label" translatable="yes">Hostname:</property>
<property name="justify">right</property>
</object> </object>
<packing> <packing>
<property name="top_attach">1</property> <property name="top_attach">1</property>
@ -172,8 +180,6 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="primary_icon_activatable">False</property> <property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -204,8 +210,6 @@
<property name="width_chars">5</property> <property name="width_chars">5</property>
<property name="primary_icon_activatable">False</property> <property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<property name="adjustment">adjustment1</property> <property name="adjustment">adjustment1</property>
<property name="climb_rate">1</property> <property name="climb_rate">1</property>
<property name="numeric">True</property> <property name="numeric">True</property>
@ -221,8 +225,8 @@
<object class="GtkLabel" id="label3"> <object class="GtkLabel" id="label3">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Username:</property> <property name="label" translatable="yes">Username:</property>
<property name="justify">right</property>
</object> </object>
<packing> <packing>
<property name="top_attach">2</property> <property name="top_attach">2</property>
@ -235,8 +239,6 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="primary_icon_activatable">False</property> <property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -249,6 +251,7 @@
<object class="GtkLabel" id="label4"> <object class="GtkLabel" id="label4">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Password:</property> <property name="label" translatable="yes">Password:</property>
</object> </object>
<packing> <packing>
@ -263,8 +266,6 @@
<property name="visibility">False</property> <property name="visibility">False</property>
<property name="primary_icon_activatable">False</property> <property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -277,13 +278,14 @@
<object class="GtkFrame" id="frame1"> <object class="GtkFrame" id="frame1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="valign">start</property>
<property name="label_xalign">0</property> <property name="label_xalign">0</property>
<property name="shadow_type">none</property> <property name="shadow_type">none</property>
<child> <child>
<object class="GtkAlignment" id="alignment4"> <object class="GtkAlignment" id="alignment4">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="left_padding">12</property> <property name="bottom_padding">10</property>
<child> <child>
<object class="GtkHBox" id="hbox1"> <object class="GtkHBox" id="hbox1">
<property name="visible">True</property> <property name="visible">True</property>
@ -293,8 +295,6 @@
<object class="GtkScrolledWindow" id="scrolledwindow1"> <object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property> <property name="shadow_type">in</property>
<child> <child>
<object class="GtkTreeView" id="smtp_recipients"> <object class="GtkTreeView" id="smtp_recipients">
@ -302,6 +302,9 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="headers_visible">False</property> <property name="headers_visible">False</property>
<property name="enable_grid_lines">horizontal</property> <property name="enable_grid_lines">horizontal</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object> </object>
</child> </child>
</object> </object>
@ -365,7 +368,9 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Recipients&lt;/b&gt;</property> <property name="label" translatable="yes">&lt;b&gt;Recipients&lt;/b&gt;</property>
<property name="margin_bottom">3</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
<property name="ypad">0</property>
</object> </object>
</child> </child>
</object> </object>
@ -380,6 +385,7 @@
<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>
<property name="halign">start</property>
<property name="draw_indicator">True</property> <property name="draw_indicator">True</property>
<child> <child>
<object class="GtkLabel" id="label9"> <object class="GtkLabel" id="label9">
@ -394,15 +400,14 @@
<property name="right_attach">4</property> <property name="right_attach">4</property>
<property name="top_attach">5</property> <property name="top_attach">5</property>
<property name="bottom_attach">6</property> <property name="bottom_attach">6</property>
<property name="x_padding">10</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="label8"> <object class="GtkLabel" id="label8">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">From:</property> <property name="label" translatable="yes">From:</property>
<property name="justify">right</property>
</object> </object>
<packing> <packing>
<property name="top_attach">4</property> <property name="top_attach">4</property>
@ -415,8 +420,6 @@
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="primary_icon_activatable">False</property> <property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property> <property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -446,6 +449,7 @@
<object class="GtkLabel" id="label7"> <object class="GtkLabel" id="label7">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">start</property>
<property name="xpad">5</property> <property name="xpad">5</property>
<property name="label" translatable="yes">&lt;b&gt;Email Notifications&lt;/b&gt;</property> <property name="label" translatable="yes">&lt;b&gt;Email Notifications&lt;/b&gt;</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
@ -474,6 +478,9 @@
<object class="GtkVBox" id="vbox5"> <object class="GtkVBox" id="vbox5">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="margin_left">15</property>
<property name="margin_right">10</property>
<property name="margin_bottom">10</property>
<child> <child>
<placeholder/> <placeholder/>
</child> </child>
@ -481,13 +488,14 @@
<object class="GtkScrolledWindow" id="scrolledwindow2"> <object class="GtkScrolledWindow" id="scrolledwindow2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child> <child>
<object class="GtkTreeView" id="subscriptions_treeview"> <object class="GtkTreeView" id="subscriptions_treeview">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="enable_grid_lines">horizontal</property> <property name="enable_grid_lines">horizontal</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object> </object>
</child> </child>
</object> </object>
@ -532,16 +540,20 @@
<object class="GtkVBox" id="sounds_page"> <object class="GtkVBox" id="sounds_page">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="margin_left">15</property>
<property name="margin_right">10</property>
<property name="margin_bottom">10</property>
<child> <child>
<object class="GtkScrolledWindow" id="scrolledwindow3"> <object class="GtkScrolledWindow" id="scrolledwindow3">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child> <child>
<object class="GtkTreeView" id="sounds_treeview"> <object class="GtkTreeView" id="sounds_treeview">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object> </object>
</child> </child>
</object> </object>
@ -624,5 +636,8 @@
</child> </child>
</object> </object>
</child> </child>
<child type="titlebar">
<placeholder/>
</child>
</object> </object>
</interface> </interface>

View File

@ -17,7 +17,8 @@ from __future__ import unicode_literals
import logging import logging
from os.path import basename from os.path import basename
import gtk from gi import require_version
from gi.repository import Gtk
from twisted.internet import defer from twisted.internet import defer
import deluge.common import deluge.common
@ -40,13 +41,12 @@ except ImportError:
SOUND_AVAILABLE = False SOUND_AVAILABLE = False
try: try:
import pynotify require_version('Notify', '0.7')
from gi.repository import Notify
POPUP_AVAILABLE = True except (ValueError, ImportError):
if deluge.common.windows_check():
POPUP_AVAILABLE = False
except ImportError:
POPUP_AVAILABLE = False POPUP_AVAILABLE = False
else:
POPUP_AVAILABLE = not deluge.common.windows_check()
DEFAULT_PREFS = { DEFAULT_PREFS = {
@ -174,17 +174,13 @@ class GtkUiNotifications(CustomNotifications):
if not self.config['popup_enabled']: if not self.config['popup_enabled']:
return defer.succeed(_('Popup notification is not enabled.')) return defer.succeed(_('Popup notification is not enabled.'))
if not POPUP_AVAILABLE: if not POPUP_AVAILABLE:
return defer.fail(_('pynotify is not installed')) return defer.fail(_('libnotify is not installed'))
if pynotify.init('Deluge'): if Notify.init('Deluge'):
icon = gtk.gdk.pixbuf_new_from_file_at_size( self.note = Notify.Notification.new(title, message, 'deluge-tray')
deluge.common.get_pixmap('deluge.svg'), 48, 48
)
self.note = pynotify.Notification(title, message)
self.note.set_icon_from_pixbuf(icon)
self.note.set_hint('desktop-entry', 'deluge') self.note.set_hint('desktop-entry', 'deluge')
if not self.note.show(): if not self.note.show():
err_msg = _('pynotify failed to show notification') err_msg = _('Failed to popup notification')
log.warning(err_msg) log.warning(err_msg)
return defer.fail(err_msg) return defer.fail(err_msg)
return defer.succeed(_('Notification popup shown')) return defer.succeed(_('Notification popup shown'))
@ -254,7 +250,7 @@ class GtkUI(Gtk3PluginBase, GtkUiNotifications):
self.config = deluge.configmanager.ConfigManager( self.config = deluge.configmanager.ConfigManager(
'notifications-gtk.conf', DEFAULT_PREFS 'notifications-gtk.conf', DEFAULT_PREFS
) )
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.get_object('smtp_port').set_value(25) self.builder.get_object('smtp_port').set_value(25)
self.prefs = self.builder.get_object('prefs_box') self.prefs = self.builder.get_object('prefs_box')
@ -331,12 +327,12 @@ class GtkUI(Gtk3PluginBase, GtkUiNotifications):
treeview_selection.connect( treeview_selection.connect(
'changed', self.on_recipients_treeview_selection_changed 'changed', self.on_recipients_treeview_selection_changed
) )
self.recipients_model = gtk.ListStore(str, bool) self.recipients_model = Gtk.ListStore(str, bool)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.connect('edited', self.on_cell_edited, self.recipients_model) renderer.connect('edited', self.on_cell_edited, self.recipients_model)
renderer.set_data('recipient', RECIPIENT_FIELD) renderer.recipient = RECIPIENT_FIELD
column = gtk.TreeViewColumn( column = Gtk.TreeViewColumn(
'Recipients', renderer, text=RECIPIENT_FIELD, editable=RECIPIENT_EDIT 'Recipients', renderer, text=RECIPIENT_FIELD, editable=RECIPIENT_EDIT
) )
column.set_expand(True) column.set_expand(True)
@ -350,28 +346,28 @@ class GtkUI(Gtk3PluginBase, GtkUiNotifications):
sounds_selection.connect('changed', self.on_sounds_treeview_selection_changed) sounds_selection.connect('changed', self.on_sounds_treeview_selection_changed)
self.sounds_treeview.set_tooltip_column(SND_EVENT_DOC) self.sounds_treeview.set_tooltip_column(SND_EVENT_DOC)
self.sounds_model = gtk.ListStore(str, str, str, str) self.sounds_model = Gtk.ListStore(str, str, str, str)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.set_data('event', SND_EVENT) renderer.event = SND_EVENT
column = gtk.TreeViewColumn('Event', renderer, text=SND_EVENT) column = Gtk.TreeViewColumn('Event', renderer, text=SND_EVENT)
column.set_expand(True) column.set_expand(True)
self.sounds_treeview.append_column(column) self.sounds_treeview.append_column(column)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.set_data('event_doc', SND_EVENT_DOC) renderer.event_doc = SND_EVENT_DOC
column = gtk.TreeViewColumn('Doc', renderer, text=SND_EVENT_DOC) column = Gtk.TreeViewColumn('Doc', renderer, text=SND_EVENT_DOC)
column.set_property('visible', False) column.set_property('visible', False)
self.sounds_treeview.append_column(column) self.sounds_treeview.append_column(column)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.set_data('sound_name', SND_NAME) renderer.sound_name = SND_NAME
column = gtk.TreeViewColumn('Name', renderer, text=SND_NAME) column = Gtk.TreeViewColumn('Name', renderer, text=SND_NAME)
self.sounds_treeview.append_column(column) self.sounds_treeview.append_column(column)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.set_data('sound_path', SND_PATH) renderer.sound_path = SND_PATH
column = gtk.TreeViewColumn('Path', renderer, text=SND_PATH) column = Gtk.TreeViewColumn('Path', renderer, text=SND_PATH)
column.set_property('visible', False) column.set_property('visible', False)
self.sounds_treeview.append_column(column) self.sounds_treeview.append_column(column)
@ -385,45 +381,45 @@ class GtkUI(Gtk3PluginBase, GtkUiNotifications):
'changed', self.on_subscriptions_treeview_selection_changed 'changed', self.on_subscriptions_treeview_selection_changed
) )
self.subscriptions_treeview.set_tooltip_column(SUB_EVENT_DOC) self.subscriptions_treeview.set_tooltip_column(SUB_EVENT_DOC)
self.subscriptions_model = gtk.ListStore(str, str, bool, bool, bool, bool) self.subscriptions_model = Gtk.ListStore(str, str, bool, bool, bool, bool)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.set_data('event', SUB_EVENT) setattr(renderer, 'event', SUB_EVENT)
column = gtk.TreeViewColumn('Event', renderer, text=SUB_EVENT) column = Gtk.TreeViewColumn('Event', renderer, text=SUB_EVENT)
column.set_expand(True) column.set_expand(True)
self.subscriptions_treeview.append_column(column) self.subscriptions_treeview.append_column(column)
renderer = gtk.CellRendererText() renderer = Gtk.CellRendererText()
renderer.set_data('event_doc', SUB_EVENT) setattr(renderer, 'event_doc', SUB_EVENT)
column = gtk.TreeViewColumn('Doc', renderer, text=SUB_EVENT_DOC) column = Gtk.TreeViewColumn('Doc', renderer, text=SUB_EVENT_DOC)
column.set_property('visible', False) column.set_property('visible', False)
self.subscriptions_treeview.append_column(column) self.subscriptions_treeview.append_column(column)
renderer = gtk.CellRendererToggle() renderer = Gtk.CellRendererToggle()
renderer.set_property('activatable', True) renderer.set_property('activatable', True)
renderer.connect('toggled', self._on_email_col_toggled) renderer.connect('toggled', self._on_email_col_toggled)
column = gtk.TreeViewColumn('Email', renderer, active=SUB_NOT_EMAIL) column = Gtk.TreeViewColumn('Email', renderer, active=SUB_NOT_EMAIL)
column.set_clickable(True) column.set_clickable(True)
self.subscriptions_treeview.append_column(column) self.subscriptions_treeview.append_column(column)
renderer = gtk.CellRendererToggle() renderer = Gtk.CellRendererToggle()
renderer.set_property('activatable', True) renderer.set_property('activatable', True)
renderer.connect('toggled', self._on_popup_col_toggled) renderer.connect('toggled', self._on_popup_col_toggled)
column = gtk.TreeViewColumn('Popup', renderer, active=SUB_NOT_POPUP) column = Gtk.TreeViewColumn('Popup', renderer, active=SUB_NOT_POPUP)
column.set_clickable(True) column.set_clickable(True)
self.subscriptions_treeview.append_column(column) self.subscriptions_treeview.append_column(column)
renderer = gtk.CellRendererToggle() renderer = Gtk.CellRendererToggle()
renderer.set_property('activatable', True) renderer.set_property('activatable', True)
renderer.connect('toggled', self._on_blink_col_toggled) renderer.connect('toggled', self._on_blink_col_toggled)
column = gtk.TreeViewColumn('Blink', renderer, active=SUB_NOT_BLINK) column = Gtk.TreeViewColumn('Blink', renderer, active=SUB_NOT_BLINK)
column.set_clickable(True) column.set_clickable(True)
self.subscriptions_treeview.append_column(column) self.subscriptions_treeview.append_column(column)
renderer = gtk.CellRendererToggle() renderer = Gtk.CellRendererToggle()
renderer.set_property('activatable', True) renderer.set_property('activatable', True)
renderer.connect('toggled', self._on_sound_col_toggled) renderer.connect('toggled', self._on_sound_col_toggled)
column = gtk.TreeViewColumn('Sound', renderer, active=SUB_NOT_SOUND) column = Gtk.TreeViewColumn('Sound', renderer, active=SUB_NOT_SOUND)
column.set_clickable(True) column.set_clickable(True)
self.subscriptions_treeview.append_column(column) self.subscriptions_treeview.append_column(column)
self.subscriptions_treeview.set_model(self.subscriptions_model) self.subscriptions_treeview.set_model(self.subscriptions_model)
@ -661,19 +657,19 @@ class GtkUI(Gtk3PluginBase, GtkUiNotifications):
model, selected_iter = selection.get_selected() model, selected_iter = selection.get_selected()
if selected_iter: if selected_iter:
path = model.get(selected_iter, SND_PATH)[0] path = model.get(selected_iter, SND_PATH)[0]
dialog = gtk.FileChooserDialog( dialog = Gtk.FileChooserDialog(
title=_('Choose Sound File'), title=_('Choose Sound File'),
buttons=( buttons=(
gtk.STOCK_CANCEL, Gtk.STOCK_CANCEL,
gtk.RESPONSE_CANCEL, Gtk.ResponseType.CANCEL,
gtk.STOCK_OPEN, Gtk.STOCK_OPEN,
gtk.RESPONSE_OK, Gtk.ResponseType.OK,
), ),
) )
dialog.set_filename(path) dialog.set_filename(path)
def update_model(response): def update_model(response):
if response == gtk.RESPONSE_OK: if response == Gtk.ResponseType.OK:
new_filename = dialog.get_filename() new_filename = dialog.get_filename()
dialog.destroy() dialog.destroy()
log.debug(new_filename) log.debug(new_filename)