feat: Complete plugin lifecycle management with lazy loading and runtime reload
Major changes: - Add unload() method to all plugins for proper cleanup (unregister commands/providers/LSP clients, destroy widgets, clear state) - Implement lazy widget loading via "show" signal across all containers - Add autoload: false manifest option for manual/conditional plugin loading - Add Plugins UI with runtime load/unload toggle via Ctrl+Shift+p - Implement controller unregistration system with proper signal disconnection - Add new events: UnregisterCommandEvent, GetFilesEvent, GetSourceViewsEvent, TogglePluginsUiEvent - Fix signal leaks by tracking and disconnecting handlers in widgets (search/replace, LSP manager, tabs, telescope, markdown preview) - Add Save/Save As to tabs context menu - Improve search/replace behavior (selection handling, focus management) - Add telescope file initialization from existing loaded files - Refactor plugin reload watcher to dynamically add/remove plugins on filesystem changes - Add new plugins: file_history, extend_source_view_menu, godot_lsp_client - Fix bug in prettify_json (undefined variable reference
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
"""
|
||||
Plugin Module
|
||||
"""
|
||||
@@ -0,0 +1,3 @@
|
||||
"""
|
||||
Plugin Package
|
||||
"""
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "Extend Source View Menu",
|
||||
"author": "ITDominator",
|
||||
"version": "0.0.1",
|
||||
"support": "",
|
||||
"requests": {}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Application imports
|
||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||
|
||||
from plugins.plugin_types import PluginCode
|
||||
|
||||
from .source_view_menu import extend_source_view_menu
|
||||
|
||||
|
||||
|
||||
class Plugin(PluginCode):
|
||||
def __init__(self):
|
||||
super(Plugin, self).__init__()
|
||||
|
||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||
if isinstance(event, Code_Event_Types.PopulateSourceViewPopupEvent):
|
||||
extend_source_view_menu(event.buffer, event.menu)
|
||||
|
||||
def load(self):
|
||||
...
|
||||
|
||||
def unload(self):
|
||||
...
|
||||
|
||||
def run(self):
|
||||
...
|
||||
@@ -0,0 +1,68 @@
|
||||
# Python imports
|
||||
import json
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
|
||||
gi.require_version('Gtk', '3.0')
|
||||
|
||||
from gi.repository import Gtk
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
|
||||
def on_case_handle(menuitem, buffer, action):
|
||||
start_itr, \
|
||||
end_itr = buffer.get_selection_bounds()
|
||||
data = buffer.get_text(start_itr, end_itr, False)
|
||||
text = data
|
||||
|
||||
if action == "on_all_upper":
|
||||
text = data.upper()
|
||||
elif action == "on_all_lower":
|
||||
text = data.lower()
|
||||
elif action == "on_invert":
|
||||
text = data.swapcase()
|
||||
elif action == "on_title":
|
||||
text = data.title()
|
||||
elif action == "on_title_strip":
|
||||
text = data.title().replace("-", "").replace("_", "").replace(" ", "")
|
||||
|
||||
buffer.begin_user_action()
|
||||
buffer.delete(start_itr, end_itr)
|
||||
buffer.insert(start_itr, text)
|
||||
buffer.end_user_action()
|
||||
|
||||
|
||||
|
||||
def extend_source_view_menu(buffer, menu):
|
||||
if not buffer.get_selection_bounds(): return
|
||||
|
||||
for child in menu.get_children():
|
||||
if not child.get_label() == "C_hange Case": continue
|
||||
menu.remove(child)
|
||||
|
||||
change_case_item = Gtk.MenuItem(label = "Change Case")
|
||||
|
||||
case_menu = Gtk.Menu()
|
||||
au_case_item = Gtk.MenuItem(label = "All Upper Case")
|
||||
al_case_item = Gtk.MenuItem(label = "All Lower Case")
|
||||
inver_case_item = Gtk.MenuItem(label = "Invert Case")
|
||||
title_case_item = Gtk.MenuItem(label = "Title Case")
|
||||
title_strip_case_item = Gtk.MenuItem(label = "Title Strip Case")
|
||||
|
||||
au_case_item.connect("activate", on_case_handle, buffer, "on_all_upper")
|
||||
al_case_item.connect("activate", on_case_handle, buffer, "on_all_lower")
|
||||
inver_case_item.connect("activate", on_case_handle, buffer, "on_invert")
|
||||
title_case_item.connect("activate", on_case_handle, buffer, "on_title")
|
||||
title_strip_case_item.connect("activate", on_case_handle, buffer, "on_title_strip")
|
||||
|
||||
case_menu.append(au_case_item)
|
||||
case_menu.append(al_case_item)
|
||||
case_menu.append(inver_case_item)
|
||||
case_menu.append(title_case_item)
|
||||
case_menu.append(title_strip_case_item)
|
||||
change_case_item.set_submenu(case_menu)
|
||||
|
||||
menu.append(change_case_item)
|
||||
Reference in New Issue
Block a user