Skip to content

Commit 48a2daa

Browse files
author
Guilherme Costa
committed
networkWindow.py: refactor to include listview
wifiConnectivityWindow.ui: change horizontalLayout to a vertical layout with a listview and a vertical scrollbar wifiConnectivityWindow.py: generated file from QtDesigner with some optimizations Signed-off-by: Guilherme Costa <guiherme.costa@blockstec.com>
1 parent cc0691c commit 48a2daa

File tree

3 files changed

+218
-169
lines changed

3 files changed

+218
-169
lines changed

BlocksScreen/lib/panels/networkWindow.py

Lines changed: 50 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1+
import copy
12
import logging
2-
import typing
3-
import copy
43
import subprocess
4+
import typing
55
from functools import partial
66

77
from PyQt6 import QtCore, QtGui, QtWidgets
8-
from PyQt6.QtCore import QRunnable, QThreadPool, QObject, pyqtSignal, QVariant
9-
from PyQt6.QtWidgets import QScroller, QScrollerProperties
8+
from PyQt6.QtCore import QRunnable, QThreadPool, QObject, pyqtSignal
109

1110
from lib.network import SdbusNetworkManagerAsync
1211
from lib.panels.widgets.popupDialogWidget import Popup
1312
from lib.ui.wifiConnectivityWindow_ui import Ui_wifi_stacked_page
1413
from lib.panels.widgets.keyboardPage import CustomQwertyKeyboard
15-
from lib.utils.blocks_frame import BlocksCustomFrame
1614
from lib.panels.widgets.loadPage import LoadScreen
1715
from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem
1816

@@ -216,9 +214,6 @@ def __init__(self, parent: typing.Optional[QtWidgets.QWidget], /) -> None:
216214

217215
self.panel = Ui_wifi_stacked_page()
218216
self.panel.setupUi(self)
219-
220-
self._setupUI()
221-
222217
self._provider = WifiIconProvider()
223218
self.ongoing_update: bool = False
224219

@@ -237,16 +232,14 @@ def __init__(self, parent: typing.Optional[QtWidgets.QWidget], /) -> None:
237232

238233
#View Models and Delegates
239234
self.model = EntryListModel()
240-
self.model.setParent(self.network_list_widget)
235+
self.model.setParent(self.panel.listView)
241236
self.entry_delegate = EntryDelegate()
242-
self.network_list_widget.setModel(self.model)
243-
self.network_list_widget.setItemDelegate(self.entry_delegate)
237+
self.panel.listView.setModel(self.model)
238+
self.panel.listView.setItemDelegate(self.entry_delegate)
244239
self.entry_delegate.item_selected.connect(self.ssid_item_clicked)
245-
self.panel.network_backButton.clicked.connect(self.reset_view_model)
246240

247241
# Network Scan
248242
self.build_network_list()
249-
250243
self.network_list_worker = BuildNetworkList()
251244
self.network_list_worker.finished_network_list_build.connect(
252245
self.handle_network_list
@@ -412,8 +405,15 @@ def __init__(self, parent: typing.Optional[QtWidgets.QWidget], /) -> None:
412405

413406
self.network_list_worker.build()
414407
self.request_network_scan.emit()
408+
self.panel.listView.verticalScrollBar().valueChanged.connect(
409+
self._handle_scrollbar
410+
)
411+
self.panel.verticalScrollBar.valueChanged.connect(self._handle_scrollbar)
412+
self.panel.verticalScrollBar.valueChanged.connect(
413+
lambda value: self.panel.listView.verticalScrollBar().setValue(value)
414+
)
415+
self.panel.verticalScrollBar.show()
415416
self.hide()
416-
417417
self.info_box_load()
418418

419419
self.qwerty = CustomQwertyKeyboard(self)
@@ -476,20 +476,28 @@ def deleteLater(self) -> None:
476476

477477
def showEvent(self, event: QtGui.QShowEvent | None) -> None:
478478
"""Re-add clients to update list"""
479+
# Block all touch events so multitouch is ignored
480+
if event.type() in (
481+
QtCore.QEvent.Type.TouchBegin,
482+
QtCore.QEvent.Type.TouchUpdate,
483+
QtCore.QEvent.Type.TouchEnd
484+
):
485+
return True # ignore the event entirely
486+
479487
self.build_model_list()
480488
return super().showEvent(event)
481489

482490
def build_model_list(self) -> None:
483491
"""Builds the model list (`self.model`) containing updatable clients"""
484-
self.network_list_widget.blockSignals(True)
485-
self.model.clear()
486-
487-
test:dict = copy.copy(self.saved_network)
488-
if test.items():
489-
for ssid,(signal,is_saved) in test.items():
492+
self.panel.listView.blockSignals(True)
493+
self.reset_view_model()
494+
saved_networks:dict = copy.copy(self.saved_network)
495+
if saved_networks.items():
496+
for ssid,(signal,is_saved) in saved_networks.items():
490497
self.add_network_entry(ssid=ssid, signal=signal, is_saved=is_saved)
491-
492-
self.network_list_widget.blockSignals(False)
498+
self._setup_scrollbar()
499+
500+
self.panel.listView.blockSignals(False)
493501

494502
def saved_wifi_option_selected(self):
495503
_sender = self.sender()
@@ -721,7 +729,7 @@ def evaluate_network_state(self, nm_state: str = "") -> None:
721729
self.info_box_load(False)
722730
self.panel.wifi_button.setEnabled(True)
723731
self.panel.hotspot_button.setEnabled(True)
724-
self.repaint()
732+
725733

726734

727735
if (
@@ -877,7 +885,6 @@ def ssid_item_clicked(self, item: ListItem) -> None:
877885
return
878886

879887
_current_ssid_name = item.text
880-
#_current_ssid_name = self.saved_network.get(item.text, {})
881888
self.selected_item = copy.copy(item)
882889
if (
883890
_current_ssid_name in self.sdbus_network.get_saved_ssid_names()
@@ -912,7 +919,6 @@ def update_network(
912919

913920
@QtCore.pyqtSlot(list, name="finished-network-list-build")
914921
def handle_network_list(self, data: typing.Dict) -> None:
915-
self.network_list_widget.blockSignals(True)
916922
for entry in data:
917923
if entry[0] == self.sdbus_network.hotspot_ssid:
918924
continue
@@ -922,8 +928,6 @@ def handle_network_list(self, data: typing.Dict) -> None:
922928
continue
923929
self.saved_network[entry[0]] = (entry[1], entry[2])
924930
self.build_model_list()
925-
self.network_list_widget.blockSignals(False)
926-
927931
self.evaluate_network_state()
928932
QtCore.QTimer().singleShot(10000, lambda: self.network_list_worker.build())
929933

@@ -937,7 +941,7 @@ def handle_button_click(self, ssid: str):
937941
self.panel.network_activate_btn.show()
938942
else:
939943
self.panel.network_activate_btn.hide()
940-
self.panel.frame.repaint()
944+
#self.panel.frame.repaint()
941945

942946
else:
943947
self.setCurrentIndex(self.indexOf(self.panel.add_network_page))
@@ -1017,67 +1021,35 @@ def add_network_entry(self, ssid: str, signal: int, is_saved:str) -> None:
10171021
"""Adds a new item to the list model"""
10181022

10191023
wifi_pixmap = self._provider.get_pixmap(signal=signal, state=is_saved)
1020-
1024+
ssid = ssid if ssid is not "" else "UNKOWN"
10211025
item = ListItem(
10221026
text=ssid,
10231027
left_icon=wifi_pixmap,
10241028
right_text=is_saved,
10251029
selected=False,
10261030
allow_check=False,
10271031
_lfontsize=17,
1028-
_rfontsize=13,
1029-
height=70,
1032+
_rfontsize=12,
1033+
height=80,
10301034
)
10311035
self.model.add_item(item)
1036+
1037+
def _handle_scrollbar(self, value):
1038+
# Block signals to avoid recursion
1039+
self.panel.verticalScrollBar.blockSignals(True)
1040+
self.panel.verticalScrollBar.setValue(value)
1041+
self.panel.verticalScrollBar.blockSignals(False)
10321042

1033-
def _setupUI(self) -> None:
1034-
1035-
"""Sets up the UI components and layout for the network window."""
1036-
1037-
font_id = QtGui.QFontDatabase.addApplicationFont(
1038-
":/font/media/fonts for text/Momcake-Bold.ttf"
1043+
def _setup_scrollbar(self) -> None:
1044+
self.panel.verticalScrollBar.setMinimum(
1045+
self.panel.listView.verticalScrollBar().minimum()
10391046
)
1040-
font_family = QtGui.QFontDatabase.applicationFontFamilies(font_id)[0]
1041-
sizePolicy = QtWidgets.QSizePolicy(
1042-
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
1043-
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
1047+
self.panel.verticalScrollBar.setMaximum(
1048+
self.panel.listView.verticalScrollBar().maximum()
1049+
)
1050+
self.panel.verticalScrollBar.setPageStep(
1051+
self.panel.listView.verticalScrollBar().pageStep()
10441052
)
1045-
sizePolicy.setHorizontalStretch(1)
1046-
#sizePolicy.setVerticalStretch(1)
1047-
self.setSizePolicy(sizePolicy)
1048-
self.setMinimumSize(QtCore.QSize(800, 500))
1049-
#self.setMaximumSize(QtCore.QSize(800, 500))
1050-
self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
1051-
self.main_content_layout = QtWidgets.QHBoxLayout()
1052-
self.main_content_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
1053-
1054-
font = QtGui.QFont()
1055-
font.setFamily(font_family)
1056-
font.setPointSize(24)
1057-
1058-
self.header_title = QtWidgets.QLabel(self)
1059-
self.header_title.setMinimumSize(QtCore.QSize(100, 60))
1060-
self.header_title.setMaximumSize(QtCore.QSize(16777215, 60))
1061-
self.header_title.setFont(font)
1062-
1063-
# Timer for loading screen timeout
1064-
self._load_timer = QtCore.QTimer(self)
1065-
1066-
#Buttons frame for update buttons
1067-
self.network_buttons_frame = BlocksCustomFrame()
1068-
#self.network_buttons_frame.setMinimumSize(QtCore.QSize(100, 100))
1069-
#self.network_buttons_frame.setMaximumSize(QtCore.QSize(800, 450))
1070-
1071-
#List widget for update buttons
1072-
self.network_list_widget = QtWidgets.QListView(self.network_buttons_frame)
1073-
1074-
self.network_buttons_layout = QtWidgets.QVBoxLayout()
1075-
self.network_buttons_layout.setContentsMargins(15, 20, 20, 5)
1076-
self.network_buttons_layout.addWidget(self.network_list_widget, 0, QtCore.Qt.AlignmentFlag.AlignBottom)
1077-
self.network_buttons_frame.setLayout(self.network_buttons_layout)
1078-
1079-
self.main_content_layout.addWidget(self.network_buttons_frame, 0)
1080-
self.setLayout(self.main_content_layout)
10811053

10821054
def build_network_list(self) -> None:
10831055
"""Build available/saved network list with optimized palette setup."""
@@ -1106,56 +1078,4 @@ def set_brush_for_all_groups(palette, role, color, style=QtCore.Qt.BrushStyle.So
11061078
set_brush_for_all_groups(palette, QtGui.QPalette.ColorRole.Link, (0, 0, 255, 0))
11071079

11081080
# Apply palette
1109-
self.network_list_widget.setPalette(palette)
1110-
1111-
# General QListView setup
1112-
self.network_list_widget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
1113-
self.network_list_widget.setStyleSheet("background-color:transparent")
1114-
self.network_list_widget.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
1115-
self.network_list_widget.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
1116-
self.network_list_widget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded)
1117-
self.network_list_widget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
1118-
self.network_list_widget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustIgnored)
1119-
self.network_list_widget.setAutoScroll(False)
1120-
self.network_list_widget.setProperty("showDropIndicator", False)
1121-
self.network_list_widget.setDefaultDropAction(QtCore.Qt.DropAction.IgnoreAction)
1122-
self.network_list_widget.setAlternatingRowColors(False)
1123-
self.network_list_widget.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection)
1124-
self.network_list_widget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectItems)
1125-
self.network_list_widget.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel)
1126-
self.network_list_widget.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel)
1127-
self.network_list_widget.setUniformItemSizes(True)
1128-
self.network_list_widget.setSpacing(3)
1129-
1130-
viewport = self.network_list_widget.viewport()
1131-
QScroller.grabGesture(viewport, QScroller.ScrollerGestureType.TouchGesture)
1132-
QScroller.grabGesture(viewport, QScroller.ScrollerGestureType.LeftMouseButtonGesture)
1133-
1134-
scroller = QScroller.scroller(viewport)
1135-
props = scroller.scrollerProperties()
1136-
1137-
props.setScrollMetric(
1138-
QScrollerProperties.ScrollMetric.VerticalOvershootPolicy,
1139-
QVariant(QScrollerProperties.OvershootPolicy.OvershootAlwaysOff)
1140-
)
1141-
props.setScrollMetric(
1142-
QScrollerProperties.ScrollMetric.OvershootDragResistanceFactor,
1143-
QVariant(1.0)
1144-
)
1145-
props.setScrollMetric(
1146-
QScrollerProperties.ScrollMetric.OvershootDragDistanceFactor,
1147-
QVariant(0.0)
1148-
)
1149-
props.setScrollMetric(
1150-
QScrollerProperties.ScrollMetric.OvershootScrollDistanceFactor,
1151-
QVariant(0.0)
1152-
)
1153-
props.setScrollMetric(
1154-
QScrollerProperties.ScrollMetric.OvershootScrollTime,
1155-
QVariant(0.0)
1156-
)
1157-
1158-
scroller.setScrollerProperties(props)
1159-
1160-
self.network_list_widget.setObjectName("network_list_widget")
1161-
self.panel.nl_content_layout.addWidget(self.network_list_widget)
1081+
self.panel.listView.setPalette(palette)

BlocksScreen/lib/ui/wifiConnectivityWindow.ui

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>800</width>
9+
<width>852</width>
1010
<height>480</height>
1111
</rect>
1212
</property>
@@ -40,7 +40,7 @@
4040
</string>
4141
</property>
4242
<property name="currentIndex">
43-
<number>2</number>
43+
<number>1</number>
4444
</property>
4545
<widget class="QWidget" name="main_network_page">
4646
<property name="sizePolicy">
@@ -697,7 +697,61 @@ using the buttons on the side.</string>
697697
</layout>
698698
</item>
699699
<item>
700-
<layout class="QVBoxLayout" name="nl_content_layout"/>
700+
<layout class="QHBoxLayout" name="horizontalLayout_2">
701+
<item>
702+
<widget class="QListView" name="listView">
703+
<property name="sizePolicy">
704+
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
705+
<horstretch>1</horstretch>
706+
<verstretch>1</verstretch>
707+
</sizepolicy>
708+
</property>
709+
<property name="minimumSize">
710+
<size>
711+
<width>0</width>
712+
<height>0</height>
713+
</size>
714+
</property>
715+
<property name="cursor" stdset="0">
716+
<cursorShape>BlankCursor</cursorShape>
717+
</property>
718+
<property name="styleSheet">
719+
<string notr="true">background-color: rgba(255, 255, 255, 0);</string>
720+
</property>
721+
<property name="frameShape">
722+
<enum>QFrame::NoFrame</enum>
723+
</property>
724+
<property name="frameShadow">
725+
<enum>QFrame::Plain</enum>
726+
</property>
727+
<property name="verticalScrollBarPolicy">
728+
<enum>Qt::ScrollBarAlwaysOff</enum>
729+
</property>
730+
<property name="horizontalScrollBarPolicy">
731+
<enum>Qt::ScrollBarAlwaysOff</enum>
732+
</property>
733+
<property name="verticalScrollMode">
734+
<enum>QAbstractItemView::ScrollPerPixel</enum>
735+
</property>
736+
<property name="horizontalScrollMode">
737+
<enum>QAbstractItemView::ScrollPerPixel</enum>
738+
</property>
739+
</widget>
740+
</item>
741+
<item>
742+
<widget class="CustomScrollBar" name="verticalScrollBar">
743+
<property name="sizePolicy">
744+
<sizepolicy hsizetype="Fixed" vsizetype="Minimum">
745+
<horstretch>0</horstretch>
746+
<verstretch>0</verstretch>
747+
</sizepolicy>
748+
</property>
749+
<property name="orientation">
750+
<enum>Qt::Vertical</enum>
751+
</property>
752+
</widget>
753+
</item>
754+
</layout>
701755
</item>
702756
</layout>
703757
</widget>
@@ -2754,6 +2808,11 @@ Type</string>
27542808
<extends>QLabel</extends>
27552809
<header location="global">lib.panels.widgets.loadWidget</header>
27562810
</customwidget>
2811+
<customwidget>
2812+
<class>CustomScrollBar</class>
2813+
<extends>QScrollBar</extends>
2814+
<header location="global">lib.utils.blocks_Scrollbar</header>
2815+
</customwidget>
27572816
</customwidgets>
27582817
<resources>
27592818
<include location="resources/background_resources.qrc"/>

0 commit comments

Comments
 (0)