[ui][settings] available as a tray action

This commit is contained in:
Vinícius Moreira
2020-02-07 15:23:01 -03:00
parent 0fd85fe10f
commit 0201bda2b7
6 changed files with 76 additions and 30 deletions

View File

@@ -4,12 +4,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [0.8.3] ## [0.8.3] - 2020
### Improvements ### Improvements
- New update lifecycle: - New update lifecycle:
- now every package manager must provide the best upgrade order for all the selected packages ( can be disabled through the settings file **~/.config/bauh/config.yml** or the UI ) - now every package manager must provide the best upgrade order for all the selected packages ( can be disabled through the settings file **~/.config/bauh/config.yml** or the UI )
- AUR - AUR
- allowing the user to bypass checksum errors when installing / upgrading / downgrading packages - allowing the user to bypass checksum errors when installing / upgrading / downgrading packages
- UI:
- **Settings** available as a tray action as well
## [0.8.2] - 2020-01-31 ## [0.8.2] - 2020-01-31
### Features ### Features

View File

@@ -76,6 +76,7 @@ def main():
manager.prepare() manager.prepare()
app = QApplication(sys.argv) app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)
app.setApplicationName(__app_name__) app.setApplicationName(__app_name__)
app.setApplicationVersion(__version__) app.setApplicationVersion(__version__)
app_icon = util.get_default_icon()[1] app_icon = util.get_default_icon()[1]
@@ -101,6 +102,7 @@ def main():
tray_icon = TrayIcon(i18n=i18n, tray_icon = TrayIcon(i18n=i18n,
manager=manager, manager=manager,
manage_window=manage_window, manage_window=manage_window,
screen_size=app.primaryScreen().size(),
config=local_config) config=local_config)
manage_window.set_tray_icon(tray_icon) manage_window.set_tray_icon(tray_icon)
tray_icon.show() tray_icon.show()

View File

@@ -409,16 +409,14 @@ class GenericSoftwareManager(SoftwareManager):
working_managers=self.working_managers, working_managers=self.working_managers,
logger=self.logger, logger=self.logger,
i18n=self.i18n) i18n=self.i18n)
else:
self.settings_manager.managers = self.managers
self.settings_manager.working_managers = self.working_managers
return self.settings_manager.get_settings(screen_width=screen_width, screen_height=screen_height) return self.settings_manager.get_settings(screen_width=screen_width, screen_height=screen_height)
def save_settings(self, component: TabGroupComponent) -> Tuple[bool, List[str]]: def save_settings(self, component: TabGroupComponent) -> Tuple[bool, List[str]]:
res = self.settings_manager.save_settings(component) return self.settings_manager.save_settings(component)
if res[0]:
self.settings_manager = None
return res
def sort_update_order(self, pkgs: List[SoftwarePackage]) -> List[SoftwarePackage]: def sort_update_order(self, pkgs: List[SoftwarePackage]) -> List[SoftwarePackage]:
by_manager = {} by_manager = {}

View File

@@ -1,6 +1,8 @@
import gc
from io import StringIO from io import StringIO
from PyQt5.QtCore import QSize from PyQt5 import sip
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolBar, QSizePolicy, QPushButton from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolBar, QSizePolicy, QPushButton
from bauh.api.abstract.controller import SoftwareManager from bauh.api.abstract.controller import SoftwareManager
@@ -14,7 +16,7 @@ from bauh.view.util.translation import I18n
class SettingsWindow(QWidget): class SettingsWindow(QWidget):
def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, tray: bool, window: QWidget, parent: QWidget = None): def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, tray, window: QWidget, parent: QWidget = None):
super(SettingsWindow, self).__init__(parent=parent) super(SettingsWindow, self).__init__(parent=parent)
self.setWindowTitle(i18n['settings'].capitalize()) self.setWindowTitle(i18n['settings'].capitalize())
self.setLayout(QVBoxLayout()) self.setLayout(QVBoxLayout())
@@ -48,6 +50,25 @@ class SettingsWindow(QWidget):
self.layout().addWidget(action_bar) self.layout().addWidget(action_bar)
def closeEvent(self, event):
if self.window and self.window.settings_window == self:
sip.delete(self.window.settings_window)
self.window.settings_window = None
elif self.tray and self.tray.settings_window == self:
sip.delete(self.tray.settings_window)
self.tray.settings_window = None
gc.collect()
event.accept()
def handle_display(self):
if self.isMinimized():
self.setWindowState(Qt.WindowNoState)
elif self.isHidden():
self.show()
else:
self.setWindowState(self.windowState() and Qt.WindowMinimized or Qt.WindowActive)
def _save_settings(self): def _save_settings(self):
success, warnings = self.manager.save_settings(self.settings_model) success, warnings = self.manager.save_settings(self.settings_model)
@@ -58,15 +79,17 @@ class SettingsWindow(QWidget):
body="<p>{}</p><p>{}</p>".format(self.i18n['settings.changed.success.warning'], body="<p>{}</p><p>{}</p>".format(self.i18n['settings.changed.success.warning'],
self.i18n['settings.changed.success.reboot']), self.i18n['settings.changed.success.reboot']),
i18n=self.i18n): i18n=self.i18n):
util.restart_app(self.tray) util.restart_app(self.window and self.window.isVisible())
else: else:
if isinstance(self.manager, GenericSoftwareManager): if isinstance(self.manager, GenericSoftwareManager):
self.manager.reset_cache() self.manager.reset_cache()
self.manager.prepare() self.manager.prepare()
self.window.verify_warnings()
self.window.types_changed = True if self.window and self.window.isVisible():
self.window.refresh_apps() self.window.verify_warnings()
self.window.types_changed = True
self.window.refresh_apps()
self.close() self.close()
else: else:
msg = StringIO() msg = StringIO()

View File

@@ -1,20 +1,21 @@
import os
import time import time
from io import StringIO from io import StringIO
from threading import Lock, Thread from threading import Lock, Thread
from typing import List from typing import List
from PyQt5.QtCore import QThread, pyqtSignal, QCoreApplication, Qt from PyQt5.QtCore import QThread, pyqtSignal, QCoreApplication, Qt, QSize
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QSystemTrayIcon, QMenu from PyQt5.QtWidgets import QSystemTrayIcon, QMenu, QWidget, QSizePolicy
from bauh import __app_name__ from bauh import __app_name__
from bauh.api.abstract.controller import SoftwareManager from bauh.api.abstract.controller import SoftwareManager
from bauh.api.abstract.model import PackageUpdate from bauh.api.abstract.model import PackageUpdate
from bauh.view.qt.view_utils import load_resource_icon from bauh.view.qt import qt_utils
from bauh.view.util import util, resource
from bauh.view.qt.about import AboutDialog from bauh.view.qt.about import AboutDialog
from bauh.view.qt.settings import SettingsWindow
from bauh.view.qt.view_utils import load_resource_icon
from bauh.view.qt.window import ManageWindow from bauh.view.qt.window import ManageWindow
from bauh.view.util import util
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
@@ -37,10 +38,11 @@ class UpdateCheck(QThread):
class TrayIcon(QSystemTrayIcon): class TrayIcon(QSystemTrayIcon):
def __init__(self, i18n: I18n, manager: SoftwareManager, manage_window: ManageWindow, config: dict): def __init__(self, i18n: I18n, manager: SoftwareManager, manage_window: ManageWindow, config: dict, screen_size: QSize):
super(TrayIcon, self).__init__() super(TrayIcon, self).__init__()
self.i18n = i18n self.i18n = i18n
self.manager = manager self.manager = manager
self.screen_size = screen_size
if config['ui']['tray']['default_icon']: if config['ui']['tray']['default_icon']:
self.icon_default = QIcon(config['ui']['tray']['default_icon']) self.icon_default = QIcon(config['ui']['tray']['default_icon'])
@@ -65,6 +67,9 @@ class TrayIcon(QSystemTrayIcon):
self.action_manage = self.menu.addAction(self.i18n['tray.action.manage']) self.action_manage = self.menu.addAction(self.i18n['tray.action.manage'])
self.action_manage.triggered.connect(self.show_manage_window) self.action_manage.triggered.connect(self.show_manage_window)
self.action_settings = self.menu.addAction(self.i18n['settings'].capitalize())
self.action_settings.triggered.connect(self.show_settings_window)
self.action_about = self.menu.addAction(self.i18n['tray.action.about']) self.action_about = self.menu.addAction(self.i18n['tray.action.about'])
self.action_about.triggered.connect(self.show_about) self.action_about.triggered.connect(self.show_about)
@@ -75,6 +80,8 @@ class TrayIcon(QSystemTrayIcon):
self.manage_window = None self.manage_window = None
self.dialog_about = None self.dialog_about = None
self.settings_window = None
self.check_thread = UpdateCheck(check_interval=int(config['updates']['check_interval']), manager=self.manager) self.check_thread = UpdateCheck(check_interval=int(config['updates']['check_interval']), manager=self.manager)
self.check_thread.signal.connect(self.notify_updates) self.check_thread.signal.connect(self.notify_updates)
self.check_thread.start() self.check_thread.start()
@@ -154,8 +161,21 @@ class TrayIcon(QSystemTrayIcon):
self.manage_window.refresh_apps() self.manage_window.refresh_apps()
self.manage_window.show() self.manage_window.show()
def show_about(self): def show_settings_window(self):
if self.settings_window:
self.settings_window.handle_display()
else:
self.settings_window = SettingsWindow(manager=self.manager,
i18n=self.i18n,
screen_size=self.screen_size,
tray=self,
window=self.manage_window)
self.settings_window.setMinimumWidth(int(self.screen_size.width() / 4))
self.settings_window.adjustSize()
qt_utils.centralize(self.settings_window)
self.settings_window.show()
def show_about(self):
if self.dialog_about is None: if self.dialog_about is None:
self.dialog_about = AboutDialog(self.i18n) self.dialog_about = AboutDialog(self.i18n)

View File

@@ -30,7 +30,6 @@ from bauh.view.qt.thread import UpdateSelectedApps, RefreshApps, UninstallApp, D
GetAppHistory, SearchPackages, InstallPackage, AnimateProgress, VerifyModels, FindSuggestions, ListWarnings, \ GetAppHistory, SearchPackages, InstallPackage, AnimateProgress, VerifyModels, FindSuggestions, ListWarnings, \
AsyncAction, LaunchApp, ApplyFilters, CustomAction, GetScreenshots AsyncAction, LaunchApp, ApplyFilters, CustomAction, GetScreenshots
from bauh.view.qt.view_model import PackageView from bauh.view.qt.view_model import PackageView
from bauh.view.qt.view_utils import load_icon
from bauh.view.util import util, resource from bauh.view.util import util, resource
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
@@ -316,7 +315,7 @@ class ManageWindow(QWidget):
self.toolbar_bottom.addWidget(new_spacer()) self.toolbar_bottom.addWidget(new_spacer())
bt_settings = IconButton(QIcon(resource.get_path('img/app_settings.svg')), bt_settings = IconButton(QIcon(resource.get_path('img/app_settings.svg')),
action=self._show_settings, action=self.show_settings,
background='#12ABAB', background='#12ABAB',
i18n=self.i18n, i18n=self.i18n,
tooltip=self.i18n['manage_window.bt_settings.tooltip']) tooltip=self.i18n['manage_window.bt_settings.tooltip'])
@@ -501,7 +500,6 @@ class ManageWindow(QWidget):
self.table_apps.change_headers_policy(policy) self.table_apps.change_headers_policy(policy)
def closeEvent(self, event): def closeEvent(self, event):
if self.tray_icon: if self.tray_icon:
event.ignore() event.ignore()
self.hide() self.hide()
@@ -1169,10 +1167,13 @@ class ManageWindow(QWidget):
else: else:
self.checkbox_console.setChecked(True) self.checkbox_console.setChecked(True)
def _show_settings(self): def show_settings(self):
self.settings_window = SettingsWindow(self.manager, self.i18n, self.screen_size, bool(self.tray_icon), self) if self.settings_window:
self.settings_window.setMinimumWidth(int(self.screen_size.width() / 4)) self.settings_window.handle_display()
self.settings_window.resize(self.size()) else:
self.settings_window.adjustSize() self.settings_window = SettingsWindow(self.manager, self.i18n, self.screen_size, self.tray_icon, self)
qt_utils.centralize(self.settings_window) self.settings_window.setMinimumWidth(int(self.screen_size.width() / 4))
self.settings_window.show() self.settings_window.resize(self.size())
self.settings_window.adjustSize()
qt_utils.centralize(self.settings_window)
self.settings_window.show()