[ui] fix -> settings dialog hangs sometimes when the button 'Change' is clicked

This commit is contained in:
Vinicius Moreira
2021-01-19 12:08:31 -03:00
parent 94e44f9341
commit 67304e86e7
2 changed files with 52 additions and 28 deletions

View File

@@ -62,6 +62,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- crashing when trying to retrieve size of runtimes subcomponents [#164](https://github.com/vinifmor/bauh/issues/164) - crashing when trying to retrieve size of runtimes subcomponents [#164](https://github.com/vinifmor/bauh/issues/164)
- UI - UI
- initialization dialog hanging sometimes (due to thread locking) - initialization dialog hanging sometimes (due to thread locking)
- settings dialog hangs sometimes when the button "Change" is clicked
- displaying a popup when information of a given package is not available - displaying a popup when information of a given package is not available
- wrong package type icon size depending on resolution - wrong package type icon size depending on resolution

View File

@@ -2,9 +2,9 @@ import gc
from io import StringIO from io import StringIO
from typing import Optional from typing import Optional
from PyQt5.QtCore import QSize, Qt, QCoreApplication from PyQt5.QtCore import QSize, Qt, QCoreApplication, QThread, pyqtSignal
from PyQt5.QtGui import QCursor from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QPushButton, QHBoxLayout from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QPushButton, QHBoxLayout, QApplication
from bauh import __app_name__ from bauh import __app_name__
from bauh.api.abstract.controller import SoftwareManager from bauh.api.abstract.controller import SoftwareManager
@@ -18,6 +18,22 @@ from bauh.view.util import util
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
class ReloadManagePanel(QThread):
signal_finished = pyqtSignal()
def __init__(self, manager: SoftwareManager):
super(ReloadManagePanel, self).__init__()
self.manager = manager
def run(self):
if isinstance(self.manager, GenericSoftwareManager):
self.manager.reset_cache()
self.manager.prepare(task_manager=None, root_password=None, internet_available=None)
self.signal_finished.emit()
class SettingsWindow(QWidget): class SettingsWindow(QWidget):
def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, window: QWidget, parent: Optional[QWidget] = None): def __init__(self, manager: SoftwareManager, i18n: I18n, screen_size: QSize, window: QWidget, parent: Optional[QWidget] = None):
@@ -31,9 +47,9 @@ class SettingsWindow(QWidget):
self.settings_model = self.manager.get_settings(screen_size.width(), screen_size.height()) self.settings_model = self.manager.get_settings(screen_size.width(), screen_size.height())
tab_group = to_widget(self.settings_model, i18n) self.tab_group = to_widget(self.settings_model, i18n)
tab_group.setObjectName('settings') self.tab_group.setObjectName('settings')
self.layout().addWidget(tab_group) self.layout().addWidget(self.tab_group)
lower_container = QWidget() lower_container = QWidget()
lower_container.setObjectName('lower_container') lower_container.setObjectName('lower_container')
@@ -41,26 +57,29 @@ class SettingsWindow(QWidget):
lower_container.setLayout(QHBoxLayout()) lower_container.setLayout(QHBoxLayout())
lower_container.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) lower_container.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
bt_close = QPushButton() self.bt_close = QPushButton()
bt_close.setObjectName('cancel') self.bt_close.setObjectName('cancel')
bt_close.setAutoDefault(True) self.bt_close.setAutoDefault(True)
bt_close.setCursor(QCursor(Qt.PointingHandCursor)) self.bt_close.setCursor(QCursor(Qt.PointingHandCursor))
bt_close.setText(self.i18n['close'].capitalize()) self.bt_close.setText(self.i18n['close'].capitalize())
bt_close.clicked.connect(lambda: self.close()) self.bt_close.clicked.connect(lambda: self.close())
lower_container.layout().addWidget(bt_close) lower_container.layout().addWidget(self.bt_close)
lower_container.layout().addWidget(new_spacer()) lower_container.layout().addWidget(new_spacer())
bt_change = QPushButton() self.bt_change = QPushButton()
bt_change.setAutoDefault(True) self.bt_change.setAutoDefault(True)
bt_change.setObjectName('ok') self.bt_change.setObjectName('ok')
bt_change.setCursor(QCursor(Qt.PointingHandCursor)) self.bt_change.setCursor(QCursor(Qt.PointingHandCursor))
bt_change.setText(self.i18n['change'].capitalize()) self.bt_change.setText(self.i18n['change'].capitalize())
bt_change.clicked.connect(self._save_settings) self.bt_change.clicked.connect(self._save_settings)
lower_container.layout().addWidget(bt_change) lower_container.layout().addWidget(self.bt_change)
self.layout().addWidget(lower_container) self.layout().addWidget(lower_container)
self.thread_reload_panel = ReloadManagePanel(manager=manager)
self.thread_reload_panel.signal_finished.connect(self._reload_manage_panel)
def show(self): def show(self):
super(SettingsWindow, self).show() super(SettingsWindow, self).show()
centralize(self) centralize(self)
@@ -83,6 +102,10 @@ class SettingsWindow(QWidget):
self.setWindowState(self.windowState() and Qt.WindowMinimized or Qt.WindowActive) self.setWindowState(self.windowState() and Qt.WindowMinimized or Qt.WindowActive)
def _save_settings(self): def _save_settings(self):
self.tab_group.setEnabled(False)
self.bt_change.setEnabled(False)
self.bt_close.setEnabled(False)
success, warnings = self.manager.save_settings(self.settings_model) success, warnings = self.manager.save_settings(self.settings_model)
if success: if success:
@@ -98,15 +121,8 @@ class SettingsWindow(QWidget):
self.close() self.close()
util.restart_app() util.restart_app()
else: else:
if isinstance(self.manager, GenericSoftwareManager): self.thread_reload_panel.start()
self.manager.reset_cache() QApplication.setOverrideCursor(Qt.WaitCursor)
self.manager.prepare(task_manager=None, root_password=None, internet_available=None)
if self.window and self.window.isVisible():
self.window.reload()
self.close()
else: else:
msg = StringIO() msg = StringIO()
msg.write("<p>{}</p>".format(self.i18n['settings.error'])) msg.write("<p>{}</p>".format(self.i18n['settings.error']))
@@ -116,3 +132,10 @@ class SettingsWindow(QWidget):
msg.seek(0) msg.seek(0)
dialog.show_message(title=self.i18n['warning'].capitalize(), body=msg.read(), type_=MessageType.WARNING) dialog.show_message(title=self.i18n['warning'].capitalize(), body=msg.read(), type_=MessageType.WARNING)
def _reload_manage_panel(self):
if self.window and self.window.isVisible():
self.window.reload()
QApplication.restoreOverrideCursor()
self.close()