mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-03 23:18:40 +00:00
Flake8'd gtkui/path_combo_chooser
This commit is contained in:
parent
a47b1a28f4
commit
3b79be04bc
1 changed files with 46 additions and 35 deletions
|
@ -42,6 +42,7 @@ from gtk import gdk, keysyms
|
||||||
|
|
||||||
from deluge.path_chooser_common import get_resource, get_completion_paths
|
from deluge.path_chooser_common import get_resource, get_completion_paths
|
||||||
|
|
||||||
|
|
||||||
def is_ascii_value(keyval, ascii_key):
|
def is_ascii_value(keyval, ascii_key):
|
||||||
try:
|
try:
|
||||||
# Set show/hide hidden files
|
# Set show/hide hidden files
|
||||||
|
@ -52,21 +53,27 @@ def is_ascii_value(keyval, ascii_key):
|
||||||
pass
|
pass
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def key_is_up(keyval):
|
def key_is_up(keyval):
|
||||||
return keyval == keysyms.Up or keyval == keysyms.KP_Up
|
return keyval == keysyms.Up or keyval == keysyms.KP_Up
|
||||||
|
|
||||||
|
|
||||||
def key_is_down(keyval):
|
def key_is_down(keyval):
|
||||||
return keyval == keysyms.Down or keyval == keysyms.KP_Down
|
return keyval == keysyms.Down or keyval == keysyms.KP_Down
|
||||||
|
|
||||||
|
|
||||||
def key_is_up_or_down(keyval):
|
def key_is_up_or_down(keyval):
|
||||||
return key_is_up(keyval) or key_is_down(keyval)
|
return key_is_up(keyval) or key_is_down(keyval)
|
||||||
|
|
||||||
|
|
||||||
def key_is_pgup_or_pgdown(keyval):
|
def key_is_pgup_or_pgdown(keyval):
|
||||||
return keyval == keysyms.Page_Down or keyval == keysyms.Page_Up
|
return keyval == keysyms.Page_Down or keyval == keysyms.Page_Up
|
||||||
|
|
||||||
|
|
||||||
def key_is_enter(keyval):
|
def key_is_enter(keyval):
|
||||||
return keyval == keysyms.Return or keyval == keysyms.KP_Enter
|
return keyval == keysyms.Return or keyval == keysyms.KP_Enter
|
||||||
|
|
||||||
|
|
||||||
def path_without_trailing_path_sep(path):
|
def path_without_trailing_path_sep(path):
|
||||||
while path.endswith("/") or path.endswith("\\"):
|
while path.endswith("/") or path.endswith("\\"):
|
||||||
if path == "/":
|
if path == "/":
|
||||||
|
@ -74,6 +81,7 @@ def path_without_trailing_path_sep(path):
|
||||||
path = path[0:-1]
|
path = path[0:-1]
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
class ValueList(object):
|
class ValueList(object):
|
||||||
|
|
||||||
paths_without_trailing_path_sep = False
|
paths_without_trailing_path_sep = False
|
||||||
|
@ -208,7 +216,7 @@ class ValueList(object):
|
||||||
|
|
||||||
if keyval == keysyms.Escape or\
|
if keyval == keysyms.Escape or\
|
||||||
(key_is_up(keyval) and
|
(key_is_up(keyval) and
|
||||||
state == gdk.MOD1_MASK): # ALT Key
|
state == gdk.MOD1_MASK): # ALT Key
|
||||||
self.popdown()
|
self.popdown()
|
||||||
return True
|
return True
|
||||||
# Set entry value to the selected row
|
# Set entry value to the selected row
|
||||||
|
@ -313,8 +321,7 @@ class ValueList(object):
|
||||||
if swap:
|
if swap:
|
||||||
p1 = self.tree_store[path][0]
|
p1 = self.tree_store[path][0]
|
||||||
p2 = self.tree_store[new_path][0]
|
p2 = self.tree_store[new_path][0]
|
||||||
self.tree_store.swap(self.tree_store.get_iter(path),
|
self.tree_store.swap(self.tree_store.get_iter(path), self.tree_store.get_iter(new_path))
|
||||||
self.tree_store.get_iter(new_path))
|
|
||||||
self.emit("list-values-reordered", [p1, p2])
|
self.emit("list-values-reordered", [p1, p2])
|
||||||
self.emit("list-values-changed", self.get_values())
|
self.emit("list-values-changed", self.get_values())
|
||||||
path = new_path
|
path = new_path
|
||||||
|
@ -324,6 +331,7 @@ class ValueList(object):
|
||||||
if set_entry:
|
if set_entry:
|
||||||
self.set_entry_value(path)
|
self.set_entry_value(path)
|
||||||
|
|
||||||
|
|
||||||
class StoredValuesList(ValueList):
|
class StoredValuesList(ValueList):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -397,6 +405,7 @@ class StoredValuesList(ValueList):
|
||||||
|
|
||||||
def on_edit_clicked(widget, path):
|
def on_edit_clicked(widget, path):
|
||||||
self.on_edit_path(path, self.tree_column)
|
self.on_edit_path(path, self.tree_column)
|
||||||
|
|
||||||
def on_remove_clicked(widget, path):
|
def on_remove_clicked(widget, path):
|
||||||
self.remove_selected_path()
|
self.remove_selected_path()
|
||||||
|
|
||||||
|
@ -410,7 +419,6 @@ class StoredValuesList(ValueList):
|
||||||
# Resize popup
|
# Resize popup
|
||||||
PathChooserPopup.popup(self)
|
PathChooserPopup.popup(self)
|
||||||
|
|
||||||
|
|
||||||
def on_stored_values_treeview_key_press_event(self, widget, event):
|
def on_stored_values_treeview_key_press_event(self, widget, event):
|
||||||
super(StoredValuesList, self).on_value_list_treeview_key_press_event(widget, event)
|
super(StoredValuesList, self).on_value_list_treeview_key_press_event(widget, event)
|
||||||
# Prevent the default event handler to move the cursor in the list
|
# Prevent the default event handler to move the cursor in the list
|
||||||
|
@ -426,7 +434,6 @@ class StoredValuesList(ValueList):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
keyval = event.keyval
|
keyval = event.keyval
|
||||||
state = event.state & gtk.accelerator_get_default_mod_mask()
|
|
||||||
ctrl = event.state & gtk.gdk.CONTROL_MASK
|
ctrl = event.state & gtk.gdk.CONTROL_MASK
|
||||||
|
|
||||||
# Edit selected row
|
# Edit selected row
|
||||||
|
@ -449,8 +456,8 @@ class StoredValuesList(ValueList):
|
||||||
# Handle key bindings for manipulating the list
|
# Handle key bindings for manipulating the list
|
||||||
# Remove the selected entry
|
# Remove the selected entry
|
||||||
if is_ascii_value(keyval, 'r'):
|
if is_ascii_value(keyval, 'r'):
|
||||||
self.remove_selected_path()
|
self.remove_selected_path()
|
||||||
return True
|
return True
|
||||||
# Add current value to saved list
|
# Add current value to saved list
|
||||||
elif is_ascii_value(keyval, 's'):
|
elif is_ascii_value(keyval, 's'):
|
||||||
super(PathChooserComboBox, self).add_current_value_to_saved_list()
|
super(PathChooserComboBox, self).add_current_value_to_saved_list()
|
||||||
|
@ -460,6 +467,7 @@ class StoredValuesList(ValueList):
|
||||||
self.edit_selected_path()
|
self.edit_selected_path()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
class CompletionList(ValueList):
|
class CompletionList(ValueList):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -512,12 +520,12 @@ class CompletionList(ValueList):
|
||||||
else:
|
else:
|
||||||
x = event.x
|
x = event.x
|
||||||
y = event.y
|
y = event.y
|
||||||
state = event.state
|
|
||||||
|
|
||||||
path = self.treeview.get_path_at_pos(int(x), int(y))
|
path = self.treeview.get_path_at_pos(int(x), int(y))
|
||||||
if path:
|
if path:
|
||||||
self.handle_list_scroll(path=path[0], next=None)
|
self.handle_list_scroll(path=path[0], next=None)
|
||||||
|
|
||||||
|
|
||||||
class PathChooserPopup(object):
|
class PathChooserPopup(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -530,7 +538,7 @@ class PathChooserPopup(object):
|
||||||
self.set_max_popup_rows(max_visible_rows)
|
self.set_max_popup_rows(max_visible_rows)
|
||||||
self.popup_window.realize()
|
self.popup_window.realize()
|
||||||
self.alignment_widget = popup_alignment_widget
|
self.alignment_widget = popup_alignment_widget
|
||||||
self.popup_buttonbox = None # If set, the height of this widget is the minimum height
|
self.popup_buttonbox = None # If set, the height of this widget is the minimum height
|
||||||
|
|
||||||
def popup(self):
|
def popup(self):
|
||||||
"""
|
"""
|
||||||
|
@ -661,11 +669,11 @@ class PathChooserPopup(object):
|
||||||
(gdk.BUTTON_PRESS_MASK |
|
(gdk.BUTTON_PRESS_MASK |
|
||||||
gdk.BUTTON_RELEASE_MASK |
|
gdk.BUTTON_RELEASE_MASK |
|
||||||
gdk.POINTER_MOTION_MASK),
|
gdk.POINTER_MOTION_MASK),
|
||||||
None, None, activate_time) == 0:
|
None, None, activate_time) == 0:
|
||||||
if gdk.keyboard_grab(self.popup_window.window, True, activate_time) == 0:
|
if gdk.keyboard_grab(self.popup_window.window, True, activate_time) == 0:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
self.popup_window.window.get_display().pointer_ungrab(activate_time);
|
self.popup_window.window.get_display().pointer_ungrab(activate_time)
|
||||||
return False
|
return False
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -699,8 +707,8 @@ class PathChooserPopup(object):
|
||||||
# Also if the intersection of self and the event is empty, hide
|
# Also if the intersection of self and the event is empty, hide
|
||||||
# the path_list
|
# the path_list
|
||||||
if (tuple(self.popup_window.allocation.intersect(
|
if (tuple(self.popup_window.allocation.intersect(
|
||||||
gdk.Rectangle(x=int(event.x), y=int(event.y),
|
gdk.Rectangle(x=int(event.x), y=int(event.y),
|
||||||
width=1, height=1))) == (0, 0, 0, 0)):
|
width=1, height=1))) == (0, 0, 0, 0)):
|
||||||
hide = True
|
hide = True
|
||||||
# Toplevel is the window that received the event, and parent is the
|
# Toplevel is the window that received the event, and parent is the
|
||||||
# path_list window. If they are not the same, means the popup should
|
# path_list window. If they are not the same, means the popup should
|
||||||
|
@ -852,6 +860,7 @@ class StoredValuesPopup(StoredValuesList, PathChooserPopup):
|
||||||
if self.default_text:
|
if self.default_text:
|
||||||
self.set_text(self.default_text, trigger_event=True)
|
self.set_text(self.default_text, trigger_event=True)
|
||||||
|
|
||||||
|
|
||||||
class PathCompletionPopup(CompletionList, PathChooserPopup):
|
class PathCompletionPopup(CompletionList, PathChooserPopup):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -924,6 +933,7 @@ class PathCompletionPopup(CompletionList, PathChooserPopup):
|
||||||
self.handle_list_scroll(path=path[0], next=None)
|
self.handle_list_scroll(path=path[0], next=None)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
class PathAutoCompleter(object):
|
class PathAutoCompleter(object):
|
||||||
|
|
||||||
def __init__(self, builder, path_entry, max_visible_rows):
|
def __init__(self, builder, path_entry, max_visible_rows):
|
||||||
|
@ -937,7 +947,8 @@ class PathAutoCompleter(object):
|
||||||
self.signal_handlers["on_completion_popup_window_key_press_event"] = \
|
self.signal_handlers["on_completion_popup_window_key_press_event"] = \
|
||||||
self.on_completion_popup_window_key_press_event
|
self.on_completion_popup_window_key_press_event
|
||||||
# We must set the signal handler here to get the handler ID.
|
# We must set the signal handler here to get the handler ID.
|
||||||
self.text_entry_delete_handler_id = self.path_entry.text_entry.connect("delete-text", self.on_entry_text_delete_text)
|
self.text_entry_delete_handler_id = \
|
||||||
|
self.path_entry.text_entry.connect("delete-text", self.on_entry_text_delete_text)
|
||||||
self.signal_handlers["on_entry_text_insert_text"] = \
|
self.signal_handlers["on_entry_text_insert_text"] = \
|
||||||
self.on_entry_text_insert_text
|
self.on_entry_text_insert_text
|
||||||
self.accelerator_string = gtk.accelerator_name(keysyms.Tab, 0)
|
self.accelerator_string = gtk.accelerator_name(keysyms.Tab, 0)
|
||||||
|
@ -960,8 +971,7 @@ class PathAutoCompleter(object):
|
||||||
"""
|
"""
|
||||||
if self.completion_popup.is_popped_up():
|
if self.completion_popup.is_popped_up():
|
||||||
cur_text = self.path_entry.get_text()
|
cur_text = self.path_entry.get_text()
|
||||||
pos = entry.get_position()
|
new_complete_text = cur_text[:start] + cur_text[end:]
|
||||||
new_complete_text = cur_text[:start] + cur_text[end:]
|
|
||||||
self.do_completion(value=new_complete_text, forward_completion=False)
|
self.do_completion(value=new_complete_text, forward_completion=False)
|
||||||
|
|
||||||
def set_use_popup(self, use):
|
def set_use_popup(self, use):
|
||||||
|
@ -1021,6 +1031,7 @@ class PathAutoCompleter(object):
|
||||||
elif self.completion_popup.is_popped_up() and args["forward_completion"]:
|
elif self.completion_popup.is_popped_up() and args["forward_completion"]:
|
||||||
self.completion_popup.popdown()
|
self.completion_popup.popdown()
|
||||||
|
|
||||||
|
|
||||||
class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
||||||
|
|
||||||
__gsignals__ = {
|
__gsignals__ = {
|
||||||
|
@ -1036,7 +1047,7 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
||||||
"accelerator-set": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (object, )),
|
"accelerator-set": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (object, )),
|
||||||
"max-rows-changed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (object, )),
|
"max-rows-changed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (object, )),
|
||||||
"text-changed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (object, )),
|
"text-changed": (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (object, )),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, max_visible_rows=20, auto_complete=True, use_completer_popup=True):
|
def __init__(self, max_visible_rows=20, auto_complete=True, use_completer_popup=True):
|
||||||
gtk.HBox.__init__(self)
|
gtk.HBox.__init__(self)
|
||||||
|
@ -1079,7 +1090,7 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
||||||
"on_button_open_dialog_clicked": self._on_button_open_dialog_clicked,
|
"on_button_open_dialog_clicked": self._on_button_open_dialog_clicked,
|
||||||
"on_entry_text_focus_out_event": self._on_entry_text_focus_out_event,
|
"on_entry_text_focus_out_event": self._on_entry_text_focus_out_event,
|
||||||
"on_entry_text_changed": self.on_entry_text_changed,
|
"on_entry_text_changed": self.on_entry_text_changed,
|
||||||
}
|
}
|
||||||
signal_handlers.update(self.signal_handlers)
|
signal_handlers.update(self.signal_handlers)
|
||||||
signal_handlers.update(self.auto_completer.signal_handlers)
|
signal_handlers.update(self.auto_completer.signal_handlers)
|
||||||
signal_handlers.update(self.config_dialog_signal_handlers)
|
signal_handlers.update(self.config_dialog_signal_handlers)
|
||||||
|
@ -1108,7 +1119,8 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
||||||
self.tooltips.set_tip(self.combo_hbox, text)
|
self.tooltips.set_tip(self.combo_hbox, text)
|
||||||
if default_text:
|
if default_text:
|
||||||
self.default_text = text
|
self.default_text = text
|
||||||
self.tooltips.set_tip(self.button_default, "Restore the default value in the text entry:\n%s" % self.default_text)
|
self.tooltips.set_tip(self.button_default,
|
||||||
|
"Restore the default value in the text entry:\n%s" % self.default_text)
|
||||||
self.button_default.set_sensitive(True)
|
self.button_default.set_sensitive(True)
|
||||||
# Set text for the filechooser dialog button
|
# Set text for the filechooser dialog button
|
||||||
folder_name = ""
|
folder_name = ""
|
||||||
|
@ -1344,7 +1356,6 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def _on_button_toggle_dropdown_toggled(self, button):
|
def _on_button_toggle_dropdown_toggled(self, button):
|
||||||
"""
|
"""
|
||||||
Shows the popup when clicking the toggle button.
|
Shows the popup when clicking the toggle button.
|
||||||
|
@ -1394,7 +1405,6 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
||||||
|
|
||||||
def _setup_config_dialog(self):
|
def _setup_config_dialog(self):
|
||||||
self.config_dialog = self.builder.get_object("completion_config_dialog")
|
self.config_dialog = self.builder.get_object("completion_config_dialog")
|
||||||
close_button = self.builder.get_object("config_dialog_button_close")
|
|
||||||
self.enable_completion = self.builder.get_object("enable_auto_completion_checkbutton")
|
self.enable_completion = self.builder.get_object("enable_auto_completion_checkbutton")
|
||||||
self.show_filechooser_checkbutton = self.builder.get_object("show_filechooser_checkbutton")
|
self.show_filechooser_checkbutton = self.builder.get_object("show_filechooser_checkbutton")
|
||||||
self.show_path_entry_checkbutton = self.builder.get_object("show_path_entry_checkbutton")
|
self.show_path_entry_checkbutton = self.builder.get_object("show_path_entry_checkbutton")
|
||||||
|
@ -1502,7 +1512,7 @@ class PathChooserComboBox(gtk.HBox, StoredValuesPopup, gobject.GObject):
|
||||||
"on_completion_config_dialog_key_release_event": on_completion_config_dialog_key_release_event,
|
"on_completion_config_dialog_key_release_event": on_completion_config_dialog_key_release_event,
|
||||||
"on_set_completion_accelerator_button_clicked": on_set_completion_accelerator_button_clicked,
|
"on_set_completion_accelerator_button_clicked": on_set_completion_accelerator_button_clicked,
|
||||||
"on_show_hidden_files_checkbutton_toggled": on_show_hidden_files_toggled,
|
"on_show_hidden_files_checkbutton_toggled": on_show_hidden_files_toggled,
|
||||||
}
|
}
|
||||||
|
|
||||||
gobject.type_register(PathChooserComboBox)
|
gobject.type_register(PathChooserComboBox)
|
||||||
|
|
||||||
|
@ -1520,7 +1530,7 @@ if __name__ == "__main__":
|
||||||
return "%s/glade/%s" % (os.path.abspath(os.path.dirname(sys.argv[0])), filename)
|
return "%s/glade/%s" % (os.path.abspath(os.path.dirname(sys.argv[0])), filename)
|
||||||
|
|
||||||
# Override get_resource which fetches from deluge install
|
# Override get_resource which fetches from deluge install
|
||||||
get_resource = get_resource2
|
# get_resource = get_resource2
|
||||||
|
|
||||||
entry1 = PathChooserComboBox(max_visible_rows=15)
|
entry1 = PathChooserComboBox(max_visible_rows=15)
|
||||||
entry2 = PathChooserComboBox()
|
entry2 = PathChooserComboBox()
|
||||||
|
@ -1529,21 +1539,22 @@ if __name__ == "__main__":
|
||||||
box1.add(entry2)
|
box1.add(entry2)
|
||||||
|
|
||||||
paths = [
|
paths = [
|
||||||
"/home/bro/Downloads",
|
"/home/bro/Downloads",
|
||||||
"/media/Movies-HD",
|
"/media/Movies-HD",
|
||||||
"/media/torrent/in",
|
"/media/torrent/in",
|
||||||
"/media/Live-show/Misc",
|
"/media/Live-show/Misc",
|
||||||
"/media/Live-show/Consert",
|
"/media/Live-show/Consert",
|
||||||
"/media/Series/1/",
|
"/media/Series/1/",
|
||||||
"/media/Series/2",
|
"/media/Series/2",
|
||||||
"/media/Series/17",
|
"/media/Series/17",
|
||||||
"/media/Series/18",
|
"/media/Series/18",
|
||||||
"/media/Series/19"
|
"/media/Series/19"
|
||||||
]
|
]
|
||||||
|
|
||||||
entry1.add_values(paths)
|
entry1.add_values(paths)
|
||||||
entry1.set_text("/home/bro/", default_text=True)
|
entry1.set_text("/home/bro/", default_text=True)
|
||||||
entry2.set_text("/home/bro/programmer/deluge/deluge-yarss-plugin/build/lib/yarss2/include/bs4/tests/", cursor_end=False)
|
entry2.set_text("/home/bro/programmer/deluge/deluge-yarss-plugin/build/lib/yarss2/include/bs4/tests/",
|
||||||
|
cursor_end=False)
|
||||||
|
|
||||||
entry2.set_filechooser_button_visible(False)
|
entry2.set_filechooser_button_visible(False)
|
||||||
#entry2.set_enable_properties(False)
|
#entry2.set_enable_properties(False)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue