From 0d01030be31a94f46e0056073e8ff3add116cff3 Mon Sep 17 00:00:00 2001
From: itdominator <1itdominator@gmail.com>
Date: Sat, 3 Dec 2022 22:03:05 -0600
Subject: [PATCH] Refactored externalized widgets, cleanup and subtle bug fixes
---
plugins/trasher/plugin.py | 5 -
.../SolarFM/solarfm/core/controller.py | 10 +-
.../SolarFM/solarfm/core/controller_data.py | 10 +-
.../solarfm/core/mixins/show_hide_mixin.py | 41 ----
.../signals/file_action_signals_mixin.py | 38 ++--
.../solarfm/core/mixins/ui/window_mixin.py | 2 +-
.../solarfm/widgets/context_menu_widget.py | 40 +++-
.../solarfm/widgets/new_file_widget.py | 76 +++++++
.../SolarFM/solarfm/widgets/rename_widget.py | 48 +++--
.../usr/share/solarfm/Main_Window.glade | 182 -----------------
.../usr/share/solarfm/contexct_menu.json | 11 +-
.../solarfm/ui_widgets/new_file_ui.glade | 186 ++++++++++++++++++
.../share/solarfm/ui_widgets/rename_ui.glade | 8 +-
13 files changed, 359 insertions(+), 298 deletions(-)
create mode 100644 src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/new_file_widget.py
create mode 100644 user_config/usr/share/solarfm/ui_widgets/new_file_ui.glade
diff --git a/plugins/trasher/plugin.py b/plugins/trasher/plugin.py
index c0e4ca9..e1d8493 100644
--- a/plugins/trasher/plugin.py
+++ b/plugins/trasher/plugin.py
@@ -97,7 +97,6 @@ class Plugin(PluginBase):
self.empty.hide()
def delete_files(self, widget = None, eve = None):
- self._event_system.emit("do_hide_context_menu")
self._event_system.emit("get_current_state")
state = self._fm_state
uris = state.selected_files
@@ -121,23 +120,19 @@ class Plugin(PluginBase):
break
def trash_files(self, widget = None, eve = None, verbocity = False):
- self._event_system.emit("do_hide_context_menu")
self._event_system.emit("get_current_state")
state = self._fm_state
for uri in state.selected_files:
self.trashman.trash(uri, verbocity)
def restore_trash_files(self, widget = None, eve = None, verbocity = False):
- self._event_system.emit("do_hide_context_menu")
self._event_system.emit("get_current_state")
state = self._fm_state
for uri in state.selected_files:
self.trashman.restore(filename=uri.split("/")[-1], verbose = verbocity)
def empty_trash(self, widget = None, eve = None, verbocity = False):
- self._event_system.emit("do_hide_context_menu")
self.trashman.empty(verbose = verbocity)
def go_to_trash(self, widget = None, eve = None, verbocity = False):
- self._event_system.emit("do_hide_context_menu")
self._event_system.emit("go_to_path", self.trash_files_path)
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py
index e0a57b7..2d71450 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller.py
@@ -38,7 +38,6 @@ class Controller(UI, SignalsMixins, Controller_Data):
event_system.subscribe("get_current_state", self.get_current_state)
event_system.subscribe("display_message", self.display_message)
event_system.subscribe("go_to_path", self.go_to_path)
- event_system.subscribe("do_hide_context_menu", self.do_hide_context_menu)
event_system.subscribe("do_action_from_menu_controls", self.do_action_from_menu_controls)
def tear_down(self, widget=None, eve=None):
@@ -104,9 +103,9 @@ class Controller(UI, SignalsMixins, Controller_Data):
else:
action = widget
- self.hide_context_menu()
- self.hide_new_file_menu()
- event_system.emit("do_hide_edit_file_menu")
+ event_system.emit("hide_context_menu")
+ event_system.emit("hide_new_file_menu")
+ event_system.emit("hide_rename_file_menu")
if action == "open":
self.open_files()
@@ -161,6 +160,3 @@ class Controller(UI, SignalsMixins, Controller_Data):
def go_to_path(self, path):
self.path_entry.set_text(path)
-
- def do_hide_context_menu(self):
- self.hide_context_menu()
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py
index 192d133..3c73b60 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/controller_data.py
@@ -12,6 +12,7 @@ from gi.repository import Gtk
from gi.repository import GLib
# Application imports
+from widgets.new_file_widget import NewFileWidget
from widgets.rename_widget import RenameWidget
from widgets.file_exists_widget import FileExistsWidget
from widgets.context_menu_widget import ContextMenuWidget
@@ -41,6 +42,7 @@ class Controller_Data:
self.builder = settings.get_builder()
self.keybindings = settings.get_keybindings()
+ NewFileWidget()
RenameWidget()
FileExistsWidget()
ContextMenuWidget()
@@ -61,11 +63,6 @@ class Controller_Data:
self.exists_file_rename_bttn = self.builder.get_object("exists_file_rename_bttn")
self.warning_alert = self.builder.get_object("warning_alert")
- self.new_file_menu = self.builder.get_object("new_file_menu")
- self.edit_file_menu = self.builder.get_object("edit_file_menu")
- self.file_exists_dialog = self.builder.get_object("file_exists_dialog")
- self.exists_file_label = self.builder.get_object("exists_file_label")
- self.exists_file_field = self.builder.get_object("exists_file_field")
self.path_menu = self.builder.get_object("path_menu")
self.path_entry = self.builder.get_object("path_entry")
@@ -92,9 +89,6 @@ class Controller_Data:
self.override_drop_dest = None
- self.cancel_creation = False
- self.skip_edit = False
- self.cancel_edit = False
self.ctrl_down = False
self.shift_down = False
self.alt_down = False
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py
index 7b0c22a..f3fcfd7 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/show_hide_mixin.py
@@ -3,9 +3,7 @@
# Gtk imports
import gi
gi.require_version('Gtk', '3.0')
-gi.require_version('Gdk', '3.0')
from gi.repository import Gtk
-from gi.repository import Gdk
# Application imports
@@ -54,44 +52,5 @@ class ShowHideMixin:
def hide_plugins_popup(self, widget=None, eve=None):
self.builder.get_object("plugin_controls").hide()
- def show_context_menu(self, widget=None, eve=None):
- self.builder.get_object("context_menu").popup_at_pointer(None)
-
- def hide_context_menu(self, widget=None, eve=None):
- self.builder.get_object("context_menu").popdown()
-
- def show_new_file_menu(self, widget=None, eve=None):
- if widget:
- widget.set_text("")
- widget.grab_focus()
-
- response = self.new_file_menu.run()
- if response == Gtk.ResponseType.CANCEL:
- self.cancel_creation = True
-
- def hide_new_file_menu(self, widget=None, eve=None):
- self.builder.get_object("new_file_menu").hide()
-
- def hide_new_file_menu_enter_key(self, widget=None, eve=None):
- keyname = Gdk.keyval_name(eve.keyval).lower()
- if keyname in ["return", "enter"]:
- self.builder.get_object("new_file_menu").hide()
-
- def show_edit_file_menu(self, widget=None, eve=None):
- if widget:
- widget.grab_focus()
-
- response = self.edit_file_menu.run()
- if response == Gtk.ResponseType.CLOSE:
- self.skip_edit = True
- if response == Gtk.ResponseType.CANCEL:
- self.cancel_edit = True
-
def show_io_popup(self, widget=None, eve=None):
self.builder.get_object("io_popup").popup()
-
- def hide_edit_file_menu_skip(self, widget=None, eve=None):
- self.edit_file_menu.response(Gtk.ResponseType.CLOSE)
-
- def hide_edit_file_menu_cancel(self, widget=None, eve=None):
- self.edit_file_menu.response(Gtk.ResponseType.CANCEL)
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py
index ee5d24f..01ae10d 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/signals/file_action_signals_mixin.py
@@ -21,7 +21,7 @@ class FileActionSignalsMixin:
"""docstring for FileActionSignalsMixin"""
def get_dir_size(self, sdir):
- """Get the size of a directory. Based on code found online."""
+ """Get the size of a directory. Based on code found online."""
size = os.path.getsize(sdir)
for item in os.listdir(sdir):
@@ -147,7 +147,7 @@ class FileActionSignalsMixin:
def rename_files(self):
rename_label = self.builder.get_object("file_to_rename_label")
- rename_input = self.builder.get_object("new_rename_fname")
+ rename_input = self.builder.get_object("rename_fname")
state = self.get_current_state()
uris = self.format_to_uris(state.store, state.wid, state.tid, self.selected_files, True)
@@ -156,23 +156,18 @@ class FileActionSignalsMixin:
rename_label.set_label(entry)
rename_input.set_text(entry)
- self.show_edit_file_menu(rename_input)
-
- if self.skip_edit:
- self.skip_edit = False
+ response = event_system.emit_and_await("show_rename_file_menu", rename_input)
+ if response == "skip_edit":
continue
- if self.cancel_edit:
- self.cancel_edit = False
+ if response == "cancel_edit":
break
rname_to = rename_input.get_text().strip()
- target = f"{state.tab.get_current_directory()}/{rname_to}"
- self.handle_files([uri], "rename", target)
+ if rname_to:
+ target = f"{state.tab.get_current_directory()}/{rname_to}"
+ self.handle_files([uri], "rename", target)
-
- self.skip_edit = False
- self.cancel_edit = False
- event_system.emit("do_hide_edit_file_menu")
+ event_system.emit("hide_rename_file_menu")
self.selected_files.clear()
def cut_files(self):
@@ -205,15 +200,15 @@ class FileActionSignalsMixin:
self.handle_files(self.to_cut_files, "move", target)
def create_files(self):
- fname_field = self.builder.get_object("new_fname_field")
- self.show_new_file_menu(fname_field)
+ fname_field = self.builder.get_object("new_fname_field")
+ cancel_creation = event_system.emit_and_await("show_new_file_menu", fname_field)
- if self.cancel_creation:
- self.cancel_creation = False
+ if cancel_creation:
+ event_system.emit("hide_new_file_menu")
return
file_name = fname_field.get_text().strip()
- type = self.builder.get_object("context_menu_type_toggle").get_state()
+ type = self.builder.get_object("new_file_toggle_type").get_state()
wid, tid = self.fm_controller.get_active_wid_and_tid()
tab = self.get_fm_window(wid).get_tab_by_id(tid)
@@ -227,8 +222,7 @@ class FileActionSignalsMixin:
else: # Create Folder
self.handle_files([path], "create_dir")
- self.cancel_creation = False
- self.hide_new_file_menu()
+ event_system.emit("hide_new_file_menu")
def move_files(self, files, target):
@@ -277,7 +271,7 @@ class FileActionSignalsMixin:
if response == "rename":
base_path = _file.get_parent().get_path()
- new_name = self.exists_file_field.get_text().strip()
+ new_name = self.builder.get_object("exists_file_field").get_text().strip()
rfPath = f"{base_path}/{new_name}"
_file = Gio.File.new_for_path(rfPath)
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py
index 3b8b677..2dcf94b 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/core/mixins/ui/window_mixin.py
@@ -201,7 +201,7 @@ class WindowMixin(TabMixin):
if self.single_click_open: # FIXME: need to find a way to pass the model index
self.grid_icon_double_click(icons_grid)
elif eve.type == Gdk.EventType.BUTTON_RELEASE and eve.button == 3: # r-click
- self.show_context_menu()
+ event_system.emit("show_context_menu")
except WindowException as e:
print(repr(e))
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/context_menu_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/context_menu_widget.py
index 2efeba8..e0f4a8f 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/context_menu_widget.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/context_menu_widget.py
@@ -1,10 +1,10 @@
# Python imports
+import inspect
# Lib imports
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
-from gi.repository import GLib
# Application imports
@@ -14,10 +14,36 @@ class ContextMenuWidget(Gtk.Menu):
def __init__(self):
super(ContextMenuWidget, self).__init__()
- self._builder = settings.get_builder()
+ self.builder = settings.get_builder()
+ self._builder = Gtk.Builder()
self._context_menu_data = settings.get_context_menu_data()
self._window = settings.get_main_window()
+ self._setup_styling()
+ self._setup_signals()
+ self._load_widgets()
+
+
+ def _setup_styling(self):
+ ...
+
+ def _setup_signals(self):
+ event_system.subscribe("show_context_menu", self.show_context_menu)
+ event_system.subscribe("hide_context_menu", self.hide_context_menu)
+
+ classes = [self]
+ handlers = {}
+ for c in classes:
+ methods = None
+ try:
+ methods = inspect.getmembers(c, predicate=inspect.ismethod)
+ handlers.update(methods)
+ except Exception as e:
+ print(repr(e))
+
+ self._builder.connect_signals(handlers)
+
+ def _load_widgets(self):
self.build_context_menu()
@@ -62,9 +88,15 @@ class ContextMenuWidget(Gtk.Menu):
self.attach_to_widget(self._window, None)
self.show_all()
- self._builder.expose_object("context_menu", self)
+ self.builder.expose_object("context_menu", self)
if plugins_entry:
- self._builder.expose_object("context_menu_plugins", plugins_entry.get_submenu())
+ self.builder.expose_object("context_menu_plugins", plugins_entry.get_submenu())
def _emit(self, menu_item, type):
event_system.emit("do_action_from_menu_controls", type)
+
+ def show_context_menu(self, widget=None, eve=None):
+ self.builder.get_object("context_menu").popup_at_pointer(None)
+
+ def hide_context_menu(self, widget=None, eve=None):
+ self.builder.get_object("context_menu").popdown()
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/new_file_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/new_file_widget.py
new file mode 100644
index 0000000..b261e69
--- /dev/null
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/new_file_widget.py
@@ -0,0 +1,76 @@
+# Python imports
+
+# Lib imports
+import inspect
+import gi
+gi.require_version('Gtk', '3.0')
+gi.require_version('Gdk', '3.0')
+from gi.repository import Gtk
+from gi.repository import Gdk
+
+# Application imports
+
+
+class NewFileWidget:
+ """docstring for NewFileWidget."""
+
+ def __init__(self):
+ super(NewFileWidget, self).__init__()
+ _GLADE_FILE = f"{settings.get_ui_widgets_path()}/new_file_ui.glade"
+ builder = settings.get_builder()
+ self._builder = Gtk.Builder()
+
+ self._builder.add_from_file(_GLADE_FILE)
+ self._new_file_menu = self._builder.get_object("new_file_menu")
+ self._new_fname_field = self._builder.get_object("new_fname_field")
+ self._new_file_toggle_type = self._builder.get_object("new_file_toggle_type")
+
+ builder.expose_object(f"new_file_menu", self._new_file_menu)
+ builder.expose_object(f"new_fname_field", self._new_fname_field)
+ builder.expose_object(f"new_file_toggle_type", self._new_file_toggle_type)
+
+ self._setup_styling()
+ self._setup_signals()
+ self._load_widgets()
+
+
+ def _setup_styling(self):
+ ...
+
+ def _setup_signals(self):
+ event_system.subscribe("show_new_file_menu", self.show_new_file_menu)
+ event_system.subscribe("hide_new_file_menu", self.hide_new_file_menu)
+
+ classes = [self]
+ handlers = {}
+ for c in classes:
+ methods = None
+ try:
+ methods = inspect.getmembers(c, predicate=inspect.ismethod)
+ handlers.update(methods)
+ except Exception as e:
+ print(repr(e))
+
+ self._builder.connect_signals(handlers)
+
+ def _load_widgets(self):
+ ...
+
+ def show_new_file_menu(self, widget=None, eve=None):
+ if widget:
+ widget.set_text("")
+ widget.grab_focus()
+
+ response = self._new_file_menu.run()
+ if response == Gtk.ResponseType.CANCEL:
+ return True
+ else:
+ return False
+
+ def hide_new_file_menu(self, widget=None, eve=None):
+ self._builder.get_object("new_file_menu").hide()
+
+ def hide_new_file_menu_enter_key(self, widget=None, eve=None):
+ keyname = Gdk.keyval_name(eve.keyval).lower()
+ if keyname in ["return", "enter"]:
+ self._new_file_menu.hide()
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py
index dc34ea1..0847ba3 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/widgets/rename_widget.py
@@ -21,13 +21,13 @@ class RenameWidget:
self._builder = Gtk.Builder()
self._builder.add_from_file(_GLADE_FILE)
- edit_file_menu = self._builder.get_object("edit_file_menu")
- new_rename_fname = self._builder.get_object("new_rename_fname")
- file_to_rename_label = self._builder.get_object("file_to_rename_label")
+ self._rename_file_menu = self._builder.get_object("rename_file_menu")
+ self._rename_fname = self._builder.get_object("rename_fname")
+ self._file_to_rename_label = self._builder.get_object("file_to_rename_label")
- builder.expose_object(f"edit_file_menu", edit_file_menu)
- builder.expose_object(f"new_rename_fname", new_rename_fname)
- builder.expose_object(f"file_to_rename_label", file_to_rename_label)
+ builder.expose_object(f"rename_file_menu", self._rename_file_menu)
+ builder.expose_object(f"rename_fname", self._rename_fname)
+ builder.expose_object(f"file_to_rename_label", self._file_to_rename_label)
self._setup_styling()
self._setup_signals()
@@ -38,7 +38,8 @@ class RenameWidget:
...
def _setup_signals(self):
- event_system.subscribe("do_hide_edit_file_menu", self.hide_edit_file_menu)
+ event_system.subscribe("show_rename_file_menu", self.show_rename_file_menu)
+ event_system.subscribe("hide_rename_file_menu", self.hide_rename_file_menu)
classes = [self]
handlers = {}
@@ -55,26 +56,35 @@ class RenameWidget:
def _load_widgets(self):
...
+ def show_rename_file_menu(self, widget=None, eve=None):
+ if widget:
+ widget.grab_focus()
+
+ response = self._rename_file_menu.run()
+ if response == Gtk.ResponseType.CLOSE:
+ return "skip_edit"
+ if response == Gtk.ResponseType.CANCEL:
+ return "cancel_edit"
+
+ return ""
+
+
def set_to_title_case(self, widget, eve=None):
- rename_widget = self._builder.get_object("new_rename_fname")
- rename_widget.set_text( rename_widget.get_text().title() )
+ self._rename_fname.set_text( self._rename_fname.get_text().title() )
def set_to_upper_case(self, widget, eve=None):
- rename_widget = self._builder.get_object("new_rename_fname")
- rename_widget.set_text( rename_widget.get_text().upper() )
+ self._rename_fname.set_text( self._rename_fname.get_text().upper() )
def set_to_lower_case(self, widget, eve=None):
- rename_widget = self._builder.get_object("new_rename_fname")
- rename_widget.set_text( rename_widget.get_text().lower() )
+ self._rename_fname.set_text( self._rename_fname.get_text().lower() )
def set_to_invert_case(self, widget, eve=None):
- rename_widget = self._builder.get_object("new_rename_fname")
- rename_widget.set_text( rename_widget.get_text().swapcase() )
+ self._rename_fname.set_text( self._rename_fname.get_text().swapcase() )
- def hide_edit_file_menu(self, widget=None, eve=None):
- self._builder.get_object("edit_file_menu").hide()
+ def hide_rename_file_menu(self, widget=None, eve=None):
+ self._rename_file_menu.hide()
- def hide_edit_file_menu_enter_key(self, widget=None, eve=None):
+ def hide_rename_file_menu_enter_key(self, widget=None, eve=None):
keyname = Gdk.keyval_name(eve.keyval).lower()
if keyname in ["return", "enter"]:
- self._builder.get_object("edit_file_menu").hide()
+ self._rename_file_menu.hide()
diff --git a/user_config/usr/share/solarfm/Main_Window.glade b/user_config/usr/share/solarfm/Main_Window.glade
index 08eaed7..4075a30 100644
--- a/user_config/usr/share/solarfm/Main_Window.glade
+++ b/user_config/usr/share/solarfm/Main_Window.glade
@@ -452,11 +452,6 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe
appchooser_select_btn
-
-
-