add the first plugins

This commit is contained in:
2021-11-26 18:19:57 +01:00
parent 1ea10e2933
commit 0e27cb2b26
13 changed files with 543 additions and 197 deletions

View File

View 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

View 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

View 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)

View 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)

View 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)