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 subprocess
from threading import Lock
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, \
QHeaderView, QLabel, QHBoxLayout, QPushButton, QToolBar
from bauh_api.abstract.model import ApplicationStatus
from bauh.core import resource
from bauh_api.util.cache import Cache
from bauh.core import resource
from bauh.util import util
from bauh.view.qt import dialog
from bauh.view.qt.view_model import ApplicationView, ApplicationViewStatus
@@ -98,6 +96,7 @@ class AppsTable(QTableWidget):
self.icon_cache = icon_cache
self.lock_async_data = Lock()
self.setRowHeight(80,80)
def has_any_settings(self, app_v: ApplicationView):
return app_v.model.can_be_refreshed() or \

View File

@@ -1,11 +1,11 @@
import operator
from functools import reduce
from typing import List, Set
from typing import List
from PyQt5.QtCore import QEvent, Qt, QSize, pyqtSignal
from PyQt5.QtGui import QIcon, QWindowStateChangeEvent, QPixmap
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.model import Application
from bauh_api.abstract.view import MessageType
@@ -34,6 +34,9 @@ class ManageWindow(QWidget):
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):
super(ManageWindow, self).__init__()
self.locale_keys = locale_keys
@@ -47,9 +50,9 @@ class ManageWindow(QWidget):
self.download_icons = download_icons
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.setWindowIcon(self.icon_flathub)
self.setWindowIcon(self.icon_app)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
@@ -75,7 +78,7 @@ class ManageWindow(QWidget):
self.input_search.setFrame(False)
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.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.toolbar_search.addWidget(self.input_search)
@@ -88,43 +91,43 @@ class ManageWindow(QWidget):
self.toolbar_top.addWidget(new_spacer())
self.layout.addWidget(self.toolbar_top)
toolbar = QToolBar()
toolbar.setStyleSheet('QToolBar {spacing: 3px;}')
self.toolbar = QToolBar()
self.toolbar.setStyleSheet('QToolBar {spacing: 4px; margin-top: 8px; margin-bottom: 5px}')
self.checkbox_updates = QCheckBox()
self.checkbox_updates.setText(self.locale_keys['updates'].capitalize())
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.setText(self.locale_keys['manage_window.checkbox.only_apps'])
self.checkbox_only_apps.setChecked(True)
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.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.setToolTip(locale_keys['manage_window.bt.refresh.tooltip'])
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.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))
toolbar.addWidget(self.bt_refresh)
self.ref_bt_refresh = self.toolbar.addWidget(self.bt_refresh)
self.bt_upgrade = QPushButton()
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.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.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.change_headers_policy()
@@ -493,12 +496,12 @@ class ManageWindow(QWidget):
self.apps = []
napps = 0 # number of apps (not libraries)
available_types = {self.any_type_filter}
available_types = {}
if apps:
for app in apps:
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
self.apps.append(app_model)
@@ -524,30 +527,38 @@ class ManageWindow(QWidget):
self.thread_verify_models.apps = self.apps
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
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:
for app_type in sorted(list(available_types)):
checkbox_app_type = QRadioButton()
text = app_type
if app_type == self.any_type_filter:
checkbox_app_type.setChecked(True)
text = self.locale_keys[app_type]
filters_layout = self.extra_filters.layout()
for i in reversed(range(filters_layout.count())):
filters_layout.itemAt(i).widget().setParent(None)
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):
self._handle_type_filter(filter_type)
def handle_activated(index: int):
self._handle_type_filter(combo.itemData(index))
checkbox_app_type.clicked.connect(handle_click)
filters_layout.addWidget(checkbox_app_type)
combo.activated.connect(handle_activated)
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):
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.ref_bt_upgrade.setVisible(False)
self.bt_refresh.setEnabled(False)
self.ref_bt_refresh.setVisible(False)
self.checkbox_only_apps.setEnabled(False)
self.table_apps.setEnabled(False)
self.checkbox_updates.setEnabled(False)
@@ -628,7 +639,7 @@ class ManageWindow(QWidget):
self.ref_toolbar_search.setVisible(False)
if clear_filters:
self._update_type_filters({self.any_type_filter})
self._update_type_filters({})
else:
self.extra_filters.setEnabled(False)
@@ -639,7 +650,7 @@ class ManageWindow(QWidget):
self.ref_label_updates.setVisible(True)
self.thread_animate_progress.stop = True
self.progress_bar.setValue(0)
self.bt_refresh.setEnabled(True)
self.ref_bt_refresh.setVisible(True)
self.checkbox_only_apps.setEnabled(True)
self.table_apps.setEnabled(True)
self.input_search.setEnabled(True)