mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-10 19:04:15 +02:00
restart is not required when changing enabled gems
This commit is contained in:
@@ -335,7 +335,7 @@ class AppsTable(QTableWidget):
|
||||
desc = '...'
|
||||
|
||||
if desc and desc != '...':
|
||||
desc = strip_html(desc[0:25]) + '...'
|
||||
desc = strip_html(desc[0:40]) + '...'
|
||||
|
||||
item.setText(desc)
|
||||
|
||||
@@ -359,9 +359,9 @@ class AppsTable(QTableWidget):
|
||||
|
||||
if not publisher:
|
||||
if not pkg.model.installed:
|
||||
item.setStyleSheet('QLabel { color: red; font-weight: bold}')
|
||||
item.setStyleSheet('QLabel { color: red; }')
|
||||
|
||||
publisher = '({})'.format(self.i18n['publisher.unknown'])
|
||||
publisher = self.i18n['unknown']
|
||||
|
||||
item.setText(' {} '.format(publisher))
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ def update_info(pkgv: PackageView, pkgs_info: dict):
|
||||
|
||||
|
||||
def apply_filters(pkgv: PackageView, filters: dict, info: dict):
|
||||
hidden = filters['only_apps'] and not pkgv.model.is_application()
|
||||
hidden = filters['only_apps'] and pkgv.model.installed and not pkgv.model.is_application()
|
||||
|
||||
if not hidden and filters['type'] is not None and filters['type'] != 'any':
|
||||
hidden = pkgv.model.get_type() != filters['type']
|
||||
|
||||
@@ -2,6 +2,7 @@ from typing import List
|
||||
|
||||
from PyQt5.QtWidgets import QMessageBox, QVBoxLayout, QLabel, QWidget
|
||||
from bauh.api.abstract.view import ViewComponent, SingleSelectComponent, MultipleSelectComponent
|
||||
from bauh.view.qt import css
|
||||
|
||||
from bauh.view.qt.components import MultipleSelectQt, new_single_select
|
||||
|
||||
@@ -13,6 +14,7 @@ class ConfirmationDialog(QMessageBox):
|
||||
self.setWindowTitle(title)
|
||||
self.setStyleSheet('QLabel { margin-right: 25px; }')
|
||||
self.bt_yes = self.addButton(locale_keys['popup.button.yes'] if not confirmation_label else confirmation_label.capitalize(), QMessageBox.YesRole)
|
||||
self.bt_yes.setStyleSheet(css.OK_BUTTON)
|
||||
|
||||
self.addButton(locale_keys['popup.button.no'] if not deny_label else deny_label.capitalize(), QMessageBox.NoRole)
|
||||
|
||||
|
||||
4
bauh/view/qt/css.py
Normal file
4
bauh/view/qt/css.py
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
OK_BUTTON = """QPushButton { background: green; color: white; font-weight: bold}
|
||||
QPushButton:disabled { background-color: gray; }
|
||||
"""
|
||||
@@ -5,6 +5,7 @@ from PyQt5.QtWidgets import QMessageBox, QLabel, QWidget, QHBoxLayout
|
||||
from bauh.api.abstract.view import MessageType
|
||||
|
||||
from bauh.util import resource
|
||||
from bauh.view.qt import css
|
||||
|
||||
MSG_TYPE_MAP = {
|
||||
MessageType.ERROR: QMessageBox.Critical,
|
||||
@@ -42,6 +43,7 @@ def ask_confirmation(title: str, body: str, locale_keys: dict, icon: QIcon = QIc
|
||||
diag.layout().addWidget(wbody, 0, 1)
|
||||
|
||||
bt_yes = diag.addButton(locale_keys['popup.button.yes'], QMessageBox.YesRole)
|
||||
bt_yes.setStyleSheet(css.OK_BUTTON)
|
||||
|
||||
diag.addButton(locale_keys['popup.button.no'], QMessageBox.NoRole)
|
||||
|
||||
|
||||
@@ -1,57 +1,53 @@
|
||||
import subprocess
|
||||
import sys
|
||||
from typing import List
|
||||
|
||||
from PyQt5.QtCore import Qt, QCoreApplication
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QIcon
|
||||
from PyQt5.QtWidgets import QWidget, QLabel, QGridLayout, QPushButton
|
||||
|
||||
from bauh import ROOT_DIR
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.api.abstract.view import MultipleSelectComponent, InputOption
|
||||
from bauh.commons import resource, system
|
||||
from bauh.commons import resource
|
||||
from bauh.core.config import Configuration, save
|
||||
from bauh.util import util
|
||||
from bauh.view.qt import qt_utils
|
||||
from bauh.core.controller import GenericSoftwareManager
|
||||
from bauh.view.qt import qt_utils, css
|
||||
from bauh.view.qt.components import MultipleSelectQt, CheckboxQt, new_spacer
|
||||
|
||||
|
||||
class GemSelectorPanel(QWidget):
|
||||
|
||||
def __init__(self, managers: List[SoftwareManager], i18n: dict, managers_set: List[str], show_panel_after_restart: bool = False):
|
||||
def __init__(self, window: QWidget, manager: GenericSoftwareManager, i18n: dict, config: Configuration, show_panel_after_restart: bool = False):
|
||||
super(GemSelectorPanel, self).__init__()
|
||||
self.managers = managers
|
||||
self.window = window
|
||||
self.manager = manager
|
||||
self.config = config
|
||||
self.setLayout(QGridLayout())
|
||||
self.setWindowIcon(QIcon(resource.get_path('img/logo.svg', ROOT_DIR)))
|
||||
self.setWindowTitle(i18n['welcome'].capitalize() if not managers_set else i18n['gem_selector.title'])
|
||||
self.setWindowTitle(i18n['gem_selector.title'])
|
||||
self.resize(400, 400)
|
||||
self.exit_on_close = not managers_set
|
||||
self.show_panel_after_restart = show_panel_after_restart
|
||||
|
||||
self.label_question = QLabel(i18n['gem_selector.question'])
|
||||
self.label_question.setStyleSheet('QLabel { font-weight: bold}')
|
||||
self.layout().addWidget(self.label_question, 0, 1, Qt.AlignHCenter)
|
||||
|
||||
self.bt_proceed = QPushButton(i18n['proceed' if not managers_set else 'change'].capitalize())
|
||||
self.bt_proceed.setStyleSheet("""QPushButton { background: green; color: white; font-weight: bold}
|
||||
QPushButton:disabled { background-color: gray; }
|
||||
""")
|
||||
self.bt_proceed = QPushButton(i18n['change'].capitalize())
|
||||
self.bt_proceed.setStyleSheet(css.OK_BUTTON)
|
||||
self.bt_proceed.clicked.connect(self.save)
|
||||
|
||||
self.bt_exit = QPushButton(i18n['exit'].capitalize())
|
||||
self.bt_exit.setStyleSheet('QPushButton { background: red; color: white; font-weight: bold}')
|
||||
self.bt_exit.clicked.connect(self.exit)
|
||||
|
||||
self.gem_map = {}
|
||||
gem_options = []
|
||||
|
||||
for m in managers:
|
||||
modname = m.__module__.split('.')[-2]
|
||||
gem_options.append(InputOption(label=i18n.get('gem.{}.label'.format(modname), modname.capitalize()),
|
||||
value=modname,
|
||||
icon_path='{r}/gems/{n}/resources/img/{n}.png'.format(r=ROOT_DIR, n=modname)))
|
||||
for m in manager.managers:
|
||||
if m.can_work():
|
||||
modname = m.__module__.split('.')[-2]
|
||||
gem_options.append(InputOption(label=i18n.get('gem.{}.label'.format(modname), modname.capitalize()),
|
||||
value=modname,
|
||||
icon_path='{r}/gems/{n}/resources/img/{n}.png'.format(r=ROOT_DIR, n=modname)))
|
||||
self.gem_map[modname] = m
|
||||
|
||||
if managers_set:
|
||||
default_ops = {o for o in gem_options if o.value in managers_set}
|
||||
if self.config.enabled_gems:
|
||||
default_ops = {o for o in gem_options if o.value in self.config.enabled_gems}
|
||||
else:
|
||||
default_ops = set(gem_options)
|
||||
|
||||
@@ -76,14 +72,19 @@ class GemSelectorPanel(QWidget):
|
||||
self.bt_proceed.setEnabled(bool(self.gem_select_model.values))
|
||||
|
||||
def save(self):
|
||||
config = Configuration(gems=[o.value for o in self.gem_select_model.values])
|
||||
save(config)
|
||||
enabled_gems = [op.value for op in self.gem_select_model.values]
|
||||
|
||||
util.restart_app(self.show_panel_after_restart)
|
||||
for module, man in self.gem_map.items():
|
||||
enabled = module in enabled_gems
|
||||
man.set_enabled(enabled)
|
||||
|
||||
self.config.enabled_gems = enabled_gems
|
||||
save(self.config)
|
||||
|
||||
self.manager.reset_cache()
|
||||
self.manager.prepare()
|
||||
self.window.refresh_apps()
|
||||
self.close()
|
||||
|
||||
def exit(self):
|
||||
if self.exit_on_close:
|
||||
QCoreApplication.exit()
|
||||
else:
|
||||
self.close()
|
||||
|
||||
self.close()
|
||||
|
||||
@@ -5,11 +5,10 @@ from typing import List
|
||||
from PyQt5.QtCore import QThread, pyqtSignal, QCoreApplication, Qt
|
||||
from PyQt5.QtGui import QIcon
|
||||
from PyQt5.QtWidgets import QSystemTrayIcon, QMenu
|
||||
from bauh.api.abstract.model import PackageUpdate
|
||||
|
||||
from bauh import __app_name__
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.core.config import Configuration
|
||||
from bauh.api.abstract.model import PackageUpdate
|
||||
from bauh.util import util, resource
|
||||
from bauh.view.qt.about import AboutDialog
|
||||
from bauh.view.qt.window import ManageWindow
|
||||
@@ -34,11 +33,10 @@ class UpdateCheck(QThread):
|
||||
|
||||
class TrayIcon(QSystemTrayIcon):
|
||||
|
||||
def __init__(self, locale_keys: dict, manager: SoftwareManager, manage_window: ManageWindow, config: Configuration, check_interval: int = 60, update_notification: bool = True):
|
||||
def __init__(self, locale_keys: dict, manager: SoftwareManager, manage_window: ManageWindow, check_interval: int = 60, update_notification: bool = True):
|
||||
super(TrayIcon, self).__init__()
|
||||
self.locale_keys = locale_keys
|
||||
self.manager = manager
|
||||
self.config = config
|
||||
|
||||
self.icon_default = QIcon(resource.get_path('img/logo.png'))
|
||||
self.icon_update = QIcon(resource.get_path('img/logo_update.png'))
|
||||
@@ -118,12 +116,8 @@ class TrayIcon(QSystemTrayIcon):
|
||||
if self.manage_window.isMinimized():
|
||||
self.manage_window.setWindowState(Qt.WindowNoState)
|
||||
elif not self.manage_window.isVisible():
|
||||
if self.config.gems:
|
||||
self.manage_window.refresh_apps()
|
||||
self.manage_window.show()
|
||||
else:
|
||||
self.manage_window.show()
|
||||
self.manage_window.show_gems_selector()
|
||||
self.manage_window.refresh_apps()
|
||||
self.manage_window.show()
|
||||
|
||||
def show_about(self):
|
||||
|
||||
|
||||
@@ -213,10 +213,10 @@ class GetAppHistory(AsyncAction):
|
||||
self.app = None
|
||||
|
||||
|
||||
class SearchApps(AsyncAction):
|
||||
class SearchPackages(AsyncAction):
|
||||
|
||||
def __init__(self, manager: SoftwareManager):
|
||||
super(SearchApps, self).__init__()
|
||||
super(SearchPackages, self).__init__()
|
||||
self.word = None
|
||||
self.manager = manager
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ from typing import List, Type, Set
|
||||
|
||||
from PyQt5.QtCore import QEvent, Qt, QSize, pyqtSignal
|
||||
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QPixmap, QCursor
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QCheckBox, QHeaderView, QToolBar, \
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHeaderView, QToolBar, \
|
||||
QLabel, QPlainTextEdit, QLineEdit, QProgressBar, QPushButton, QComboBox, QMenu, QAction
|
||||
|
||||
from bauh.api.abstract.cache import MemoryCache
|
||||
@@ -12,8 +12,8 @@ from bauh.api.abstract.context import ApplicationContext
|
||||
from bauh.api.abstract.controller import SoftwareManager
|
||||
from bauh.api.abstract.model import SoftwarePackage, PackageAction
|
||||
from bauh.api.abstract.view import MessageType
|
||||
from bauh.core import gems
|
||||
from bauh.core.config import Configuration
|
||||
from bauh.core.controller import GenericSoftwareManager
|
||||
from bauh.util import util, resource
|
||||
from bauh.view.qt import dialog, commons, qt_utils
|
||||
from bauh.view.qt.about import AboutDialog
|
||||
@@ -26,7 +26,7 @@ from bauh.view.qt.info import InfoDialog
|
||||
from bauh.view.qt.root import is_root, ask_root_password
|
||||
from bauh.view.qt.styles import StylesComboBox
|
||||
from bauh.view.qt.thread import UpdateSelectedApps, RefreshApps, UninstallApp, DowngradeApp, GetAppInfo, \
|
||||
GetAppHistory, SearchApps, InstallApp, AnimateProgress, VerifyModels, FindSuggestions, ListWarnings, \
|
||||
GetAppHistory, SearchPackages, InstallApp, AnimateProgress, VerifyModels, FindSuggestions, ListWarnings, \
|
||||
AsyncAction, RunApp, ApplyFilters, CustomAction
|
||||
from bauh.view.qt.view_model import PackageView
|
||||
from bauh.view.qt.view_utils import load_icon
|
||||
@@ -204,7 +204,7 @@ class ManageWindow(QWidget):
|
||||
self.thread_uninstall = self._bind_async_action(UninstallApp(self.manager, self.icon_cache), finished_call=self._finish_uninstall)
|
||||
self.thread_get_info = self._bind_async_action(GetAppInfo(self.manager), finished_call=self._finish_get_info)
|
||||
self.thread_get_history = self._bind_async_action(GetAppHistory(self.manager, self.i18n), finished_call=self._finish_get_history)
|
||||
self.thread_search = self._bind_async_action(SearchApps(self.manager), finished_call=self._finish_search, only_finished=True)
|
||||
self.thread_search = self._bind_async_action(SearchPackages(self.manager), finished_call=self._finish_search, only_finished=True)
|
||||
self.thread_downgrade = self._bind_async_action(DowngradeApp(self.manager, self.i18n), finished_call=self._finish_downgrade)
|
||||
self.thread_suggestions = self._bind_async_action(FindSuggestions(man=self.manager), finished_call=self._finish_search, only_finished=True)
|
||||
self.thread_run_app = self._bind_async_action(RunApp(), finished_call=self._finish_run_app, only_finished=False)
|
||||
@@ -900,21 +900,21 @@ class ManageWindow(QWidget):
|
||||
self.checkbox_console.setChecked(True)
|
||||
|
||||
def show_gems_selector(self):
|
||||
managers = gems.load_managers(context=self.context, locale=None)
|
||||
enabled_managers = [m for m in managers if m.is_enabled()]
|
||||
gem_panel = GemSelectorPanel(managers=enabled_managers, i18n=self.i18n,
|
||||
managers_set=self.config.gems,
|
||||
gem_panel = GemSelectorPanel(window=self,
|
||||
manager=self.manager, i18n=self.i18n,
|
||||
config=self.config,
|
||||
show_panel_after_restart=bool(self.tray_icon))
|
||||
gem_panel.show()
|
||||
|
||||
def _show_settings_menu(self):
|
||||
menu_row = QMenu()
|
||||
|
||||
action_gems = QAction(self.i18n['manage_window.settings.gems'])
|
||||
action_gems.setIcon(self.icon_app)
|
||||
if isinstance(self.manager, GenericSoftwareManager):
|
||||
action_gems = QAction(self.i18n['manage_window.settings.gems'])
|
||||
action_gems.setIcon(self.icon_app)
|
||||
|
||||
action_gems.triggered.connect(self.show_gems_selector)
|
||||
menu_row.addAction(action_gems)
|
||||
action_gems.triggered.connect(self.show_gems_selector)
|
||||
menu_row.addAction(action_gems)
|
||||
|
||||
action_about = QAction(self.i18n['manage_window.settings.about'])
|
||||
action_about.setIcon(QIcon(resource.get_path('img/about.svg')))
|
||||
|
||||
Reference in New Issue
Block a user