Skip to content

Commit 331f25b

Browse files
committed
Add NoClickableStyle and ClickableList classes
1 parent d53b1f3 commit 331f25b

File tree

3 files changed

+104
-59
lines changed

3 files changed

+104
-59
lines changed

deepinesStore/maing.py

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from PyQt5.QtCore import QMetaObject, QRect, QSize, Qt, pyqtSignal
55

66
from deepinesStore.core import get_res, tr, get_text_link, STORE_VERSION
7-
from deepinesStore.widgets import ClickableLabel
7+
from deepinesStore.widgets import ClickableLabel, ClickableList
88

99

1010
# https://stackoverflow.com/a/67711660
@@ -226,120 +226,122 @@ def setupUi(self, MainWindow):
226226
self.horizontalLayout_2.addWidget(self.pushButton)
227227
# Segundo item, cuadro busqueda
228228
self.verticalLayout.addWidget(self.frame_4)
229-
self.listWidget = QtWidgets.QListWidget(self.frame_2)
230-
self.listWidget.setStyleSheet(
231-
"#listWidget{\n"
229+
self.lw_categories = ClickableList(self.frame_2)
230+
self.lw_categories.setStyleSheet(
231+
"#lw_categories{\n"
232232
" padding-left:10px;\n"
233233
" padding-top:6px;\n"
234234
" padding-bottom:6px;\n"
235235
" border-radius: 15px;\n"
236236
" background-color: rgba(16, 16, 16, 163);\n"
237237
"}\n"
238-
"#listWidget:item{\n"
238+
"#lw_categories:item{\n"
239239
# Top Right Bottom Left
240240
" padding: 3px 5px 3px 5px;\n"
241241
"}\n"
242-
"#listWidget:item:selected{\n"
242+
"#lw_categories:item:selected{\n"
243243
" background-color: transparent;\n"
244244
" border: 0px solid transparent;\n"
245245
" color: #419fd9;\n"
246246
"}")
247-
self.listWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
248-
self.listWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
249-
self.listWidget.setAutoScroll(False)
250-
self.listWidget.setIconSize(QSize(24, 24))
251-
self.listWidget.setObjectName("listWidget")
247+
self.lw_categories.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
248+
self.lw_categories.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
249+
self.lw_categories.setAutoScroll(False)
250+
self.lw_categories.setIconSize(QSize(24, 24))
251+
self.lw_categories.setObjectName("lw_categories")
252252
item = QtWidgets.QListWidgetItem()
253253
icon1 = QtGui.QIcon()
254254
icon1.addPixmap(QtGui.QPixmap(svg_star),
255255
QtGui.QIcon.Normal, QtGui.QIcon.Off)
256256
item.setIcon(icon1)
257257
item.setFlags(Qt.ItemIsSelectable |
258258
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
259-
self.listWidget.addItem(item)
259+
self.lw_categories.addItem(item)
260260
item = QtWidgets.QListWidgetItem()
261261
icon2 = QtGui.QIcon()
262262
icon2.addPixmap(QtGui.QPixmap(svg_deepines),
263263
QtGui.QIcon.Normal, QtGui.QIcon.Off)
264264
item.setIcon(icon2)
265-
self.listWidget.addItem(item)
265+
self.lw_categories.addItem(item)
266266
item = QtWidgets.QListWidgetItem()
267267
icon3 = QtGui.QIcon()
268268
icon3.addPixmap(QtGui.QPixmap(svg_internet),
269269
QtGui.QIcon.Normal, QtGui.QIcon.Off)
270270
item.setIcon(icon3)
271271
item.setFlags(Qt.ItemIsSelectable |
272272
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
273-
self.listWidget.addItem(item)
273+
self.lw_categories.addItem(item)
274274
item = QtWidgets.QListWidgetItem()
275275
icon4 = QtGui.QIcon()
276276
icon4.addPixmap(QtGui.QPixmap(svg_music),
277277
QtGui.QIcon.Normal, QtGui.QIcon.Off)
278278
item.setIcon(icon4)
279279
item.setFlags(Qt.ItemIsSelectable |
280280
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
281-
self.listWidget.addItem(item)
281+
self.lw_categories.addItem(item)
282282
item = QtWidgets.QListWidgetItem()
283283
icon5 = QtGui.QIcon()
284284
icon5.addPixmap(QtGui.QPixmap(svg_picture),
285285
QtGui.QIcon.Normal, QtGui.QIcon.Off)
286286
item.setIcon(icon5)
287287
item.setFlags(Qt.ItemIsSelectable |
288288
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
289-
self.listWidget.addItem(item)
289+
self.lw_categories.addItem(item)
290290
item = QtWidgets.QListWidgetItem()
291291
icon6 = QtGui.QIcon()
292292
icon6.addPixmap(QtGui.QPixmap(svg_console),
293293
QtGui.QIcon.Normal, QtGui.QIcon.Off)
294294
item.setIcon(icon6)
295295
item.setFlags(Qt.ItemIsSelectable |
296296
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
297-
self.listWidget.addItem(item)
297+
self.lw_categories.addItem(item)
298298
item = QtWidgets.QListWidgetItem()
299299
icon7 = QtGui.QIcon()
300300
icon7.addPixmap(QtGui.QPixmap(svg_board),
301301
QtGui.QIcon.Normal, QtGui.QIcon.Off)
302302
item.setIcon(icon7)
303303
item.setFlags(Qt.ItemIsSelectable |
304304
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
305-
self.listWidget.addItem(item)
305+
self.lw_categories.addItem(item)
306306
item = QtWidgets.QListWidgetItem()
307307
icon8 = QtGui.QIcon()
308308
icon8.addPixmap(QtGui.QPixmap(svg_terminal),
309309
QtGui.QIcon.Normal, QtGui.QIcon.Off)
310310
item.setIcon(icon8)
311311
item.setFlags(Qt.ItemIsSelectable |
312312
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
313-
self.listWidget.addItem(item)
313+
self.lw_categories.addItem(item)
314314
item = QtWidgets.QListWidgetItem()
315315
icon9 = QtGui.QIcon()
316316
icon9.addPixmap(QtGui.QPixmap(svg_computer),
317317
QtGui.QIcon.Normal, QtGui.QIcon.Off)
318318
item.setIcon(icon9)
319319
item.setFlags(Qt.ItemIsSelectable |
320320
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
321-
self.listWidget.addItem(item)
321+
self.lw_categories.addItem(item)
322322
item = QtWidgets.QListWidgetItem()
323323
icon10 = QtGui.QIcon()
324324
icon10.addPixmap(QtGui.QPixmap(svg_pamela),
325325
QtGui.QIcon.Normal, QtGui.QIcon.Off)
326326
item.setIcon(icon10)
327327
item.setFlags(Qt.ItemIsSelectable |
328328
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
329-
self.listWidget.addItem(item)
329+
self.lw_categories.addItem(item)
330330
item = QtWidgets.QListWidgetItem()
331331
item.setFlags(Qt.NoItemFlags)
332-
self.listWidget.addItem(item)
332+
self.lw_categories.set_skip_item_action_indices([10])
333+
334+
self.lw_categories.addItem(item)
333335
item = QtWidgets.QListWidgetItem()
334336
icon11 = QtGui.QIcon()
335337
icon11.addPixmap(QtGui.QPixmap(svg_pamela),
336338
QtGui.QIcon.Normal, QtGui.QIcon.Off)
337339
item.setIcon(icon11)
338340
item.setFlags(Qt.ItemIsSelectable |
339341
Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
340-
self.listWidget.addItem(item)
342+
self.lw_categories.addItem(item)
341343
# Tercer item, lista de filtros
342-
self.verticalLayout.addWidget(self.listWidget)
344+
self.verticalLayout.addWidget(self.lw_categories)
343345

344346
self.widget_2 = QtWidgets.QWidget(self.frame_2)
345347
self.widget_2.setStyleSheet("background-color:transparent;")
@@ -461,7 +463,7 @@ def setupUi(self, MainWindow):
461463
MainWindow.setCentralWidget(self.centralwidget)
462464

463465
self.retranslateUi(MainWindow)
464-
self.listWidget.setCurrentRow(-1)
466+
self.lw_categories.setCurrentRow(-1)
465467
QMetaObject.connectSlotsByName(MainWindow)
466468

467469
def __tr(self, txt, disambiguation=None, n=-1):
@@ -473,33 +475,33 @@ def retranslateUi(self, MainWindow):
473475
self.label_3.setText(self.__tr("Deepines Store"))
474476
self.lbl_list_apps.setText(self.__tr("TextLabel"))
475477
self.btn_install.setText(self.__tr("Install"))
476-
__sortingEnabled = self.listWidget.isSortingEnabled()
477-
self.listWidget.setSortingEnabled(False)
478-
item = self.listWidget.item(0)
478+
__sortingEnabled = self.lw_categories.isSortingEnabled()
479+
self.lw_categories.setSortingEnabled(False)
480+
item = self.lw_categories.item(0)
479481
item.setText(self.__tr("Home"))
480-
item = self.listWidget.item(1)
482+
item = self.lw_categories.item(1)
481483
item.setText(self.__tr("Deepines"))
482-
item = self.listWidget.item(2)
484+
item = self.lw_categories.item(2)
483485
item.setText(self.__tr("Internet"))
484-
item = self.listWidget.item(3)
486+
item = self.lw_categories.item(3)
485487
item.setText(self.__tr("Multimedia"))
486-
item = self.listWidget.item(4)
488+
item = self.lw_categories.item(4)
487489
item.setText(self.__tr("Graphics"))
488-
item = self.listWidget.item(5)
490+
item = self.lw_categories.item(5)
489491
item.setText(self.__tr("Games"))
490-
item = self.listWidget.item(6)
492+
item = self.lw_categories.item(6)
491493
item.setText(self.__tr("Office automation"))
492-
item = self.listWidget.item(7)
494+
item = self.lw_categories.item(7)
493495
item.setText(self.__tr("Development"))
494-
item = self.listWidget.item(8)
496+
item = self.lw_categories.item(8)
495497
item.setText(self.__tr("System"))
496-
item = self.listWidget.item(9)
498+
item = self.lw_categories.item(9)
497499
item.setText(self.__tr("Other"))
498-
item = self.listWidget.item(10)
500+
item = self.lw_categories.item(10)
499501
item.setText(self.__tr(""))
500-
item = self.listWidget.item(11)
502+
item = self.lw_categories.item(11)
501503
item.setText(self.__tr("Installed apps"))
502-
self.listWidget.setSortingEnabled(__sortingEnabled)
504+
self.lw_categories.setSortingEnabled(__sortingEnabled)
503505
self.lineEdit.setPlaceholderText(self.__tr("Search"))
504506
self.about_version_text = self.__tr("About \nVersion: {version}")
505507
self.btn_minimize.setToolTip(self.__tr("Minimize"))

deepinesStore/store.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def __init__(self):
7979
ui.lbl_list_apps.setEnabled(False)
8080
ui.icon_car.clicked.connect(self.apps_seleccionadas)
8181
ui.lbl_list_apps.clicked.connect(self.apps_seleccionadas)
82-
ui.listWidget.itemClicked.connect(self.listwidgetclicked)
82+
ui.lw_categories.itemClicked.connect(self.listwidgetclicked)
8383
ui.lineEdit.textChanged.connect(self.search_app)
8484
self.about_dialog = AboutDialog(self) # Intentional preloading.
8585
ui.label_2.clicked.connect(self.show_about_dialog)
@@ -139,7 +139,7 @@ def error(self, text: str):
139139
self.label_error.setAlignment(QtCore.AlignCenter)
140140
self.label_error.setObjectName("label_error")
141141
ui.gridLayout.addWidget(self.label_error, 2, 1, 1, 1)
142-
ui.listWidget.setEnabled(False)
142+
ui.lw_categories.setEnabled(False)
143143
ui.frame_4.setEnabled(False)
144144

145145
# /Control de errores #
@@ -183,7 +183,7 @@ def change_type_app_selected(self):
183183
ui.btn_app_deb.setIcon(QIcon(QPixmap(get_res('debian'))))
184184
lista_global = self.lista_app_flatpak
185185
lista_inicio = self.inicio_apps_flatpak
186-
ui.listWidget.item(1).setHidden(True)
186+
ui.lw_categories.item(1).setHidden(True)
187187
else:
188188
# Seleccionamos deb
189189
selected_type_app = 0
@@ -192,10 +192,10 @@ def change_type_app_selected(self):
192192
ui.btn_app_deb.setIcon(QIcon(QPixmap(get_res('flatpak_sin_texto'))))
193193
lista_global = self.lista_app_deb
194194
lista_inicio = self.inicio_apps_deb
195-
ui.listWidget.item(1).setHidden(False)
195+
ui.lw_categories.item(1).setHidden(False)
196196

197197
self.do_list_apps(lista_inicio)
198-
item = ui.listWidget.item(0)
198+
item = ui.lw_categories.item(0)
199199
item.setSelected(True)
200200

201201
# /Cambiar tipo de app #
@@ -210,7 +210,7 @@ def search_app(self):
210210
lista_search = list()
211211
global lista_global, lista_temp
212212
if len(text) != 0 and len(text) > 2:
213-
ui.listWidget.clearSelection()
213+
ui.lw_categories.clearSelection()
214214
for app_item in lista_global:
215215
if text in str(app_item.name).lower() or text in str(app_item.description).lower():
216216
indice = lista_global.index(app_item)
@@ -236,45 +236,45 @@ def listwidgetclicked(self, item):
236236
global lista_global, lista_inicio
237237

238238
# TODO: Maybe a switch statement would be nice here
239-
if item == ui.listWidget.item(0): # Home
239+
if item == ui.lw_categories.item(0): # Home
240240
filtro.append("inicio")
241-
if item == ui.listWidget.item(1): # Deepines
241+
if item == ui.lw_categories.item(1): # Deepines
242242
filtro.append("deepines")
243-
if item == ui.listWidget.item(2): # Internet
243+
if item == ui.lw_categories.item(2): # Internet
244244
filtro.append("web")
245245
filtro.append("net")
246246
filtro.append("mail")
247247
filtro.append("networking")
248248
filtro.append("network")
249-
if item == ui.listWidget.item(3): # Multimedia
249+
if item == ui.lw_categories.item(3): # Multimedia
250250
filtro.append("sound")
251251
filtro.append("audio")
252252
filtro.append("video")
253253
filtro.append("audiovideo")
254-
if item == ui.listWidget.item(4): # Graphics
254+
if item == ui.lw_categories.item(4): # Graphics
255255
filtro.append("graphics")
256256
filtro.append("media")
257-
if item == ui.listWidget.item(5): # Games
257+
if item == ui.lw_categories.item(5): # Games
258258
filtro.append("games")
259259
filtro.append("game")
260-
if item == ui.listWidget.item(6): # Office automation
260+
if item == ui.lw_categories.item(6): # Office automation
261261
filtro.append("editors")
262262
filtro.append("office")
263263
filtro.append("productivity")
264-
if item == ui.listWidget.item(7): # Development
264+
if item == ui.lw_categories.item(7): # Development
265265
filtro.append("devel")
266266
filtro.append("shells")
267267
filtro.append("development")
268-
if item == ui.listWidget.item(8): # System
268+
if item == ui.lw_categories.item(8): # System
269269
filtro.append("admin")
270270
filtro.append("python")
271271
filtro.append("system")
272272
filtro.append("utility")
273-
if item == ui.listWidget.item(9): # Other
273+
if item == ui.lw_categories.item(9): # Other
274274
filtro.append("otros")
275275
filtro.append("education")
276276
filtro.append("science")
277-
if item == ui.listWidget.item(11):
277+
if item == ui.lw_categories.item(11):
278278
filtro.append("installed")
279279

280280
if "inicio" not in filtro and "installed" not in filtro:
@@ -341,7 +341,7 @@ def do_list_apps(self, lista):
341341
global lista_inicio, lista_global
342342
equal = lista_inicio == lista_global
343343
if equal:
344-
item = ui.listWidget.item(0)
344+
item = ui.lw_categories.item(0)
345345
item.setSelected(True)
346346

347347
while ui.gridLayout.count():
@@ -611,7 +611,7 @@ def minimize(self):
611611

612612
def apps_seleccionadas(self):
613613
self.do_list_apps(lista_selected)
614-
ui.listWidget.clearSelection()
614+
ui.lw_categories.clearSelection()
615615

616616
################################################
617617
# Card para la aplicacion #

deepinesStore/widgets.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,49 @@ def __init__(self, name, contact=None):
88
self.name = name
99
self.contact = contact
1010

11+
class NoClickableStyle(w.QProxyStyle):
12+
def __init__(self, parent=None, skip_indices=[]):
13+
super().__init__(parent)
14+
self.skip_indices = skip_indices
15+
16+
def drawControl(self, element, option, painter, widget=None):
17+
if element == w.QStyle.CE_ItemViewItem:
18+
index = option.index
19+
if index.isValid() and index.row() in self.skip_indices:
20+
option.state &= ~w.QStyle.State_Enabled
21+
option.state &= ~w.QStyle.State_MouseOver
22+
super().drawControl(element, option, painter, widget)
23+
24+
class ClickableList(w.QListWidget):
25+
def __init__(self, parent=None):
26+
super().__init__(parent)
27+
self.setAutoFillBackground(True)
28+
self.setFrameShape(w.QFrame.Shape.NoFrame)
29+
30+
def mousePressEvent(self, event):
31+
if event.button() == Qt.LeftButton:
32+
super().mousePressEvent(event)
33+
34+
def mouseMoveEvent(self, event):
35+
if event.buttons() == Qt.LeftButton:
36+
event.ignore()
37+
else:
38+
super().mouseMoveEvent(event)
39+
40+
def set_skip_item_action_indices(self, skip_indices=[]):
41+
self.setStyle(NoClickableStyle(self.style(), skip_indices))
42+
43+
# Accessibility!!
44+
def keyPressEvent(self, event):
45+
if event.key() in (Qt.Key_Enter, Qt.Key_Return):
46+
current_item = self.currentItem()
47+
if current_item:
48+
current_item.setSelected(True)
49+
self.itemClicked.emit(current_item)
50+
else:
51+
super().keyPressEvent(event)
52+
53+
1154
# FIXME: Need to revisit this! AI is not a good coder!
1255
class CreditsListWidget(w.QListWidget):
1356
def __init__(self, parent=None):

0 commit comments

Comments
 (0)