From 7720d4d3e31d44f94c4406e6b44e25ac5fa4962f Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Tue, 26 Nov 2019 19:09:00 -0300 Subject: [PATCH] [ui][aur] improved Required / Optional confirmation dialogs --- CHANGELOG.md | 5 ++++ bauh/api/abstract/view.py | 3 ++- bauh/gems/arch/confirmation.py | 32 ++++++++++++++++++++---- bauh/gems/arch/resources/img/mirror.png | Bin 0 -> 6591 bytes bauh/view/qt/components.py | 8 ++++++ 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100755 bauh/gems/arch/resources/img/mirror.png diff --git a/CHANGELOG.md b/CHANGELOG.md index a1b1563d..6d5ef2f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Ignoring no related updates ( there are some scenarios the updates are not listed due to warnings / suggestions related to some specific runtimes if the param **--no-related** is not informed ) - AUR - Removing repeated **prepare** step that was delaying the build and preventing some packages to install (e.g: xdman ) + +### UI +- AUR + - Textual dependencies replaced by read-only checkboxes on Required Dependencies confirmation dialog + - Optional Dependencies installation dialog now has a type icon beside the dependency name ## [0.7.2] 2019-11-01 ### Improvements diff --git a/bauh/api/abstract/view.py b/bauh/api/abstract/view.py index 3caf1dc1..3cf6103c 100644 --- a/bauh/api/abstract/view.py +++ b/bauh/api/abstract/view.py @@ -28,7 +28,7 @@ class InputOption: Represents a select component option. """ - def __init__(self, label: str, value: object, tooltip: str = None, icon_path: str = None): + def __init__(self, label: str, value: object, tooltip: str = None, icon_path: str = None, read_only: bool = False): """ :param label: the string that will be shown to the user :param value: the option value (not shown) @@ -45,6 +45,7 @@ class InputOption: self.value = value self.tooltip = tooltip self.icon_path = icon_path + self.read_only = read_only def __hash__(self): return hash(self.label) + hash(self.value) diff --git a/bauh/gems/arch/confirmation.py b/bauh/gems/arch/confirmation.py index dd114388..d88653b7 100644 --- a/bauh/gems/arch/confirmation.py +++ b/bauh/gems/arch/confirmation.py @@ -2,15 +2,28 @@ from typing import Set from bauh.api.abstract.handler import ProcessWatcher from bauh.api.abstract.view import MultipleSelectComponent, InputOption +from bauh.commons import resource from bauh.commons.html import bold +from bauh.gems.arch import ROOT_DIR from bauh.view.util.translation import I18n +def _get_mirror_icon(mirror: str): + return resource.get_path('img/{}.png'.format('arch' if mirror == 'aur' else 'mirror'), ROOT_DIR) + + def request_optional_deps(pkgname: str, pkg_mirrors: dict, watcher: ProcessWatcher, i18n: I18n) -> Set[str]: - opts = [InputOption('{}{} ( {} )'.format(p, ': ' + d['desc'] if d['desc'] else '', d['mirror'].upper()), p) for p, d in pkg_mirrors.items()] + opts = [] + + for p, d in pkg_mirrors.items(): + op = InputOption('{}{} ( {} )'.format(p, ': ' + d['desc'] if d['desc'] else '', d['mirror'].upper()), p) + op.icon_path = _get_mirror_icon(d['mirror']) + opts.append(op) + view_opts = MultipleSelectComponent(label='', options=opts, default_options=None) + install = watcher.request_confirmation(title=i18n['arch.install.optdeps.request.title'], body='

{}

'.format(i18n['arch.install.optdeps.request.body'].format(bold(pkgname)) + ':'), components=[view_opts], @@ -22,8 +35,17 @@ def request_optional_deps(pkgname: str, pkg_mirrors: dict, watcher: ProcessWatch def request_install_missing_deps(pkgname: str, pkg_mirrors: dict, watcher: ProcessWatcher, i18n: I18n) -> bool: - deps_str = ''.join(['
- {} ( {} )'.format(d, m.upper()) for d, m in pkg_mirrors.items()]) - msg = '

{}

'.format(i18n['arch.missing_deps.body'].format(bold(pkgname)) + ':
' + deps_str) - msg += i18n['ask.continue'] + msg = '

{}

'.format(i18n['arch.missing_deps.body'].format(bold(pkgname)) + ':') - return watcher.request_confirmation(i18n['arch.missing_deps.title'], msg) + opts = [] + for p, m in pkg_mirrors.items(): + op = InputOption('{} ( {} )'.format(p, m), p) + op.read_only = True + op.icon_path = _get_mirror_icon(m) + opts.append(op) + + comps = [ + MultipleSelectComponent(label='', options=opts, default_options=set(opts)) + ] + + return watcher.request_confirmation(i18n['arch.missing_deps.title'], msg, comps, confirmation_label=i18n['continue'].capitalize()) diff --git a/bauh/gems/arch/resources/img/mirror.png b/bauh/gems/arch/resources/img/mirror.png new file mode 100755 index 0000000000000000000000000000000000000000..b4d85c0d16dbf08e2c182cb278fd685baa057e4d GIT binary patch literal 6591 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ķL0yJ3!q>XUWR@*96dF5BokO&KytXz*agU0$ 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 xGQ%Qqi9x002ovPDHLkV1iUnz##wt literal 0 HcmV?d00001 diff --git a/bauh/view/qt/components.py b/bauh/view/qt/components.py index 7175d8a7..c2cdf05b 100644 --- a/bauh/view/qt/components.py +++ b/bauh/view/qt/components.py @@ -15,6 +15,10 @@ class RadioButtonQt(QRadioButton): self.model_parent = model_parent self.toggled.connect(self._set_checked) + if self.model.read_only: + self.setAttribute(Qt.WA_TransparentForMouseEvents) + self.setFocusPolicy(Qt.NoFocus) + def _set_checked(self, checked: bool): if checked: self.model_parent.value = self.model @@ -34,6 +38,10 @@ class CheckboxQt(QCheckBox): if model.icon_path: self.setIcon(QIcon(model.icon_path)) + if model.read_only: + self.setAttribute(Qt.WA_TransparentForMouseEvents) + self.setFocusPolicy(Qt.NoFocus) + def _set_checked(self, state): checked = state == 2