add the first plugins
This commit is contained in:
0
raven/plugins/domain/__init__.py
Normal file
0
raven/plugins/domain/__init__.py
Normal file
11
raven/plugins/domain/menucontribution.py
Normal file
11
raven/plugins/domain/menucontribution.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from raven.plugins.domain.raction import RAction
|
||||
from raven.plugins.domain.rmenu import RMenu
|
||||
|
||||
|
||||
class MenuContribution():
|
||||
def __init__(self, menu_id: str, action: RAction = None, menu: RMenu = None, action_id=None):
|
||||
super(MenuContribution, self).__init__()
|
||||
self.menu_id = menu_id
|
||||
self.action = action
|
||||
self.menu = menu
|
||||
self.action_id = action_id
|
||||
37
raven/plugins/domain/raction.py
Normal file
37
raven/plugins/domain/raction.py
Normal file
@@ -0,0 +1,37 @@
|
||||
class RAction():
|
||||
|
||||
def __init__(self,
|
||||
label: str,
|
||||
action=None,
|
||||
shortcut: str = None,
|
||||
icon_from_theme: str = None,
|
||||
icon_file: str = None,
|
||||
checkable: bool = False,
|
||||
checked: bool = False
|
||||
):
|
||||
super(RAction, self).__init__()
|
||||
self.label = label
|
||||
self.action = action
|
||||
self.shortcut = shortcut
|
||||
self.icon_from_theme = icon_from_theme
|
||||
self.icon_file = icon_file
|
||||
self.checkable = checkable
|
||||
self.checked = checked
|
||||
|
||||
def set_action(self, action):
|
||||
self.action = action
|
||||
|
||||
def set_icon_from_theme(self, icon_from_theme: str):
|
||||
self.icon_from_theme = icon_from_theme
|
||||
|
||||
def set_icon_file(self, icon_file: str):
|
||||
self.icon_file = icon_file
|
||||
|
||||
def set_shortcut(self, shortcut: str):
|
||||
self.shortcut = shortcut
|
||||
|
||||
def set_checkable(self, checkable: bool):
|
||||
self.checkable = checkable
|
||||
|
||||
def set_checked(self, checked: bool):
|
||||
self.checked = checked
|
||||
26
raven/plugins/domain/rmenu.py
Normal file
26
raven/plugins/domain/rmenu.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from typing import Callable
|
||||
|
||||
from raven.plugins.domain.raction import RAction
|
||||
|
||||
|
||||
class RMenu():
|
||||
def __init__(self, label: str):
|
||||
super(RMenu, self).__init__()
|
||||
self.label = label
|
||||
self.actions = []
|
||||
self.listeners = []
|
||||
|
||||
def add_action(self, action: RAction):
|
||||
self.actions.append(action)
|
||||
self._notify()
|
||||
|
||||
def clear(self):
|
||||
self.actions.clear()
|
||||
self._notify()
|
||||
|
||||
def _notify(self):
|
||||
for listener in self.listeners:
|
||||
listener()
|
||||
|
||||
def add_change_listener(self, listener: Callable[[], None]):
|
||||
self.listeners.append(listener)
|
||||
84
raven/plugins/openfileplugin.py
Normal file
84
raven/plugins/openfileplugin.py
Normal file
@@ -0,0 +1,84 @@
|
||||
import os
|
||||
from typing import Callable
|
||||
|
||||
from PyQt6.QtGui import QAction, QIcon
|
||||
from PyQt6.QtWidgets import QMenu, QFileDialog
|
||||
|
||||
from raven.pluginbase import PluginBase
|
||||
from raven.pluginregistry import PluginRegistry
|
||||
from raven.plugins.domain.menucontribution import MenuContribution
|
||||
from raven.plugins.domain.raction import RAction
|
||||
from raven.plugins.domain.rmenu import RMenu
|
||||
from settings import Settings
|
||||
|
||||
|
||||
class OpenFilePlugin(PluginBase):
|
||||
def __init__(self):
|
||||
super(OpenFilePlugin, self).__init__()
|
||||
print("init OpenFilePlugin")
|
||||
|
||||
def set_settings(self, settings: Settings):
|
||||
self.settings = settings
|
||||
|
||||
def set_translator(self, tr: Callable[[str], str]):
|
||||
self.tr = tr
|
||||
|
||||
def _action_open_file(self) -> RAction:
|
||||
open_file = RAction(self.tr("&Open..."), self._open_file_dialog, shortcut='Ctrl+O',
|
||||
icon_from_theme="document-open")
|
||||
return open_file
|
||||
|
||||
def _sub_menu_recent_files(self) -> RMenu:
|
||||
self._menu_recent_files = RMenu("Open &Recent")
|
||||
self._update_recent_files_menu()
|
||||
return self._menu_recent_files
|
||||
|
||||
def get_menu_contributions(self) -> [MenuContribution]:
|
||||
return [
|
||||
MenuContribution("file", action=self._action_open_file(), action_id="open file"),
|
||||
MenuContribution("file", menu=self._sub_menu_recent_files(), action_id="recent files menu"),
|
||||
]
|
||||
|
||||
def _open_file_dialog(self) -> None:
|
||||
current_file = PluginRegistry.executeSingle("current_file")
|
||||
directory = os.path.dirname(current_file) if current_file else ''
|
||||
|
||||
dialog = QFileDialog()
|
||||
(selected_file, _filter) = dialog.getOpenFileName(
|
||||
caption=self.tr("Open File"),
|
||||
directory=directory
|
||||
)
|
||||
if selected_file:
|
||||
self._open_file(selected_file)
|
||||
|
||||
def _open_file(self, selected_file: str):
|
||||
PluginRegistry.executeSingle("create_tab", selected_file)
|
||||
self._remember_recent_file(selected_file)
|
||||
|
||||
def _get_recent_files(self) -> [str]:
|
||||
recent_files = self.settings.session.get('general', 'recent_files', fallback='')
|
||||
print(recent_files)
|
||||
files = recent_files.split(os.pathsep)
|
||||
if "" in files:
|
||||
files.remove("")
|
||||
return files
|
||||
|
||||
def _update_recent_files_menu(self):
|
||||
self._menu_recent_files.clear()
|
||||
files = self._get_recent_files()
|
||||
for file in files:
|
||||
action = RAction(os.path.basename(file))
|
||||
action.set_action(lambda x, f=file: self._open_file(f))
|
||||
self._menu_recent_files.add_action(action)
|
||||
|
||||
def _remember_recent_file(self, file: str):
|
||||
files = self._get_recent_files()
|
||||
if file in files:
|
||||
files.remove(file)
|
||||
files.insert(0, file)
|
||||
recent_files = os.pathsep.join(files[:10])
|
||||
self.settings.set_session('general', 'recent_files', recent_files)
|
||||
self._update_recent_files_menu()
|
||||
|
||||
def after_open_file(self, file: str):
|
||||
self._remember_recent_file(file)
|
||||
21
raven/plugins/ravenlogplugin.py
Normal file
21
raven/plugins/ravenlogplugin.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from typing import Optional
|
||||
|
||||
from raven.mainwindow import MainWindow
|
||||
from raven.pluginbase import PluginBase
|
||||
|
||||
|
||||
class RavenLogPlugin(PluginBase):
|
||||
def __init__(self):
|
||||
super(RavenLogPlugin, self).__init__()
|
||||
self.main_window = None
|
||||
|
||||
def create_main_window(self):
|
||||
if not self.main_window:
|
||||
self.main_window = MainWindow()
|
||||
return self.main_window
|
||||
|
||||
def current_file(self) -> Optional[str]:
|
||||
return self.main_window.current_file()
|
||||
|
||||
def create_tab(self, file: str):
|
||||
self.main_window.tabs.create_tab(file)
|
||||
Reference in New Issue
Block a user