diff --git a/plugins/archiver/manifest.json b/plugins/archiver/manifest.json
index 761a2eb..5d9fc1b 100644
--- a/plugins/archiver/manifest.json
+++ b/plugins/archiver/manifest.json
@@ -5,7 +5,7 @@
"version": "0.0.1",
"support": "",
"requests": {
- "ui_target": "context_menu",
+ "ui_target": "context_menu_plugins",
"pass_fm_events": "true"
}
}
diff --git a/plugins/archiver/plugin.py b/plugins/archiver/plugin.py
index ccfd732..5426094 100644
--- a/plugins/archiver/plugin.py
+++ b/plugins/archiver/plugin.py
@@ -81,13 +81,12 @@ class Plugin(PluginBase):
self._archiver_dialogue = self._builder.get_object("archiver_dialogue")
self._arc_command_buffer = self._builder.get_object("arc_command_buffer")
- icon = Gtk.Image(stock=Gtk.STOCK_FLOPPY)
- button = Gtk.Button(label=self.name)
+ item = Gtk.ImageMenuItem(self.name)
+ item.set_image( Gtk.Image(stock=Gtk.STOCK_FLOPPY) )
+ item.connect("activate", self.show_archiver_dialogue)
+ item.set_always_show_image(True)
+ return item
- button.set_image(icon)
- button.connect("button-release-event", self.show_archiver_dialogue)
-
- return button
def run(self):
...
diff --git a/plugins/file_properties/plugin.py b/plugins/file_properties/plugin.py
index c20bc1a..e28d1e3 100644
--- a/plugins/file_properties/plugin.py
+++ b/plugins/file_properties/plugin.py
@@ -99,13 +99,11 @@ class Plugin(PluginBase):
self._file_group = self._builder.get_object("file_group")
def generate_reference_ui_element(self):
- icon = Gtk.Image(stock=Gtk.STOCK_PROPERTIES )
- button = Gtk.Button(label=self.name)
-
- button.connect("button-release-event", self._show_properties_page)
- button.set_image(icon)
-
- return button
+ item = Gtk.ImageMenuItem(self.name)
+ item.set_image( Gtk.Image(stock=Gtk.STOCK_PROPERTIES) )
+ item.connect("activate", self._show_properties_page)
+ item.set_always_show_image(True)
+ return item
@threaded
diff --git a/plugins/movie_tv_info/manifest.json b/plugins/movie_tv_info/manifest.json
index 9290b70..2bff10f 100644
--- a/plugins/movie_tv_info/manifest.json
+++ b/plugins/movie_tv_info/manifest.json
@@ -5,7 +5,7 @@
"version": "0.0.1",
"support": "",
"requests": {
- "ui_target": "context_menu",
+ "ui_target": "context_menu_plugins",
"pass_fm_events": "true"
}
}
diff --git a/plugins/movie_tv_info/plugin.py b/plugins/movie_tv_info/plugin.py
index 2bae410..f16f282 100644
--- a/plugins/movie_tv_info/plugin.py
+++ b/plugins/movie_tv_info/plugin.py
@@ -70,13 +70,11 @@ class Plugin(PluginBase):
self._trailer_link = self._builder.get_object("trailer_link")
def generate_reference_ui_element(self):
- icon = Gtk.Image(stock=Gtk.STOCK_FIND)
- button = Gtk.Button(label=self.name)
-
- button.connect("button-release-event", self._show_info_page)
- button.set_image(icon)
-
- return button
+ item = Gtk.ImageMenuItem(self.name)
+ item.set_image( Gtk.Image(stock=Gtk.STOCK_FIND) )
+ item.connect("activate", self._show_info_page)
+ item.set_always_show_image(True)
+ return item
@threaded
def _show_info_page(self, widget=None, eve=None):
diff --git a/plugins/searcher/plugin.py b/plugins/searcher/plugin.py
index ab63097..17eaa63 100644
--- a/plugins/searcher/plugin.py
+++ b/plugins/searcher/plugin.py
@@ -80,13 +80,11 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase):
self.create_ipc_listener()
def generate_reference_ui_element(self):
- icon = Gtk.Image(stock=Gtk.STOCK_FIND)
- button = Gtk.Button(label=self.name)
-
- button.connect("button-release-event", self._show_page)
- button.set_image(icon)
-
- return button
+ item = Gtk.ImageMenuItem(self.name)
+ item.set_image( Gtk.Image(stock=Gtk.STOCK_FIND) )
+ item.connect("activate", self._show_page)
+ item.set_always_show_image(True)
+ return item
def _show_page(self, widget=None, eve=None):
@@ -113,6 +111,7 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase):
self.grep_list_parent.add(self._grep_list)
self.grep_list_parent.show_all()
+ time.sleep(0.05)
Gtk.main_iteration()
def reset_file_list_box(self) -> None:
@@ -128,4 +127,5 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase):
self.file_list_parent.add(self._file_list)
self.file_list_parent.show_all()
+ time.sleep(0.05)
Gtk.main_iteration()
diff --git a/plugins/trasher/plugin.py b/plugins/trasher/plugin.py
index 78cc759..69618d9 100644
--- a/plugins/trasher/plugin.py
+++ b/plugins/trasher/plugin.py
@@ -47,34 +47,49 @@ class Plugin(PluginBase):
self._event_system.subscribe("trash_files", self.trash_files)
def generate_reference_ui_element(self):
- self._builder = Gtk.Builder()
- self._builder.add_from_file(self._GLADE_FILE)
+ trash_a = Gtk.MenuItem("Trash Actions")
+ trash_menu = Gtk.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.restore = Gtk.MenuItem("Restore From Trash")
+ self.restore.connect("activate", self.restore_trash_files)
- self._builder.connect_signals(handlers)
+ self.empty = Gtk.MenuItem("Empty Trash")
+ self.empty.connect("activate", self.empty_trash)
- trasher = self._builder.get_object("trasher")
- trasher.show_all()
+ trash = Gtk.ImageMenuItem("Trash")
+ trash.set_image( Gtk.Image.new_from_icon_name("user-trash", 16) )
+ trash.connect("activate", self.trash_files)
+ trash.set_always_show_image(True)
- return trasher
+ go_to = Gtk.ImageMenuItem("Go To Trash")
+ go_to.set_image( Gtk.Image.new_from_icon_name("user-trash", 16) )
+ go_to.connect("activate", self.go_to_trash)
+ go_to.set_always_show_image(True)
+
+ delete = Gtk.ImageMenuItem("Delete")
+ delete.set_image( Gtk.Image(stock=Gtk.STOCK_DELETE) )
+ delete.connect("activate", self.delete_files)
+ delete.set_always_show_image(True)
+
+ trash_a.set_submenu(trash_menu)
+ trash_a.show_all()
+ self._appen_menu_items(trash_menu, [self.restore, self.empty, trash, go_to, delete])
+
+ return trash_a
+
+
+ def _appen_menu_items(self, menu, items):
+ for item in items:
+ menu.append(item)
def _show_trash_buttons(self):
- self._builder.get_object("restore_from_trash").show()
- self._builder.get_object("empty_trash").show()
+ self.restore.show()
+ self.empty.show()
def _hide_trash_buttons(self):
- self._builder.get_object("restore_from_trash").hide()
- self._builder.get_object("empty_trash").hide()
+ self.restore.hide()
+ self.empty.hide()
def delete_files(self, widget = None, eve = None):
self._event_system.emit("do_hide_context_menu")
diff --git a/plugins/trasher/trasher.glade b/plugins/trasher/trasher.glade
deleted file mode 100644
index 2867476..0000000
--- a/plugins/trasher/trasher.glade
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/plugins/vod_thumbnailer/manifest.json b/plugins/vod_thumbnailer/manifest.json
index 154bd40..21523f0 100644
--- a/plugins/vod_thumbnailer/manifest.json
+++ b/plugins/vod_thumbnailer/manifest.json
@@ -5,7 +5,7 @@
"version": "0.0.1",
"support": "",
"requests": {
- "ui_target": "context_menu",
+ "ui_target": "context_menu_plugins",
"pass_fm_events": "true"
}
}
diff --git a/plugins/vod_thumbnailer/plugin.py b/plugins/vod_thumbnailer/plugin.py
index 694972f..81a97a6 100644
--- a/plugins/vod_thumbnailer/plugin.py
+++ b/plugins/vod_thumbnailer/plugin.py
@@ -70,12 +70,11 @@ class Plugin(PluginBase):
def generate_reference_ui_element(self):
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(f"{self.path}/../../icons/video.png", 16, 16, True)
icon = Gtk.Image.new_from_pixbuf(pixbuf)
- button = Gtk.Button(label=self.name)
-
- button.set_image(icon)
- button.connect("button-release-event", self._show_thumbnailer_page)
-
- return button
+ item = Gtk.ImageMenuItem("Delete")
+ item.set_image( icon )
+ item.connect("activate", self._show_thumbnailer_page)
+ item.set_always_show_image(True)
+ return item
@threaded
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py
index 9ed03c8..a96c67f 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py
@@ -24,7 +24,6 @@ def daemon_threaded_wrapper(fn):
-
# NOTE: Just reminding myself we can add to builtins two different ways...
# __builtins__.update({"event_system": Builtins()})
builtins.app_name = "SolarFM"
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py
index b61b260..e1fa0e9 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py
@@ -22,7 +22,7 @@ if __name__ == "__main__":
""" Set process title, get arguments, and create GTK main thread. """
try:
- setproctitle('SolarFM')
+ setproctitle(f"{app_name}")
faulthandler.enable() # For better debug info
parser = argparse.ArgumentParser()
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 904a8ad..dabae41 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
@@ -4,6 +4,8 @@ from dataclasses import dataclass
# Lib imports
import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk
from gi.repository import GLib
# Application imports
@@ -100,6 +102,89 @@ class Controller_Data:
if settings.is_debug():
self.window.set_interactive_debugging(True)
+ self.build_context_menu()
+
+
+ def build_context_menu(self) -> None:
+ main_menu = Gtk.Menu()
+ open_menu = Gtk.Menu()
+ filea_menu = Gtk.Menu()
+ plugins_menu = Gtk.Menu()
+ open_a = Gtk.MenuItem("Open Actions")
+ file_a = Gtk.MenuItem("File Actions")
+ plugins = Gtk.MenuItem("Plugins")
+
+ self._appen_menu_items(main_menu, [open_a, file_a, plugins])
+
+ open = Gtk.ImageMenuItem("Open")
+ open.set_name("open")
+ open.set_image( Gtk.Image(stock=Gtk.STOCK_OPEN) )
+ open.set_always_show_image(True)
+ open.connect("activate", self.do_action_from_menu_controls)
+
+ open_with = Gtk.ImageMenuItem("Open With")
+ open_with.set_name("open_with")
+ open_with.set_image( Gtk.Image(stock=Gtk.STOCK_OPEN) )
+ open_with.set_always_show_image(True)
+ open_with.connect("activate", self.do_action_from_menu_controls)
+
+ execute = Gtk.ImageMenuItem("Execute")
+ execute.set_name("execute")
+ execute.set_image( Gtk.Image(stock=Gtk.STOCK_EXECUTE) )
+ execute.set_always_show_image(True)
+ execute.connect("activate", self.do_action_from_menu_controls)
+
+ execute_term = Gtk.ImageMenuItem("Execute in Terminal")
+ execute_term.set_name("execute_in_terminal")
+ execute_term.set_image( Gtk.Image(stock=Gtk.STOCK_EXECUTE) )
+ execute_term.set_always_show_image(True)
+ execute_term.connect("activate", self.do_action_from_menu_controls)
+
+ self._appen_menu_items(open_menu, [open, open_with, execute, execute_term])
+
+ new = Gtk.ImageMenuItem("New")
+ new.set_name("create")
+ new.set_image( Gtk.Image(stock=Gtk.STOCK_ADD) )
+ new.set_always_show_image(True)
+ new.connect("activate", self.do_action_from_menu_controls)
+
+ rename = Gtk.ImageMenuItem("Rename")
+ rename.set_name("rename")
+ rename.set_image( Gtk.Image(stock=Gtk.STOCK_EDIT) )
+ rename.set_always_show_image(True)
+ rename.connect("activate", self.do_action_from_menu_controls)
+
+ cut = Gtk.ImageMenuItem("Cut")
+ cut.set_name("cut")
+ cut.set_image( Gtk.Image(stock=Gtk.STOCK_CUT) )
+ cut.set_always_show_image(True)
+ cut.connect("activate", self.do_action_from_menu_controls)
+
+ copy = Gtk.ImageMenuItem("Copy")
+ copy.set_name("copy")
+ copy.set_image( Gtk.Image(stock=Gtk.STOCK_COPY) )
+ copy.set_always_show_image(True)
+ copy.connect("activate", self.do_action_from_menu_controls)
+
+ paste = Gtk.ImageMenuItem("Paste")
+ paste.set_name("paste")
+ paste.set_image( Gtk.Image(stock=Gtk.STOCK_PASTE) )
+ paste.set_always_show_image(True)
+ paste.connect("activate", self.do_action_from_menu_controls)
+
+ self._appen_menu_items(filea_menu, [new, rename, cut, copy, paste])
+ open_a.set_submenu(open_menu)
+ file_a.set_submenu(filea_menu)
+ plugins.set_submenu(plugins_menu)
+
+ main_menu.attach_to_widget(self.window, None)
+ main_menu.show_all()
+ self.builder.expose_object("context_menu", main_menu)
+ self.builder.expose_object("context_menu_plugins", plugins_menu)
+
+ def _appen_menu_items(self, menu, items):
+ for item in items:
+ menu.append(item)
def get_current_state(self) -> State:
'''
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 8377158..239b155 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
@@ -83,10 +83,10 @@ class ShowHideMixin:
self.builder.get_object("plugin_controls").hide()
def show_context_menu(self, widget=None, eve=None):
- self.builder.get_object("context_menu_popup").run()
+ 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_popup").hide()
+ self.builder.get_object("context_menu").popdown()
def show_new_file_menu(self, widget=None, eve=None):
if widget:
diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py
index e53c0c5..3d23ecf 100644
--- a/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py
+++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/plugins/manifest.py
@@ -56,7 +56,8 @@ class ManifestProcessor:
if requests["ui_target"] in [
"none", "other", "main_Window", "main_menu_bar",
"main_menu_bttn_box_bar", "path_menu_bar", "plugin_control_list",
- "context_menu", "window_1", "window_2", "window_3", "window_4"
+ "context_menu", "context_menu_plugins", "window_1",
+ "window_2", "window_3", "window_4"
]:
if requests["ui_target"] == "other":
if "ui_target_id" in keys:
diff --git a/user_config/usr/share/solarfm/Main_Window.glade b/user_config/usr/share/solarfm/Main_Window.glade
index fa62070..0176307 100644
--- a/user_config/usr/share/solarfm/Main_Window.glade
+++ b/user_config/usr/share/solarfm/Main_Window.glade
@@ -457,11 +457,6 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe
False
gtk-new
-
- True
- False
- gtk-execute
-
True
False
@@ -488,287 +483,12 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe
gtk-execute
-
- True
- False
- gtk-open
-
True
False
gtk-edit
3
-
- True
- False
- gtk-edit
-
-
False
dialog