type filters as combos

This commit is contained in:
Vinicius Moreira
2019-08-28 21:47:11 -03:00
parent de06d15085
commit 8d030fc7b9
2 changed files with 50 additions and 40 deletions

View File

@@ -1,5 +1,4 @@
import os import os
import subprocess
from threading import Lock from threading import Lock
from typing import List from typing import List
@@ -9,10 +8,9 @@ from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest
from PyQt5.QtWidgets import QTableWidget, QTableView, QMenu, QAction, QTableWidgetItem, QToolButton, QWidget, \ from PyQt5.QtWidgets import QTableWidget, QTableView, QMenu, QAction, QTableWidgetItem, QToolButton, QWidget, \
QHeaderView, QLabel, QHBoxLayout, QPushButton, QToolBar QHeaderView, QLabel, QHBoxLayout, QPushButton, QToolBar
from bauh_api.abstract.model import ApplicationStatus from bauh_api.abstract.model import ApplicationStatus
from bauh.core import resource
from bauh_api.util.cache import Cache from bauh_api.util.cache import Cache
from bauh.core import resource
from bauh.util import util from bauh.util import util
from bauh.view.qt import dialog from bauh.view.qt import dialog
from bauh.view.qt.view_model import ApplicationView, ApplicationViewStatus from bauh.view.qt.view_model import ApplicationView, ApplicationViewStatus
@@ -98,6 +96,7 @@ class AppsTable(QTableWidget):
self.icon_cache = icon_cache self.icon_cache = icon_cache
self.lock_async_data = Lock() self.lock_async_data = Lock()
self.setRowHeight(80,80)
def has_any_settings(self, app_v: ApplicationView): def has_any_settings(self, app_v: ApplicationView):
return app_v.model.can_be_refreshed() or \ return app_v.model.can_be_refreshed() or \

View File

@@ -1,11 +1,11 @@
import operator import operator
from functools import reduce from functools import reduce
from typing import List, Set from typing import List
from PyQt5.QtCore import QEvent, Qt, QSize, pyqtSignal from PyQt5.QtCore import QEvent, Qt, QSize, pyqtSignal
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QPixmap from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QPixmap
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QCheckBox, QHeaderView, QToolButton, QToolBar, \ from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QCheckBox, QHeaderView, QToolButton, QToolBar, \
QLabel, QPlainTextEdit, QLineEdit, QProgressBar, QHBoxLayout, QPushButton, QRadioButton QLabel, QPlainTextEdit, QLineEdit, QProgressBar, QHBoxLayout, QPushButton, QComboBox
from bauh_api.abstract.controller import ApplicationManager from bauh_api.abstract.controller import ApplicationManager
from bauh_api.abstract.model import Application from bauh_api.abstract.model import Application
from bauh_api.abstract.view import MessageType from bauh_api.abstract.view import MessageType
@@ -34,6 +34,9 @@ class ManageWindow(QWidget):
signal_user_res = pyqtSignal(bool) signal_user_res = pyqtSignal(bool)
def _toolbar_button_style(self, bg: str):
return 'QPushButton { color: white; font-weight: bold; background: ' + bg + '}'
def __init__(self, locale_keys: dict, icon_cache: Cache, manager: ApplicationManager, disk_cache: bool, download_icons: bool, screen_size, suggestions: bool, tray_icon=None): def __init__(self, locale_keys: dict, icon_cache: Cache, manager: ApplicationManager, disk_cache: bool, download_icons: bool, screen_size, suggestions: bool, tray_icon=None):
super(ManageWindow, self).__init__() super(ManageWindow, self).__init__()
self.locale_keys = locale_keys self.locale_keys = locale_keys
@@ -47,9 +50,9 @@ class ManageWindow(QWidget):
self.download_icons = download_icons self.download_icons = download_icons
self.screen_size = screen_size self.screen_size = screen_size
self.icon_flathub = QIcon(resource.get_path('img/logo.svg')) self.icon_app = QIcon(resource.get_path('img/logo.svg'))
self.resize(ManageWindow.__BASE_HEIGHT__, ManageWindow.__BASE_HEIGHT__) self.resize(ManageWindow.__BASE_HEIGHT__, ManageWindow.__BASE_HEIGHT__)
self.setWindowIcon(self.icon_flathub) self.setWindowIcon(self.icon_app)
self.layout = QVBoxLayout() self.layout = QVBoxLayout()
self.setLayout(self.layout) self.setLayout(self.layout)
@@ -75,7 +78,7 @@ class ManageWindow(QWidget):
self.input_search.setFrame(False) self.input_search.setFrame(False)
self.input_search.setPlaceholderText(self.locale_keys['window_manage.input_search.placeholder'] + "...") self.input_search.setPlaceholderText(self.locale_keys['window_manage.input_search.placeholder'] + "...")
self.input_search.setToolTip(self.locale_keys['window_manage.input_search.tooltip']) self.input_search.setToolTip(self.locale_keys['window_manage.input_search.tooltip'])
self.input_search.setStyleSheet("QLineEdit { background-color: white; color: gray; spacing: 0;}") self.input_search.setStyleSheet("QLineEdit { background-color: white; color: gray; spacing: 0; height: 30px; font-size: 12px; width: 300px}")
self.input_search.returnPressed.connect(self.search) self.input_search.returnPressed.connect(self.search)
self.toolbar_search.addWidget(self.input_search) self.toolbar_search.addWidget(self.input_search)
@@ -88,43 +91,43 @@ class ManageWindow(QWidget):
self.toolbar_top.addWidget(new_spacer()) self.toolbar_top.addWidget(new_spacer())
self.layout.addWidget(self.toolbar_top) self.layout.addWidget(self.toolbar_top)
toolbar = QToolBar() self.toolbar = QToolBar()
toolbar.setStyleSheet('QToolBar {spacing: 3px;}') self.toolbar.setStyleSheet('QToolBar {spacing: 4px; margin-top: 8px; margin-bottom: 5px}')
self.checkbox_updates = QCheckBox() self.checkbox_updates = QCheckBox()
self.checkbox_updates.setText(self.locale_keys['updates'].capitalize()) self.checkbox_updates.setText(self.locale_keys['updates'].capitalize())
self.checkbox_updates.stateChanged.connect(self._handle_updates_filter) self.checkbox_updates.stateChanged.connect(self._handle_updates_filter)
self.ref_checkbox_updates = toolbar.addWidget(self.checkbox_updates) self.ref_checkbox_updates = self.toolbar.addWidget(self.checkbox_updates)
self.checkbox_only_apps = QCheckBox() self.checkbox_only_apps = QCheckBox()
self.checkbox_only_apps.setText(self.locale_keys['manage_window.checkbox.only_apps']) self.checkbox_only_apps.setText(self.locale_keys['manage_window.checkbox.only_apps'])
self.checkbox_only_apps.setChecked(True) self.checkbox_only_apps.setChecked(True)
self.checkbox_only_apps.stateChanged.connect(self._handle_filter_only_apps) self.checkbox_only_apps.stateChanged.connect(self._handle_filter_only_apps)
self.ref_checkbox_only_apps = toolbar.addWidget(self.checkbox_only_apps) self.ref_checkbox_only_apps = self.toolbar.addWidget(self.checkbox_only_apps)
self.extra_filters = QWidget() self.extra_filters = QWidget()
self.extra_filters.setLayout(QHBoxLayout()) self.extra_filters.setLayout(QHBoxLayout())
toolbar.addWidget(self.extra_filters) self.toolbar.addWidget(self.extra_filters)
toolbar.addWidget(new_spacer()) self.toolbar.addWidget(new_spacer())
self.bt_refresh = QPushButton() self.bt_refresh = QPushButton()
self.bt_refresh.setToolTip(locale_keys['manage_window.bt.refresh.tooltip']) self.bt_refresh.setToolTip(locale_keys['manage_window.bt.refresh.tooltip'])
self.bt_refresh.setIcon(QIcon(resource.get_path('img/new_refresh.svg'))) self.bt_refresh.setIcon(QIcon(resource.get_path('img/new_refresh.svg')))
self.bt_refresh.setText(self.locale_keys['manage_window.bt.refresh.text']) self.bt_refresh.setText(self.locale_keys['manage_window.bt.refresh.text'])
self.bt_refresh.setStyleSheet('QPushButton { background: #2368AD; color: white; font-weight: bold;} QPushButton:disabled { background: gray }') self.bt_refresh.setStyleSheet(self._toolbar_button_style('#2368AD'))
self.bt_refresh.clicked.connect(lambda: self.refresh_apps(keep_console=False)) self.bt_refresh.clicked.connect(lambda: self.refresh_apps(keep_console=False))
toolbar.addWidget(self.bt_refresh) self.ref_bt_refresh = self.toolbar.addWidget(self.bt_refresh)
self.bt_upgrade = QPushButton() self.bt_upgrade = QPushButton()
self.bt_upgrade.setToolTip(locale_keys['manage_window.bt.upgrade.tooltip']) self.bt_upgrade.setToolTip(locale_keys['manage_window.bt.upgrade.tooltip'])
self.bt_upgrade.setIcon(QIcon(resource.get_path('img/app_update.svg'))) self.bt_upgrade.setIcon(QIcon(resource.get_path('img/app_update.svg')))
self.bt_upgrade.setText(locale_keys['manage_window.bt.upgrade.text']) self.bt_upgrade.setText(locale_keys['manage_window.bt.upgrade.text'])
self.bt_upgrade.setStyleSheet('QPushButton { background: #20A435; color: white; font-weight: bold;} QPushButton:disabled { background: gray }') # 19CC24 19B622 self.bt_upgrade.setStyleSheet(self._toolbar_button_style('#20A435'))
self.bt_upgrade.clicked.connect(self.update_selected) self.bt_upgrade.clicked.connect(self.update_selected)
self.ref_bt_upgrade = toolbar.addWidget(self.bt_upgrade) self.ref_bt_upgrade = self.toolbar.addWidget(self.bt_upgrade)
self.layout.addWidget(toolbar) self.layout.addWidget(self.toolbar)
self.table_apps = AppsTable(self, self.icon_cache, disk_cache=self.disk_cache, download_icons=self.download_icons) self.table_apps = AppsTable(self, self.icon_cache, disk_cache=self.disk_cache, download_icons=self.download_icons)
self.table_apps.change_headers_policy() self.table_apps.change_headers_policy()
@@ -493,12 +496,12 @@ class ManageWindow(QWidget):
self.apps = [] self.apps = []
napps = 0 # number of apps (not libraries) napps = 0 # number of apps (not libraries)
available_types = {self.any_type_filter} available_types = {}
if apps: if apps:
for app in apps: for app in apps:
app_model = ApplicationView(model=app, visible=(not app.is_library()) or not self.checkbox_only_apps.isChecked()) app_model = ApplicationView(model=app, visible=(not app.is_library()) or not self.checkbox_only_apps.isChecked())
available_types.add(app.get_type()) available_types[app.get_type()] = app.get_type_icon_path()
napps += 1 if not app.is_library() else 0 napps += 1 if not app.is_library() else 0
self.apps.append(app_model) self.apps.append(app_model)
@@ -524,30 +527,38 @@ class ManageWindow(QWidget):
self.thread_verify_models.apps = self.apps self.thread_verify_models.apps = self.apps
self.thread_verify_models.start() self.thread_verify_models.start()
def _update_type_filters(self, available_types: Set[str]): @staticmethod
def _get_resized_icon(path: str, size: int) -> QIcon:
pixmap = QPixmap(path)
return QIcon(pixmap.scaled(size, size, Qt.KeepAspectRatio, Qt.SmoothTransformation))
def _update_type_filters(self, available_types: dict):
self.type_filter = self.any_type_filter self.type_filter = self.any_type_filter
filters_layout = self.extra_filters.layout()
for i in reversed(range(filters_layout.count())):
filters_layout.itemAt(i).widget().setParent(None)
if len(available_types) > 1: if len(available_types) > 1:
for app_type in sorted(list(available_types)):
checkbox_app_type = QRadioButton()
text = app_type filters_layout = self.extra_filters.layout()
if app_type == self.any_type_filter: for i in reversed(range(filters_layout.count())):
checkbox_app_type.setChecked(True) filters_layout.itemAt(i).widget().setParent(None)
text = self.locale_keys[app_type]
checkbox_app_type.setText(text.capitalize()) if available_types:
combo = QComboBox()
combo.setStyleSheet('QLineEdit { height: 2px}')
combo.setEditable(True)
combo.lineEdit().setReadOnly(True)
combo.lineEdit().setAlignment(Qt.AlignCenter)
def handle_click(clicked: bool, filter_type: str = app_type): def handle_activated(index: int):
self._handle_type_filter(filter_type) self._handle_type_filter(combo.itemData(index))
checkbox_app_type.clicked.connect(handle_click) combo.activated.connect(handle_activated)
filters_layout.addWidget(checkbox_app_type) combo.addItem(self._get_resized_icon(resource.get_path('img/logo.svg'), 14), self.locale_keys[self.any_type_filter].capitalize(), self.any_type_filter)
for app_type, icon_path in available_types.items():
combo.addItem(self._get_resized_icon(icon_path, 14), app_type.capitalize(), app_type)
filters_layout.addWidget(combo)
def resize_and_center(self, accept_lower_width: bool = True): def resize_and_center(self, accept_lower_width: bool = True):
new_width = reduce(operator.add, [self.table_apps.columnWidth(i) for i in range(len(self.table_apps.column_names))]) * 1.05 new_width = reduce(operator.add, [self.table_apps.columnWidth(i) for i in range(len(self.table_apps.column_names))]) * 1.05
@@ -617,7 +628,7 @@ class ManageWindow(QWidget):
self.label_status.setText(action_label + "...") self.label_status.setText(action_label + "...")
self.ref_bt_upgrade.setVisible(False) self.ref_bt_upgrade.setVisible(False)
self.bt_refresh.setEnabled(False) self.ref_bt_refresh.setVisible(False)
self.checkbox_only_apps.setEnabled(False) self.checkbox_only_apps.setEnabled(False)
self.table_apps.setEnabled(False) self.table_apps.setEnabled(False)
self.checkbox_updates.setEnabled(False) self.checkbox_updates.setEnabled(False)
@@ -628,7 +639,7 @@ class ManageWindow(QWidget):
self.ref_toolbar_search.setVisible(False) self.ref_toolbar_search.setVisible(False)
if clear_filters: if clear_filters:
self._update_type_filters({self.any_type_filter}) self._update_type_filters({})
else: else:
self.extra_filters.setEnabled(False) self.extra_filters.setEnabled(False)
@@ -639,7 +650,7 @@ class ManageWindow(QWidget):
self.ref_label_updates.setVisible(True) self.ref_label_updates.setVisible(True)
self.thread_animate_progress.stop = True self.thread_animate_progress.stop = True
self.progress_bar.setValue(0) self.progress_bar.setValue(0)
self.bt_refresh.setEnabled(True) self.ref_bt_refresh.setVisible(True)
self.checkbox_only_apps.setEnabled(True) self.checkbox_only_apps.setEnabled(True)
self.table_apps.setEnabled(True) self.table_apps.setEnabled(True)
self.input_search.setEnabled(True) self.input_search.setEnabled(True)