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 + + True @@ -140,6 +142,7 @@ False True True + @@ -307,7 +310,7 @@ True False - + gtk-home go_home True @@ -324,7 +327,7 @@ - + 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()