137 lines
5.1 KiB
Python
137 lines
5.1 KiB
Python
import logging
|
|
|
|
from PySide6.QtWidgets import *
|
|
from PySide6.QtGui import *
|
|
from PySide6.QtCore import Qt
|
|
|
|
from src.ui.icon import Icon
|
|
from src.util import urlutils
|
|
from src.settings.cutesettings import CuteSettings
|
|
from src.pluginregistry import PluginRegistry
|
|
from src.plugins.domain.menucontribution import MenuContribution, sort_menu_contributions
|
|
from src.plugins.domain.raction import RAction
|
|
from src.plugins.domain.rmenu import RMenu
|
|
from src.settings.settingsstore import SettingsStore
|
|
from src.ui.tabs import Tabs
|
|
from src.util.urlutils import url_is_file
|
|
|
|
from src.i18n import _
|
|
|
|
MAX_LINE_LENGTH = 4096
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
log = logging.getLogger("main")
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self, *args, **kwargs):
|
|
super(MainWindow, self).__init__(*args, **kwargs)
|
|
|
|
self.settings = SettingsStore.load()
|
|
PluginRegistry.execute("set_settings", self.settings)
|
|
|
|
self.setWindowTitle(_("KrowLog"))
|
|
self._restore_window()
|
|
|
|
self.setDockNestingEnabled(True)
|
|
self.setAcceptDrops(True)
|
|
|
|
self.tabs = Tabs(self.settings)
|
|
|
|
self._menu_recent_files = QMenu(_("Open &Recent"), self)
|
|
self.setCentralWidget(self.tabs)
|
|
self.status_bar = QStatusBar(self)
|
|
self.setStatusBar(self.status_bar)
|
|
self.setMenuBar(self.create_dynamic_menu_bar())
|
|
|
|
self.setTabPosition(Qt.DockWidgetArea.AllDockWidgetAreas, QTabWidget.TabPosition.North)
|
|
|
|
def create_dynamic_menu_bar(self) -> QMenuBar:
|
|
menu_bar = QMenuBar()
|
|
|
|
menu_contributions: [MenuContribution] = PluginRegistry.execute_flat_map("get_menu_contributions")
|
|
menu_contributions.append(MenuContribution("settings", action=self._action_highlight_search_terms()))
|
|
menu_contributions.append(MenuContribution("settings", action=self._action_new_tab()))
|
|
|
|
menu_contributions = sort_menu_contributions(menu_contributions)
|
|
|
|
known_menus = [
|
|
("file", _("&File")),
|
|
("settings", _("&Settings")),
|
|
("window", _("&Window")),
|
|
("help", _("&Help"))
|
|
]
|
|
|
|
for (menu_id, menu_label) in known_menus:
|
|
menu = QMenu(self)
|
|
menu.setTitle(menu_label)
|
|
mcs: [MenuContribution] = [mc for mc in menu_contributions if mc.menu_id == menu_id]
|
|
if len(mcs) == 0:
|
|
continue
|
|
for menu_contribution in mcs:
|
|
if menu_contribution.action:
|
|
action = menu_contribution.action.to_qaction(menu)
|
|
menu.addAction(action)
|
|
if menu_contribution.menu:
|
|
submenu = QMenu(menu_contribution.menu.label, menu_bar)
|
|
submenu.setIcon(Icon.fromTheme(menu_contribution.menu.icon_from_theme))
|
|
menu_contribution.menu.add_change_listener(
|
|
lambda qmenu=submenu, rmenu=menu_contribution.menu: self._rmenu_update(qmenu, rmenu))
|
|
self._rmenu_update(submenu, menu_contribution.menu)
|
|
menu.addMenu(submenu)
|
|
|
|
menu_bar.addMenu(menu)
|
|
|
|
return menu_bar
|
|
|
|
def _rmenu_update(self, qmenu: QMenu, rmenu: RMenu):
|
|
qmenu.clear()
|
|
for raction in rmenu.actions:
|
|
action = raction.to_qaction(qmenu)
|
|
qmenu.addAction(action)
|
|
|
|
def _action_highlight_search_terms(self):
|
|
highlight_search_terms = RAction(_("Highlight &Searches"))
|
|
highlight_search_terms.set_checkable(True)
|
|
highlight_search_terms.set_checked(self.settings.session.getboolean("general", "highlight_search_term"))
|
|
highlight_search_terms.set_action(lambda: self.settings.set_session("general", "highlight_search_term",
|
|
str(highlight_search_terms.checked)) or self.update())
|
|
return highlight_search_terms
|
|
|
|
def _action_new_tab(self):
|
|
new_tab = RAction(_("Open Tab on Save As File"))
|
|
new_tab.set_checkable(True)
|
|
new_tab.set_checked(self.settings.session.getboolean("general", "open_tab_on_save_as_file"))
|
|
new_tab.set_action(
|
|
lambda: self.settings.set_session("general", "open_tab_on_save_as_file", str(new_tab.checked)))
|
|
return new_tab
|
|
|
|
def dragEnterEvent(self, e: QDragEnterEvent):
|
|
if url_is_file(e.mimeData().text()):
|
|
e.accept()
|
|
else:
|
|
e.ignore()
|
|
|
|
def dropEvent(self, e):
|
|
files = urlutils.urls_to_path(e.mimeData().text())
|
|
for file in files:
|
|
PluginRegistry.execute_single("open_file", file)
|
|
|
|
def _restore_window(self):
|
|
qsettings = CuteSettings()
|
|
geometry_restored = False
|
|
geometry = qsettings.value("mainWindow/geometry")
|
|
if geometry:
|
|
geometry_restored = self.restoreGeometry(geometry)
|
|
if not geometry_restored:
|
|
self.setGeometry(0, 0, 800, 600)
|
|
|
|
def closeEvent(self, event):
|
|
self.destruct()
|
|
|
|
def destruct(self):
|
|
PluginRegistry.execute("before_shutdown")
|
|
self.tabs.destruct()
|
|
self.close()
|
|
SettingsStore.save(self.settings)
|
|
CuteSettings().set_value("mainWindow/geometry", self.saveGeometry())
|