Skip to content

Commit fcd9242

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 81b8d5f commit fcd9242

3 files changed

Lines changed: 218 additions & 180 deletions

File tree

‎BlocksScreen/lib/panels/networkWindow.py‎

Lines changed: 50 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,24 @@
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

1917

2018
logger = logging.getLogger("logs/BlocksScreen.log")
2119

22-
<<<<<<< HEAD
23-
24-
class BuildNetworkList(QtCore.QThread):
25-
"""Retrieves information from sdbus interface about scanned networks"""
26-
=======
2720
class NetworkScanRunnable(QRunnable):
2821
"""QRunnable task that performs network scanning using SdbusNetworkManagerAsync
29-
>>>>>>> 9285fb7 (Refactor: Refac to MVC view with Controller being runnables on a threadpoll)
3022
3123
This runnable:
3224
- Triggers a network rescan via SdbusNetworkManagerAsync
@@ -222,9 +214,6 @@ def __init__(self, parent: typing.Optional[QtWidgets.QWidget], /) -> None:
222214

223215
self.panel = Ui_wifi_stacked_page()
224216
self.panel.setupUi(self)
225-
226-
self._setupUI()
227-
228217
self._provider = WifiIconProvider()
229218
self.ongoing_update: bool = False
230219

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

244233
#View Models and Delegates
245234
self.model = EntryListModel()
246-
self.model.setParent(self.network_list_widget)
235+
self.model.setParent(self.panel.listView)
247236
self.entry_delegate = EntryDelegate()
248-
self.network_list_widget.setModel(self.model)
249-
self.network_list_widget.setItemDelegate(self.entry_delegate)
237+
self.panel.listView.setModel(self.model)
238+
self.panel.listView.setItemDelegate(self.entry_delegate)
250239
self.entry_delegate.item_selected.connect(self.ssid_item_clicked)
251-
self.panel.network_backButton.clicked.connect(self.reset_view_model)
252240

253241
# Network Scan
254242
self.build_network_list()
255-
256243
self.network_list_worker = BuildNetworkList()
257244
self.network_list_worker.finished_network_list_build.connect(
258245
self.handle_network_list
@@ -413,8 +400,15 @@ def __init__(self, parent: typing.Optional[QtWidgets.QWidget], /) -> None:
413400

414401
self.network_list_worker.build()
415402
self.request_network_scan.emit()
403+
self.panel.listView.verticalScrollBar().valueChanged.connect(
404+
self._handle_scrollbar
405+
)
406+
self.panel.verticalScrollBar.valueChanged.connect(self._handle_scrollbar)
407+
self.panel.verticalScrollBar.valueChanged.connect(
408+
lambda value: self.panel.listView.verticalScrollBar().setValue(value)
409+
)
410+
self.panel.verticalScrollBar.show()
416411
self.hide()
417-
418412
self.info_box_load()
419413

420414
self.qwerty = CustomQwertyKeyboard(self)
@@ -477,20 +471,28 @@ def deleteLater(self) -> None:
477471

478472
def showEvent(self, event: QtGui.QShowEvent | None) -> None:
479473
"""Re-add clients to update list"""
474+
# Block all touch events so multitouch is ignored
475+
if event.type() in (
476+
QtCore.QEvent.Type.TouchBegin,
477+
QtCore.QEvent.Type.TouchUpdate,
478+
QtCore.QEvent.Type.TouchEnd
479+
):
480+
return True # ignore the event entirely
481+
480482
self.build_model_list()
481483
return super().showEvent(event)
482484

483485
def build_model_list(self) -> None:
484486
"""Builds the model list (`self.model`) containing updatable clients"""
485-
self.network_list_widget.blockSignals(True)
486-
self.model.clear()
487-
488-
test:dict = copy.copy(self.saved_network)
489-
if test.items():
490-
for ssid,(signal,is_saved) in test.items():
487+
self.panel.listView.blockSignals(True)
488+
self.reset_view_model()
489+
saved_networks:dict = copy.copy(self.saved_network)
490+
if saved_networks.items():
491+
for ssid,(signal,is_saved) in saved_networks.items():
491492
self.add_network_entry(ssid=ssid, signal=signal, is_saved=is_saved)
492-
493-
self.network_list_widget.blockSignals(False)
493+
self._setup_scrollbar()
494+
495+
self.panel.listView.blockSignals(False)
494496

495497
def saved_wifi_option_selected(self):
496498
"""Handle connect/delete network button clicks"""
@@ -739,6 +741,7 @@ def evaluate_network_state(self, nm_state: str = "") -> None:
739741
self.panel.hotspot_button.setEnabled(True)
740742
self.repaint()
741743

744+
742745
if (
743746
wifi_btn.state == wifi_btn.State.OFF
744747
and hotspot_btn.state == hotspot_btn.State.OFF
@@ -905,15 +908,9 @@ def add_network(self) -> None:
905908
self.panel.add_network_validation_button.setEnabled(True)
906909
self.panel.add_network_validation_button.repaint()
907910
self.popup.new_message(message_type=Popup.MessageType.ERROR, message=message)
908-
<<<<<<< HEAD
909-
910-
@QtCore.pyqtSlot(QtWidgets.QListWidgetItem, name="ssid_item_clicked")
911-
def ssid_item_clicked(self, item: QtWidgets.QListWidgetItem) -> None:
912-
=======
913911

914912
@QtCore.pyqtSlot(ListItem, name="ssid_item_clicked")
915913
def ssid_item_clicked(self, item: ListItem) -> None:
916-
>>>>>>> da41c34 (refactor: change network list to listview)
917914
"""Handles when a network is clicked on the QListWidget.
918915
919916
Args:
@@ -923,7 +920,6 @@ def ssid_item_clicked(self, item: ListItem) -> None:
923920
return
924921

925922
_current_ssid_name = item.text
926-
#_current_ssid_name = self.saved_network.get(item.text, {})
927923
self.selected_item = copy.copy(item)
928924
if (
929925
_current_ssid_name in self.sdbus_network.get_saved_ssid_names()
@@ -964,7 +960,6 @@ def handle_network_list(self, data: typing.List[typing.Tuple]) -> None:
964960
scroll_bar_position = self.network_list_widget.verticalScrollBar().value()
965961
=======
966962
def handle_network_list(self, data: typing.Dict) -> None:
967-
>>>>>>> da41c34 (refactor: change network list to listview)
968963
self.network_list_widget.blockSignals(True)
969964
for entry in data:
970965
if entry[0] == self.sdbus_network.hotspot_ssid:
@@ -975,8 +970,6 @@ def handle_network_list(self, data: typing.Dict) -> None:
975970
continue
976971
self.saved_network[entry[0]] = (entry[1], entry[2])
977972
self.build_model_list()
978-
self.network_list_widget.blockSignals(False)
979-
980973
self.evaluate_network_state()
981974
QtCore.QTimer().singleShot(10000, lambda: self.network_list_worker.build())
982975

@@ -990,7 +983,7 @@ def handle_button_click(self, ssid: str):
990983
self.panel.network_activate_btn.show()
991984
else:
992985
self.panel.network_activate_btn.hide()
993-
self.panel.frame.repaint()
986+
#self.panel.frame.repaint()
994987

995988
else:
996989
self.setCurrentIndex(self.indexOf(self.panel.add_network_page))
@@ -1070,67 +1063,35 @@ def add_network_entry(self, ssid: str, signal: int, is_saved:str) -> None:
10701063
"""Adds a new item to the list model"""
10711064

10721065
wifi_pixmap = self._provider.get_pixmap(signal=signal, state=is_saved)
1073-
1066+
ssid = ssid if ssid is not "" else "UNKOWN"
10741067
item = ListItem(
10751068
text=ssid,
10761069
left_icon=wifi_pixmap,
10771070
right_text=is_saved,
10781071
selected=False,
10791072
allow_check=False,
10801073
_lfontsize=17,
1081-
_rfontsize=13,
1082-
height=70,
1074+
_rfontsize=12,
1075+
height=80,
10831076
)
10841077
self.model.add_item(item)
1078+
1079+
def _handle_scrollbar(self, value):
1080+
# Block signals to avoid recursion
1081+
self.panel.verticalScrollBar.blockSignals(True)
1082+
self.panel.verticalScrollBar.setValue(value)
1083+
self.panel.verticalScrollBar.blockSignals(False)
10851084

1086-
def _setupUI(self) -> None:
1087-
1088-
"""Sets up the UI components and layout for the network window."""
1089-
1090-
font_id = QtGui.QFontDatabase.addApplicationFont(
1091-
":/font/media/fonts for text/Momcake-Bold.ttf"
1085+
def _setup_scrollbar(self) -> None:
1086+
self.panel.verticalScrollBar.setMinimum(
1087+
self.panel.listView.verticalScrollBar().minimum()
10921088
)
1093-
font_family = QtGui.QFontDatabase.applicationFontFamilies(font_id)[0]
1094-
sizePolicy = QtWidgets.QSizePolicy(
1095-
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
1096-
QtWidgets.QSizePolicy.Policy.MinimumExpanding,
1089+
self.panel.verticalScrollBar.setMaximum(
1090+
self.panel.listView.verticalScrollBar().maximum()
1091+
)
1092+
self.panel.verticalScrollBar.setPageStep(
1093+
self.panel.listView.verticalScrollBar().pageStep()
10971094
)
1098-
sizePolicy.setHorizontalStretch(1)
1099-
#sizePolicy.setVerticalStretch(1)
1100-
self.setSizePolicy(sizePolicy)
1101-
self.setMinimumSize(QtCore.QSize(800, 500))
1102-
#self.setMaximumSize(QtCore.QSize(800, 500))
1103-
self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
1104-
self.main_content_layout = QtWidgets.QHBoxLayout()
1105-
self.main_content_layout.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
1106-
1107-
font = QtGui.QFont()
1108-
font.setFamily(font_family)
1109-
font.setPointSize(24)
1110-
1111-
self.header_title = QtWidgets.QLabel(self)
1112-
self.header_title.setMinimumSize(QtCore.QSize(100, 60))
1113-
self.header_title.setMaximumSize(QtCore.QSize(16777215, 60))
1114-
self.header_title.setFont(font)
1115-
1116-
# Timer for loading screen timeout
1117-
self._load_timer = QtCore.QTimer(self)
1118-
1119-
#Buttons frame for update buttons
1120-
self.network_buttons_frame = BlocksCustomFrame()
1121-
#self.network_buttons_frame.setMinimumSize(QtCore.QSize(100, 100))
1122-
#self.network_buttons_frame.setMaximumSize(QtCore.QSize(800, 450))
1123-
1124-
#List widget for update buttons
1125-
self.network_list_widget = QtWidgets.QListView(self.network_buttons_frame)
1126-
1127-
self.network_buttons_layout = QtWidgets.QVBoxLayout()
1128-
self.network_buttons_layout.setContentsMargins(15, 20, 20, 5)
1129-
self.network_buttons_layout.addWidget(self.network_list_widget, 0, QtCore.Qt.AlignmentFlag.AlignBottom)
1130-
self.network_buttons_frame.setLayout(self.network_buttons_layout)
1131-
1132-
self.main_content_layout.addWidget(self.network_buttons_frame, 0)
1133-
self.setLayout(self.main_content_layout)
11341095

11351096
def build_network_list(self) -> None:
11361097
"""Build available/saved network list with optimized palette setup."""
@@ -1159,56 +1120,4 @@ def set_brush_for_all_groups(palette, role, color, style=QtCore.Qt.BrushStyle.So
11591120
set_brush_for_all_groups(palette, QtGui.QPalette.ColorRole.Link, (0, 0, 255, 0))
11601121

11611122
# Apply palette
1162-
self.network_list_widget.setPalette(palette)
1163-
1164-
# General QListView setup
1165-
self.network_list_widget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
1166-
self.network_list_widget.setStyleSheet("background-color:transparent")
1167-
self.network_list_widget.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
1168-
self.network_list_widget.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
1169-
self.network_list_widget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded)
1170-
self.network_list_widget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
1171-
self.network_list_widget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustIgnored)
1172-
self.network_list_widget.setAutoScroll(False)
1173-
self.network_list_widget.setProperty("showDropIndicator", False)
1174-
self.network_list_widget.setDefaultDropAction(QtCore.Qt.DropAction.IgnoreAction)
1175-
self.network_list_widget.setAlternatingRowColors(False)
1176-
self.network_list_widget.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection)
1177-
self.network_list_widget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectItems)
1178-
self.network_list_widget.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel)
1179-
self.network_list_widget.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel)
1180-
self.network_list_widget.setUniformItemSizes(True)
1181-
self.network_list_widget.setSpacing(3)
1182-
1183-
viewport = self.network_list_widget.viewport()
1184-
QScroller.grabGesture(viewport, QScroller.ScrollerGestureType.TouchGesture)
1185-
QScroller.grabGesture(viewport, QScroller.ScrollerGestureType.LeftMouseButtonGesture)
1186-
1187-
scroller = QScroller.scroller(viewport)
1188-
props = scroller.scrollerProperties()
1189-
1190-
props.setScrollMetric(
1191-
QScrollerProperties.ScrollMetric.VerticalOvershootPolicy,
1192-
QVariant(QScrollerProperties.OvershootPolicy.OvershootAlwaysOff)
1193-
)
1194-
props.setScrollMetric(
1195-
QScrollerProperties.ScrollMetric.OvershootDragResistanceFactor,
1196-
QVariant(1.0)
1197-
)
1198-
props.setScrollMetric(
1199-
QScrollerProperties.ScrollMetric.OvershootDragDistanceFactor,
1200-
QVariant(0.0)
1201-
)
1202-
props.setScrollMetric(
1203-
QScrollerProperties.ScrollMetric.OvershootScrollDistanceFactor,
1204-
QVariant(0.0)
1205-
)
1206-
props.setScrollMetric(
1207-
QScrollerProperties.ScrollMetric.OvershootScrollTime,
1208-
QVariant(0.0)
1209-
)
1210-
1211-
scroller.setScrollerProperties(props)
1212-
1213-
self.network_list_widget.setObjectName("network_list_widget")
1214-
self.panel.nl_content_layout.addWidget(self.network_list_widget)
1123+
self.panel.listView.setPalette(palette)

0 commit comments

Comments
 (0)