import os from typing import Callable from pathlib import Path 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__() self.settings = None self.tr = None 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("&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.execute_single("current_file") directory = os.path.dirname(current_file) if current_file else os.path.join(Path.home()) 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): tab = PluginRegistry.execute_single("create_tab", selected_file) if tab: PluginRegistry.execute_single("add_tab", tab) PluginRegistry.execute("after_open_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)