PageUp/PageDown impl

This commit is contained in:
Dmitriy Yefremov
2017-11-03 23:39:15 +03:00
parent d555e511ff
commit a88ca84c01
5 changed files with 178 additions and 121 deletions

View File

@@ -166,6 +166,70 @@ dmitry.v.yefremov@gmail.com
<action-widget response="-5">button4</action-widget>
</action-widgets>
</object>
<object class="GtkFileChooserDialog" id="path_chooser_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes"> </property>
<property name="modal">True</property>
<property name="destroy_with_parent">True</property>
<property name="icon_name">document-open</property>
<property name="type_hint">dialog</property>
<property name="action">save</property>
<property name="do_overwrite_confirmation">True</property>
<child internal-child="vbox">
<object class="GtkBox" id="filechooser_dialog_vbox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="filechooser_dialog_action_area">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button2">
<property name="label">gtk-undo</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<property name="yalign">0.55000001192092896</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">button2</action-widget>
<action-widget response="-12">button1</action-widget>
</action-widgets>
</object>
<object class="GtkMessageDialog" id="question_dialog">
<property name="width_request">320</property>
<property name="can_focus">False</property>
@@ -520,66 +584,4 @@ dmitry.v.yefremov@gmail.com
<action-widget response="-5">ok_button</action-widget>
</action-widgets>
</object>
<object class="GtkFileChooserDialog" id="path_chooser_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes"> </property>
<property name="icon_name">document-open</property>
<property name="type_hint">dialog</property>
<property name="transient_for">settings_dialog</property>
<property name="action">save</property>
<child internal-child="vbox">
<object class="GtkBox" id="filechooserdialog-vbox3">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="filechooserdialog-action_area3">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button2">
<property name="label">gtk-undo</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<property name="yalign">0.55000001192092896</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">button2</action-widget>
<action-widget response="-12">button1</action-widget>
</action-widgets>
</object>
</interface>

View File

@@ -107,6 +107,14 @@ def move_items(key):
prev_itr = model.iter_previous(itr)
if prev_itr:
model.move_before(itr, prev_itr)
elif key == Gdk.KEY_Page_Up:
up_itr = model.get_iter(__fav_view.get_cursor()[0])
if up_itr:
model.move_before(itr, up_itr)
elif key == Gdk.KEY_Page_Down:
down_itr = model.get_iter(__fav_view.get_cursor()[0])
if down_itr:
model.move_after(itr, down_itr)
def on_cut(view):
@@ -424,6 +432,11 @@ def on_fav_selection(model, path, column):
def on_bouquets_selection(model, path, column):
__fav_model.clear()
if __bouquets_view.row_expanded(path):
__bouquets_view.collapse_row(path)
else:
__bouquets_view.expand_row(path, column)
if len(path) > 1:
delete_selection(__services_view)
update_bouquet_channels(model, path)
@@ -496,18 +509,21 @@ def on_preferences(item):
show_settings_dialog(__main_window, __options)
def on_tree_view_key_release(view, event):
def on_tree_view_key_release(view: Gtk.TreeView, event):
""" Handling keystrokes """
key = event.keyval
ctrl = event.state & Gdk.ModifierType.CONTROL_MASK
alt = event.state & Gdk.ModifierType.MOD1_MASK
model_name = view.get_model().get_name()
if key == Gdk.KEY_Delete:
on_delete(view)
elif ctrl and key == Gdk.KEY_Up:
move_items(Gdk.KEY_Up)
elif ctrl and key == Gdk.KEY_Down:
move_items(Gdk.KEY_Down)
elif ctrl and key == Gdk.KEY_Up or key == Gdk.KEY_Page_Up:
move_items(key)
elif ctrl and key == Gdk.KEY_Down or key == Gdk.KEY_Page_Down:
move_items(key)
elif model_name == FAV_LIST_NAME and key == Gdk.KEY_Control_L or key == Gdk.KEY_Control_R:
update_fav_num_column(view.get_model())
elif key == Gdk.KEY_Insert:
# Move items from main to fav list
if model_name == SERVICE_LIST_NAME:
@@ -523,6 +539,10 @@ def on_tree_view_key_release(view, event):
on_cut(view)
elif ctrl and key == Gdk.KEY_v or key == Gdk.KEY_V:
on_paste(view)
elif ctrl and key == Gdk.KEY_s or key == Gdk.KEY_S:
on_data_save()
elif key == Gdk.KEY_space and model_name == FAV_LIST_NAME:
pass
@run_task

View File

@@ -171,7 +171,7 @@
<object class="GtkDialog" id="satellites_editor_dialog">
<property name="width_request">640</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Satellites</property>
<property name="title" translatable="yes">Satellites edit tool</property>
<property name="modal">True</property>
<property name="destroy_with_parent">True</property>
<property name="icon_name">applications-utilities</property>
@@ -300,6 +300,7 @@
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_add" object="satellites_editor_tree_view" swapped="no"/>
</object>
</child>
<child>
@@ -319,7 +320,7 @@
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_remove" object="tree_view_selection" swapped="no"/>
<signal name="activate" handler="on_remove" object="satellites_editor_tree_view" swapped="no"/>
</object>
</child>
</object>
@@ -343,8 +344,8 @@
<property name="can_focus">False</property>
<property name="label" translatable="yes">Load</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-goto-bottom</property>
<signal name="clicked" handler="on_satellites_list_load" object="satellites_tree_store" swapped="no"/>
<property name="stock_id">gtk-open</property>
<signal name="clicked" handler="on_open" object="satellites_tree_store" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
@@ -452,6 +453,7 @@
<property name="enable_tree_lines">True</property>
<signal name="button-press-event" handler="on_popup_menu" object="popup_menu" swapped="no"/>
<signal name="key-release-event" handler="on_key_release" swapped="no"/>
<signal name="row-activated" handler="on_row_activated" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="tree_view_selection">
<property name="mode">multiple</property>

View File

@@ -13,19 +13,21 @@ def show_satellites_dialog(transient, options):
class SatellitesDialog:
_aggr = [None for x in range(9)] # aggregate
__slots__ = ["_dialog", "_data_path", "_stores", "_options"]
__slots__ = ["_dialog", "_data_path", "_stores", "_options", "_sat_view"]
def __init__(self, transient, options):
self._data_path = options["data_dir_path"]
self._options = options
handlers = {"on_satellites_list_load": self.on_satellites_list_load,
handlers = {"on_open": self.on_open,
"on_remove": self.on_remove,
"on_save": self.on_save,
"on_popup_menu": self.on_popup_menu,
"on_add": self.on_add,
"on_edit": self.on_edit,
"on_key_release": self.on_key_release,
"on_row_activated": self.on_row_activated,
"on_resize": self.on_resize}
builder = Gtk.Builder()
@@ -36,6 +38,7 @@ class SatellitesDialog:
self._dialog = builder.get_object("satellites_editor_dialog")
self._dialog.set_transient_for(transient)
self._dialog.get_content_area().set_border_width(0) # The width of the border around the main dialog area!
self._sat_view = builder.get_object("satellites_editor_tree_view")
# Setting the last size of the dialog window if it was saved
window_size = self._options.get("sat_editor_window_size", None)
if window_size:
@@ -45,6 +48,7 @@ class SatellitesDialog:
4: builder.get_object("fec_store"),
5: builder.get_object("system_store"),
6: builder.get_object("mod_store")}
self.on_satellites_list_load(self._sat_view.get_model())
def run(self):
self._dialog.run()
@@ -57,6 +61,27 @@ class SatellitesDialog:
if self._options:
self._options["sat_editor_window_size"] = window.get_size()
def on_open(self, model):
builder = Gtk.Builder()
builder.add_objects_from_file("./ui/dialogs.glade", ("path_chooser_dialog",))
ch_dialog = builder.get_object("path_chooser_dialog")
ch_dialog.set_transient_for(self._dialog)
if ch_dialog.run() == 12:
path = ch_dialog.get_filename()
if path:
print(path)
self._data_path = path
self.on_satellites_list_load(model)
ch_dialog.destroy()
@staticmethod
def on_row_activated(view, path, column):
if view.row_expanded(path):
view.collapse_row(path)
else:
view.expand_row(path, column)
def on_key_release(self, view, event):
""" Handling keystrokes """
key = event.keyval
@@ -68,6 +93,12 @@ class SatellitesDialog:
self.on_add(view)
elif key == Gdk.KEY_F2:
self.on_edit(view)
elif ctrl and Gdk.KEY_s or Gdk.KEY_S:
self.on_satellite()
elif ctrl and Gdk.KEY_t or Gdk.KEY_T:
self.on_transponder()
elif key == Gdk.KEY_space:
pass
@run_task
def on_satellites_list_load(self, model):

View File

@@ -1,59 +1,61 @@
from main.properties import write_config
from . import Gtk
__current_data_path = ""
def show_settings_dialog(transient, options):
handlers = {"on_data_dir_field_icon_press": on_data_dir_field_icon_press}
builder = Gtk.Builder()
builder.add_from_file("ui/dialogs.glade")
builder.connect_signals(handlers)
dialog = builder.get_object("settings_dialog")
dialog.set_transient_for(transient)
host_field = builder.get_object("host_field")
host_field.set_text(options["host"])
port_field = builder.get_object("port_field")
port_field.set_text(options["port"])
login_field = builder.get_object("login_field")
login_field.set_text(options["user"])
password_field = builder.get_object("password_field")
password_field.set_text(options["password"])
services_field = builder.get_object("services_field")
services_field.set_text(options["services_path"])
user_bouquet_field = builder.get_object("user_bouquet_field")
user_bouquet_field.set_text(options["user_bouquet_path"])
satellites_xml_field = builder.get_object("satellites_xml_field")
satellites_xml_field.set_text(options["satellites_xml_path"])
data_dir_field = builder.get_object("data_dir_field")
data_dir_field.set_text(options["data_dir_path"])
global __current_data_path
__current_data_path = options["data_dir_path"]
if dialog.run() == Gtk.ResponseType.OK:
options["host"] = host_field.get_text()
options["port"] = port_field.get_text()
options["user"] = login_field.get_text()
options["password"] = password_field.get_text()
options["services_path"] = services_field.get_text()
options["user_bouquet_path"] = user_bouquet_field.get_text()
options["satellites_xml_path"] = satellites_xml_field.get_text()
options["data_dir_path"] = data_dir_field.get_text()
write_config(options)
dialog.destroy()
SettingsDialog(transient, options)
def on_data_dir_field_icon_press(entry, icon, event_button):
builder = Gtk.Builder()
builder.add_from_file("ui/dialogs.glade")
dialog = builder.get_object("path_chooser_dialog")
dialog.set_current_folder(__current_data_path)
response = dialog.run()
if response == -12: # -12 for fix assertion 'gtk_widget_get_can_default (widget)' failed
entry.set_text(dialog.get_filename() if dialog.get_filename() else __current_data_path)
dialog.destroy()
class SettingsDialog:
def __init__(self, transient, options):
handlers = {"on_data_dir_field_icon_press": self.on_data_dir_field_icon_press}
builder = Gtk.Builder()
builder.add_from_file("ui/dialogs.glade")
builder.connect_signals(handlers)
self._dialog = builder.get_object("settings_dialog")
self._dialog.set_transient_for(transient)
self._host_field = builder.get_object("host_field")
self._host_field.set_text(options["host"])
self._port_field = builder.get_object("port_field")
self._port_field.set_text(options["port"])
self._login_field = builder.get_object("login_field")
self._login_field.set_text(options["user"])
self._password_field = builder.get_object("password_field")
self._password_field.set_text(options["password"])
self._services_field = builder.get_object("services_field")
self._services_field.set_text(options["services_path"])
self._user_bouquet_field = builder.get_object("user_bouquet_field")
self._user_bouquet_field.set_text(options["user_bouquet_path"])
self._satellites_xml_field = builder.get_object("satellites_xml_field")
self._satellites_xml_field.set_text(options["satellites_xml_path"])
self._data_dir_field = builder.get_object("data_dir_field")
self._data_dir_field.set_text(options["data_dir_path"])
self._current_data_path = options["data_dir_path"]
return response
if self._dialog.run() == Gtk.ResponseType.OK:
options["host"] = self._host_field.get_text()
options["port"] = self._port_field.get_text()
options["user"] = self._login_field.get_text()
options["password"] = self._password_field.get_text()
options["services_path"] = self._services_field.get_text()
options["user_bouquet_path"] = self._user_bouquet_field.get_text()
options["satellites_xml_path"] = self._satellites_xml_field.get_text()
options["data_dir_path"] = self._data_dir_field.get_text()
write_config(options)
self._dialog.destroy()
def on_data_dir_field_icon_press(self, entry, icon, event_button):
builder = Gtk.Builder()
builder.add_from_file("ui/dialogs.glade")
dialog = builder.get_object("path_chooser_dialog")
dialog.set_transient_for(self._dialog)
dialog.set_current_folder(self._current_data_path)
response = dialog.run()
if response == -12: # -12 for fix assertion 'gtk_widget_get_can_default (widget)' failed
entry.set_text(dialog.get_filename() if dialog.get_filename() else self._current_data_path)
dialog.destroy()
return response
if __name__ == "__main__":