Skip to content

Commit

Permalink
refactoring, fix multiple enable/disable bug.
Browse files Browse the repository at this point in the history
closes #21
  • Loading branch information
dredkin committed Feb 6, 2020
1 parent a47edad commit 8cd2df5
Showing 1 changed file with 82 additions and 65 deletions.
147 changes: 82 additions & 65 deletions deluge_browsebutton/gtkui.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,16 @@ def getTheme():
def caseInsensitive(key):
return key.lower()

class ButtonRec:
id = None
editbox = None
widget = None
window = None
click_handler_id = None
oldsignal = None
def __init__(self, id, window):
self.id = id
self.window = window

class BrowseDialog:
def __init__(self, path, recent, parent, RootDirectory, RootDirectoryDisableTraverse):
Expand Down Expand Up @@ -230,7 +240,7 @@ def OK(self):

class BrowseButtonUI(AbstractUI):
error = None
buttons = None
buttons = []
addDialog = None
moveDialog = None
mainWindow = None
Expand Down Expand Up @@ -258,15 +268,16 @@ def enable(self):

def disable(self):
self.error = None
if self.buttons is not None:
for button in self.buttons :
self.deleteButton(button)
self.handleError()
self.buttons.clear()
self.configPage = None
component.get("Preferences").remove_page("Browse Button")
if self.hooksregistered:
component.get("PluginManager").deregister_hook("on_apply_prefs", self.on_apply_prefs)
component.get("PluginManager").deregister_hook("on_show_prefs", self.on_show_prefs)
if self.buttons is not None:
for button in self.buttons :
self.deleteButton(button)
self.handleError()
self.swapMenuItems(self.newMoveItem, self.originalMoveItem)
self.originalMoveItem = None
self.mainWindow = None
Expand Down Expand Up @@ -426,6 +437,7 @@ def findDialog(self, compName, attribute):
return None

def makeButtons(self):
log.debug('starting to add/connect buttons...')
if self.mainWindow is None:
self.mainWindow = self.findDialog("MainWindow", "window")
if self.addDialog is None:
Expand All @@ -436,45 +448,43 @@ def makeButtons(self):
self.moveDialog = self.makeMoveStorageDialog()

if PY3:
self.buttons = [ \
{ 'id': 'hbox_download_location_chooser' , 'editbox': None, 'widget': None , 'window': self.addDialog, 'oldsignal': None}, \
{ 'id': 'hbox_move_completed_chooser' , 'editbox': None, 'widget': None , 'window': self.addDialog, 'oldsignal': None}, \
{ 'id': 'hbox_move_completed_path_chooser', 'editbox': None, 'widget': None , 'window': self.mainWindow, 'oldsignal': None}, \
{ 'id': 'hbox_root_path_chooser', 'editbox': None, 'widget': None , 'window': self.prefDialog, 'oldsignal': None}, \
{ 'id': 'hbox_destination_chooser', 'editbox': None, 'widget': None , 'window': self.moveDialog, 'oldsignal': None}, \
{ 'id': 'hbox_download_to_path_chooser', 'editbox': None, 'widget': None , 'window': self.prefDialog, 'oldsignal': None}, \
{ 'id': 'hbox_move_completed_to_path_chooser', 'editbox': None, 'widget': None , 'window': self.prefDialog, 'oldsignal': None}, \
{ 'id': 'hbox_copy_torrent_files_path_chooser','editbox': None, 'widget': None , 'window': self.prefDialog, 'oldsignal': None}, \
]
self.buttons.append(ButtonRec('hbox_download_location_chooser' , self.addDialog))
self.buttons.append(ButtonRec('hbox_move_completed_chooser' , self.addDialog))
self.buttons.append(ButtonRec('hbox_move_completed_path_chooser', self.mainWindow))
self.buttons.append(ButtonRec('hbox_root_path_chooser', self.prefDialog))
self.buttons.append(ButtonRec('hbox_destination_chooser', self.moveDialog))
self.buttons.append(ButtonRec('hbox_download_to_path_chooser', self.prefDialog))
self.buttons.append(ButtonRec('hbox_move_completed_to_path_chooser', self.prefDialog))
self.buttons.append(ButtonRec('hbox_copy_torrent_files_path_chooser', self.prefDialog))
else:
self.buttons = [ \
{ 'id': 'entry_download_path' , 'editbox': None, 'widget': None , 'window': self.addDialog}, \
{ 'id': 'entry_move_completed_path' , 'editbox': None, 'widget': None , 'window': self.addDialog}, \
{ 'id': 'entry_move_completed' , 'editbox': None, 'widget': None , 'window': self.mainWindow}, \
{ 'id': 'entry_root_path' , 'editbox': None, 'widget': None , 'window': self.configPage}, \
{ 'id': 'entry_destination' , 'editbox': None, 'widget': None , 'window': self.moveDialog},
{ 'id': 'entry_download_path' , 'editbox': None, 'widget': None , 'window': self.prefDialog}, \
{ 'id': 'entry_move_completed_path' , 'editbox': None, 'widget': None , 'window': self.prefDialog}, \
{ 'id': 'entry_torrents_path' , 'editbox': None, 'widget': None , 'window': self.prefDialog}, \
{ 'id': 'entry_autoadd' , 'editbox': None, 'widget': None , 'window': self.prefDialog}, \
]


for button in self.buttons :
editbox = self.findEditor(button)
self.buttons.append(ButtonRec('entry_download_path' , self.addDialog))
self.buttons.append(ButtonRec('entry_move_completed_path' , self.addDialog))
self.buttons.append(ButtonRec('entry_move_completed' , self.mainWindow))
self.buttons.append(ButtonRec('entry_root_path' , self.configPage))
self.buttons.append(ButtonRec('entry_destination' , self.moveDialog))
self.buttons.append(ButtonRec('entry_download_path' , self.prefDialog))
self.buttons.append(ButtonRec('entry_move_completed_path' , self.prefDialog))
self.buttons.append(ButtonRec('entry_torrents_path' , self.prefDialog))
self.buttons.append(ButtonRec('entry_autoadd' , self.prefDialog))


for btnRec in self.buttons :
editbox = self.findEditor(btnRec)
if editbox is None:
self.handleError()
continue
button['editbox'] = editbox
btnRec.editbox = editbox

btn = self.findButton(button)
btn = self.findButton(btnRec)
if btn is None:
self.handleError()
continue

btn.connect("clicked", self.on_browse_button_clicked)
log.debug("button connected")
button['widget'] = btn
log.debug("connecting button to browse dialog:"+btnRec.id)
btnRec.click_handler_id = btn.connect("clicked", self.on_browse_button_clicked)
log.debug("button connected:"+btnRec.id)
btnRec.widget = btn
log.debug('all buttons connected.')

def findwidget(self, container, name, verbose):
result = findwidget(container, name, verbose)
Expand Down Expand Up @@ -505,45 +515,53 @@ def chooseFolder(self, editbox, parent):
dialog.dialog.destroy()

def on_browse_button_clicked(self, widget):
for button in self.buttons :
if widget == button['widget']:
return self.chooseFolder(button['editbox'], button['window'])
for btnRec in self.buttons :
if widget == btnRec.widget:
return self.chooseFolder(btnRec.editbox, btnRec.window)

if PY3:
class Gtk3UI_(BrowseButtonUI):
def getTheme(self):
return gtk.IconTheme().get_default()

def findEditor(self, button):
hbox = self.findwidget(button['window'], button['id'], False)
def findEditor(self, btnRec):
hbox = self.findwidget(btnRec.window, btnRec.id, False)
if hbox is None:
return None
editbox = self.findwidget(hbox, 'entry_text', False)
if editbox is None:
return None
return editbox

def findButton(self, button):
hbox = self.findwidget(button['window'], button['id'], False)
# def get_handler_id(self, obj, signal_name):
# signal_id, detail = gtk.signal_parse_name(signal_name, obj, True)
# return gtk.signal_handler_find(obj, GObject.SignalMatchType.ID, signal_id, detail, None, None, None)

def findButton(self, btnRec):
hbox = self.findwidget(btnRec.window, btnRec.id, False)
if hbox is None:
return None
btn = self.findwidget(hbox, 'button_open_dialog', False)
log.debug("disconnecting button ")
log.debug("disconnecting old signal from button "+btnRec.id)
ch = hbox.get_children()
for widget in ch:
if hasattr(widget, '_on_button_open_dialog_clicked'):
button['oldsignal'] = widget._on_button_open_dialog_clicked
btn.disconnect_by_func(button['oldsignal'])
log.debug('button sucessfilly disconnected')
btnRec.oldsignal = widget._on_button_open_dialog_clicked
btn.disconnect_by_func(btnRec.oldsignal)
log.debug('button sucessfilly disconnected:'+ btnRec.id)
return self.findwidget(hbox, 'button_open_dialog', False)

def deleteButton(self, button):
if button['widget'] is not None:
btn = button['widget']
btn.disconnect_by_func(self.on_browse_button_clicked)
if button['oldsignal'] is not None:
btn.connect("clicked", button['oldsignal'])
button['widget'] = None
def deleteButton(self, btnRec):
if btnRec.widget is not None:
log.debug('restoring old signal for button:'+ btnRec.id)
btn = btnRec.widget
if btnRec.click_handler_id is not None:
btn.disconnect(btnRec.click_handler_id)
if btnRec.oldsignal is not None:
btn.connect("clicked", btnRec.oldsignal)
btnRec.oldsignal = None
log.debug('old signal for button restored:'+ btnRec.id)
btnRec.widget = None
return True

def OK(self):
Expand All @@ -553,9 +571,9 @@ class GtkUI_(BrowseButtonUI):
def getTheme(self):
return gtk.icon_theme_get_default()

def findEditor(self, button):
dialog = button['window']
id = button['id']
def findEditor(self, btnRec):
dialog = btnRec.window
id = btnRec.id
if dialog is None:
self.error = "window is not set for "+ id +"!"
return None
Expand All @@ -564,15 +582,14 @@ def findEditor(self, button):
self.error = id + " not found!"
return editbox

def findButton(self, button):
def findButton(self, btnRec):
"""Adds a Button to the editbox inside hbox container."""
if button['editbox'] is None:
self.error = "editbox is not set for "+button['id']+"!"
if btnRec.editbox is None:
self.error = "editbox is not set for "+btnRec.id+"!"
return None
editbox = button['editbox']
hbox = editbox.get_parent()
hbox = btnRec.editbox.get_parent()
if hbox is None:
self.error = "hbox not found for "+button['id']+"!"
self.error = "hbox not found for "+btnRec.id+"!"
return None
#image = gtk.Image()
#image.set_from_stock(gtk.STOCK_DIRECTORY, gtk.ICON_SIZE_BUTTON)
Expand All @@ -584,13 +601,13 @@ def findButton(self, button):
btn.show()
return btn

def deleteButton(self, button):
btn = button['widget']
def deleteButton(self, btnRec):
btn = btnRec.widget
if btn is not None:
if btn.parent is None:
return False
btn.parent.remove(btn)
button['widget'] = None
btnRec.widget = None
return True

def OK(self):
Expand Down

0 comments on commit 8cd2df5

Please sign in to comment.