From e4ac63e01d285c0c08c39f2b5702ac60b072e6ff Mon Sep 17 00:00:00 2001
From: itdominator <1itdominator@gmail.com>
Date: Sat, 20 Nov 2021 21:00:34 -0600
Subject: [PATCH] Added some keyboard controls
---
.../PyFM/new/pyfm/resources/Main_Window.glade | 12 ++--
.../PyFM/new/pyfm/signal_classes/Signals.py | 64 ++++++++++++++++++-
.../pyfm/signal_classes/mixins/TabMixin.py | 52 +++++++++++++--
.../pyfm/signal_classes/mixins/WidgetMixin.py | 30 +++++++--
.../pyfm/signal_classes/mixins/WindowMixin.py | 30 +++++----
5 files changed, 153 insertions(+), 35 deletions(-)
diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/resources/Main_Window.glade b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/resources/Main_Window.glade
index cbf7617..17d0a5e 100644
--- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/resources/Main_Window.glade
+++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/resources/Main_Window.glade
@@ -35,6 +35,8 @@
830
pyfm.png
center
+
+
@@ -307,7 +310,7 @@
True
False
-
-
+
gtk-refresh
refresh_view
True
@@ -341,7 +344,7 @@
-
+
gtk-go-up
go_up
True
@@ -373,7 +376,7 @@
-
+
gtk-add
create_tab
True
@@ -417,6 +420,7 @@
notebook1
True
True
+ True
5
5
5
diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py
index 39bb35e..b4e05e3 100644
--- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py
+++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py
@@ -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:
diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py
index abf931d..5c22607 100644
--- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py
+++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py
@@ -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
diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WidgetMixin.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WidgetMixin.py
index e00222b..517d3bc 100644
--- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WidgetMixin.py
+++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WidgetMixin.py
@@ -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
diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WindowMixin.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WindowMixin.py
index 24b39d1..3331f5f 100644
--- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WindowMixin.py
+++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/WindowMixin.py
@@ -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()