Template
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
33 lines
558 B
Python
33 lines
558 B
Python
# Python imports
|
|
from typing import Type, TypeVar, Any
|
|
|
|
# Lib imports
|
|
|
|
# Application imports
|
|
|
|
|
|
|
|
class SingletonError(Exception):
|
|
pass
|
|
|
|
|
|
|
|
T = TypeVar('T', bound = 'Singleton')
|
|
|
|
|
|
|
|
class Singleton:
|
|
_instances = {}
|
|
|
|
def __new__(cls: Type[T], *args: Any, **kwargs: Any) -> T:
|
|
if cls in cls._instances: return cls._instances[cls]
|
|
|
|
instance = super().__new__(cls)
|
|
cls._instances[cls] = instance
|
|
return instance
|
|
|
|
@classmethod
|
|
def destroy(cls):
|
|
if cls in cls._instances:
|
|
del cls._instances[cls]
|