[view] fix: several issues related to resizing

This commit is contained in:
Vinicius Moreira
2022-11-04 17:53:05 -03:00
parent 96d38f3b7f
commit de8b143273
8 changed files with 111 additions and 60 deletions

View File

@@ -20,7 +20,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Packaging - Packaging
- AppImage: download certificate issue [#280](https://github.com/vinifmor/bauh/issues/280) - AppImage: download certificate issue [#280](https://github.com/vinifmor/bauh/issues/280)
- GUI - GUI
- management panel not fully maximizing - initialization panel size not based on the current display device size
- management panel:
- not fully maximizing
- not maximizing based on the current display device size (for multiple display setups)
- not respecting a minimal/maximum width based on the current display device size (for multiple display setup)
- dialogs not respecting the current display device width
- not readjusting size after maximizing/minimizing
### Localization (i18n) ### Localization (i18n)
- Italian ([@albanobattistella](https://github.com/albanobattistella), [@luca-digrazia](https://github.com/luca-digrazia)) - Italian ([@albanobattistella](https://github.com/albanobattistella), [@luca-digrazia](https://github.com/luca-digrazia))

View File

@@ -76,7 +76,6 @@ def new_manage_panel(app_args: Namespace, app_config: dict, logger: logging.Logg
manage_window = ManageWindow(i18n=i18n, manage_window = ManageWindow(i18n=i18n,
manager=manager, manager=manager,
icon_cache=icon_cache, icon_cache=icon_cache,
screen_size=screen_size,
config=app_config, config=app_config,
context=context, context=context,
http_client=http_client, http_client=http_client,
@@ -84,8 +83,7 @@ def new_manage_panel(app_args: Namespace, app_config: dict, logger: logging.Logg
force_suggestions=force_suggestions, force_suggestions=force_suggestions,
logger=logger) logger=logger)
prepare = PreparePanel(screen_size=screen_size, prepare = PreparePanel(context=context,
context=context,
manager=manager, manager=manager,
i18n=i18n, i18n=i18n,
manage_window=manage_window, manage_window=manage_window,

View File

@@ -15,6 +15,7 @@ from bauh.api.abstract.model import PackageStatus, CustomSoftwareAction
from bauh.commons.html import strip_html, bold from bauh.commons.html import strip_html, bold
from bauh.view.qt.components import IconButton, QCustomMenuAction, QCustomToolbar from bauh.view.qt.components import IconButton, QCustomMenuAction, QCustomToolbar
from bauh.view.qt.dialog import ConfirmationDialog from bauh.view.qt.dialog import ConfirmationDialog
from bauh.view.qt.qt_utils import get_current_screen_geometry
from bauh.view.qt.view_model import PackageView from bauh.view.qt.view_model import PackageView
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
@@ -68,9 +69,8 @@ class PackagesTable(QTableWidget):
COL_NUMBER = 9 COL_NUMBER = 9
DEFAULT_ICON_SIZE = QSize(16, 16) DEFAULT_ICON_SIZE = QSize(16, 16)
def __init__(self, parent: QWidget, icon_cache: MemoryCache, download_icons: bool, screen_width: int): def __init__(self, parent: QWidget, icon_cache: MemoryCache, download_icons: bool):
super(PackagesTable, self).__init__() super(PackagesTable, self).__init__()
self.screen_width = screen_width
self.setObjectName('table_packages') self.setObjectName('table_packages')
self.setParent(parent) self.setParent(parent)
self.window = parent self.window = parent
@@ -180,15 +180,16 @@ class PackagesTable(QTableWidget):
action=custom_action) action=custom_action)
def refresh(self, pkg: PackageView): def refresh(self, pkg: PackageView):
self._update_row(pkg, update_check_enabled=False, change_update_col=False) screen_width = get_current_screen_geometry(self.parent()).width()
self._update_row(pkg, screen_width, update_check_enabled=False, change_update_col=False)
def update_package(self, pkg: PackageView, change_update_col: bool = False): def update_package(self, pkg: PackageView, screen_width: int, change_update_col: bool = False):
if self.download_icons and pkg.model.icon_url: if self.download_icons and pkg.model.icon_url:
icon_request = QNetworkRequest(QUrl(pkg.model.icon_url)) icon_request = QNetworkRequest(QUrl(pkg.model.icon_url))
icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True) icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
self.network_man.get(icon_request) self.network_man.get(icon_request)
self._update_row(pkg, change_update_col=change_update_col) self._update_row(pkg, screen_width, change_update_col=change_update_col)
def _uninstall(self, pkg: PackageView): def _uninstall(self, pkg: PackageView):
if ConfirmationDialog(title=self.i18n['manage_window.apps_table.row.actions.uninstall.popup.title'], if ConfirmationDialog(title=self.i18n['manage_window.apps_table.row.actions.uninstall.popup.title'],
@@ -255,6 +256,7 @@ class PackagesTable(QTableWidget):
self.setEnabled(True) self.setEnabled(True)
if pkgs: if pkgs:
screen_width = get_current_screen_geometry(self.parent()).width()
self.setColumnCount(self.COL_NUMBER if update_check_enabled else self.COL_NUMBER - 1) self.setColumnCount(self.COL_NUMBER if update_check_enabled else self.COL_NUMBER - 1)
self.setRowCount(len(pkgs)) self.setRowCount(len(pkgs))
@@ -266,16 +268,17 @@ class PackagesTable(QTableWidget):
icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True) icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
self.network_man.get(icon_request) self.network_man.get(icon_request)
self._update_row(pkg, update_check_enabled) self._update_row(pkg, screen_width, update_check_enabled)
self.scrollToTop() self.scrollToTop()
def _update_row(self, pkg: PackageView, update_check_enabled: bool = True, change_update_col: bool = True): def _update_row(self, pkg: PackageView, screen_width: int,
update_check_enabled: bool = True, change_update_col: bool = True):
self._set_col_icon(0, pkg) self._set_col_icon(0, pkg)
self._set_col_name(1, pkg) self._set_col_name(1, pkg, screen_width)
self._set_col_version(2, pkg) self._set_col_version(2, pkg, screen_width)
self._set_col_description(3, pkg) self._set_col_description(3, pkg, screen_width)
self._set_col_publisher(4, pkg) self._set_col_publisher(4, pkg, screen_width)
self._set_col_type(5, pkg) self._set_col_type(5, pkg)
self._set_col_installed(6, pkg) self._set_col_installed(6, pkg)
self._set_col_actions(7, pkg) self._set_col_actions(7, pkg)
@@ -355,7 +358,7 @@ class PackagesTable(QTableWidget):
col_type_icon.setToolTip(icon_data['tip']) col_type_icon.setToolTip(icon_data['tip'])
self.setCellWidget(pkg.table_index, col, col_type_icon) self.setCellWidget(pkg.table_index, col, col_type_icon)
def _set_col_version(self, col: int, pkg: PackageView): def _set_col_version(self, col: int, pkg: PackageView, screen_width: int):
label_version = QLabel(str(pkg.model.version if pkg.model.version else '?')) label_version = QLabel(str(pkg.model.version if pkg.model.version else '?'))
label_version.setObjectName('app_version') label_version.setObjectName('app_version')
label_version.setAlignment(Qt.AlignCenter) label_version.setAlignment(Qt.AlignCenter)
@@ -383,7 +386,7 @@ class PackagesTable(QTableWidget):
f"{self.i18n['version.latest']}: {pkg.model.latest_version})" f"{self.i18n['version.latest']}: {pkg.model.latest_version})"
label_version.setText(f"{label_version.text()} > {pkg.model.latest_version}") label_version.setText(f"{label_version.text()} > {pkg.model.latest_version}")
if label_version.sizeHint().width() / self.screen_width > 0.22: if label_version.sizeHint().width() / screen_width > 0.22:
label_version.setText(pkg.model.latest_version) label_version.setText(pkg.model.latest_version)
item.setToolTip(tooltip) item.setToolTip(tooltip)
@@ -426,7 +429,7 @@ class PackagesTable(QTableWidget):
self._update_icon(col_icon, icon) self._update_icon(col_icon, icon)
self.setCellWidget(pkg.table_index, col, col_icon) self.setCellWidget(pkg.table_index, col, col_icon)
def _set_col_name(self, col: int, pkg: PackageView): def _set_col_name(self, col: int, pkg: PackageView, screen_width: int):
col_name = QLabel() col_name = QLabel()
col_name.setObjectName('app_name') col_name.setObjectName('app_name')
col_name.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) col_name.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
@@ -439,7 +442,7 @@ class PackagesTable(QTableWidget):
col_name.setToolTip(self.i18n['app.name'].lower()) col_name.setToolTip(self.i18n['app.name'].lower())
col_name.setText(name) col_name.setText(name)
screen_perc = col_name.sizeHint().width() / self.screen_width screen_perc = col_name.sizeHint().width() / screen_width
if screen_perc > 0.15: if screen_perc > 0.15:
max_chars = int(len(name) * 0.15 / screen_perc) - 3 max_chars = int(len(name) * 0.15 / screen_perc) - 3
@@ -454,7 +457,7 @@ class PackagesTable(QTableWidget):
sizes = icon.availableSizes() sizes = icon.availableSizes()
return sizes[-1] if sizes else self.DEFAULT_ICON_SIZE return sizes[-1] if sizes else self.DEFAULT_ICON_SIZE
def _set_col_description(self, col: int, pkg: PackageView): def _set_col_description(self, col: int, pkg: PackageView, screen_width: int):
item = QLabel() item = QLabel()
item.setObjectName('app_description') item.setObjectName('app_description')
@@ -468,7 +471,7 @@ class PackagesTable(QTableWidget):
item.setText(desc) item.setText(desc)
current_width_perc = item.sizeHint().width() / self.screen_width current_width_perc = item.sizeHint().width() / screen_width
if current_width_perc > 0.18: if current_width_perc > 0.18:
max_width = int(len(desc) * 0.18 / current_width_perc) - 3 max_width = int(len(desc) * 0.18 / current_width_perc) - 3
desc = desc[0:max_width] + '...' desc = desc[0:max_width] + '...'
@@ -479,7 +482,7 @@ class PackagesTable(QTableWidget):
self.setCellWidget(pkg.table_index, col, item) self.setCellWidget(pkg.table_index, col, item)
def _set_col_publisher(self, col: int, pkg: PackageView): def _set_col_publisher(self, col: int, pkg: PackageView, screen_width: int):
item = QToolBar() item = QToolBar()
publisher = pkg.model.get_publisher() publisher = pkg.model.get_publisher()
@@ -494,7 +497,7 @@ class PackagesTable(QTableWidget):
if publisher: if publisher:
lb_name.setText(publisher) lb_name.setText(publisher)
screen_perc = lb_name.sizeHint().width() / self.screen_width screen_perc = lb_name.sizeHint().width() / screen_width
if screen_perc > 0.12: if screen_perc > 0.12:
max_chars = int(len(publisher) * 0.12 / screen_perc) - 3 max_chars = int(len(publisher) * 0.12 / screen_perc) - 3

View File

@@ -1,6 +1,6 @@
from collections.abc import Iterable from collections.abc import Iterable
from PyQt5.QtCore import QSize, Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QCursor from PyQt5.QtGui import QIcon, QCursor
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGroupBox, \ from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGroupBox, \
QLineEdit, QLabel, QGridLayout, QPushButton, QPlainTextEdit, QScrollArea, QFrame, QWidget, QSizePolicy, \ QLineEdit, QLabel, QGridLayout, QPushButton, QPlainTextEdit, QScrollArea, QFrame, QWidget, QSizePolicy, \
@@ -8,6 +8,7 @@ from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGroupBox, \
from bauh.api.abstract.cache import MemoryCache from bauh.api.abstract.cache import MemoryCache
from bauh.view.qt.components import new_spacer from bauh.view.qt.components import new_spacer
from bauh.view.qt.qt_utils import get_current_screen_geometry
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
IGNORED_ATTRS = {'name', '__app__'} IGNORED_ATTRS = {'name', '__app__'}
@@ -15,10 +16,9 @@ IGNORED_ATTRS = {'name', '__app__'}
class InfoDialog(QDialog): class InfoDialog(QDialog):
def __init__(self, pkg_info: dict, icon_cache: MemoryCache, i18n: I18n, screen_size: QSize): def __init__(self, pkg_info: dict, icon_cache: MemoryCache, i18n: I18n):
super(InfoDialog, self).__init__() super(InfoDialog, self).__init__()
self.setWindowTitle(str(pkg_info['__app__'])) self.setWindowTitle(str(pkg_info['__app__']))
self.screen_size = screen_size
self.i18n = i18n self.i18n = i18n
layout = QVBoxLayout() layout = QVBoxLayout()
self.setLayout(layout) self.setLayout(layout)
@@ -108,7 +108,9 @@ class InfoDialog(QDialog):
lower_container.layout().addWidget(self.bt_close) lower_container.layout().addWidget(self.bt_close)
layout.addWidget(lower_container) layout.addWidget(lower_container)
self.setMinimumWidth(int(self.gbox_info.sizeHint().width() * 1.2)) self.setMinimumWidth(int(self.gbox_info.sizeHint().width() * 1.2))
self.setMaximumHeight(int(screen_size.height() * 0.8))
screen_height = get_current_screen_geometry().height()
self.setMaximumHeight(int(screen_height * 0.8))
self.adjustSize() self.adjustSize()
def _gen_show_button(self, idx: int, val): def _gen_show_button(self, idx: int, val):

View File

@@ -15,7 +15,7 @@ from bauh.api.abstract.controller import SoftwareManager, SoftwareAction
from bauh.api.abstract.handler import TaskManager from bauh.api.abstract.handler import TaskManager
from bauh.api import user from bauh.api import user
from bauh.view.qt.components import new_spacer, QCustomToolbar from bauh.view.qt.components import new_spacer, QCustomToolbar
from bauh.view.qt.qt_utils import centralize from bauh.view.qt.qt_utils import centralize, get_current_screen_geometry
from bauh.view.qt.root import RootDialog from bauh.view.qt.root import RootDialog
from bauh.view.qt.thread import AnimateProgress from bauh.view.qt.thread import AnimateProgress
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
@@ -145,7 +145,7 @@ class PreparePanel(QWidget, TaskManager):
signal_status = pyqtSignal(int) signal_status = pyqtSignal(int)
signal_password_response = pyqtSignal(bool, str) signal_password_response = pyqtSignal(bool, str)
def __init__(self, context: ApplicationContext, manager: SoftwareManager, screen_size: QSize, def __init__(self, context: ApplicationContext, manager: SoftwareManager,
i18n: I18n, manage_window: QWidget, app_config: dict, force_suggestions: bool = False): i18n: I18n, manage_window: QWidget, app_config: dict, force_suggestions: bool = False):
super(PreparePanel, self).__init__(flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint) super(PreparePanel, self).__init__(flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint)
self.i18n = i18n self.i18n = i18n
@@ -153,9 +153,7 @@ class PreparePanel(QWidget, TaskManager):
self.app_config = app_config self.app_config = app_config
self.manage_window = manage_window self.manage_window = manage_window
self.setWindowTitle('{} ({})'.format(__app_name__, self.i18n['prepare_panel.title.start'].lower())) self.setWindowTitle('{} ({})'.format(__app_name__, self.i18n['prepare_panel.title.start'].lower()))
self.setMinimumWidth(int(screen_size.width() * 0.5))
self.setMinimumHeight(int(screen_size.height() * 0.35))
self.setMaximumHeight(int(screen_size.height() * 0.95))
self.setLayout(QVBoxLayout()) self.setLayout(QVBoxLayout())
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
self.manager = manager self.manager = manager
@@ -292,6 +290,10 @@ class PreparePanel(QWidget, TaskManager):
super(PreparePanel, self).show() super(PreparePanel, self).show()
self.prepare_thread.start() self.prepare_thread.start()
centralize(self) centralize(self)
screen_size = get_current_screen_geometry()
self.setMinimumWidth(int(screen_size.width() * 0.5))
self.setMinimumHeight(int(screen_size.height() * 0.35))
self.setMaximumHeight(int(screen_size.height() * 0.95))
def start(self, tasks: int): def start(self, tasks: int):
self.started_at = time.time() self.started_at = time.time()

View File

@@ -1,16 +1,18 @@
from PyQt5.QtCore import Qt from typing import Optional, Union
from PyQt5.QtCore import Qt, QRect, QPoint
from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtWidgets import QWidget, QApplication, QDesktopWidget
from bauh.view.util import resource from bauh.view.util import resource
desktop: Optional[QDesktopWidget] = None
def centralize(widget: QWidget): def centralize(widget: QWidget):
geo = widget.frameGeometry() screen_geometry = get_current_screen_geometry()
screen = QApplication.desktop().screenNumber(QApplication.desktop().cursor().pos()) widget.frameGeometry().moveCenter(screen_geometry.center())
center_point = QApplication.desktop().screenGeometry(screen).center() widget.move(widget.frameGeometry().topLeft())
geo.moveCenter(center_point)
widget.move(geo.topLeft())
def load_icon(path: str, width: int, height: int = None) -> QIcon: def load_icon(path: str, width: int, height: int = None) -> QIcon:
@@ -27,3 +29,13 @@ def measure_based_on_width(percent: float) -> int:
def measure_based_on_height(percent: float) -> int: def measure_based_on_height(percent: float) -> int:
return round(percent * QApplication.primaryScreen().size().height()) return round(percent * QApplication.primaryScreen().size().height())
def get_current_screen_geometry(source_widget: Optional[Union[QWidget, QPoint]] = None) -> QRect:
global desktop
if not desktop:
desktop = QDesktopWidget()
current_screen_idx = desktop.screenNumber(source_widget if source_widget else desktop.cursor().pos())
return desktop.screen(current_screen_idx).geometry()

View File

@@ -29,6 +29,7 @@ from bauh.view.core import timeshift
from bauh.view.core.config import CoreConfigManager, BACKUP_REMOVE_METHODS, BACKUP_DEFAULT_REMOVE_METHOD from bauh.view.core.config import CoreConfigManager, BACKUP_REMOVE_METHODS, BACKUP_DEFAULT_REMOVE_METHOD
from bauh.view.qt import commons from bauh.view.qt import commons
from bauh.view.qt.commons import sort_packages from bauh.view.qt.commons import sort_packages
from bauh.view.qt.qt_utils import get_current_screen_geometry
from bauh.view.qt.view_model import PackageView, PackageViewStatus from bauh.view.qt.view_model import PackageView, PackageViewStatus
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
@@ -231,12 +232,12 @@ class UpgradeSelected(AsyncAction):
SUMMARY_FILE = UPGRADE_LOGS_DIR + '/{}_summary.txt' SUMMARY_FILE = UPGRADE_LOGS_DIR + '/{}_summary.txt'
def __init__(self, manager: SoftwareManager, internet_checker: InternetChecker, i18n: I18n, def __init__(self, manager: SoftwareManager, internet_checker: InternetChecker, i18n: I18n,
screen_width: int, pkgs: List[PackageView] = None): parent_widget: QWidget, pkgs: List[PackageView] = None):
super(UpgradeSelected, self).__init__(i18n=i18n) super(UpgradeSelected, self).__init__(i18n=i18n)
self.pkgs = pkgs self.pkgs = pkgs
self.manager = manager self.manager = manager
self.internet_checker = internet_checker self.internet_checker = internet_checker
self.screen_width = screen_width self._parent_widget = parent_widget
def _req_as_option(self, req: UpgradeRequirement, tooltip: bool = True, custom_tooltip: str = None, required_size: bool = True, display_sizes: bool = True, def _req_as_option(self, req: UpgradeRequirement, tooltip: bool = True, custom_tooltip: str = None, required_size: bool = True, display_sizes: bool = True,
positive_size_symbol: bool = False) -> InputOption: positive_size_symbol: bool = False) -> InputOption:
@@ -495,9 +496,10 @@ class UpgradeSelected(AsyncAction):
comps.insert(0, TextComponent(f'{disc_size_text} ({download_size_text})', size=14)) comps.insert(0, TextComponent(f'{disc_size_text} ({download_size_text})', size=14))
comps.insert(1, TextComponent('')) comps.insert(1, TextComponent(''))
screen_width = get_current_screen_geometry(self._parent_widget).width()
if not self.request_confirmation(title=self.i18n['action.update.summary'].capitalize(), body='', components=comps, if not self.request_confirmation(title=self.i18n['action.update.summary'].capitalize(), body='', components=comps,
confirmation_label=self.i18n['proceed'].capitalize(), deny_label=self.i18n['cancel'].capitalize(), confirmation_label=self.i18n['proceed'].capitalize(), deny_label=self.i18n['cancel'].capitalize(),
confirmation_button=can_upgrade, min_width=int(0.45 * self.screen_width)): confirmation_button=can_upgrade, min_width=int(0.45 * screen_width)):
self.notify_finished({'success': success, 'updated': updated, 'types': updated_types, 'id': None}) self.notify_finished({'success': success, 'updated': updated, 'types': updated_types, 'id': None})
self.pkgs = None self.pkgs = None
return return

View File

@@ -5,8 +5,8 @@ import time
from pathlib import Path from pathlib import Path
from typing import List, Type, Set, Tuple, Optional from typing import List, Type, Set, Tuple, Optional
from PyQt5.QtCore import QEvent, Qt, pyqtSignal, QSize from PyQt5.QtCore import QEvent, Qt, pyqtSignal, QRect
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QCursor from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QCursor, QMoveEvent
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHeaderView, QToolBar, \ from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHeaderView, QToolBar, \
QLabel, QPlainTextEdit, QProgressBar, QPushButton, QComboBox, QApplication, QListView, QSizePolicy, \ QLabel, QPlainTextEdit, QProgressBar, QPushButton, QComboBox, QApplication, QListView, QSizePolicy, \
QMenu, QHBoxLayout QMenu, QHBoxLayout
@@ -33,6 +33,7 @@ from bauh.view.qt.components import new_spacer, IconButton, QtComponentsManager,
from bauh.view.qt.dialog import ConfirmationDialog from bauh.view.qt.dialog import ConfirmationDialog
from bauh.view.qt.history import HistoryDialog from bauh.view.qt.history import HistoryDialog
from bauh.view.qt.info import InfoDialog from bauh.view.qt.info import InfoDialog
from bauh.view.qt.qt_utils import get_current_screen_geometry
from bauh.view.qt.root import RootDialog from bauh.view.qt.root import RootDialog
from bauh.view.qt.screenshots import ScreenshotsDialog from bauh.view.qt.screenshots import ScreenshotsDialog
from bauh.view.qt.settings import SettingsWindow from bauh.view.qt.settings import SettingsWindow
@@ -95,7 +96,7 @@ class ManageWindow(QWidget):
signal_table_update = pyqtSignal() signal_table_update = pyqtSignal()
signal_stop_notifying = pyqtSignal() signal_stop_notifying = pyqtSignal()
def __init__(self, i18n: I18n, icon_cache: MemoryCache, manager: SoftwareManager, screen_size: QSize, config: dict, def __init__(self, i18n: I18n, icon_cache: MemoryCache, manager: SoftwareManager, config: dict,
context: ApplicationContext, http_client: HttpClient, logger: logging.Logger, icon: QIcon, context: ApplicationContext, http_client: HttpClient, logger: logging.Logger, icon: QIcon,
force_suggestions: bool = False): force_suggestions: bool = False):
super(ManageWindow, self).__init__() super(ManageWindow, self).__init__()
@@ -111,7 +112,6 @@ class ManageWindow(QWidget):
self.pkgs_installed = [] # cached installed packages self.pkgs_installed = [] # cached installed packages
self.display_limit = config['ui']['table']['max_displayed'] self.display_limit = config['ui']['table']['max_displayed']
self.icon_cache = icon_cache self.icon_cache = icon_cache
self.screen_size = screen_size
self.config = config self.config = config
self.context = context self.context = context
self.http_client = http_client self.http_client = http_client
@@ -278,8 +278,7 @@ class ManageWindow(QWidget):
self.table_container.layout().setContentsMargins(0, 0, 0, 0) self.table_container.layout().setContentsMargins(0, 0, 0, 0)
self.table_apps = PackagesTable(self, self.icon_cache, self.table_apps = PackagesTable(self, self.icon_cache,
download_icons=bool(self.config['download']['icons']), download_icons=bool(self.config['download']['icons']))
screen_width=int(screen_size.width()))
self.table_apps.change_headers_policy() self.table_apps.change_headers_policy()
self.table_container.layout().addWidget(self.table_apps) self.table_container.layout().addWidget(self.table_apps)
@@ -332,7 +331,7 @@ class ManageWindow(QWidget):
self.thread_update = self._bind_async_action(UpgradeSelected(manager=self.manager, i18n=self.i18n, self.thread_update = self._bind_async_action(UpgradeSelected(manager=self.manager, i18n=self.i18n,
internet_checker=context.internet_checker, internet_checker=context.internet_checker,
screen_width=screen_size.width()), parent_widget=self),
finished_call=self._finish_upgrade_selected) finished_call=self._finish_upgrade_selected)
self.thread_refresh = self._bind_async_action(RefreshApps(i18n, self.manager), finished_call=self._finish_refresh_packages, only_finished=True) self.thread_refresh = self._bind_async_action(RefreshApps(i18n, self.manager), finished_call=self._finish_refresh_packages, only_finished=True)
self.thread_uninstall = self._bind_async_action(UninstallPackage(self.manager, self.icon_cache, self.i18n), finished_call=self._finish_uninstall) self.thread_uninstall = self._bind_async_action(UninstallPackage(self.manager, self.icon_cache, self.i18n), finished_call=self._finish_uninstall)
@@ -432,8 +431,6 @@ class ManageWindow(QWidget):
self.container_progress.add_space() self.container_progress.add_space()
self.layout.addWidget(self.container_progress) self.layout.addWidget(self.container_progress)
qt_utils.centralize(self)
self.filter_only_apps = True self.filter_only_apps = True
self.type_filter = self.any_type_filter self.type_filter = self.any_type_filter
self.category_filter = self.any_category_filter self.category_filter = self.any_category_filter
@@ -456,9 +453,8 @@ class ManageWindow(QWidget):
self.thread_load_installed = NotifyInstalledLoaded() self.thread_load_installed = NotifyInstalledLoaded()
self.thread_load_installed.signal_loaded.connect(self._finish_loading_installed) self.thread_load_installed.signal_loaded.connect(self._finish_loading_installed)
self.setMinimumHeight(int(screen_size.height() * 0.5))
self.setMinimumWidth(int(screen_size.width() * 0.5))
self._register_groups() self._register_groups()
self._screen_geometry: Optional[QRect] = None
def _register_groups(self): def _register_groups(self):
common_filters = (CHECK_APPS, CHECK_UPDATES, COMBO_CATEGORIES, COMBO_TYPES, INP_NAME) common_filters = (CHECK_APPS, CHECK_UPDATES, COMBO_CATEGORIES, COMBO_TYPES, INP_NAME)
@@ -594,6 +590,8 @@ class ManageWindow(QWidget):
self.thread_warnings.start() self.thread_warnings.start()
qt_utils.centralize(self) qt_utils.centralize(self)
self._screen_geometry = get_current_screen_geometry()
self._update_size_limits()
def verify_warnings(self): def verify_warnings(self):
self.thread_warnings.start() self.thread_warnings.start()
@@ -668,7 +666,8 @@ class ManageWindow(QWidget):
if self.table_apps.isEnabled() and self.pkgs is not None and 0 <= idx < len(self.pkgs): if self.table_apps.isEnabled() and self.pkgs is not None and 0 <= idx < len(self.pkgs):
pkg = self.pkgs[idx] pkg = self.pkgs[idx]
pkg.status = PackageViewStatus.READY pkg.status = PackageViewStatus.READY
self.table_apps.update_package(pkg) screen_width = get_current_screen_geometry(self).width()
self.table_apps.update_package(pkg, screen_width=screen_width)
def _reload_categories(self): def _reload_categories(self):
categories = set() categories = set()
@@ -684,11 +683,33 @@ class ManageWindow(QWidget):
if categories: if categories:
self._update_categories(categories, keep_selected=True) self._update_categories(categories, keep_selected=True)
def _update_size_limits(self):
self.setMinimumHeight(int(self._screen_geometry.height() * 0.5))
self.setMinimumWidth(int(self._screen_geometry.width() * 0.5))
self.setMaximumWidth(int(self._screen_geometry.width()))
def changeEvent(self, e: QEvent): def changeEvent(self, e: QEvent):
if isinstance(e, QWindowStateChangeEvent): if isinstance(e, QWindowStateChangeEvent):
self._maximized = self.isMaximized() self._maximized = self.isMaximized()
self.table_apps.change_headers_policy(maximized=self._maximized) self.table_apps.change_headers_policy(maximized=self._maximized)
if not self._maximized:
self._reorganize()
self.adjustSize()
def event(self, e: QEvent) -> bool:
res = super(ManageWindow, self).event(e)
if self.isVisible() and e.type() == 216: # drop event
current_geometry = get_current_screen_geometry()
if current_geometry != self._screen_geometry: # only if the display device has changed
self._screen_geometry = current_geometry
self._update_size_limits()
self._reorganize()
self.adjustSize()
return res
def _handle_console(self, checked: bool): def _handle_console(self, checked: bool):
if checked: if checked:
self.textarea_details.show() self.textarea_details.show()
@@ -777,6 +798,7 @@ class ManageWindow(QWidget):
util.notify_user('{} ({}) {}'.format(src_pkg.model.name, src_pkg.model.get_type(), self.i18n['uninstalled'])) util.notify_user('{} ({}) {}'.format(src_pkg.model.name, src_pkg.model.get_type(), self.i18n['uninstalled']))
if res['removed']: if res['removed']:
screen_width = get_current_screen_geometry(self).width()
for list_idx, pkg_list in enumerate((self.pkgs_available, self.pkgs, self.pkgs_installed)): for list_idx, pkg_list in enumerate((self.pkgs_available, self.pkgs, self.pkgs_installed)):
if pkg_list: if pkg_list:
removed_idxs = [] removed_idxs = []
@@ -793,7 +815,9 @@ class ManageWindow(QWidget):
removed_idxs.append(pkgv_idx) removed_idxs.append(pkgv_idx)
if self.search_performed and list_idx == 1: # only for displayed if self.search_performed and list_idx == 1: # only for displayed
self.table_apps.update_package(pkgv, change_update_col=True) self.table_apps.update_package(pkgv,
screen_width=screen_width,
change_update_col=True)
break # as the model has been found, stops the loop break # as the model has been found, stops the loop
@@ -1283,8 +1307,7 @@ class ManageWindow(QWidget):
if pkg_info: if pkg_info:
if len(pkg_info) > 1: if len(pkg_info) > 1:
dialog_info = InfoDialog(pkg_info=pkg_info, icon_cache=self.icon_cache, dialog_info = InfoDialog(pkg_info=pkg_info, icon_cache=self.icon_cache, i18n=self.i18n)
i18n=self.i18n, screen_size=self.screen_size)
dialog_info.exec_() dialog_info.exec_()
else: else:
dialog.show_message(title=self.i18n['warning'].capitalize(), dialog.show_message(title=self.i18n['warning'].capitalize(),
@@ -1459,10 +1482,11 @@ class ManageWindow(QWidget):
self.pkgs_available.insert(new_idx, data[2]) self.pkgs_available.insert(new_idx, data[2])
# updating the respective table rows: # updating the respective table rows:
screen_width = get_current_screen_geometry(self).width()
for displayed in self.pkgs: for displayed in self.pkgs:
for model in models_updated: for model in models_updated:
if displayed.model == model: if displayed.model == model:
self.table_apps.update_package(displayed, change_update_col=True) self.table_apps.update_package(displayed, screen_width=screen_width, change_update_col=True)
self.update_bt_upgrade() self.update_bt_upgrade()
@@ -1562,7 +1586,8 @@ class ManageWindow(QWidget):
self.settings_window.handle_display() self.settings_window.handle_display()
else: else:
self.settings_window = SettingsWindow(manager=self.manager, i18n=self.i18n, window=self) self.settings_window = SettingsWindow(manager=self.manager, i18n=self.i18n, window=self)
self.settings_window.setMinimumWidth(int(self.screen_size.width() / 4)) screen_width = get_current_screen_geometry(self).width()
self.settings_window.setMinimumWidth(int(screen_width / 4))
self.settings_window.resize(self.size()) self.settings_window.resize(self.size())
self.settings_window.adjustSize() self.settings_window.adjustSize()
qt_utils.centralize(self.settings_window) qt_utils.centralize(self.settings_window)
@@ -1625,10 +1650,11 @@ class ManageWindow(QWidget):
self._update_table_indexes() self._update_table_indexes()
self.update_bt_upgrade() self.update_bt_upgrade()
else: else:
screen_width = get_current_screen_geometry(self).width()
for pkg in self.pkgs: for pkg in self.pkgs:
if pkg == res['pkg']: if pkg == res['pkg']:
pkg.update_model(res['pkg'].model) pkg.update_model(res['pkg'].model)
self.table_apps.update_package(pkg, change_update_col=not any([self.search_performed, self.suggestions_requested])) self.table_apps.update_package(pkg, screen_width=screen_width, change_update_col=not any([self.search_performed, self.suggestions_requested]))
self.update_bt_upgrade() self.update_bt_upgrade()
break break