Added some keyboard controls
This commit is contained in:
parent
85a9c5d899
commit
e4ac63e01d
@ -35,6 +35,8 @@
|
||||
<property name="default-height">830</property>
|
||||
<property name="icon">pyfm.png</property>
|
||||
<property name="gravity">center</property>
|
||||
<signal name="key-press-event" handler="global_key_press_controller" swapped="no"/>
|
||||
<signal name="key-release-event" handler="global_key_release_controller" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
@ -140,6 +142,7 @@
|
||||
<property name="can-focus">False</property>
|
||||
<property name="use-underline">True</property>
|
||||
<property name="use-stock">True</property>
|
||||
<signal name="button-release-event" handler="menu_bar_copy" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
@ -307,7 +310,7 @@
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<object class="GtkButton" id="go_home">
|
||||
<property name="label">gtk-home</property>
|
||||
<property name="name">go_home</property>
|
||||
<property name="visible">True</property>
|
||||
@ -324,7 +327,7 @@
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<object class="GtkButton" id="refresh_view">
|
||||
<property name="label">gtk-refresh</property>
|
||||
<property name="name">refresh_view</property>
|
||||
<property name="visible">True</property>
|
||||
@ -341,7 +344,7 @@
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<object class="GtkButton" id="go_up">
|
||||
<property name="label">gtk-go-up</property>
|
||||
<property name="name">go_up</property>
|
||||
<property name="visible">True</property>
|
||||
@ -373,7 +376,7 @@
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<object class="GtkButton" id="create_tab">
|
||||
<property name="label">gtk-add</property>
|
||||
<property name="name">create_tab</property>
|
||||
<property name="visible">True</property>
|
||||
@ -417,6 +420,7 @@
|
||||
<property name="name">notebook1</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="has-focus">True</property>
|
||||
<property name="margin-left">5</property>
|
||||
<property name="margin-right">5</property>
|
||||
<property name="margin-top">5</property>
|
||||
|
@ -4,7 +4,9 @@ import threading, subprocess, signal, inspect, os, time
|
||||
# Gtk imports
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk as gtk
|
||||
gi.require_version('Gdk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk
|
||||
from gi.repository import GLib
|
||||
|
||||
# Application imports
|
||||
@ -19,7 +21,7 @@ def threaded(fn):
|
||||
return wrapper
|
||||
|
||||
|
||||
class Signals(WindowMixin, PaneMixin):
|
||||
class Signals(PaneMixin, WindowMixin):
|
||||
def __init__(self, settings):
|
||||
self.settings = settings
|
||||
self.builder = self.settings.builder
|
||||
@ -41,6 +43,10 @@ class Signals(WindowMixin, PaneMixin):
|
||||
self.is_pane3_hidden = False
|
||||
self.is_pane4_hidden = False
|
||||
|
||||
self.ctrlDown = False
|
||||
self.shiftDown = False
|
||||
self.altDown = False
|
||||
|
||||
self.window.show()
|
||||
self.generate_windows(self.state)
|
||||
|
||||
@ -73,11 +79,63 @@ class Signals(WindowMixin, PaneMixin):
|
||||
self.load_store(view, store)
|
||||
|
||||
|
||||
|
||||
|
||||
def global_key_press_controller(self, eve, user_data):
|
||||
keyname = Gdk.keyval_name(user_data.keyval).lower()
|
||||
if "control" in keyname or "alt" in keyname or "shift" in keyname:
|
||||
if "control" in keyname:
|
||||
self.ctrlDown = True
|
||||
if "shift" in keyname:
|
||||
self.shiftDown = True
|
||||
if "alt" in keyname:
|
||||
self.altDown = True
|
||||
|
||||
# NOTE: Yes, this should actually be mapped to some key
|
||||
# controller setting file or something. Sue me.
|
||||
def global_key_release_controller(self, eve, user_data):
|
||||
keyname = Gdk.keyval_name(user_data.keyval).lower()
|
||||
if debug:
|
||||
print(f"global_key_release_controller > key > {keyname}")
|
||||
|
||||
if "control" in keyname or "alt" in keyname or "shift" in keyname:
|
||||
if "control" in keyname:
|
||||
self.ctrlDown = False
|
||||
if "shift" in keyname:
|
||||
self.shiftDown = False
|
||||
if "alt" in keyname:
|
||||
self.altDown = False
|
||||
|
||||
if (self.ctrlDown and keyname == "h") or keyname == "home":
|
||||
self.builder.get_object("go_home").released()
|
||||
if self.ctrlDown and keyname == "r":
|
||||
self.builder.get_object("refresh_view").released()
|
||||
if (self.ctrlDown and keyname == "up") or (self.ctrlDown and keyname == "up"):
|
||||
self.builder.get_object("go_up").released()
|
||||
if self.ctrlDown and keyname == "l":
|
||||
self.builder.get_object("path_entry").grab_focus()
|
||||
if self.ctrlDown and keyname == "t":
|
||||
self.builder.get_object("create_tab").released()
|
||||
if self.ctrlDown and keyname == "w":
|
||||
print("[close tab] stub...")
|
||||
|
||||
if self.ctrlDown and keyname == "period":
|
||||
wid, tid = self.window_controller.get_active_data()
|
||||
view = self.get_fm_window(wid).get_view_by_id(tid)
|
||||
view.hide_hidden = not view.hide_hidden
|
||||
view.load_directory()
|
||||
self.builder.get_object("refresh_view").released()
|
||||
if self.ctrlDown and keyname == "c":
|
||||
print("[copy] stub...")
|
||||
if self.ctrlDown and keyname == "v":
|
||||
print("[paste] stub...")
|
||||
|
||||
|
||||
def tear_down(self, widget=None, eve=None):
|
||||
self.window_controller.save_state()
|
||||
event_system.monitor_events = False
|
||||
time.sleep(event_sleep_time)
|
||||
gtk.main_quit()
|
||||
Gtk.main_quit()
|
||||
|
||||
def generate_windows(self, data = None):
|
||||
if data:
|
||||
|
@ -34,7 +34,7 @@ class TabMixin(WidgetMixin):
|
||||
def close_tab(self, widget, eve):
|
||||
notebook = widget.get_parent().get_parent()
|
||||
page = notebook.get_current_page()
|
||||
tid = self.get_tab_id_from_widget(widget.get_parent())
|
||||
tid = self.get_tab_id_from_tab_box(widget.get_parent())
|
||||
wid = int(notebook.get_name()[-1])
|
||||
|
||||
self.get_fm_window(wid).delete_view_by_id(tid)
|
||||
@ -43,17 +43,20 @@ class TabMixin(WidgetMixin):
|
||||
self.set_window_title()
|
||||
|
||||
def on_tab_switch_update(self, notebook, content=None, index=None):
|
||||
wid, tid = content.get_children()[0].get_name().split("|")
|
||||
wid, tid = content.get_children()[0].get_name().split("|")
|
||||
self.window_controller.set_active_data(wid, tid)
|
||||
self.set_path_text(wid, tid)
|
||||
self.set_window_title()
|
||||
|
||||
def get_tab_id_from_widget(self, tab_box):
|
||||
def get_tab_id_from_tab_box(self, tab_box):
|
||||
tid = tab_box.get_children()[2]
|
||||
return tid.get_text()
|
||||
|
||||
def get_tab_label_widget_from_widget(self, notebook, widget):
|
||||
return notebook.get_tab_label(widget.get_parent()).get_children()[0]
|
||||
def get_tab_label(self, notebook, iconview):
|
||||
return notebook.get_tab_label(iconview.get_parent()).get_children()[0]
|
||||
|
||||
def get_tab_iconview_from_notebook(self, notebook):
|
||||
return notebook.get_children()[1].get_children()[0]
|
||||
|
||||
|
||||
def do_action_from_bar_controls(self, widget, eve=None):
|
||||
@ -74,7 +77,11 @@ class TabMixin(WidgetMixin):
|
||||
self.create_tab(wid, dir)
|
||||
return
|
||||
if action == "path_entry":
|
||||
path = widget.get_text()
|
||||
path = widget.get_text()
|
||||
dir = view.get_current_directory() + "/"
|
||||
if path == dir :
|
||||
return
|
||||
|
||||
traversed = view.set_path(path)
|
||||
if not traversed:
|
||||
return
|
||||
@ -86,6 +93,17 @@ class TabMixin(WidgetMixin):
|
||||
|
||||
|
||||
# File control events
|
||||
def get_uris(self, store, treePaths=None):
|
||||
uris = []
|
||||
|
||||
for path in treePaths:
|
||||
itr = store.get_iter(path)
|
||||
file = store.get(itr, 1)[0]
|
||||
fpath = f"file://{dir}/{file}"
|
||||
uris.append(fpath)
|
||||
|
||||
return uris
|
||||
|
||||
def create_file(self):
|
||||
pass
|
||||
|
||||
@ -103,8 +121,28 @@ class TabMixin(WidgetMixin):
|
||||
def move_file(self, view, fFile, tFile):
|
||||
view.move_file(fFile.replace("file://", ""), tFile)
|
||||
|
||||
def menu_bar_copy(self, widget, eve):
|
||||
self.copy_file()
|
||||
|
||||
def copy_file(self):
|
||||
pass
|
||||
wid, tid = self.window_controller.get_active_data()
|
||||
print(wid)
|
||||
print(tid)
|
||||
notebook = self.builder.get_object(f"window_{wid}")
|
||||
iconview = self.get_tab_iconview_from_notebook(notebook)
|
||||
print(iconview)
|
||||
store = iconview.get_model()
|
||||
treePaths = iconview.get_selected_items()
|
||||
|
||||
print(len(treePaths))
|
||||
for path in treePaths:
|
||||
itr = store.get_iter(path)
|
||||
file = store.get(itr, 1)[0]
|
||||
# print(file)
|
||||
|
||||
# uris = self.get_uris(store, treePaths)
|
||||
# print(uris)
|
||||
|
||||
|
||||
def cut_file(self):
|
||||
pass
|
||||
|
@ -51,7 +51,10 @@ class WidgetMixin:
|
||||
if not icon:
|
||||
icon = self.get_system_thumbnail(fpath, view.SYS_ICON_WH[0])
|
||||
if not icon:
|
||||
icon = GdkPixbuf.Pixbuf.new_from_file(view.DEFAULT_ICON)
|
||||
if fpath.endswith(".gif"):
|
||||
icon = GdkPixbuf.PixbufAnimation.get_static_image(fpath)
|
||||
else:
|
||||
icon = GdkPixbuf.Pixbuf.new_from_file(view.DEFAULT_ICON)
|
||||
|
||||
store.set_value(itr, 0, icon)
|
||||
|
||||
@ -143,34 +146,47 @@ class WidgetMixin:
|
||||
scroll = Gtk.ScrolledWindow()
|
||||
grid = Gtk.TreeView()
|
||||
store = Gtk.ListStore(GdkPixbuf.Pixbuf, str)
|
||||
# store = Gtk.TreeStore(GdkPixbuf.Pixbuf, str)
|
||||
column = Gtk.TreeViewColumn("Icons")
|
||||
icon = Gtk.CellRendererPixbuf()
|
||||
name = Gtk.CellRendererText()
|
||||
selec = grid.get_selection()
|
||||
|
||||
grid.set_model(store)
|
||||
selec.set_mode(3)
|
||||
column.pack_start(icon, False)
|
||||
column.pack_start(name, True)
|
||||
column.add_attribute(icon, "pixbuf", 0)
|
||||
column.add_attribute(name, "text", 1)
|
||||
column.set_expand(True)
|
||||
column.set_expand(False)
|
||||
column.set_sizing(2)
|
||||
column.set_min_width(120)
|
||||
column.set_max_width(74)
|
||||
|
||||
grid.append_column(column)
|
||||
grid.set_search_column(1)
|
||||
grid.set_rubber_banding(True)
|
||||
grid.set_headers_visible(False)
|
||||
grid.set_enable_tree_lines(False)
|
||||
grid.set_visible(True)
|
||||
|
||||
grid.connect("button_release_event", self.grid_icon_single_left_click)
|
||||
grid.connect("item-activated", self.grid_icon_double_left_click)
|
||||
grid.connect("row-activated", self.grid_icon_double_left_click)
|
||||
grid.connect("drag-data-get", self.grid_on_drag_set)
|
||||
grid.connect("drag-data-received", self.grid_on_drag_data_received)
|
||||
grid.connect("drag-motion", self.grid_on_drag_motion)
|
||||
|
||||
URI_TARGET_TYPE = 80
|
||||
uri_target = Gtk.TargetEntry.new('text/uri-list', Gtk.TargetFlags(0), URI_TARGET_TYPE)
|
||||
targets = [ uri_target ]
|
||||
action = Gdk.DragAction.COPY
|
||||
grid.enable_model_drag_dest(targets, action)
|
||||
grid.enable_model_drag_source(0, targets, action)
|
||||
|
||||
column.set_visible(True)
|
||||
icon.set_visible(True)
|
||||
name.set_visible(True)
|
||||
|
||||
grid.show_all()
|
||||
scroll.add(grid)
|
||||
grid.set_name(f"{wid}|{view.id}")
|
||||
grid.columns_autosize()
|
||||
return scroll, store
|
||||
|
||||
|
||||
|
@ -24,16 +24,16 @@ class WindowMixin(TabMixin):
|
||||
wid, tid = self.window_controller.get_active_data()
|
||||
view = self.get_fm_window(wid).get_view_by_id(tid)
|
||||
dir = view.get_current_directory()
|
||||
self.window.set_title(dir)
|
||||
self.window.set_title("PyFM ~ " + dir)
|
||||
|
||||
def set_path_text(self, wid, tid):
|
||||
path_entry = self.builder.get_object("path_entry")
|
||||
view = self.get_fm_window(wid).get_view_by_id(tid)
|
||||
path_entry.set_text(view.get_current_directory())
|
||||
|
||||
def grid_icon_single_left_click(self, widget, eve):
|
||||
def grid_icon_single_left_click(self, iconview, eve):
|
||||
try:
|
||||
wid, tid = widget.get_name().split("|")
|
||||
wid, tid = iconview.get_name().split("|")
|
||||
self.window_controller.set_active_data(wid, tid)
|
||||
|
||||
if eve.type == Gdk.EventType.BUTTON_RELEASE and eve.button == 1: # l-click
|
||||
@ -41,7 +41,7 @@ class WindowMixin(TabMixin):
|
||||
self.set_window_title()
|
||||
|
||||
if self.single_click_open: # FIXME: need to find a way to pass the model index
|
||||
self.grid_icon_double_left_click(widget)
|
||||
self.grid_icon_double_left_click(iconview)
|
||||
elif eve.type == Gdk.EventType.BUTTON_RELEASE and eve.button == 3: # r-click
|
||||
pass
|
||||
# input = self.builder.get_object("filenameInput")
|
||||
@ -73,15 +73,15 @@ class WindowMixin(TabMixin):
|
||||
except Exception as e:
|
||||
print(repr(e))
|
||||
|
||||
def grid_icon_double_left_click(self, widget, item):
|
||||
def grid_icon_double_left_click(self, iconview, item, data=None):
|
||||
try:
|
||||
wid, tid = self.window_controller.get_active_data()
|
||||
notebook = self.builder.get_object(f"window_{wid}")
|
||||
path_entry = self.builder.get_object(f"path_entry")
|
||||
tab_label = self.get_tab_label_widget_from_widget(notebook, widget)
|
||||
tab_label = self.get_tab_label(notebook, iconview)
|
||||
|
||||
view = self.get_fm_window(wid).get_view_by_id(tid)
|
||||
model = widget.get_model()
|
||||
model = iconview.get_model()
|
||||
|
||||
fileName = model[item][1]
|
||||
dir = view.get_current_directory()
|
||||
@ -101,10 +101,12 @@ class WindowMixin(TabMixin):
|
||||
except Exception as e:
|
||||
print(repr(e))
|
||||
|
||||
def grid_on_drag_set(self, widget, drag_context, data, info, time):
|
||||
action = widget.get_name()
|
||||
store = widget.get_model()
|
||||
treePaths = widget.get_selected_items()
|
||||
|
||||
|
||||
def grid_on_drag_set(self, iconview, drag_context, data, info, time):
|
||||
action = iconview.get_name()
|
||||
store = iconview.get_model()
|
||||
treePaths = iconview.get_selected_items()
|
||||
wid, tid = action.split("|")
|
||||
view = self.get_fm_window(wid).get_view_by_id(tid)
|
||||
dir = view.get_current_directory()
|
||||
@ -119,8 +121,8 @@ class WindowMixin(TabMixin):
|
||||
data.set_uris(uris)
|
||||
event_system.push_gui_event(["refresh_tab", None, action])
|
||||
|
||||
def grid_on_drag_motion(self, widget, drag_context, x, y, data):
|
||||
wid, tid = widget.get_name().split("|")
|
||||
def grid_on_drag_motion(self, iconview, drag_context, x, y, data):
|
||||
wid, tid = iconview.get_name().split("|")
|
||||
self.window_controller.set_active_data(wid, tid)
|
||||
|
||||
def grid_on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
|
||||
@ -128,8 +130,8 @@ class WindowMixin(TabMixin):
|
||||
wid, tid = self.window_controller.get_active_data()
|
||||
notebook = self.builder.get_object(f"window_{wid}")
|
||||
store, tab_label = self.get_store_and_label_from_notebook(notebook, f"{wid}|{tid}")
|
||||
view = self.get_fm_window(wid).get_view_by_id(tid)
|
||||
|
||||
view = self.get_fm_window(wid).get_view_by_id(tid)
|
||||
uris = data.get_uris()
|
||||
dest = view.get_current_directory()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user