Added some keyboard controls

This commit is contained in:
itdominator 2021-11-20 21:00:34 -06:00
parent 85a9c5d899
commit e4ac63e01d
5 changed files with 153 additions and 35 deletions

View File

@ -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>

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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()