This commit is contained in:
Vinícius Moreira
2022-11-05 15:07:04 -03:00
committed by GitHub
24 changed files with 321 additions and 115 deletions

View File

@@ -86,7 +86,7 @@ class AdaptableFileDownloader(FileDownloader):
return SimpleProcess(cmd=cmd, cwd=cwd, root_password=root_password)
def _get_wget_process(self, url: str, output_path: str, cwd: str, root_password: Optional[str]) -> SimpleProcess:
cmd = ['wget', url, '-c', '--retry-connrefused', '-t', '10', '--no-config', '-nc']
cmd = ['wget', url, '-c', '--retry-connrefused', '-t', '10', '-nc']
if not self.check_ssl:
cmd.append('--no-check-certificate')

View File

@@ -15,6 +15,7 @@ from bauh.api.abstract.model import PackageStatus, CustomSoftwareAction
from bauh.commons.html import strip_html, bold
from bauh.view.qt.components import IconButton, QCustomMenuAction, QCustomToolbar
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.util.translation import I18n
@@ -68,9 +69,8 @@ class PackagesTable(QTableWidget):
COL_NUMBER = 9
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__()
self.screen_width = screen_width
self.setObjectName('table_packages')
self.setParent(parent)
self.window = parent
@@ -180,15 +180,16 @@ class PackagesTable(QTableWidget):
action=custom_action)
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:
icon_request = QNetworkRequest(QUrl(pkg.model.icon_url))
icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
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):
if ConfirmationDialog(title=self.i18n['manage_window.apps_table.row.actions.uninstall.popup.title'],
@@ -255,6 +256,7 @@ class PackagesTable(QTableWidget):
self.setEnabled(True)
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.setRowCount(len(pkgs))
@@ -266,16 +268,17 @@ class PackagesTable(QTableWidget):
icon_request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
self.network_man.get(icon_request)
self._update_row(pkg, update_check_enabled)
self._update_row(pkg, screen_width, update_check_enabled)
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_name(1, pkg)
self._set_col_version(2, pkg)
self._set_col_description(3, pkg)
self._set_col_publisher(4, pkg)
self._set_col_name(1, pkg, screen_width)
self._set_col_version(2, pkg, screen_width)
self._set_col_description(3, pkg, screen_width)
self._set_col_publisher(4, pkg, screen_width)
self._set_col_type(5, pkg)
self._set_col_installed(6, pkg)
self._set_col_actions(7, pkg)
@@ -355,7 +358,7 @@ class PackagesTable(QTableWidget):
col_type_icon.setToolTip(icon_data['tip'])
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.setObjectName('app_version')
label_version.setAlignment(Qt.AlignCenter)
@@ -383,7 +386,7 @@ class PackagesTable(QTableWidget):
f"{self.i18n['version.latest']}: {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)
item.setToolTip(tooltip)
@@ -426,7 +429,7 @@ class PackagesTable(QTableWidget):
self._update_icon(col_icon, 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.setObjectName('app_name')
col_name.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
@@ -439,7 +442,7 @@ class PackagesTable(QTableWidget):
col_name.setToolTip(self.i18n['app.name'].lower())
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:
max_chars = int(len(name) * 0.15 / screen_perc) - 3
@@ -454,7 +457,7 @@ class PackagesTable(QTableWidget):
sizes = icon.availableSizes()
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.setObjectName('app_description')
@@ -468,7 +471,7 @@ class PackagesTable(QTableWidget):
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:
max_width = int(len(desc) * 0.18 / current_width_perc) - 3
desc = desc[0:max_width] + '...'
@@ -479,7 +482,7 @@ class PackagesTable(QTableWidget):
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()
publisher = pkg.model.get_publisher()
@@ -494,7 +497,7 @@ class PackagesTable(QTableWidget):
if 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:
max_chars = int(len(publisher) * 0.12 / screen_perc) - 3

View File

@@ -1,6 +1,6 @@
from collections.abc import Iterable
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QCursor
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QGroupBox, \
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.view.qt.components import new_spacer
from bauh.view.qt.qt_utils import get_current_screen_geometry
from bauh.view.util.translation import I18n
IGNORED_ATTRS = {'name', '__app__'}
@@ -15,10 +16,9 @@ IGNORED_ATTRS = {'name', '__app__'}
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__()
self.setWindowTitle(str(pkg_info['__app__']))
self.screen_size = screen_size
self.i18n = i18n
layout = QVBoxLayout()
self.setLayout(layout)
@@ -108,7 +108,9 @@ class InfoDialog(QDialog):
lower_container.layout().addWidget(self.bt_close)
layout.addWidget(lower_container)
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()
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 import user
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.thread import AnimateProgress
from bauh.view.util.translation import I18n
@@ -145,7 +145,7 @@ class PreparePanel(QWidget, TaskManager):
signal_status = pyqtSignal(int)
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):
super(PreparePanel, self).__init__(flags=Qt.CustomizeWindowHint | Qt.WindowTitleHint)
self.i18n = i18n
@@ -153,9 +153,7 @@ class PreparePanel(QWidget, TaskManager):
self.app_config = app_config
self.manage_window = manage_window
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.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
self.manager = manager
@@ -292,6 +290,10 @@ class PreparePanel(QWidget, TaskManager):
super(PreparePanel, self).show()
self.prepare_thread.start()
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):
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.QtWidgets import QWidget, QApplication
from PyQt5.QtWidgets import QWidget, QApplication, QDesktopWidget
from bauh.view.util import resource
desktop: Optional[QDesktopWidget] = None
def centralize(widget: QWidget):
geo = widget.frameGeometry()
screen = QApplication.desktop().screenNumber(QApplication.desktop().cursor().pos())
center_point = QApplication.desktop().screenGeometry(screen).center()
geo.moveCenter(center_point)
widget.move(geo.topLeft())
screen_geometry = get_current_screen_geometry()
widget.frameGeometry().moveCenter(screen_geometry.center())
widget.move(widget.frameGeometry().topLeft())
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:
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.qt import commons
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.util.translation import I18n
@@ -231,12 +232,12 @@ class UpgradeSelected(AsyncAction):
SUMMARY_FILE = UPGRADE_LOGS_DIR + '/{}_summary.txt'
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)
self.pkgs = pkgs
self.manager = manager
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,
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(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,
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.pkgs = None
return

View File

@@ -2,12 +2,11 @@ import logging
import operator
import os.path
import time
import traceback
from pathlib import Path
from typing import List, Type, Set, Tuple, Optional
from PyQt5.QtCore import QEvent, Qt, pyqtSignal, QSize
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QCursor
from PyQt5.QtCore import QEvent, Qt, pyqtSignal, QRect
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QCursor, QMoveEvent
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QCheckBox, QHeaderView, QToolBar, \
QLabel, QPlainTextEdit, QProgressBar, QPushButton, QComboBox, QApplication, QListView, QSizePolicy, \
QMenu, QHBoxLayout
@@ -34,6 +33,7 @@ from bauh.view.qt.components import new_spacer, IconButton, QtComponentsManager,
from bauh.view.qt.dialog import ConfirmationDialog
from bauh.view.qt.history import HistoryDialog
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.screenshots import ScreenshotsDialog
from bauh.view.qt.settings import SettingsWindow
@@ -96,7 +96,7 @@ class ManageWindow(QWidget):
signal_table_update = 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,
force_suggestions: bool = False):
super(ManageWindow, self).__init__()
@@ -112,7 +112,6 @@ class ManageWindow(QWidget):
self.pkgs_installed = [] # cached installed packages
self.display_limit = config['ui']['table']['max_displayed']
self.icon_cache = icon_cache
self.screen_size = screen_size
self.config = config
self.context = context
self.http_client = http_client
@@ -279,8 +278,7 @@ class ManageWindow(QWidget):
self.table_container.layout().setContentsMargins(0, 0, 0, 0)
self.table_apps = PackagesTable(self, self.icon_cache,
download_icons=bool(self.config['download']['icons']),
screen_width=int(screen_size.width()))
download_icons=bool(self.config['download']['icons']))
self.table_apps.change_headers_policy()
self.table_container.layout().addWidget(self.table_apps)
@@ -333,7 +331,7 @@ class ManageWindow(QWidget):
self.thread_update = self._bind_async_action(UpgradeSelected(manager=self.manager, i18n=self.i18n,
internet_checker=context.internet_checker,
screen_width=screen_size.width()),
parent_widget=self),
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_uninstall = self._bind_async_action(UninstallPackage(self.manager, self.icon_cache, self.i18n), finished_call=self._finish_uninstall)
@@ -433,8 +431,6 @@ class ManageWindow(QWidget):
self.container_progress.add_space()
self.layout.addWidget(self.container_progress)
qt_utils.centralize(self)
self.filter_only_apps = True
self.type_filter = self.any_type_filter
self.category_filter = self.any_category_filter
@@ -457,11 +453,8 @@ class ManageWindow(QWidget):
self.thread_load_installed = NotifyInstalledLoaded()
self.thread_load_installed.signal_loaded.connect(self._finish_loading_installed)
self.setMinimumHeight(int(screen_size.height() * 0.5))
self.setMaximumHeight(int(screen_size.height()))
self.setMinimumWidth(int(screen_size.width() * 0.5))
self.setMaximumWidth(int(screen_size.width() - screen_size.width() * 0.015))
self._register_groups()
self._screen_geometry: Optional[QRect] = None
def _register_groups(self):
common_filters = (CHECK_APPS, CHECK_UPDATES, COMBO_CATEGORIES, COMBO_TYPES, INP_NAME)
@@ -597,6 +590,8 @@ class ManageWindow(QWidget):
self.thread_warnings.start()
qt_utils.centralize(self)
self._screen_geometry = get_current_screen_geometry()
self._update_size_limits()
def verify_warnings(self):
self.thread_warnings.start()
@@ -671,7 +666,8 @@ class ManageWindow(QWidget):
if self.table_apps.isEnabled() and self.pkgs is not None and 0 <= idx < len(self.pkgs):
pkg = self.pkgs[idx]
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):
categories = set()
@@ -687,11 +683,33 @@ class ManageWindow(QWidget):
if categories:
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):
if isinstance(e, QWindowStateChangeEvent):
self._maximized = self.isMaximized()
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):
if checked:
self.textarea_details.show()
@@ -780,6 +798,7 @@ class ManageWindow(QWidget):
util.notify_user('{} ({}) {}'.format(src_pkg.model.name, src_pkg.model.get_type(), self.i18n['uninstalled']))
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)):
if pkg_list:
removed_idxs = []
@@ -796,7 +815,9 @@ class ManageWindow(QWidget):
removed_idxs.append(pkgv_idx)
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
@@ -1286,8 +1307,7 @@ class ManageWindow(QWidget):
if pkg_info:
if len(pkg_info) > 1:
dialog_info = InfoDialog(pkg_info=pkg_info, icon_cache=self.icon_cache,
i18n=self.i18n, screen_size=self.screen_size)
dialog_info = InfoDialog(pkg_info=pkg_info, icon_cache=self.icon_cache, i18n=self.i18n)
dialog_info.exec_()
else:
dialog.show_message(title=self.i18n['warning'].capitalize(),
@@ -1462,10 +1482,11 @@ class ManageWindow(QWidget):
self.pkgs_available.insert(new_idx, data[2])
# updating the respective table rows:
screen_width = get_current_screen_geometry(self).width()
for displayed in self.pkgs:
for model in models_updated:
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()
@@ -1565,7 +1586,8 @@ class ManageWindow(QWidget):
self.settings_window.handle_display()
else:
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.adjustSize()
qt_utils.centralize(self.settings_window)
@@ -1628,10 +1650,11 @@ class ManageWindow(QWidget):
self._update_table_indexes()
self.update_bt_upgrade()
else:
screen_width = get_current_screen_geometry(self).width()
for pkg in self.pkgs:
if pkg == res['pkg']:
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()
break