diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 907eba86..9154273c 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,4 +3,5 @@ "seanwu.vscode-qt-for-python", "aaron-bond.better-comments" ] + } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 47389c10..c44e369f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -26,15 +26,25 @@ }, "peacock.remoteColor": "#c2fb90", "cSpell.words": [ + "babystepping", "bltouch", + "decel", + "DPMS", "ENDSTOP", + "Frameless", "gcode", "klippy", "metascan", + "Momcake", + "mooncake", + "printcore", "qtobject", "Reimplementation", "sdbus", + "setdefaulttimeout", "TESTZ", + "Tickmarks", + "topbar", "unextrude" ], "todo-tree.tree.scanMode": "workspace", @@ -51,5 +61,5 @@ "workbench.list.fastScrollSensitivity": 10, "terminal.integrated.fastScrollSensitivity": 10, "workbench.list.mouseWheelScrollSensitivity": 2, - + "editor.lineHeight": 48 } \ No newline at end of file diff --git a/BlocksScreen/BlocksScreen.py b/BlocksScreen/BlocksScreen.py index 539e303c..ace0f9f4 100644 --- a/BlocksScreen/BlocksScreen.py +++ b/BlocksScreen/BlocksScreen.py @@ -1,5 +1,6 @@ + import logging -import os +# import os import sys import typing @@ -9,20 +10,28 @@ from PyQt6 import QtCore, QtGui, QtWidgets from screensaver import ScreenSaver -os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1.0" -os.environ["QT_SCALE_FACTOR"] = "1.0" -os.environ["QT_DEVICE_PIXEL_RATIO"] = "1.0" -os.environ["QT_QPA_PLATFORM"] = "xcb" -os.environ["QT_STYLE_OVERRIDE"] = "fusion" +# os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1.0" +# os.environ["QT_SCALE_FACTOR"] = "1.0" +# os.environ["QT_DEVICE_PIXEL_RATIO"] = "1.0" +# os.environ["QT_QPA_PLATFORM"] = "xcb" +# os.environ["QT_STYLE_OVERRIDE"] = "fusion" _logger = logging.getLogger(name="logs/BlocksScreen.log") -QtGui.QGuiApplication.setHighDpiScaleFactorRoundingPolicy( # type: ignore - QtCore.Qt.HighDpiScaleFactorRoundingPolicy.Ceil +# QtGui.QGuiApplication.setHighDpiScaleFactorRoundingPolicy( # type: ignore +# QtCore.Qt.HighDpiScaleFactorRoundingPolicy.Ceil +# ) +# QtGui.QGuiApplication.setLayoutDirection( # type: ignore +# QtCore.Qt.LayoutDirection.LayoutDirectionAuto +# ) +QtGui.QGuiApplication.setAttribute( + QtCore.Qt.ApplicationAttribute.AA_SynthesizeMouseForUnhandledTouchEvents, + True, ) -QtGui.QGuiApplication.setLayoutDirection( # type: ignore - QtCore.Qt.LayoutDirection.LayoutDirectionAuto +QtGui.QGuiApplication.setAttribute( + QtCore.Qt.ApplicationAttribute.AA_SynthesizeTouchForUnhandledMouseEvents, + True, ) RED = "\033[31m" @@ -57,19 +66,18 @@ def run(): setup_app_loggers() BlocksScreen = QtWidgets.QApplication([]) main_window = MainWindow() - show_splash(main_window) + # show_splash(main_window) BlocksScreen.setApplicationName("BlocksScreen") BlocksScreen.setApplicationDisplayName("BlocksScreen") BlocksScreen.setDesktopFileName("BlocksScreen") - BlocksScreen.setHighDpiScaleFactorRoundingPolicy( - QtCore.Qt.HighDpiScaleFactorRoundingPolicy.Round - ) + # BlocksScreen.setHighDpiScaleFactorRoundingPolicy( + # QtCore.Qt.HighDpiScaleFactorRoundingPolicy.Round + # ) screensaver = ScreenSaver() BlocksScreen.processEvents() # main_window.setScreen(BlocksScreen.screens()[0]) # main_window.showFullScreen() - # main_window.show() main_window.show() main_window.bo_ws_startup.emit() sys.exit(BlocksScreen.exec()) diff --git a/BlocksScreen/configmanager.py b/BlocksScreen/configmanager.py deleted file mode 100644 index 5336bf77..00000000 --- a/BlocksScreen/configmanager.py +++ /dev/null @@ -1,27 +0,0 @@ -import configparser -import os -import pathlib - -class ConfigManager(configparser.ConfigParser): - baseFilename = "bo_config.cfg" - dirpath_klipper_print_data = "\printer_data\config" - - def __init__(self, filename: str = baseFilename): - self.filename = filename - kpd_dirpath = os.getcwd() + self.dirpath_klipper_print_data - - super(ConfigManager, self).__init__() - - kpd - - ... - - - def read_config(self, dir, filename): - if os.access(os.path.join(dir, filename), os.X_OK): - with _file_handler as self.read(os.path.join(dir, filename)) - - - def __getitem__(self, key: str) -> configparser.SectionProxy: - return super().__getitem__(key) - diff --git a/BlocksScreen/events.py b/BlocksScreen/events.py index 7b5229e2..05c5d28f 100644 --- a/BlocksScreen/events.py +++ b/BlocksScreen/events.py @@ -48,7 +48,9 @@ def __init__( @staticmethod def type() -> QEvent.Type: - return QEvent.Type(WebSocketMessageReceived.WebsocketMessageReceivedEvent) + return QEvent.Type( + WebSocketMessageReceived.WebsocketMessageReceivedEvent + ) class WebSocketOpen(QEvent): @@ -81,7 +83,9 @@ class WebSocketError(QEvent): WebsocketErrorEvent = QEvent.Type(QEvent.registerEventType()) def __init__(self, data, *args, **kwargs): - super(WebSocketError, self).__init__(WebSocketError.WebsocketErrorEvent) + super(WebSocketError, self).__init__( + WebSocketError.WebsocketErrorEvent + ) self.data = data self.args = args self.kwargs = kwargs @@ -124,7 +128,9 @@ class WebSocketClose(QEvent): WebsocketCloseEvent = QEvent.Type(QEvent.registerEventType()) def __init__(self, data, *args, **kwargs): - super(WebSocketClose, self).__init__(WebSocketClose.WebsocketCloseEvent) + super(WebSocketClose, self).__init__( + WebSocketClose.WebsocketCloseEvent + ) self.data = data self.args = args self.kwargs = kwargs @@ -145,7 +151,9 @@ class KlippyShutdown(QEvent): def __init__(self, data, *args, **kwargs): QEvent.__instancecheck__(self) - super(KlippyShutdown, self).__init__(KlippyShutdown.KlippyShutdownEvent) + super(KlippyShutdown, self).__init__( + KlippyShutdown.KlippyShutdownEvent + ) self.data = data self.args = args self.kwargs = kwargs @@ -236,7 +244,9 @@ class ReceivedFileData(QEvent): def __init__( self, data, method, params, /, *args, **kwargs ): # Positional-only arguments "data", "method", "params", these need to be inserted in order or it wont work - super(ReceivedFileData, self).__init__(ReceivedFileData.ReceivedFileDataEvent) + super(ReceivedFileData, self).__init__( + ReceivedFileData.ReceivedFileDataEvent + ) self.data = data self.method = method self.params = params @@ -249,18 +259,19 @@ def type() -> QEvent.Type: class PrintStart(QEvent): - """Print start event + """Print Job Start event Args: - data (any): Data or message to pass onto the event + filename(any): Name of the file currently printing + **kwargs(dict): File's metadata """ PrintStartEvent = QEvent.Type(QEvent.registerEventType()) - def __init__(self, data, *args, **kwargs): + def __init__(self, filename, *args, **kwargs): super(PrintStart, self).__init__(PrintStart.PrintStartEvent) - self.data = data - self.args = args + self.file = filename + self.file_metadata = kwargs self.kwargs = kwargs @staticmethod @@ -340,7 +351,9 @@ class PrintCancelled(QEvent): PrintCancelledEvent = QEvent.Type(QEvent.registerEventType()) def __init__(self, data, *args, **kwargs): - super(PrintCancelled, self).__init__(PrintCancelled.PrintCancelledEvent) + super(PrintCancelled, self).__init__( + PrintCancelled.PrintCancelledEvent + ) self.data = data self.args = args @@ -401,7 +414,9 @@ class NetworkDeleted(QEvent): NetworkDeletedEvent = QEvent.Type(QEvent.registerEventType()) def __init__(self, data, *args, **kwargs): - super(NetworkDeleted, self).__init__(NetworkDeleted.NetworkDeletedEvent) + super(NetworkDeleted, self).__init__( + NetworkDeleted.NetworkDeletedEvent + ) self.data = data self.args = args self.kwargs = kwargs diff --git a/BlocksScreen/lib/files.py b/BlocksScreen/lib/files.py index be3aa64c..b7524414 100644 --- a/BlocksScreen/lib/files.py +++ b/BlocksScreen/lib/files.py @@ -85,7 +85,6 @@ def on_request_fileinfo(self, filename: str) -> None: "slicer": str, } _file_metadata = self.files_metadata.get(str(filename)) - print(_file_metadata) if not _file_metadata: return _thumbnails = _file_metadata.get("thumbnails", {}) diff --git a/BlocksScreen/lib/moonAPI.py b/BlocksScreen/lib/moonAPI.py index dd668db7..47ceb5e3 100644 --- a/BlocksScreen/lib/moonAPI.py +++ b/BlocksScreen/lib/moonAPI.py @@ -26,7 +26,9 @@ class MoonAPI(QtCore.QObject): # TODO: Callbacks for each method # TODO: Finish the pyqt slots for needed requests on the API - def __init__(self, parent: typing.Optional["QObject"], ws: typing.MoonWebSocket): + def __init__( + self, parent: typing.Optional["QObject"], ws: typing.MoonWebSocket + ): super(MoonAPI, self).__init__(parent) self._ws: MoonWebSocket = ws @@ -174,7 +176,8 @@ def get_video_devices(self): def get_cabus_devices(self, interface: str = "can0"): return self._ws.send_request( - method="machine.peripherals.canbus", params={"interface": interface} + method="machine.peripherals.canbus", + params={"interface": interface}, ) @pyqtSlot(name="api_request_file_list") @@ -227,7 +230,9 @@ def download_file(self, root: str, filename: str): if not isinstance(filename, str) or not isinstance(root, str): return False - return self._ws._moonRest.get_request(f"/server/files/{root}/{filename}") + return self._ws._moonRest.get_request( + f"/server/files/{root}/{filename}" + ) # def upload_file(self, ) # TODO: Maybe this is not necessary but either way do it @@ -268,7 +273,8 @@ def move_file(self, source_dir: str, dest_dir: str): ): return False return self._ws.send_request( - method="server.files.move", params={"source": source_dir, "dest": dest_dir} + method="server.files.move", + params={"source": source_dir, "dest": dest_dir}, ) def copy_file(self, source_dir: str, dest_dir: str): @@ -280,7 +286,8 @@ def copy_file(self, source_dir: str, dest_dir: str): ): return False return self._ws.send_request( - method="server.files.copy", params={"source": source_dir, "dest": dest_dir} + method="server.files.copy", + params={"source": source_dir, "dest": dest_dir}, ) def zip_archive(self, items: list): @@ -313,14 +320,21 @@ def list_announcements_feeds(self): return self._ws.send_request(method="server.announcements.feeds") def post_announcement_feed(self, announcement_name: str): - if isinstance(announcement_name, str) is False or announcement_name is None: + if ( + isinstance(announcement_name, str) is False + or announcement_name is None + ): return False return self._ws.send_request( - method="server.announcements.post_feed", params={"name": announcement_name} + method="server.announcements.post_feed", + params={"name": announcement_name}, ) def delete_announcement_feed(self, announcement_name: str): - if isinstance(announcement_name, str) is False or announcement_name is None: + if ( + isinstance(announcement_name, str) is False + or announcement_name is None + ): return False return self._ws.send_request( method="server.announcements.delete_feed", @@ -341,7 +355,9 @@ def get_webcam_info(self, uid: str): # TODO: Can create a class that irs a URL type like i've done before to validate the links # TODO: There are more options in this section, alot more options, later see if it's worth to implement or not - def add_update_webcam(self, cam_name: str, snapshot_url: str, stream_url: str): + def add_update_webcam( + self, cam_name: str, snapshot_url: str, stream_url: str + ): if ( isinstance(cam_name, str) is False or isinstance(snapshot_url, str) is False @@ -370,7 +386,9 @@ def delete_webcam(self, uid: str): def test_webcam(self, uid: str): if isinstance(uid, str) is False or uid is None: return False - return self._ws.send_request(method="server.webcams.test", params={"uid": uid}) + return self._ws.send_request( + method="server.webcams.test", params={"uid": uid} + ) def list_notifiers(self): return self._ws.send_request(method="server.notifiers.list") @@ -410,7 +428,8 @@ def recover_corrupt_repo(self, name: str, hard: bool = False): if isinstance(name, str) is False or name is None: return False return self._ws.send_request( - method="machine.update.recover", params={"name": name, "hard": hard} + method="machine.update.recover", + params={"name": name, "hard": hard}, ) def rollback_update(self, name: str): diff --git a/BlocksScreen/lib/moonrakerComm.py b/BlocksScreen/lib/moonrakerComm.py index 0b284dd5..53136e5e 100644 --- a/BlocksScreen/lib/moonrakerComm.py +++ b/BlocksScreen/lib/moonrakerComm.py @@ -167,8 +167,7 @@ def connect(self) -> bool: f"Unexpected error occurred when trying to acquire oneshot token: {e}" ) return False - # _url = f"ws://192.168.1.100:7125/websocket?token={_oneshot_token}" - _url = f"ws://192.168.1.109:7125/websocket?token={_oneshot_token}" + _url = f"ws://localhost:7125/websocket?token={_oneshot_token}" self.ws = websocket.WebSocketApp( _url, on_open=self.on_open, @@ -303,8 +302,8 @@ def on_message(self, *args) -> None: # request server.info in 2 seconds if not self.query_klippy_status_timer.running: self.query_klippy_status_timer.startTimer() - elif response["result"]["klippy_state"] == "disconnected": - if not self.query_klippy_status_timer.running: + elif response["result"]["klippy_state"] == "disconnected": + if not self.query_klippy_status_timer.running: self.query_klippy_status_timer.startTimer() self.klippy_connected_signal.emit( response["result"]["klippy_connected"] @@ -332,7 +331,7 @@ def on_message(self, *args) -> None: ): # Checkout for notify_klippy_disconnect self.evaluate_klippy_status() - message_event = WebSocketMessageReceived( # mainly used to pass websocket notifications + message_event = WebSocketMessageReceived( # mainly used to pass websocket notifications method=str(response["method"]), data=response, metadata=None, diff --git a/BlocksScreen/lib/moonrest.py b/BlocksScreen/lib/moonrest.py index 31a8906e..a6ac58bb 100644 --- a/BlocksScreen/lib/moonrest.py +++ b/BlocksScreen/lib/moonrest.py @@ -26,11 +26,9 @@ class MoonRest: """ timeout = 3 - # TODO: The ip and port need to come from a configfile - # def __init__(self, ip="localhost", port="7125", api_key=False): - def __init__(self, ip="192.168.1.109", port="7125", api_key=False): + def __init__(self, ip="localhost", port="7125", api_key=False): self._ip = ip self._port = port self._api_key = api_key diff --git a/BlocksScreen/lib/network.py b/BlocksScreen/lib/network.py index e77cbdce..570880b9 100644 --- a/BlocksScreen/lib/network.py +++ b/BlocksScreen/lib/network.py @@ -1,4 +1,5 @@ import logging +import random import typing from uuid import uuid4 @@ -26,9 +27,6 @@ NmConnectionPropertyNotFoundError, ) -# TODO: Add Logging, separate logger in this case so i can structure it better -# TODO: Remove the statically attributed variables - class NetworkManagerRescanError(Exception): """Exception raised when rescanning the network fails.""" @@ -38,6 +36,7 @@ def __init__(self, error): self.error = error +# class SdbusNetworkManager: class SdbusNetworkManager(QObject): """Class that controls the linux NetworkManager tool using the sdbus library. @@ -50,31 +49,24 @@ class SdbusNetworkManager(QObject): """ def __init__(self, parent: typing.Optional["QObject"]): + # def __init__(self): super(SdbusNetworkManager, self).__init__() - self.system_dbus = sdbus.sd_bus_open_system() - - if self.system_dbus is None: + if not self.system_dbus: return - self.known_networks = [] - self.saved_networks_ssids: typing.List self.hotspot_ssid: str = "PrinterHotspot" self.hotspot_password: str = "123456789" - # * Test the networkmanager sdbus.set_default_bus(self.system_dbus) - try: self.nm = NetworkManager() except Exception as e: logging.debug( f"Exception occurred when getting NetworkManager, exception message: {e}" ) - self.available_wired_interfaces = self.get_wired_interfaces() self.available_wireless_interfaces = self.get_wireless_interfaces() - self.primary_wifi_interface: NetworkDeviceWireless | None = ( self.get_wireless_interfaces()[0] if len(self.get_wireless_interfaces()) > 0 @@ -109,7 +101,8 @@ def get_available_interfaces(self) -> typing.List[str]: """ return [ - NetworkDeviceGeneric(device).interface for device in self.nm.get_devices() + NetworkDeviceGeneric(device).interface + for device in self.nm.get_devices() ] def wifi_enabled(self) -> bool: @@ -203,31 +196,42 @@ def get_wireless_interfaces(self) -> typing.List[NetworkDeviceWireless]: ) ) - def get_current_ip_addr(self) -> typing.List[str] | None: + def get_current_ssid(self) -> typing.Union[str, None]: + if self.nm.primary_connection == "/": + return + try: + return ActiveConnection(self.nm.primary_connection).id + except Exception as e: + logging.info(f"Unexpected error occurred: {e}") + + def get_current_ip_addr(self) -> typing.Union[typing.List[str], None]: """get_current_ip_addr Gets the current connection ip address. Returns: str: A string containing the current ip address """ - if self.nm.primary_connection == "/": - # TODO: Logging - print("There is no NetworkManager connection. No IP Address") - return None - _device_ip4_conf_path = ActiveConnection(self.nm.primary_connection).ip4_config + logging.info("There is no NetworkManager active connection.") + return + _device_ip4_conf_path = ActiveConnection( + self.nm.primary_connection + ).ip4_config if _device_ip4_conf_path == "/": - # NetworkManager reports that there is no ipv4 config for the interface, probably there is no connection at this time. - logging.info("NetworkManager reports no IP configuration for the interface") - # TODO: Logging - return None - + logging.info( + "NetworkManager reports no IP configuration for the interface" + ) + return ip4_conf = IPv4Config(_device_ip4_conf_path) - _addrs = [address_data["address"][1] for address_data in ip4_conf.address_data] - return _addrs + return [ + address_data["address"][1] + for address_data in ip4_conf.address_data + ] def get_primary_interface( self, - ) -> NetworkDeviceWired | NetworkDeviceWireless | typing.Tuple | str: + ) -> typing.Union[ + NetworkDeviceWired, NetworkDeviceWireless, typing.Tuple, str + ]: """get_primary_interface Return the primary interface, If a there is a connection, returns the interface that is being currently used. @@ -253,14 +257,18 @@ def get_primary_interface( self.nm.primary_connection_type, ) - def rescan_networks(self) -> None: + def rescan_networks(self) -> bool: """rescan_networks Scan for available networks.""" - if self.primary_wifi_interface == "/" or self.primary_wifi_interface is None: - return + if ( + self.primary_wifi_interface == "/" + or not self.primary_wifi_interface + ): + return False try: self.primary_wifi_interface.request_scan({}) - except Exception as e: - raise NetworkManagerRescanError(f"Network rescan failed: {e}") + return True + except Exception: + raise NetworkManagerRescanError("Network scan failed") def get_available_networks(self) -> typing.Dict: """get_available_networks Scan for networks, get the information about each network. @@ -269,14 +277,17 @@ def get_available_networks(self) -> typing.Dict: typing.List[dict] | None: A list that contains the information about every available found networks. None if nothing is found or the scan failed. - Implemented with map built-in python method instead of for loops. Don't know the performance difference, but tried to not use for loops in these methods just to try. """ - # This will only work on wifi, because we can scan networks - if self.primary_wifi_interface == "/" or self.primary_wifi_interface is None: + if ( + self.primary_wifi_interface == "/" + or not self.primary_wifi_interface + ): return {"error": "No primary interface found"} - # Make sure we scan for networks first if self.rescan_networks(): - if self.primary_wifi_interface.device_type == enums.DeviceType.WIFI: - # Get information about all scanned networks. + if ( + self.primary_wifi_interface.device_type + == enums.DeviceType.WIFI + ): _aps: typing.List[AccessPoint] = list( map( lambda ap_path: AccessPoint(ap_path), @@ -299,6 +310,7 @@ def get_available_networks(self) -> typing.Dict: _aps, ) ) + return _info_networks return {"error": "No available networks"} @@ -317,8 +329,8 @@ def get_security_type(self, ap: AccessPoint) -> typing.Tuple: Check: For more information about the flags :py:class:`WpaSecurityFlags` and `ÀccessPointCapabilities` from :py:module:`python-sdbus-networkmanager.enums` """ - if ap is None: - return None + if not ap: + return _sec_rsn: typing.List[WpaSecurityFlags] = list( map(lambda sec: sec, list(WpaSecurityFlags(ap.rsn_flags))) @@ -345,15 +357,21 @@ def get_saved_networks(self) -> typing.List[typing.Dict | None]: I admit that this implementation is way to complicated, I don't even think it's great on memory and time, but i didn't use for loops so mission achieved. """ - if self.nm is None: + if not self.nm: return [{"error": "No network manager"}] - _connections: typing.List[str] = NetworkManagerSettings().list_connections() + _connections: typing.List[str] = ( + NetworkManagerSettings().list_connections() + ) - _network_settings: typing.List[NetworkManagerConnectionProperties] = list( - map( - lambda _settings: NetworkConnectionSettings(_settings).get_settings(), - iter(_connections), + _network_settings: typing.List[NetworkManagerConnectionProperties] = ( + list( + map( + lambda _settings: NetworkConnectionSettings( + _settings + ).get_settings(), + iter(_connections), + ) ) ) @@ -364,10 +382,12 @@ def get_saved_networks(self) -> typing.List[typing.Dict | None]: map( lambda network_properties: ( { - "SSID": network_properties["802-11-wireless"]["ssid"][ - 1 - ].decode(), - "UUID": network_properties["connection"]["uuid"][1], + "SSID": network_properties["802-11-wireless"][ + "ssid" + ][1].decode(), + "UUID": network_properties["connection"][ + "uuid" + ][1], # "CONNECTION_PATH": connection } if network_properties["connection"]["type"][1] @@ -392,7 +412,7 @@ def get_saved_networks_with_for(self) -> typing.List[dict]: This implementation is equal to the klipper screen implementation, this one uses for loops and is simpler. https://github.com/KlipperScreen/KlipperScreen/blob/master/ks_includes/sdbus_nm.py Alfredo Monclues (alfrix) 2024 """ - if self.nm is None: + if not self.nm: return [] known_networks = [] for connection in NetworkManagerSettings().list_connections(): @@ -403,9 +423,9 @@ def get_saved_networks_with_for(self) -> typing.List[dict]: { "SSID": conn["802-11-wireless"]["ssid"][1].decode(), "UUID": conn["connection"]["uuid"][1], - "SECURITY_TYPE": conn["802-11-wireless-security"]["key_mgmt"][ - 1 - ].decode(), + "SECURITY_TYPE": conn["802-11-wireless-security"][ + "key_mgmt" + ][1].decode(), "CONNECTION_PATH": connection, } ) @@ -437,7 +457,9 @@ def is_known(self, ssid: str) -> bool: Returns: bool: True if the network is known otherwise False """ - return any(net["SSID"] == ssid for net in self.get_saved_networks_with_for()) + return any( + net["SSID"] == ssid for net in self.get_saved_networks_with_for() + ) def add_wifi_network(self, ssid: str, psk: str) -> typing.Dict: """Add and Save a network to the device. @@ -455,7 +477,10 @@ def add_wifi_network(self, ssid: str, psk: str) -> typing.Dict: On the returned dictionary a key value "error" can appear if an error occurred, the value will say what the error was. "exception" """ - if self.primary_wifi_interface is None or self.primary_wifi_interface == "/": + if ( + not self.primary_wifi_interface + or self.primary_wifi_interface == "/" + ): return {"status": "error", "msg": "No Available interface"} # Connections with the same if result in failure, so get ids first. @@ -480,7 +505,10 @@ def add_wifi_network(self, ssid: str, psk: str) -> typing.Dict: "id": ("s", ssid), "uuid": ("s", str(uuid4())), "type": ("s", "802-11-wireless"), - "interface-name": ("s", self.primary_wifi_interface.interface), + "interface-name": ( + "s", + self.primary_wifi_interface.interface, + ), "autoconnect": ("b", bool(True)), }, "802-11-wireless": { @@ -526,18 +554,20 @@ def add_wifi_network(self, ssid: str, psk: str) -> typing.Dict: "wep-key0": ("s", psk), "auth-alg": ("s", "shared"), } - elif (WpaSecurityFlags.P2P_TKIP or WpaSecurityFlags.BROADCAST_TKIP) in ( - _security_types[1] or _security_types[2] - ): + elif ( + WpaSecurityFlags.P2P_TKIP + or WpaSecurityFlags.BROADCAST_TKIP + ) in (_security_types[1] or _security_types[2]): # * TKip # raise NotImplementedError return { "status": "error", "msg": "Security type P2P_TKIP OR BRADCAST_TKIP not supported", } - elif (WpaSecurityFlags.P2P_CCMP or WpaSecurityFlags.BROADCAST_CCMP) in ( - _security_types[1] or _security_types[2] - ): + elif ( + WpaSecurityFlags.P2P_CCMP + or WpaSecurityFlags.BROADCAST_CCMP + ) in (_security_types[1] or _security_types[2]): # * AES/CCMP WPA2 properties["802-11-wireless-security"] = { "key-mgmt": ("s", "wpa-psk"), @@ -608,7 +638,10 @@ def add_wifi_network(self, ssid: str, psk: str) -> typing.Dict: try: NetworkManagerSettings().add_connection(properties) - return {"status": "success", "msg": "Network added successfully"} + return { + "status": "success", + "msg": "Network added successfully", + } except NmConnectionFailedError as e: return { "status": "exception", @@ -638,7 +671,10 @@ def disconnect_network(self) -> bool: - True -> wifi interface is not and can perform the disconnection - False -> Wifi interface is none and the disconnect command is not run. """ - if self.primary_wifi_interface == "/" or self.primary_wifi_interface is None: + if ( + self.primary_wifi_interface == "/" + or self.primary_wifi_interface is None + ): return False self.primary_wifi_interface.disconnect() return True @@ -659,9 +695,7 @@ def get_connection_path_by_ssid(self, ssid: str) -> str | None: _connection_path = None _saved_networks = self.get_saved_networks_with_for() if len(_saved_networks) == 0 or _saved_networks is None: - return ( - "There are no saved networks, must add a new network connection first." - ) + return "There are no saved networks, must add a new network connection first." # *Get the connection path by ssid for saved_network in _saved_networks: @@ -712,12 +746,18 @@ def get_connection_signal_by_ssid(self, ssid: str) -> typing.Dict | int: return {"error": "ssid argument must be of type string"} if self.nm is None: return {"error": "No Network Manager instance available"} - if self.primary_wifi_interface == "/" or self.primary_wifi_interface is None: + if ( + self.primary_wifi_interface == "/" + or self.primary_wifi_interface is None + ): return {"error": "No wifi interface"} _signal: int = 0 if self.rescan_networks(): - if self.primary_wifi_interface.device_type == enums.DeviceType.WIFI: + if ( + self.primary_wifi_interface.device_type + == enums.DeviceType.WIFI + ): # Get information on scanned networks: _aps: typing.List[AccessPoint] = list( map( @@ -836,7 +876,9 @@ def create_hotspot( NetworkManagerSettings().add_connection(properties) return {"status": "success"} except Exception as e: - logging.debug(f"Error occurred while adding a hotspot connection: {e.args}") + logging.debug( + f"Error occurred while adding a hotspot connection: {e.args}" + ) return {"status": "error, exception"} def delete_old_hotspot_connection(self) -> None: @@ -881,11 +923,17 @@ def update_connection_settings( if ssid == self.hotspot_ssid: self.hotspot_ssid = new_ssid properties["connection"]["id"] = ("s", str(new_ssid)) - properties["802-11-wireless"]["ssid"] = ("ay", new_ssid.encode("utf-8")) + properties["802-11-wireless"]["ssid"] = ( + "ay", + new_ssid.encode("utf-8"), + ) if password is not None: if ssid == self.hotspot_ssid: self.hotspot_password = password - properties["802-11-wireless-security"]["psk"] = ("s", str(password)) + properties["802-11-wireless-security"]["psk"] = ( + "s", + str(password), + ) con_settings.update(properties) @@ -918,6 +966,9 @@ def __init__(self): self.primary_wired_interface = "path/wireddDummy" self.wireless_active: bool = True + def get_current_ssid(self) -> str: + return "Blocks" + def get_available_interfaces(self) -> typing.List[str]: """get_available_interfaces Gets the names of all available interfaces @@ -932,7 +983,6 @@ def wifi_enabled(self) -> bool: Returns: bool: True if device is enabled | False if not """ - print(self.wireless_active) return self.wireless_active def toggle_wifi(self, toggle: bool): @@ -962,7 +1012,7 @@ def toggle_hotspot(self, toggle: bool): ValueError: If the toggle argument is not a Boolean. """ # TODO: toggle Hotspot, function to activate or deactivate the device hotspot - self.hotspot_active = not self.hotspot_active + self.hotspot_active = toggle def hotspot_enabled(self) -> typing.Optional["bool"]: """Returns a boolean indicating whether the device hotspot is on or not . @@ -971,6 +1021,7 @@ def hotspot_enabled(self) -> typing.Optional["bool"]: bool: True if Hotspot is activated, False otherwise. """ # TODO: Hotspot enbaled or not + return self.hotspot_active def get_wired_interfaces(self) -> typing.List: @@ -1031,26 +1082,100 @@ def get_available_networks(self): - Implemented with map built-in python method instead of for loops. Don't know the performance difference, but tried to not use for loops in these methods just to try. """ # This will only work on wifi, because we can scan networks - return [ - { - "ssid": "BLOCKS", - "security": "wpa", - "frequency": 344, - "channel": 2, - "signal_level": "-12", - "max_bitrate": "1222", - "BSSID": "12:312:je:22", - }, - { - "ssid": "MEO", - "security": "wpa", - "frequency": 344, - "channel": 2, - "signal_level": "-12", - "max_bitrate": "1222", - "BSSID": "12:312:je:22", - }, - ] + return ( + [ + { + "ssid": "BLOCKS", + "security": "wpa", + "frequency": 344, + "channel": 2, + "signal_level": "-12", + "max_bitrate": "1222", + "BSSID": "12:312:je:22", + }, + { + "ssid": "MEO", + "security": "wpa", + "frequency": 344, + "channel": 2, + "signal_level": "-12", + "max_bitrate": "1222", + "BSSID": "12:312:je:22", + }, + { + "ssid": "SkyNet", + "security": "wpa2", + "frequency": 5180, + "channel": 36, + "signal_level": "-45", + "max_bitrate": "867", + "BSSID": "a2:3f:5d:8c:01:aa", + }, + { + "ssid": "CoffeeShop_WiFi", + "security": "open", + "frequency": 2412, + "channel": 1, + "signal_level": "-68", + "max_bitrate": "144", + "BSSID": "bc:85:56:de:12:39", + }, + { + "ssid": "HomeNetwork5G", + "security": "wpa3", + "frequency": 5745, + "channel": 149, + "signal_level": "-38", + "max_bitrate": "1300", + "BSSID": "e3:55:76:9a:cd:ef", + }, + { + "ssid": "PublicLibraryNet", + "security": "wpa2", + "frequency": 2437, + "channel": 6, + "signal_level": "-72", + "max_bitrate": "300", + "BSSID": "00:1a:2b:3c:4d:5e", + }, + { + "ssid": "Device_AP_8934", + "security": "open", + "frequency": 2462, + "channel": 11, + "signal_level": "-80", + "max_bitrate": "54", + "BSSID": "de:ad:be:ef:00:99", + }, + { + "ssid": "IoT_Network", + "security": "wpa2", + "frequency": 2422, + "channel": 3, + "signal_level": "-59", + "max_bitrate": "72", + "BSSID": "aa:bb:cc:dd:ee:ff", + }, + { + "ssid": "FastLane", + "security": "wpa3", + "frequency": 5200, + "channel": 40, + "signal_level": "-33", + "max_bitrate": "2400", + "BSSID": "11:22:33:44:55:66", + }, + { + "ssid": "GUEST1234", + "security": "wpa", + "frequency": 2462, + "channel": 11, + "signal_level": "-50", + "max_bitrate": "600", + "BSSID": "77:88:99:aa:bb:cc", + }, + ], + ) def get_security_type(self, ap: AccessPoint) -> typing.Tuple: """get_security_type Get the security type from a network AccessPoint @@ -1080,14 +1205,7 @@ def get_saved_networks(self) -> typing.List[typing.Dict | None]: I admit that this implementation is way to complicated, I don't even think it's great on memory and time, but i didn't use for loops so mission achieved. """ return [ - { - "SSID": "BLOCKS", - "UUID": "OOAISUDFOASODFJ", - }, - { - "SSID": "PrinterHotspot", - "UUID": "OOAISUDFOASODFJ", - }, + {"SSID": "BLOCKS", "UUID": "OOAISUDFOASODFJ"}, ] def get_saved_networks_with_for(self): @@ -1101,14 +1219,7 @@ def get_saved_networks_with_for(self): https://github.com/KlipperScreen/KlipperScreen/blob/master/ks_includes/sdbus_nm.py Alfredo Monclues (alfrix) 2024 """ return [ - { - "SSID": "BLOCKS", - "UUID": "OOAISUDFOASODFJ", - }, - { - "SSID": "PrinterHotspot", - "UUID": "OOAISUDFOASODFJ", - }, + {"SSID": "BLOCKS", "UUID": "OOAISUDFOASODFJ"}, ] def get_saved_ssid_names(self) -> typing.List[str]: @@ -1117,7 +1228,14 @@ def get_saved_ssid_names(self) -> typing.List[str]: Returns: typing.List[str]: List that contains the names of the saved ssid network names """ - return ["BLOCKS"] + return [ + "BLOCKS", + "PrinterHotspot", + "SkyNet", + "PublicLibraryNet", + "FastLane", + "GUEST1234", + ] def is_known(self, ssid: str): """Whether or not a network is known @@ -1145,9 +1263,9 @@ def add_wifi_network(self, ssid: str, psk: str) -> typing.Dict: On the returned dictionary a key value "error" can appear if an error occurred, the value will say what the error was. """ - print(ssid) + print("added network", ssid) print(psk) - return {"status": "error", "msg": "dummy"} + return {"status": "asdas", "msg": "dummy"} def disconnect_network(self): """disconnect_network Disconnect the wireless device and prevent it from reconnecting. @@ -1192,7 +1310,7 @@ def get_connection_signal_by_ssid(self, ssid: str) -> typing.Dict | int: In the case we are able to scan The method returns the signal strength in % """ - return 14 + return random.randint(1, 100) def connect_network(self, ssid: str): """Connect to a saved network given an ssid @@ -1221,14 +1339,17 @@ def delete_network(self, ssid: str): """ print(f"Deleted network {ssid}") - def create_hotspot(self, ssid: str = "PrinterHotspot", password: str = "123456789"): + def create_hotspot( + self, ssid: str = "PrinterHotspot", password: str = "123456789" + ): print(f"Created hotspot {ssid}, {password}") def delete_old_hotspot_connection(self) -> None: print("Deleted old hotspot ") def get_hotspot_ssid(self): - print("Get hostpot ssid") + print(self.hotspot_ssid) + return self.hotspot_ssid def set_hotspot_ssid(self, ssid: str) -> None: print(f"Set hotspot ssid {ssid}") @@ -1247,4 +1368,7 @@ def update_connection_settings( Returns: typing.Dict: status dictionary with possible keys "error" and "status" """ + print(new_ssid) print(f"Updated a network connection {ssid} | {password} | {new_ssid}") + return {"status": "AUGH", "msg": "dummy"} + diff --git a/BlocksScreen/lib/panels/filamentTab.py b/BlocksScreen/lib/panels/filamentTab.py index 1ea402c2..91eaec49 100644 --- a/BlocksScreen/lib/panels/filamentTab.py +++ b/BlocksScreen/lib/panels/filamentTab.py @@ -14,12 +14,10 @@ class FilamentTab(QStackedWidget): request_filament_change_page = pyqtSignal(name="filament_change_page") request_filament_load = pyqtSignal(name="filament_load_t1") - request_back = pyqtSignal( - name="request_back" - ) + request_back = pyqtSignal(name="request_back") request_change_page = pyqtSignal(int, int, name="request_change_page") request_toolhead_count = pyqtSignal(int, name="toolhead_number_received") - run_gcode_signal = pyqtSignal(str, name="run_gcode") + run_gcode = pyqtSignal(str, name="run_gcode") class FilamentTypes(enum.Enum): PLA = Filament(name="PLA", temperature=220) @@ -48,7 +46,7 @@ def __init__(self, parent: QWidget, printer: Printer, ws, /) -> None: self.filament_type: Filament | None = None self.panel.filament_page_load_btn.clicked.connect( - partial(self.change_page, 1) + partial(self.change_page, self.indexOf(self.panel.load_page)) ) self.panel.custom_filament_header_back_btn.clicked.connect( self.back_button @@ -79,33 +77,33 @@ def __init__(self, parent: QWidget, printer: Printer, ws, /) -> None: self.panel.filament_page_unload_btn.clicked.connect( lambda: self.unload_filament(toolhead=0, temp=250) ) - self.run_gcode_signal.connect(self.ws.api.run_gcode) + self.run_gcode.connect(self.ws.api.run_gcode) @pyqtSlot(int, int, name="load_filament") def load_filament(self, toolhead: int = 0, temp: int = 220) -> None: - if not self.has_load_unload_objects: - return # {"error": "No load/unload routines"} - if not self._filament_state == self.FilamentStates.UNLOADED: - return # {"error": "Filament already loaded"} - if toolhead == 0: - self.run_gcode_signal.emit(f"LOAD_FILAMENT TEMPERATURE={temp}") - else: - self.run_gcode_signal.emit( - f"LOAD_FILAMENT TOOLHEAD={toolhead} TEMPERATURE{temp}" - ) + # if not self.has_load_unload_objects: + # return # {"error": "No load/unload routines"} + # if not self._filament_state == self.FilamentStates.UNLOADED: + # return # {"error": "Filament already loaded"} + # if toolhead == 0: + # self.run_gcode.emit(f"LOAD_FILAMENT TEMPERATURE={temp}") + # else: + self.run_gcode.emit( + f"LOAD_FILAMENT TOOLHEAD=load_toolhead TEMPERATURE={temp}" + ) @pyqtSlot(str, int, name="unload_filament") def unload_filament(self, toolhead: str = "0", temp: int = 220) -> None: - if not self.has_load_unload_objects: - return # {"error": "No load/unload routines"} - if not self._filament_state == self.FilamentStates.LOADED: - return # {"error": "No loaded filament"} + # if not self.has_load_unload_objects: + # return # {"error": "No load/unload routines"} + # if not self._filament_state == self.FilamentStates.LOADED: + # return # {"error": "No loaded filament"} - self.find_routine_objects() + # self.find_routine_objects() if toolhead == 0: - self.run_gcode_signal.emit(f"UNLOAD_FILAMENT TEMPERATURE={temp}") + self.run_gcode.emit(f"UNLOAD_FILAMENT TEMPERATURE={temp}") else: - self.run_gcode_signal.emit( + self.run_gcode.emit( f"UNLOAD_FILAMENT TOOLHEAD={toolhead} TEMPERATURE={temp}" ) @@ -137,7 +135,7 @@ def resizeEvent(self, a0: QResizeEvent | None) -> None: return super().resizeEvent(a0) def find_routine_objects(self): - if self.printer is None: + if not self.printer: return _available_objects = self.printer.available_objects.copy() diff --git a/BlocksScreen/lib/panels/networkWindow.py b/BlocksScreen/lib/panels/networkWindow.py index 6bc7c6b4..79c470ec 100644 --- a/BlocksScreen/lib/panels/networkWindow.py +++ b/BlocksScreen/lib/panels/networkWindow.py @@ -1,14 +1,23 @@ +from ast import Return import typing from functools import partial from PyQt6 import QtCore, QtGui, QtWidgets -from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot +from PyQt6.QtCore import Qt, pyqtSignal, pyqtSlot, QEvent from PyQt6.QtGui import QPaintEvent from PyQt6.QtWidgets import QListWidgetItem, QStackedWidget, QWidget +# from BlocksScreen.lib.network import SdbusNetworkManager from lib.ui.wifiConnectivityWindow_ui import Ui_wifi_stacked_page from lib.network import SdbusNetworkManagerDummy +from lib.utils.list_button import ListCustomButton + +from lib.utils.toggleAnimatedButton import ToggleAnimatedButton + +from lib.panels.widgets.popupDialogWidget import Popup +import subprocess + # TEST: Network saving, Adding new Network connections, Toggle on and off hotspot, etc.... # TODO: Complete this panel # TODO: Add a Virtual Keyboard @@ -28,40 +37,123 @@ class NetworkControlWindow(QStackedWidget): name="new_connection_result", ) - request_signal_strength = pyqtSignal(str, name="network_signal_strength") - def __init__(self, parent: QWidget, /) -> None: super(NetworkControlWindow, self).__init__(parent) + self.background: QtGui.QPixmap | None = None self.panel = Ui_wifi_stacked_page() self.panel.setupUi(self) + self.popup = Popup(self) + self.panel.network_list_widget.setLayoutDirection( Qt.LayoutDirection.LeftToRight ) # * Instantiate the network control class sdbus self.sdbus_network = SdbusNetworkManagerDummy() self.current_ip_address: typing.List | None = [] + + # * i reelly dont know where to put this, so ya + + current_ssuid = self.sdbus_network.get_current_ssid() + + self.panel.netlist_ip.setText( + str(self.sdbus_network.get_current_ip_addr()) + ) + self.panel.netlist_ssuid.setText(current_ssuid) + + self.panel.netlist_security.setText( + str( + self.sdbus_network.get_security_type_by_ssid(current_ssuid) + ).upper() + ) + self.panel.netlist_strength.setText( + str( + self.sdbus_network.get_connection_signal_by_ssid(current_ssuid) + ) + + "%" + ) + + self.panel.wifi_button.setLeftFontSize(20) + self.panel.hotspot_button.setLeftFontSize(20) + + self.panel.wifi_button.clicked.connect( + partial(self.setCurrentIndex, 1) + ) + + self.panel.hotspot_button.clicked.connect( + partial(self.setCurrentIndex, 4) + ) + + text = self.sdbus_network.get_current_ip_addr() + if text is None: + text = "No IP Address" + self.panel.netlist_ip.setProperty("text_color", "white") + self.panel.netlist_ip.setText( + f"IP: {text[0]}" + ) # Set the current ip address on the network list page + + self.panel.hotspot_password_input_field.installEventFilter(self) + + QtWidgets.QScroller.grabGesture( + self.panel.network_list_widget, + QtWidgets.QScroller.ScrollerGestureType.TouchGesture, + ) + QtWidgets.QScroller.grabGesture( + self.panel.network_list_widget, + QtWidgets.QScroller.ScrollerGestureType.LeftMouseButtonGesture, + ) + + self.networkdead = False + if self.networkdead: + self.panel.line.hide() + self.panel.netlist_ssuid.hide() + self.panel.ip_frame.hide() + self.panel.stregth_frame.hide() + self.panel.signal_frame.hide() + else: + self.panel.line.show() + self.panel.netlist_ssuid.show() + self.panel.ip_frame.show() + self.panel.stregth_frame.show() + self.panel.signal_frame.show() + self.panel.label_2.hide() + + if self.sdbus_network.wifi_enabled(): + self.panel.Togglewifi.state = ToggleAnimatedButton.State.ON + self.panel.Togglehot.state = ToggleAnimatedButton.State.OFF + else: + self.panel.Togglewifi.state = ToggleAnimatedButton.State.OFF + + self.panel.wifi_backButton.clicked.connect( + partial(self.setCurrentIndex, 0) + ) + + self.panel.Togglewifi.clicked.connect( + lambda: self.wifihotspot_handler("wifi") + ) + self.panel.Togglehot.clicked.connect( + lambda: self.wifihotspot_handler("hotspot") + ) + # * Network List - self.panel.network_list_widget.itemClicked.connect(self.ssid_item_clicked) - self.panel.wifi_backButton.clicked.connect(self.hide) - self.panel.rescan_button.clicked.connect(self.sdbus_network.rescan_networks) + self.panel.network_list_widget.itemClicked.connect( + self.ssid_item_clicked + ) + self.panel.network_backButton.clicked.connect(self.hide) + self.panel.rescan_button.clicked.connect( + self.sdbus_network.rescan_networks + ) self.panel.rescan_button.clicked.connect( self.add_ssid_network_entry ) # To Update the network list - self.panel.wifi_toggle_button.clicked.connect( - partial( - self.sdbus_network.toggle_wifi, - toggle=not bool(self.sdbus_network.wifi_enabled()), - ) - ) # Turn off if enabled/Turn on if disabled + self.request_network_scan.connect(self.rescan_networks) - self.panel.call_hotspot_button.clicked.connect( - partial(self.setCurrentIndex, 3) - ) # Go to hotspot settings page # * Add Network page widget - self.panel.add_network_validation_button.clicked.connect(self.add_network) + self.panel.add_network_validation_button.clicked.connect( + self.add_network + ) self.panel.add_network_page_backButton.clicked.connect( - partial(self.setCurrentIndex, 0) + partial(self.setCurrentIndex, 1) ) self.panel.add_network_password_view.pressed.connect( partial( @@ -78,12 +170,11 @@ def __init__(self, parent: QWidget, /) -> None: # * Saved Connection page widget self.panel.saved_connection_back_button.clicked.connect( - partial(self.setCurrentIndex, 0) + partial(self.setCurrentIndex, 1) ) # Back button on this page always leads to the network list page self.delete_network_signal.connect(self.delete_network) self.panel.saved_connection_change_password_field.returnPressed.connect( - partial( - self.sdbus_network.update_connection_settings, + lambda: self.update_network( ssid=self.panel.saved_connection_network_name.text(), password=self.panel.saved_connection_change_password_field.text(), new_ssid=None, @@ -95,7 +186,7 @@ def __init__(self, parent: QWidget, /) -> None: QtWidgets.QLineEdit.EchoMode.Normal, ) ) - self.panel.saved_connection_change_password_view.pressed.connect( + self.panel.saved_connection_change_password_view.released.connect( partial( self.panel.saved_connection_change_password_field.setEchoMode, QtWidgets.QLineEdit.EchoMode.Password, @@ -103,46 +194,82 @@ def __init__(self, parent: QWidget, /) -> None: ) # * Hotspot page - self.panel.hotspot_toggle.clicked.connect(self.sdbus_network.toggle_hotspot) - self.panel.hotspot_back_button.clicked.connect(partial(self.setCurrentIndex, 0)) + + self.panel.hotspot_back_button.clicked.connect( + partial(self.setCurrentIndex, 0) + ) self.panel.hotspot_name_input_field.returnPressed.connect( - partial( - self.sdbus_network.update_connection_settings, + lambda: self.update_network( ssid=self.sdbus_network.hotspot_ssid, password=None, new_ssid=self.panel.hotspot_name_input_field.text(), ) - ) # Automatically create a new hotspot connection when a new hotspot name is inserted and enter is pressed + ) + # Automatically create a new hotspot connection when a new hotspot name is inserted and enter is pressed self.panel.hotspot_password_input_field.returnPressed.connect( - partial( - self.sdbus_network.update_connection_settings, + lambda: self.update_network( ssid=self.sdbus_network.hotspot_ssid, password=self.panel.hotspot_password_input_field.text(), new_ssid=None, ) ) + + self.panel.hotspot_password_input_field.setHidden(True) + self.panel.hotspot_password_view_button.pressed.connect( - partial( - self.panel.hotspot_password_input_field.setEchoMode, - QtWidgets.QLineEdit.EchoMode.Normal, - ) + partial(self.panel.hotspot_password_input_field.setHidden, False) ) self.panel.hotspot_password_view_button.released.connect( - partial( - self.panel.hotspot_password_input_field.setEchoMode, - QtWidgets.QLineEdit.EchoMode.Password, - ) + partial(self.panel.hotspot_password_input_field.setHidden, True) ) + + self.panel.hotspot_name_input_field.setText( + str(self.sdbus_network.get_hotspot_ssid()) + ) + self.panel.hotspot_password_input_field.setText( + str(self.sdbus_network.hotspot_password) + ) + self.new_connection_result.connect(self.process_new_connection_result) - # * Set ip address boxes with the corresponding ip - self.new_ip_signal.connect(partial(self.panel.hotspot_info_ip_field.setText)) # * request a initial network scan self.request_network_scan.emit() self.hide() + def wifihotspot_handler(self, source: str): + """Toggle Wi-Fi and Hotspot so only one is active at a time.""" + + wifi_enabled = self.sdbus_network.wifi_enabled() + hotspot_enabled = self.sdbus_network.hotspot_enabled() + + if source == "wifi": + self.sdbus_network.toggle_wifi(not wifi_enabled) + if not wifi_enabled and hotspot_enabled: + self.sdbus_network.toggle_hotspot(False) + + elif source == "hotspot": + self.sdbus_network.toggle_hotspot(not hotspot_enabled) + if not hotspot_enabled and wifi_enabled: + self.sdbus_network.toggle_wifi(False) + + # Refresh states after changes + wifi_enabled = self.sdbus_network.wifi_enabled() + hotspot_enabled = self.sdbus_network.hotspot_enabled() + + # Update UI states + self.panel.Togglewifi.state = ( + ToggleAnimatedButton.State.ON + if wifi_enabled + else ToggleAnimatedButton.State.OFF + ) + self.panel.Togglehot.state = ( + ToggleAnimatedButton.State.ON + if hotspot_enabled + else ToggleAnimatedButton.State.OFF + ) + @pyqtSlot(str, name="delete_network") def delete_network(self, ssid: str) -> None: self.sdbus_network.delete_network(ssid=ssid) @@ -178,18 +305,36 @@ def add_network(self) -> None: """ # Check if a password was inserted - if self.panel.add_network_password_field.text() is None: + if not self.panel.add_network_password_field.text(): return _network_psk = self.panel.add_network_password_field.text() _add_network_result: typing.Dict = self.sdbus_network.add_wifi_network( ssid=self.panel.add_network_network_label.text(), psk=_network_psk ) # Add the network connection - # Send a signal with the result of adding a new network - if ("error" or "exception" or "failure") in _add_network_result["status"]: - self.new_connection_result[str].emit(str(_add_network_result["msg"])) + # Send a signal with the result of adding a new networkx + + if any( + word in _add_network_result["status"] + for word in ("error", "exception", "failure") + ): + self.new_connection_result[str].emit( + str(_add_network_result["msg"]) + ) + self.popup.new_message( + message_type=Popup.MessageType.ERROR, + message=f"Could not connect to '{self.panel.add_network_network_label.text()}'\n Please check your password or try again later.", + ) + else: - self.new_connection_result.emit() + self.new_connection_result[str].emit( + str(_add_network_result["msg"]) + ) + self.popup.new_message( + message_type=Popup.MessageType.INFO, + message=f"Connected to '{self.panel.add_network_network_label.text()}' successfully", + ) + self.setCurrentIndex(0) @pyqtSlot(QListWidgetItem, name="ssid_item_clicked") def ssid_item_clicked(self, item: QListWidgetItem) -> None: @@ -198,10 +343,14 @@ def ssid_item_clicked(self, item: QListWidgetItem) -> None: Args: item (QListWidgetItem): The list entry that was clicked """ - _current_item: QWidget | None = self.panel.network_list_widget.itemWidget(item) + _current_item: QWidget | None = ( + self.panel.network_list_widget.itemWidget(item) + ) if _current_item is not None: - _current_ssid_name = _current_item.findChild(QtWidgets.QLabel).text() + _current_ssid_name = _current_item.findChild( + QtWidgets.QLabel + ).text() if ( _current_ssid_name in self.sdbus_network.get_saved_ssid_names() ): # Network already saved go to the information page @@ -215,67 +364,182 @@ def ssid_item_clicked(self, item: QListWidgetItem) -> None: str(_current_ssid_name) ) # Add the network name to the title + def update_network( + self, ssid: str, password: str | None, new_ssid: str | None + ) -> None: + _update_network_result: typing.Dict = ( + self.sdbus_network.update_connection_settings( + ssid=ssid, + password=password, + new_ssid=new_ssid, + ) + ) + + if any( + word in _update_network_result["status"] + for word in ("error", "exception", "failure") + ): + self.new_connection_result[str].emit( + str(_update_network_result["msg"]) + ) + self.popup.new_message( + message_type=Popup.MessageType.ERROR, + message=f"Could not update the settings for '{ssid}'.", + ) + + else: + self.new_connection_result[str].emit( + str(_update_network_result["msg"]) + ) + self.popup.new_message( + message_type=Popup.MessageType.INFO, + message=f"Network settings for '{ssid}' updated successfully.", + ) + + def eventFilter(self, obj, event): + if ( + obj == self.panel.hotspot_password_input_field + and event.type() == QEvent.Type.MouseButtonPress + ): + self.panel.hotspot_password_input_field.setFocus() + # subprocess.Popen(["onboard"]) # Open the virtual keyboard + return super().eventFilter(obj, event) + def add_ssid_network_entry(self) -> None: - """Add scanned networks entries to listWidget""" - index = 0 + """Add scanned networks: saved go to network_list_widget, unsaved to network_list_widget_.""" self.panel.network_list_widget.clear() - for item in self.sdbus_network.get_available_networks(): - if not isinstance(item, dict): + self.panel.network_list_widget.setSpacing(35) + + saved_ssids = set(self.sdbus_network.get_saved_ssid_names()) + + networks = [] + + available_networks = self.sdbus_network.get_available_networks()[ + 0 + ] # unpack tuple + for item in available_networks: + if not isinstance(item, dict) or "ssid" not in item: continue - if ( - "ssid" in item.keys() and item is not None - ): # REFACTOR: Can be better implemented - results = self.configure_network_entry(str(item["ssid"])) - # _item, _item_widget = self.configure_network_entry(str(item["ssid"])) - if results is not None and isinstance(results, tuple): - _item, _item_widget = results - if (_item and _item_widget) is not None: - self.panel.network_list_widget.addItem(_item) - self.panel.network_list_widget.setItemWidget( - _item, _item_widget - ) - index += 1 - - @staticmethod - def configure_network_entry( + + ssid = str(item["ssid"]) + signal = self.sdbus_network.get_connection_signal_by_ssid(ssid) + try: + signal_value = int(signal) + except (ValueError, TypeError): + signal_value = 0 + + is_saved = ssid in saved_ssids + + networks.append( + {"ssid": ssid, "signal": signal_value, "is_saved": is_saved} + ) + + saved_networks = sorted( + [n for n in networks if n["is_saved"]], key=lambda x: -x["signal"] + ) + unsaved_networks = sorted( + [n for n in networks if not n["is_saved"]], + key=lambda x: -x["signal"], + ) + + # ---- Add Saved Networks ---- + for net in saved_networks: + self._add_network_button( + ssid=net["ssid"], + signal=net["signal"], + right_text="Saved", + target_widget=self.panel.network_list_widget, + ) + + # ---- Separator Between Saved and Unsaved ---- + if saved_networks and unsaved_networks: + separator_item = QtWidgets.QListWidgetItem() + separator_widget = QtWidgets.QLabel() + separator_widget.setStyleSheet( + "background-color: gray; margin: 1px 1px; min-height: 1px; max-height: 1px;" + ) + separator_item.setSizeHint( + QtCore.QSize(0, 2) + ) # Total vertical space: 2px + self.panel.network_list_widget.addItem(separator_item) + self.panel.network_list_widget.setItemWidget( + separator_item, separator_widget + ) + + # ---- Add Unsaved Networks ---- + for net in unsaved_networks: + self._add_network_button( + ssid=net["ssid"], + signal=net["signal"], + right_text="Protected", + target_widget=self.panel.network_list_widget, + ) + + # Add a dummy blank space at the end if there are any unsaved networks + if unsaved_networks: + spacer_item = QtWidgets.QListWidgetItem() + spacer_widget = QtWidgets.QWidget() + spacer_widget.setFixedHeight(10) # Adjust height as needed + spacer_item.setSizeHint(spacer_widget.sizeHint()) + self.panel.network_list_widget.addItem(spacer_item) + + self.panel.network_list_widget.setItemWidget( + spacer_item, spacer_widget + ) + + def _add_network_button( + self, ssid: str, - ) -> typing.Tuple[QtWidgets.QListWidgetItem, QWidget] | None: - """Creates a QListWidgetItem to be inserted on the QListWidget with a network information. + signal: int, + right_text: str, + target_widget: QtWidgets.QListWidget, + ): + """Helper to create and insert a network button into the given list widget.""" + if signal >= 70: + wifi_pixmap = QtGui.QPixmap( + ":/network/media/btn_icons/4bar_wifi.svg" + ) + elif signal >= 40: + wifi_pixmap = QtGui.QPixmap( + ":/network/media/btn_icons/3bar_wifi.svg" + ) + elif signal >= 20: + wifi_pixmap = QtGui.QPixmap( + ":/network/media/btn_icons/2bar_wifi.svg" + ) + else: + wifi_pixmap = QtGui.QPixmap( + ":/network/media/btn_icons/1bar_wifi.svg" + ) - Args: - ssid (str): String with the ssid of the network + button = ListCustomButton(parent=target_widget) + button.setText(ssid) + button.setRightText(right_text) + button.setPixmap( + QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg") + ) + button.setSecondPixmap(wifi_pixmap) + button.setFixedHeight(80) + button.setLeftFontSize(17) + button.setRightFontSize(12) - Returns: - typing.Tuple[QtWidgets.QListWidgetItem, QWidget] | None: None if the argument is invalid, not a string - """ - if not isinstance(ssid, str): - return None - # REFACTOR: this code is pretty bad - _list_item = QtWidgets.QListWidgetItem() - _list_item_widget = QWidget() - _item_layout = QtWidgets.QHBoxLayout() - _item_text = QtWidgets.QLabel() - _item_button = QtWidgets.QPushButton() - - _item_button.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, True) - # _item_button.setStyleSheet("QPushButton{background:Transparent;}") - - _item_text.setText(str(ssid)) - _item_layout.addWidget(_item_text) - _item_layout.addWidget(_item_button) - _list_item_widget.setLayout(_item_layout) - _list_item.setSizeHint(_list_item_widget.sizeHint()) - _item_button.setText(">") - _size = _list_item_widget.geometry() - _button_size = QtCore.QSize(50, 30) - _item_button.setFixedSize(_button_size) - _item_button.setBackgroundRole(QtGui.QPalette.ColorRole.Highlight) - - _list_item.setFlags( - ~Qt.ItemFlag.ItemIsEditable - ) # ~ is for making the item not editable - - return _list_item, _list_item_widget + button.clicked.connect( + lambda checked, s=ssid: self.handle_button_click(s) + ) + + item = QtWidgets.QListWidgetItem() + item.setSizeHint(button.sizeHint()) + target_widget.addItem(item) + target_widget.setItemWidget(item, button) + + def handle_button_click(self, ssid: str): + if ssid in self.sdbus_network.get_saved_ssid_names(): + self.setCurrentIndex(3) + self.panel.saved_connection_network_name.setText(str(ssid)) + + else: + self.setCurrentIndex(2) + self.panel.add_network_network_label.setText(str(ssid)) #################################################################################### # * Reimplemented methods from parent class | Page index control methods * # @@ -320,15 +584,15 @@ def setCurrentIndex(self, index: int): return _cur = self.currentIndex() - if index == 0: # Main page + if index == 1: # Main page self.panel.network_list_widget.clear() self.add_ssid_network_entry() # Add network entries to the list - elif index == 1: # Add network page + elif index == 2: # Add network page self.panel.add_network_password_field.clear() self.panel.add_network_password_field.setPlaceholderText( "Insert password here, press enter when finished." ) - elif index == 2: # Network information page + elif index == 3: # Network information page self.panel.saved_connection_change_password_field.clear() self.panel.saved_connection_change_password_field.setPlaceholderText( "Change network password" @@ -344,10 +608,6 @@ def setCurrentIndex(self, index: int): f"{self.sdbus_network.get_connection_signal_by_ssid(self.panel.saved_connection_network_name.text())}%" ) - elif index == 3: # Hotspot settings page - self.panel.hotspot_info_ip_field.clear() - self.panel.hotspot_name_input_field.clear() - self.update() return super().setCurrentIndex(index) @@ -386,7 +646,7 @@ def call_network_panel( self.panel.network_list_widget.clear() self.setCurrentIndex(0) - _parent_size= self.parent().size() + _parent_size = self.parent().size() self.setGeometry(0, 0, _parent_size.width(), _parent_size.height()) self.updateGeometry() self.update() diff --git a/BlocksScreen/lib/panels/printTab.py b/BlocksScreen/lib/panels/printTab.py index 862818fa..9d91b03d 100644 --- a/BlocksScreen/lib/panels/printTab.py +++ b/BlocksScreen/lib/panels/printTab.py @@ -54,7 +54,6 @@ class PrintTab(QtWidgets.QStackedWidget): run_gcode_signal: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( str, name="run_gcode" ) - _z_offset: float = 0.0 def __init__( @@ -127,6 +126,9 @@ def __init__( self.file_data.fileinfo.connect(self.jobStatusPage_widget.on_fileinfo) self.jobStatusPage_widget.print_start.connect(self.ws.api.start_print) + + # self.jobStatusPage_widget.print_start.connect() + self.jobStatusPage_widget.print_cancel.connect( self.ws.api.cancel_print ) @@ -186,6 +188,9 @@ def __init__( self.printer.gcode_move_update[str, float].connect( self.tune_page.on_gcode_move_update ) + self.printer.gcode_move_update[str, list].connect( + self.babystepPage.on_gcode_move_update + ) self.tune_page.run_gcode.connect(self.ws.api.run_gcode) self.tune_page.request_sliderPage[str, int, "PyQt_PyObject"].connect( self.on_slidePage_request @@ -226,6 +231,7 @@ def __init__( self.panel.main_print_btn.clicked.connect( partial(self.change_page, self.indexOf(self.filesPage_widget)) ) + self.babystepPage.run_gcode.connect(self.ws.api.run_gcode) self.run_gcode_signal.connect(self.ws.api.run_gcode) diff --git a/BlocksScreen/lib/panels/widgets/babystepPage.py b/BlocksScreen/lib/panels/widgets/babystepPage.py index f08fc591..699d5dfc 100644 --- a/BlocksScreen/lib/panels/widgets/babystepPage.py +++ b/BlocksScreen/lib/panels/widgets/babystepPage.py @@ -2,6 +2,7 @@ from lib.utils.blocks_label import BlocksLabel from lib.utils.icon_button import IconButton +from lib.utils.group_button import GroupButton from PyQt6 import QtCore, QtGui, QtWidgets @@ -12,6 +13,7 @@ class BabystepPage(QtWidgets.QWidget): run_gcode: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( str, name="run_gcode" ) + _z_offset: float = 0.1 def __init__(self, parent) -> None: @@ -21,6 +23,7 @@ def __init__(self, parent) -> None: self.setAttribute(QtCore.Qt.WidgetAttribute.WA_MouseTracking, True) self.setTabletTracking(True) self.setMouseTracking(True) + self.setupUI() self.bbp_away_from_bed.clicked.connect(self.on_move_nozzle_away) self.bbp_close_to_bed.clicked.connect(self.on_move_nozzle_close) @@ -29,21 +32,20 @@ def __init__(self, parent) -> None: self.bbp_nozzle_offset_025.toggled.connect(self.handle_z_offset_change) self.bbp_nozzle_offset_05.toggled.connect(self.handle_z_offset_change) self.bbp_nozzle_offset_1.toggled.connect(self.handle_z_offset_change) - self.bbp_nozzle_offset_1.toggled.connect(self.handle_z_offset_change) - self.babystep_back_btn.clicked.connect(self.request_back) @QtCore.pyqtSlot(name="on_move_nozzle_close") def on_move_nozzle_close(self) -> None: """Move the nozzle closer to the print plate by the amount set in **` self._z_offset`**""" self.run_gcode.emit( - f"SET_GCODE_OFFSET Z_ADJUST=-{self._z_offset} MOVE=1" # Z_ADJUST adds the value to the existing offset + f"SET_GCODE_OFFSET Z_ADJUST=-{self._z_offset}" # Z_ADJUST adds the value to the existing offset ) @QtCore.pyqtSlot(name="on_move_nozzle_away") def on_move_nozzle_away(self) -> None: """Slot for Babystep button to get far from the bed by **` self._z_offset`** amount""" + print("Moving nozzle away from bed by:", self._z_offset, "a") self.run_gcode.emit( - f"SET_GCODE_OFFSET Z_ADJUST=+{self._z_offset} MOVE=1" # Z_ADJUST adds the value to the existing offset + f"SET_GCODE_OFFSET Z_ADJUST=+{self._z_offset}" # Z_ADJUST adds the value to the existing offset ) @QtCore.pyqtSlot(name="handle_z_offset_change") @@ -59,13 +61,29 @@ def handle_z_offset_change(self) -> None: """ _possible_z_values: typing.List = [0.01, 0.025, 0.05, 0.1] _sender: QtCore.QObject | None = self.sender() - if _sender is not None and isinstance(_sender, QtWidgets.QLabel): - if float(_sender.text()) in _possible_z_values: - if self._z_offset == float(_sender.text()): - return - self._z_offset = float(_sender.text()) + if self._z_offset == float(_sender.text()[:-3]): + print(_sender.text()[:-3], "is already set") + return + self._z_offset = float(_sender.text()[:-3]) + print(_sender.text()[:-3], "is now set") + + def on_gcode_move_update(self, name: str, value: list) -> None: + if not value: + return + + if name == "homing_origin": + self._z_offset_text = value[2] + self.bbp_z_offset_current_value.setText( + f"Z: {self._z_offset_text:.3f}mm" + ) + if self.bbp_z_offset_title_label.text() == "smth": + self.bbp_z_offset_title_label.setText( + f"Z: {self._z_offset_text:.3f}mm" + ) def setupUI(self): + self.bbp_offset_value_selector_group = QtWidgets.QButtonGroup(self) + self.bbp_offset_value_selector_group.setExclusive(True) sizePolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding, @@ -75,10 +93,16 @@ def setupUI(self): sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(sizePolicy) self.setMinimumSize(QtCore.QSize(710, 400)) - self.setMaximumSize(QtCore.QSize(720, 420)) + self.setMaximumSize( + QtCore.QSize(720, 420) + ) # This sets the maximum width of the entire page self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + + # Main Vertical Layout for the entire page self.verticalLayout = QtWidgets.QVBoxLayout(self) self.verticalLayout.setObjectName("verticalLayout") + + # Header Layout self.bbp_header_layout = QtWidgets.QHBoxLayout() self.bbp_header_layout.setObjectName("bbp_header_layout") self.bbp_header_title = QtWidgets.QLabel(parent=self) @@ -108,6 +132,15 @@ def setupUI(self): self.bbp_header_title.setText("Babystep") self.bbp_header_title.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.bbp_header_title.setObjectName("bbp_header_title") + + spacerItem = QtWidgets.QSpacerItem( + 60, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, + ) + self.bbp_header_layout.addItem(spacerItem) + self.bbp_header_layout.addWidget( self.bbp_header_title, 0, @@ -126,17 +159,162 @@ def setupUI(self): QtGui.QPixmap(":/ui/media/btn_icons/back.svg") ) self.babystep_back_btn.setObjectName("babystep_back_btn") + self.bbp_header_layout.addWidget( self.babystep_back_btn, 0, QtCore.Qt.AlignmentFlag.AlignRight | QtCore.Qt.AlignmentFlag.AlignVCenter, ) - self.bbp_header_layout.setStretch(0, 1) self.verticalLayout.addLayout(self.bbp_header_layout) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") + + self.main_content_horizontal_layout = QtWidgets.QHBoxLayout() + self.main_content_horizontal_layout.setObjectName( + "main_content_horizontal_layout" + ) + + # Offset Steps Buttons Group Box (LEFT side of main_content_horizontal_layout) + self.bbp_offset_steps_buttons_group_box = QtWidgets.QGroupBox(self) + font = QtGui.QFont() + font.setPointSize(14) + self.bbp_offset_steps_buttons_group_box.setFont(font) + self.bbp_offset_steps_buttons_group_box.setFlat(True) + # Add stylesheet to explicitly remove any border from the QGroupBox + self.bbp_offset_steps_buttons_group_box.setStyleSheet( + "QGroupBox { border: none; }" + ) + self.bbp_offset_steps_buttons_group_box.setObjectName( + "bbp_offset_steps_buttons_group_box" + ) + + self.bbp_offset_steps_buttons = QtWidgets.QVBoxLayout( + self.bbp_offset_steps_buttons_group_box + ) + self.bbp_offset_steps_buttons.setContentsMargins(9, 9, 9, 9) + self.bbp_offset_steps_buttons.setObjectName("bbp_offset_steps_buttons") + + # 0.1mm button + self.bbp_nozzle_offset_1 = GroupButton( + parent=self.bbp_offset_steps_buttons_group_box + ) + self.bbp_nozzle_offset_1.setMinimumSize(QtCore.QSize(100, 70)) + self.bbp_nozzle_offset_1.setMaximumSize(QtCore.QSize(100, 70)) + self.bbp_nozzle_offset_1.setText("0.1 mm") + + font = QtGui.QFont() + font.setPointSize(14) + self.bbp_nozzle_offset_1.setFont(font) + self.bbp_nozzle_offset_1.setCheckable(True) + self.bbp_nozzle_offset_1.setChecked(True) # Set as initially checked + self.bbp_nozzle_offset_1.setFlat(True) + self.bbp_nozzle_offset_1.setProperty("button_type", "") + self.bbp_nozzle_offset_1.setObjectName("bbp_nozzle_offset_1") + self.bbp_offset_value_selector_group.addButton( + self.bbp_nozzle_offset_1 + ) + self.bbp_offset_steps_buttons.addWidget( + self.bbp_nozzle_offset_1, + 0, + QtCore.Qt.AlignmentFlag.AlignHCenter + | QtCore.Qt.AlignmentFlag.AlignVCenter, + ) + + # Line separator for 0.1mm - set size policy to expanding horizontally + + # 0.01mm button + self.bbp_nozzle_offset_01 = GroupButton( + parent=self.bbp_offset_steps_buttons_group_box + ) + self.bbp_nozzle_offset_01.setMinimumSize(QtCore.QSize(100, 70)) + self.bbp_nozzle_offset_01.setMaximumSize( + QtCore.QSize(100, 70) + ) # Increased max width by 5 pixels + self.bbp_nozzle_offset_01.setText("0.01 mm") + + font = QtGui.QFont() + font.setPointSize(14) + self.bbp_nozzle_offset_01.setFont(font) + self.bbp_nozzle_offset_01.setCheckable(True) + self.bbp_nozzle_offset_01.setFlat(True) + self.bbp_nozzle_offset_01.setProperty("button_type", "") + self.bbp_nozzle_offset_01.setObjectName("bbp_nozzle_offset_01") + self.bbp_offset_value_selector_group.addButton( + self.bbp_nozzle_offset_01 + ) + self.bbp_offset_steps_buttons.addWidget( + self.bbp_nozzle_offset_01, + 0, + QtCore.Qt.AlignmentFlag.AlignHCenter + | QtCore.Qt.AlignmentFlag.AlignVCenter, + ) + + # 0.05mm button + self.bbp_nozzle_offset_05 = GroupButton( + parent=self.bbp_offset_steps_buttons_group_box + ) + self.bbp_nozzle_offset_05.setMinimumSize(QtCore.QSize(100, 70)) + self.bbp_nozzle_offset_05.setMaximumSize( + QtCore.QSize(100, 70) + ) # Increased max width by 5 pixels + self.bbp_nozzle_offset_05.setText("0.05 mm") + + font = QtGui.QFont() + font.setPointSize(14) + self.bbp_nozzle_offset_05.setFont(font) + self.bbp_nozzle_offset_05.setCheckable(True) + self.bbp_nozzle_offset_05.setFlat(True) + self.bbp_nozzle_offset_05.setProperty("button_type", "") + self.bbp_nozzle_offset_05.setObjectName("bbp_nozzle_offset_05") + self.bbp_offset_value_selector_group.addButton( + self.bbp_nozzle_offset_05 + ) + self.bbp_offset_steps_buttons.addWidget( + self.bbp_nozzle_offset_05, + 0, + QtCore.Qt.AlignmentFlag.AlignHCenter + | QtCore.Qt.AlignmentFlag.AlignVCenter, + ) + + # 0.025mm button + self.bbp_nozzle_offset_025 = GroupButton( + parent=self.bbp_offset_steps_buttons_group_box + ) + self.bbp_nozzle_offset_025.setMinimumSize(QtCore.QSize(100, 70)) + self.bbp_nozzle_offset_025.setMaximumSize( + QtCore.QSize(100, 70) + ) # Increased max width by 5 pixels + self.bbp_nozzle_offset_025.setText("0.025 mm") + + font = QtGui.QFont() + font.setPointSize(14) + self.bbp_nozzle_offset_025.setFont(font) + self.bbp_nozzle_offset_025.setCheckable(True) + self.bbp_nozzle_offset_025.setFlat(True) + self.bbp_nozzle_offset_025.setProperty("button_type", "") + self.bbp_nozzle_offset_025.setObjectName("bbp_nozzle_offset_025") + self.bbp_offset_value_selector_group.addButton( + self.bbp_nozzle_offset_025 + ) + self.bbp_offset_steps_buttons.addWidget( + self.bbp_nozzle_offset_025, + 0, + QtCore.Qt.AlignmentFlag.AlignHCenter + | QtCore.Qt.AlignmentFlag.AlignVCenter, + ) + + # Line separator for 0.025mm - set size policy to expanding horizontally + + # Set the layout for the group box + self.bbp_offset_steps_buttons_group_box.setLayout( + self.bbp_offset_steps_buttons + ) + # Add the group box to the main content horizontal layout FIRST for left placement + self.main_content_horizontal_layout.addWidget( + self.bbp_offset_steps_buttons_group_box + ) + + # Graphic and Current Value Frame (This will now be in the MIDDLE) self.frame_2 = QtWidgets.QFrame(parent=self) sizePolicy.setHeightForWidth( self.frame_2.sizePolicy().hasHeightForWidth() @@ -160,9 +338,32 @@ def setupUI(self): QtCore.Qt.AlignmentFlag.AlignCenter ) self.bbp_babystep_graphic.setObjectName("bbp_babystep_graphic") + + # === NEW LABEL ADDED HERE === + # This is the title label that appears above the red value box. + self.bbp_z_offset_title_label = QtWidgets.QLabel(parent=self) + # Position it just above the red box. Red box is at y=70, so y=40 is appropriate. + self.bbp_z_offset_title_label.setGeometry( + QtCore.QRect(100, 40, 200, 30) + ) + font = QtGui.QFont() + font.setPointSize(12) + + self.bbp_z_offset_title_label.setFont(font) + # Set color to white to be visible on the dark background + self.bbp_z_offset_title_label.setStyleSheet( + "color: gray; background: transparent;" + ) + self.bbp_z_offset_title_label.setText("Z-Offset") + self.bbp_z_offset_title_label.setObjectName("bbp_z_offset_title_label") + self.bbp_z_offset_title_label.setText("smth") + self.bbp_z_offset_title_label.setGeometry(420, 270, 200, 30) + + # === END OF NEW LABEL === + self.bbp_z_offset_current_value = BlocksLabel(parent=self.frame_2) self.bbp_z_offset_current_value.setGeometry( - QtCore.QRect(130, 70, 200, 60) + QtCore.QRect(100, 70, 200, 60) ) sizePolicy.setHeightForWidth( self.bbp_z_offset_current_value.sizePolicy().hasHeightForWidth() @@ -176,7 +377,7 @@ def setupUI(self): self.bbp_z_offset_current_value.setStyleSheet( "background: transparent; color: white;" ) - self.bbp_z_offset_current_value.setText("") + self.bbp_z_offset_current_value.setText(f"Z: {self._z_offset:.2f}mm") self.bbp_z_offset_current_value.setPixmap( QtGui.QPixmap(":/graphics/media/btn_icons/z_offset_adjust.svg") ) @@ -186,12 +387,15 @@ def setupUI(self): self.bbp_z_offset_current_value.setObjectName( "bbp_z_offset_current_value" ) - self.horizontalLayout_2.addWidget( + # Add graphic frame AFTER the offset buttons group box + self.main_content_horizontal_layout.addWidget( self.frame_2, 0, QtCore.Qt.AlignmentFlag.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignVCenter, ) + + # Move Buttons Layout (This will now be on the RIGHT) self.bbp_buttons_layout = QtWidgets.QVBoxLayout() self.bbp_buttons_layout.setContentsMargins(5, 5, 5, 5) self.bbp_buttons_layout.setObjectName("bbp_buttons_layout") @@ -202,6 +406,7 @@ def setupUI(self): self.bbp_away_from_bed.setSizePolicy(sizePolicy) self.bbp_away_from_bed.setMinimumSize(QtCore.QSize(80, 80)) self.bbp_away_from_bed.setMaximumSize(QtCore.QSize(80, 80)) + self.bbp_away_from_bed.setText("") self.bbp_away_from_bed.setFlat(True) self.bbp_away_from_bed.setPixmap( QtGui.QPixmap(":/arrow_icons/media/btn_icons/up_arrow.svg") @@ -220,6 +425,7 @@ def setupUI(self): self.bbp_close_to_bed.setSizePolicy(sizePolicy) self.bbp_close_to_bed.setMinimumSize(QtCore.QSize(80, 80)) self.bbp_close_to_bed.setMaximumSize(QtCore.QSize(80, 80)) + self.bbp_close_to_bed.setText("") self.bbp_close_to_bed.setFlat(True) self.bbp_close_to_bed.setPixmap( QtGui.QPixmap(":/arrow_icons/media/btn_icons/down_arrow.svg") @@ -229,286 +435,43 @@ def setupUI(self): self.bbp_buttons_layout.addWidget( self.bbp_close_to_bed, 0, QtCore.Qt.AlignmentFlag.AlignRight ) - self.bbp_buttons_layout.setStretch(0, 1) - self.bbp_buttons_layout.setStretch(1, 1) - self.horizontalLayout_2.addLayout(self.bbp_buttons_layout) - self.horizontalLayout_2.setStretch(0, 1) - self.verticalLayout.addLayout(self.horizontalLayout_2) - - self.bbp_offset_steps_buttons_group_box = QtWidgets.QGroupBox() + spacerItem = QtWidgets.QSpacerItem( + 40, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, + ) + self.main_content_horizontal_layout.addItem(spacerItem) - self.bbp_offset_steps_buttons = QtWidgets.QHBoxLayout() + # Add move buttons layout LAST for right placement + self.main_content_horizontal_layout.addLayout(self.bbp_buttons_layout) - self.bbp_offset_steps_buttons.setContentsMargins(9, 9, 9, 9) - self.bbp_offset_steps_buttons.setObjectName("bbp_offset_steps_buttons") - self.bbp_nozzle_offset_01 = QtWidgets.QPushButton(parent=self) - self.bbp_nozzle_offset_01.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_01.setMaximumSize(QtCore.QSize(100, 80)) - self.bbp_nozzle_offset_01.setText("0.01") - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - self.bbp_nozzle_offset_01.setPalette(palette) - font = QtGui.QFont() - font.setPointSize(14) - self.bbp_nozzle_offset_01.setFont(font) - self.bbp_nozzle_offset_01.setCheckable(True) - self.bbp_nozzle_offset_01.setFlat(True) - self.bbp_nozzle_offset_01.setProperty("button_type", "") - self.bbp_nozzle_offset_01.setObjectName("bbp_nozzle_offset_01") - self.bbp_offset_value_selector_group = QtWidgets.QButtonGroup(self) - self.bbp_offset_value_selector_group.setObjectName( - "bbp_offset_value_selector_group" + spacerItem = QtWidgets.QSpacerItem( + 40, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, ) - self.bbp_offset_value_selector_group.addButton( - self.bbp_nozzle_offset_01 - ) - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_01) - self.line_3 = QtWidgets.QFrame(parent=self) - self.line_3.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_3.setObjectName("line_3") - self.bbp_offset_steps_buttons.addWidget(self.line_3) - self.bbp_nozzle_offset_025 = QtWidgets.QPushButton(parent=self) - self.bbp_nozzle_offset_025.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_025.setMaximumSize(QtCore.QSize(100, 80)) - self.bbp_nozzle_offset_025.setText("0.025") - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - self.bbp_nozzle_offset_025.setPalette(palette) - font = QtGui.QFont() - font.setPointSize(14) - self.bbp_nozzle_offset_025.setFont(font) - self.bbp_nozzle_offset_025.setCheckable(True) - self.bbp_nozzle_offset_025.setFlat(True) - self.bbp_nozzle_offset_025.setProperty("button_type", "") - self.bbp_nozzle_offset_025.setObjectName("bbp_nozzle_offset_025") - self.bbp_offset_value_selector_group.addButton( - self.bbp_nozzle_offset_025 - ) - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_025) - self.line_4 = QtWidgets.QFrame(parent=self) - self.line_4.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_4.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_4.setObjectName("line_4") - self.bbp_offset_steps_buttons.addWidget(self.line_4) - self.bbp_nozzle_offset_05 = QtWidgets.QPushButton(parent=self) - self.bbp_nozzle_offset_05.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_05.setMaximumSize(QtCore.QSize(100, 80)) - self.bbp_nozzle_offset_05.setText("0.05") - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - self.bbp_nozzle_offset_05.setPalette(palette) - font = QtGui.QFont() - font.setPointSize(14) - self.bbp_nozzle_offset_05.setFont(font) - self.bbp_nozzle_offset_05.setCheckable(True) - self.bbp_nozzle_offset_05.setFlat(True) - self.bbp_nozzle_offset_05.setProperty("button_type", "") - self.bbp_nozzle_offset_05.setObjectName("bbp_nozzle_offset_05") - self.bbp_offset_value_selector_group.addButton( - self.bbp_nozzle_offset_05 - ) - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_05) - self.line_5 = QtWidgets.QFrame(parent=self) - self.line_5.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_5.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_5.setObjectName("line_5") - self.bbp_offset_steps_buttons.addWidget(self.line_5) - self.bbp_nozzle_offset_1 = QtWidgets.QPushButton(parent=self) - self.bbp_nozzle_offset_1.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_1.setMaximumSize(QtCore.QSize(100, 80)) - self.bbp_nozzle_offset_1.setText("0.1") + self.main_content_horizontal_layout.addItem(spacerItem) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.WindowText, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.ButtonText, - brush, - ) - self.bbp_nozzle_offset_1.setPalette(palette) - font = QtGui.QFont() - font.setPointSize(14) - self.bbp_nozzle_offset_1.setFont(font) - self.bbp_nozzle_offset_1.setCheckable(True) - self.bbp_nozzle_offset_1.setChecked(True) - self.bbp_nozzle_offset_1.setFlat(True) - self.bbp_nozzle_offset_1.setProperty("button_type", "") - self.bbp_nozzle_offset_1.setObjectName("bbp_nozzle_offset_1") + # Set stretch factors for main content horizontal layout + # This will distribute space: offset buttons, graphic frame, move buttons + self.main_content_horizontal_layout.setStretch( + 0, 1 + ) # offset_steps_buttons_group_box + self.main_content_horizontal_layout.setStretch( + 1, 2 + ) # frame_2 (graphic and current value) + self.main_content_horizontal_layout.setStretch( + 2, 0 + ) # bbp_buttons_layout (move buttons) + + # Add the main content horizontal layout to the vertical layout + self.verticalLayout.addLayout(self.main_content_horizontal_layout) + + # Set stretch factors for vertical layout (adjust as needed for overall sizing) + self.verticalLayout.setStretch( + 1, 1 + ) # This stretch applies to main_content_horizontal_layout - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_1) - self.bbp_offset_value_selector_group.addButton( - self.bbp_nozzle_offset_1 - ) - self.bbp_offset_steps_buttons_group_box.setLayout( - self.bbp_offset_steps_buttons - ) - self.bbp_offset_steps_buttons_group_box.setPalette(palette) - - font.setPointSize(14) - self.bbp_offset_steps_buttons_group_box.setFont(font) - self.bbp_offset_steps_buttons_group_box.setFlat(True) - self.bbp_offset_steps_buttons_group_box.setTitle("Move length (mm)") - self.bbp_offset_steps_buttons_group_box.adjustSize() - self.verticalLayout.addWidget(self.bbp_offset_steps_buttons_group_box) - self.verticalLayout.setStretch(1, 1) self.setLayout(self.verticalLayout) diff --git a/BlocksScreen/lib/panels/widgets/confirmPage.py b/BlocksScreen/lib/panels/widgets/confirmPage.py index 0b3bffc7..a549ac9e 100644 --- a/BlocksScreen/lib/panels/widgets/confirmPage.py +++ b/BlocksScreen/lib/panels/widgets/confirmPage.py @@ -37,14 +37,43 @@ def on_show_widget(self, text: str, filedata: dict | None = None) -> None: _total_filament = filedata.get("filament_total") _estimated_time = filedata.get("estimated_time") + + if isinstance(_estimated_time, str): + seconds = 0 + else: + seconds = _estimated_time + + _estimated_time = self.estimate_print_time(seconds) + + self.cf_info.setText( "Total Filament:" + str(_total_filament) + "\n" + "Slicer time: " - + str(_estimated_time) + + str(_estimated_time[0]) + + " days " + + str(_estimated_time[1]) + + " hours " + + str(_estimated_time[2]) + + " minutes " + + str(_estimated_time[3]) + + " seconds" ) self.repaint() + def estimate_print_time(self, seconds: int) -> list: + """Convert time in seconds format to days, hours, minutes, seconds. + + Args: + seconds (int): Seconds + + Returns: + list: list that contains the converted information [days, hours, minutes, seconds] + """ + num_min, seconds = divmod(seconds, 60) + num_hours, minutes = divmod(num_min, 60) + days, hours = divmod(num_hours, 24) + return [days, hours, minutes, seconds] def paintEvent(self, a0: QtGui.QPaintEvent) -> None: _scene = QtWidgets.QGraphicsScene() @@ -288,7 +317,7 @@ def setupUI(self) -> None: self.cf_content_vertical_layout.addWidget( self.cf_thumbnail, 0, - QtCore.Qt.AlignmentFlag.AlignHCenter + QtCore.Qt.AlignmentFlag.AlignRight | QtCore.Qt.AlignmentFlag.AlignVCenter, ) self.verticalLayout_4.addLayout(self.cf_content_vertical_layout) diff --git a/BlocksScreen/lib/panels/widgets/dialogPage.py b/BlocksScreen/lib/panels/widgets/dialogPage.py new file mode 100644 index 00000000..06aeff04 --- /dev/null +++ b/BlocksScreen/lib/panels/widgets/dialogPage.py @@ -0,0 +1,166 @@ +from PyQt6 import QtCore, QtGui, QtWidgets +from lib.utils.blocks_button import BlocksCustomButton + + +class DialogPage(QtWidgets.QDialog): + button_clicked = QtCore.pyqtSignal( + str + ) # Signal to emit which button was clicked + + def __init__( + self, + parent: QtWidgets.QWidget, + ) -> None: + super().__init__(parent) + + self.setWindowFlags( + QtCore.Qt.WindowType.Popup + | QtCore.Qt.WindowType.FramelessWindowHint + ) + self.setAttribute( + QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True + ) # Make background transparent + + app_instance = QtWidgets.QApplication.instance() + self.main_window = ( + app_instance.activeWindow() if app_instance else None + ) + if self.main_window is None and app_instance: + for widget in app_instance.allWidgets(): + if isinstance(widget, QtWidgets.QMainWindow): + self.main_window = widget + + offset = 0.7 + self.testwidth = int(self.main_window.width() * offset) + self.testheight = int(self.main_window.height() * offset) + + self.setupUI() + + def set_message(self, message: str) -> None: + self.label.setText(message) + + def geometry_calc(self) -> None: + x = int( + self.main_window.geometry().x() + + (self.main_window.width() - self.testwidth) / 2 + ) + + y = int( + self.main_window.geometry().y() + + (self.main_window.height() - self.testheight) / 2 + ) + + self.setGeometry(x, y, self.testwidth, self.testheight) + + def paintEvent(self, event: QtGui.QPaintEvent) -> None: + painter = QtGui.QPainter(self) + painter.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing, True) + + rect = self.rect() + radius = 20 # Adjust the radius for rounded corners + + # Convert the QPoint returned by rect.center() to a QPointF + center_f = QtCore.QPointF(rect.center()) + + # Create a radial gradient + gradient = QtGui.QRadialGradient( + center_f, max(rect.width(), rect.height()) + ) + gradient.setColorAt( + 0.0, QtGui.QColor(50, 50, 50) + ) # Light gray in the center + gradient.setColorAt(1.0, QtGui.QColor(0, 0, 0)) # Black on the outside + + painter.setBrush(QtGui.QBrush(gradient)) + + painter.drawRoundedRect(rect, radius, radius) + + painter.end() + + def sizeHint(self) -> QtCore.QSize: + popup_width = int(self.geometry().width()) + popup_height = int(self.geometry().height()) + # Centering logic + + popup_x = self.x() + popup_y = self.y() + (self.height() - popup_height) // 2 + self.move(popup_x, popup_y) + self.setFixedSize(popup_width, popup_height) + self.setMinimumSize(popup_width, popup_height) + return super().sizeHint() + + def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: + return + + def resizeEvent(self, event: QtGui.QResizeEvent) -> None: + super().resizeEvent(event) + + label_width = self.testwidth + label_height = self.testheight + label_x = (self.width() - label_width) // 2 + label_y = ( + int(label_height / 4) - 20 + ) # Move the label to the top (adjust as needed) + + self.label.setGeometry(label_x, -label_y, label_width, label_height) + + # Adjust button positions on resize + self.confirm_button.setGeometry( + int(15), self.height() - 110, int(self.width() / 2) - 40, 70 + ) + self.cancel_button.setGeometry( + int(self.width() / 2) + 15, + self.height() - 110, + int(self.width() / 2) - 40, + 70, + ) + + def show(self) -> None: + self.geometry_calc() + return super().show() + + def setupUI(self) -> None: + self.label = QtWidgets.QLabel("Test", self) + font = QtGui.QFont() + font.setPointSize(25) + self.label.setFont(font) + self.label.setStyleSheet("color: #ffffff; background: transparent;") + self.label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.label.setWordWrap(True) + + # Create Confirm and Cancel buttons + self.confirm_button = BlocksCustomButton(self) + self.cancel_button = BlocksCustomButton(self) + + self.confirm_button.setText("Confirm") + self.cancel_button.setText("Cancel") + + # Set button styles + button_font = QtGui.QFont() + button_font.setPointSize(20) + self.confirm_button.setFont(button_font) + self.cancel_button.setFont(button_font) + + self.confirm_button.setPixmap( + QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg") + ) + self.cancel_button.setPixmap( + QtGui.QPixmap(":/dialog/media/btn_icons/no.svg") + ) + + # Connect button signals + self.confirm_button.clicked.connect( + lambda: self.on_button_clicked("Confirm") + ) + self.cancel_button.clicked.connect( + lambda: self.on_button_clicked("Cancel") + ) + + def on_button_clicked(self, button_name: str) -> None: + self.button_clicked.emit( + button_name + ) # Emit the signal with the button name + if button_name == "Confirm": + self.accept() # Close the dialog with an accepted state + elif button_name == "Cancel": + self.reject() # Close the dialog with a rejected state diff --git a/BlocksScreen/lib/panels/widgets/fansPage.py b/BlocksScreen/lib/panels/widgets/fansPage.py new file mode 100644 index 00000000..5dffba42 --- /dev/null +++ b/BlocksScreen/lib/panels/widgets/fansPage.py @@ -0,0 +1,13 @@ +from PyQt6 import QtCore, QtWidgets +import typing + +class FansPage(QtWidgets.QWidget): + + def __init__( + self, parent: typing.Optional["QtWidgets.QWidget"], flags: typing.Optional["QtCore.Qt.WindowType"] + ) -> None: + if parent is not None and flags is not None: + super(FansPage, self).__init__(parent, flags) + + else : + super(FansPage, self).__init__() \ No newline at end of file diff --git a/BlocksScreen/lib/panels/widgets/filesPage.py b/BlocksScreen/lib/panels/widgets/filesPage.py index b17cf140..84849f51 100644 --- a/BlocksScreen/lib/panels/widgets/filesPage.py +++ b/BlocksScreen/lib/panels/widgets/filesPage.py @@ -1,7 +1,10 @@ +from functools import partial from PyQt6 import QtCore, QtGui, QtWidgets import typing from lib.utils.icon_button import IconButton +from lib.utils.list_button import ListCustomButton +from lib.utils.blocks_Scrollbar import CustomScrollBar class FilesPage(QtWidgets.QWidget): @@ -23,20 +26,62 @@ class FilesPage(QtWidgets.QWidget): def __init__(self, parent) -> None: super().__init__(parent) self.setupUI() - self.setMouseTracking(True) self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True) - self.listWidget.itemClicked.connect(self.fileItemClicked) - self.ReloadButton.clicked.connect(lambda: self.reload_list) + + self.ReloadButton.clicked.connect(lambda: self.reload_list()) + + self.listWidget.verticalScrollBar().valueChanged.connect( + self.handlescrollbar + ) + self.scrollbar.valueChanged.connect(self.handlescrollbar) + + self.scrollbar.valueChanged.connect( + lambda value: self.listWidget.verticalScrollBar().setValue(value) + ) def showEvent(self, a0: QtGui.QShowEvent) -> None: self.add_file_entries() return super().showEvent(a0) + def estimate_print_time(self, seconds: int) -> list: + num_min, seconds = divmod(seconds, 60) + num_hours, minutes = divmod(num_min, 60) + days, hours = divmod(num_hours, 24) + return [days, hours, minutes, seconds] + @QtCore.pyqtSlot(dict, name="on_fileinfo") def on_fileinfo(self, filedata: dict) -> None: - if self._current_file_name: - self.file_selected.emit(str(self._current_file_name), filedata) + if self.buttons: + estimated_time = filedata.get("estimated_time", 0) + seconds = ( + int(estimated_time) + if isinstance(estimated_time, (int, float)) + else 0 + ) + + filament_type = ( + filedata.get("filament_type", "Unknown filament") + if filedata.get("filament_type", "Unknown filament") != -1.0 + else "Unknown filament" + ) + time_str = "" + days, hours, minutes, _ = self.estimate_print_time(seconds) + if seconds <= 0: + time_str = "No time estimated" + elif seconds < 60: + time_str = "less than 1 minute" + else: + if days > 0: + time_str = f"{days}d {hours}h {minutes}m" + elif hours > 0: + time_str = f"{hours}h {minutes}m" + else: + time_str = f"{minutes}m" + + self.button.setRightText(f"{filament_type} - {time_str}") + return + self.file_selected.emit(str(self._current_file_name), filedata) @QtCore.pyqtSlot(name="reload_list") def reload_list(self) -> None: @@ -50,49 +95,79 @@ def on_file_list(self, file_list: list) -> None: self.add_file_entries() @QtCore.pyqtSlot(QtWidgets.QListWidgetItem, name="file_item_clicked") - def fileItemClicked(self, item: QtWidgets.QListWidgetItem) -> None: + def fileItemClicked(self, item: str) -> None: """Slot for List Item clicked Args: item (QListWidgetItem): Clicked item """ # * Get the filename from the list item pressed - _current_item: QtWidgets.QWidget = self.listWidget.itemWidget(item) - if _current_item is not None: - self._current_file_name = _current_item.findChild( - QtWidgets.QLabel - ).text() # type: ignore + if item is not None: + self._current_file_name = item if self._current_file_name: self.request_file_info.emit(self._current_file_name) def add_file_entries(self) -> None: """Inserts the currently available gcode files on the QListWidget""" self.listWidget.clear() + + self.listWidget.setSpacing(35) index = 0 + self.buttons = True - def _add_entry(): - _item = QtWidgets.QListWidgetItem() - _item_widget = QtWidgets.QWidget() - _item_layout = QtWidgets.QHBoxLayout() - _item_text = QtWidgets.QLabel() - _item_text.setText(str(item["path"])) - _item_text.setAlignment( - QtCore.Qt.AlignmentFlag.AlignLeft - & QtCore.Qt.AlignmentFlag.AlignVCenter + sorted_list = sorted( + self.file_list, key=lambda x: x["modified"], reverse=True + ) + + for item in sorted_list: + self.button = ListCustomButton() + self.button.setText(str(item["path"][:-6])) + self.request_file_info.emit(item["path"]) + + self.button.setPixmap( + QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg") + ) + self.button.setFixedSize(600, 80) + self.button.setLeftFontSize(17) + self.button.setRightFontSize(12) + + list_item = QtWidgets.QListWidgetItem() + list_item.setSizeHint(self.button.sizeHint()) + + self.listWidget.addItem(list_item) + self.listWidget.setItemWidget(list_item, self.button) + + namefile = str(item["path"]) + self.button.clicked.connect( + partial(self.fileItemClicked, namefile) ) - _item_layout.addWidget(_item_text) - _item_widget.setLayout(_item_layout) - _item.setSizeHint(_item_widget.sizeHint()) - _item.setFlags(~QtCore.Qt.ItemFlag.ItemIsEditable) - return _item, _item_widget - - for item in self.file_list: - # TODO: Add a file icon before the name - _item, _item_widget = _add_entry() - self.listWidget.addItem(_item) - self.listWidget.setItemWidget(_item, _item_widget) index += 1 + self.buttons = False + + spacer_item = QtWidgets.QListWidgetItem() + spacer_widget = QtWidgets.QWidget() + spacer_widget.setFixedHeight(10) + spacer_item.setSizeHint(spacer_widget.sizeHint()) + self.listWidget.addItem(spacer_item) + + self.scrollbar.setMinimum( + self.listWidget.verticalScrollBar().minimum() + ) + self.scrollbar.setMaximum( + self.listWidget.verticalScrollBar().maximum() + ) + self.scrollbar.setPageStep( + self.listWidget.verticalScrollBar().pageStep() + ) + + def handlescrollbar(self, value): + # Block signals to avoid recursion + + self.scrollbar.blockSignals(True) + self.scrollbar.setValue(value) + self.scrollbar.blockSignals(False) + def setupUI(self): sizePolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Policy.MinimumExpanding, @@ -145,88 +220,58 @@ def setupUI(self): self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) self.line.setObjectName("line") self.verticalLayout_5.addWidget(self.line) - self.fp_content_layout = QtWidgets.QVBoxLayout() - self.fp_content_layout.setContentsMargins(5, 5, 5, 5) + self.fp_content_layout = QtWidgets.QHBoxLayout() + self.fp_content_layout.setContentsMargins(0, 0, 0, 0) self.fp_content_layout.setObjectName("fp_content_layout") self.listWidget = QtWidgets.QListWidget(parent=self) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.Button, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.Base, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Active, - QtGui.QPalette.ColorRole.Window, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.Button, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.Base, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Inactive, - QtGui.QPalette.ColorRole.Window, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.Button, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.Base, - brush, - ) - brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush( - QtGui.QPalette.ColorGroup.Disabled, - QtGui.QPalette.ColorRole.Window, - brush, - ) - self.listWidget.setPalette(palette) - self.listWidget.setStyleSheet( - "QListWidget{background-color: transparent;}\n" - "\n" - "QLabel{\n" - "color: #ffffff;\n" - "}" - ) - self.listWidget.setEditTriggers( - QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers - ) self.listWidget.setProperty("showDropIndicator", False) + self.listWidget.setProperty("selectionMode", "NoSelection") + self.listWidget.setStyleSheet("background: transparent;") self.listWidget.setDefaultDropAction(QtCore.Qt.DropAction.IgnoreAction) self.listWidget.setUniformItemSizes(True) self.listWidget.setObjectName("listWidget") + self.listWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.listWidget.setDefaultDropAction(QtCore.Qt.DropAction.IgnoreAction) + self.listWidget.setSelectionBehavior( + QtWidgets.QAbstractItemView.SelectionBehavior.SelectItems + ) + self.listWidget.setVerticalScrollMode( + QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel + ) + self.listWidget.setVerticalScrollBarPolicy( + QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff + ) + QtWidgets.QScroller.grabGesture( + self.listWidget, + QtWidgets.QScroller.ScrollerGestureType.TouchGesture, + ) + QtWidgets.QScroller.grabGesture( + self.listWidget, + QtWidgets.QScroller.ScrollerGestureType.LeftMouseButtonGesture, + ) + self.listWidget.setEditTriggers( + QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers + ) + + scroller_instance = QtWidgets.QScroller.scroller(self.listWidget) + scroller_props = scroller_instance.scrollerProperties() + scroller_props.setScrollMetric( + QtWidgets.QScrollerProperties.ScrollMetric.DragVelocitySmoothingFactor, + 0.05, # Lower = more responsive + ) + scroller_props.setScrollMetric( + QtWidgets.QScrollerProperties.ScrollMetric.DecelerationFactor, + 0.4, # higher = less inertia + ) + QtWidgets.QScroller.scroller(self.listWidget).setScrollerProperties( + scroller_props + ) + self.fp_content_layout.addWidget(self.listWidget) + self.scrollbar = CustomScrollBar() + self.fp_content_layout.addWidget(self.scrollbar) self.verticalLayout_5.addLayout(self.fp_content_layout) + self.scrollbar.setAttribute( + QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents, True + ) + self.scroller = QtWidgets.QScroller.scroller(self.listWidget) diff --git a/BlocksScreen/lib/panels/widgets/jobStatusPage.py b/BlocksScreen/lib/panels/widgets/jobStatusPage.py index e4d52f6e..f30f8ef7 100644 --- a/BlocksScreen/lib/panels/widgets/jobStatusPage.py +++ b/BlocksScreen/lib/panels/widgets/jobStatusPage.py @@ -6,6 +6,7 @@ from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_label import BlocksLabel from lib.utils.display_button import DisplayButton +from lib.panels.widgets import dialogPage import events from PyQt6 import QtCore, QtGui, QtWidgets @@ -47,12 +48,31 @@ class JobStatusWidget(QtWidgets.QWidget): def __init__(self, parent) -> None: super().__init__(parent) + + self.canceldialog = dialogPage.DialogPage(self) + self.setupUI() self.tune_menu_btn.clicked.connect(self.tune_clicked.emit) self.pause_printing_btn.clicked.connect(self.pause_resume_print) - self.stop_printing_btn.clicked.connect( - lambda: self.print_cancel.emit() + self.stop_printing_btn.clicked.connect(self.handleCancel) + + def handleCancel(self) -> None: + """Handle the cancel print job dialog""" + self.canceldialog.set_message( + "Are you sure you \n want to cancel \n this print job?" ) + self.canceldialog.button_clicked.connect(self.on_dialog_button_clicked) + self.canceldialog.show() + + def on_dialog_button_clicked(self, button_name: str) -> None: + """Handle dialog button clicks""" + if button_name == "Confirm": + print( + "Confirm button clicked MY GD HELPO ME IDK WHAT AM I DOING I MISS MY WIFI OH GOD HE IS HERE M-MY , NOOOOOOOOOOooOooOO..." + ) + self.print_cancel.emit() # Emit the print_cancel signal + elif button_name == "Cancel": + print("Cancel button clicked") @QtCore.pyqtSlot(str, name="on_print_start") def on_print_start(self, file: str) -> None: diff --git a/BlocksScreen/lib/panels/widgets/loadPage.py b/BlocksScreen/lib/panels/widgets/loadPage.py new file mode 100644 index 00000000..466ebba2 --- /dev/null +++ b/BlocksScreen/lib/panels/widgets/loadPage.py @@ -0,0 +1,188 @@ +import enum + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class LoadScreen(QtWidgets.QDialog): + class AnimationGIF(enum.Enum): + # [x]: WATHERE ARE NO GIFS IN LOADSCREEN PLEASE REMEMBER THIS IM WARNING + + # TODO : add more types into LoadScreen + + DEFAULT = None + PLACEHOLDER = "" + + def __init__( + self, parent: QtWidgets.QWidget, type: AnimationGIF = AnimationGIF.DEFAULT + ) -> None: + super().__init__(parent) + + self.type = type + self._angle = 0 + self._span_angle = 90.0 + self._is_span_growing = True + self.min_length = 5.0 + self.max_length = 150.0 + self.length_step = 2.5 + + self.setStyleSheet( + "background-image: url(:/background/media/1st_background.png);" + ) + + self.setWindowFlags( + QtCore.Qt.WindowType.Popup + | QtCore.Qt.WindowType.FramelessWindowHint + ) + + self.setupUI() + + config = parent.get_config() + try: + if config is not None: + loading_config = config["loading"] + animation = loading_config.get( + str(self.type.name), self.type.value + ) + except KeyError: + self.type = LoadScreen.AnimationGIF.DEFAULT + + self.timer = QtCore.QTimer(self) + self.timer.timeout.connect(self._update_animation) + + if self.type != LoadScreen.AnimationGIF.PLACEHOLDER: + self.movie = QtGui.QMovie(animation) # Create QMovie object + self.gifshow.setMovie(self.movie) # Set QMovie to QLabel + self.movie.start() # Start the QMovie + + # Only start the animation timer if no GIF is provided + if self.type == LoadScreen.AnimationGIF.DEFAULT: + self.timer.start(16) + + self.repaint() + + def set_status_message(self, message: str) -> None: + self.label.setText(message) + + def geometry_calc(self) -> None: + # REFACTOR: find another way to get mainwindow geometry , this version consumes too much ram + app_instance = QtWidgets.QApplication.instance() + main_window = app_instance.activeWindow() if app_instance else None + if main_window is None and app_instance: + for widget in app_instance.allWidgets(): + if isinstance(widget, QtWidgets.QMainWindow): + main_window = widget + x = main_window.geometry().x() + y = main_window.geometry().y() + width = main_window.width() + height = main_window.height() + + self.setGeometry(x, y, width, height) + + def close(self) -> bool: + self.timer.stop() + self.label.setText("Loading...") + self._angle = 0 + # Stop the GIF animation if it was started + if self.type != LoadScreen.AnimationGIF.DEFAULT: + self.gifshow.movie().stop() + return super().close() + + def _update_animation(self) -> None: + self._angle = (self._angle + 5) % 360 + if self._is_span_growing: + self._span_angle += self.length_step + if self._span_angle >= self.max_length: + self._span_angle = self.max_length + self._is_span_growing = False + else: + self._span_angle -= self.length_step + if self._span_angle <= self.min_length: + self._span_angle = self.min_length + self._is_span_growing = True + self.update() + + def sizeHint(self) -> QtCore.QSize: + popup_width = int(self.geometry().width()) + popup_height = int(self.geometry().height()) + # Centering logic + + popup_x = self.x() + popup_y = self.y() + (self.height() - popup_height) // 2 + self.move(popup_x, popup_y) + self.setFixedSize(popup_width, popup_height) + self.setMinimumSize(popup_width, popup_height) + return super().sizeHint() + + def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None: + return + + def paintEvent(self, a0: QtGui.QPaintEvent) -> None: + painter = QtGui.QPainter(self) + # loading circle draw + if self.type == LoadScreen.AnimationGIF.DEFAULT: + painter.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing, True) + painter.setRenderHint( + QtGui.QPainter.RenderHint.LosslessImageRendering, True + ) + painter.setRenderHint( + QtGui.QPainter.RenderHint.SmoothPixmapTransform, True + ) + painter.setRenderHint( + QtGui.QPainter.RenderHint.TextAntialiasing, True + ) + pen = QtGui.QPen() + pen.setWidth(8) + pen.setColor(QtGui.QColor("#ffffff")) + pen.setCapStyle(QtCore.Qt.PenCapStyle.RoundCap) + painter.setPen(pen) + + center_x = self.width() // 2 + center_y = int(self.height() * 0.4) + arc_size = 150 + + painter.translate(center_x, center_y) + painter.rotate(self._angle) + + arc_rect = QtCore.QRectF( + -arc_size / 2, -arc_size / 2, arc_size, arc_size + ) + span_angle = int(self._span_angle * 16) + painter.drawArc(arc_rect, 0, span_angle) + + def resizeEvent(self, event: QtGui.QResizeEvent) -> None: + super().resizeEvent(event) + + label_width = self.width() + label_height = 100 + label_x = (self.width() - label_width) // 2 + label_y = int(self.height() * 0.65) + + margin = 20 + # Center the GIF + gifshow_width = self.width() - margin * 2 + gifshow_height = self.height() - (self.height() - label_y) - margin + + self.gifshow.setGeometry(margin, margin, gifshow_width, gifshow_height) + + self.label.setGeometry(label_x, label_y, label_width, label_height) + + def show(self) -> None: + self.geometry_calc() + # Start the animation timer only if no GIF is present + if self.type == LoadScreen.AnimationGIF.DEFAULT: + self.timer.start() + self.repaint() + return super().show() + + def setupUI(self) -> None: + self.gifshow = QtWidgets.QLabel("", self) + self.gifshow.setObjectName("gifshow") + self.gifshow.setStyleSheet("background: transparent;") + self.gifshow.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + + self.label = QtWidgets.QLabel("Test", self) + font = QtGui.QFont() + font.setPointSize(20) + self.label.setFont(font) + self.label.setStyleSheet("color: #ffffff; background: transparent;") + self.label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) diff --git a/BlocksScreen/lib/panels/widgets/loadingPage.py b/BlocksScreen/lib/panels/widgets/loadingPage.py new file mode 100644 index 00000000..1d6919ce --- /dev/null +++ b/BlocksScreen/lib/panels/widgets/loadingPage.py @@ -0,0 +1,24 @@ +from PyQt6 import QtCore, QtWidgets, QtGui + + +class LoadingPage(QtWidgets.QWidget): + def __init__(self, parent) -> None: + super().__init__(parent) + + def setupUI(self) -> None: + sizePolicy = QtWidgets.QSizePolicy( + QtWidgets.QSizePolicy.Policy.MinimumExpanding, + QtWidgets.QSizePolicy.Policy.MinimumExpanding, + ) + sizePolicy.setHorizontalStretch(1) + sizePolicy.setVerticalStretch(1) + sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) + self.setSizePolicy(sizePolicy) + self.setMinimumSize(QtCore.QSize(710, 400)) + self.setMaximumSize(QtCore.QSize(720, 420)) + self.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + + + # centered_x = (self.width() - myloadingicon.width()) // 2 + # centered_y = (self.height() - myloadingicon.height()) // 2 + # myloadingicon.moveTo(QtCore.QPoint(centered_x, centered_y)) diff --git a/BlocksScreen/lib/panels/widgets/sensorsPanel.py b/BlocksScreen/lib/panels/widgets/sensorsPanel.py index 751e1e95..e8e21440 100644 --- a/BlocksScreen/lib/panels/widgets/sensorsPanel.py +++ b/BlocksScreen/lib/panels/widgets/sensorsPanel.py @@ -5,7 +5,6 @@ from PyQt6 import QtCore, QtGui, QtWidgets -# TODO: Add buttons that toggle on and of the available printer sensors class SensorsWindow(QtWidgets.QWidget): run_gcode_signal: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( str, name="run_gcode" @@ -23,11 +22,13 @@ class SensorsWindow(QtWidgets.QWidget): def __init__(self, parent): super(SensorsWindow, self).__init__(parent) self.setupUi() - self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground) - self.setWindowFlags( - self.windowFlags() | QtCore.Qt.WindowType.FramelessWindowHint + self.setAttribute( + QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True ) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True) + self.setTabletTracking(True) self.fs_sensors_list.itemClicked.connect(self.handle_sensor_clicked) + self.fs_sensors_list.itemClicked self.fs_back_button.clicked.connect(self.request_back) @QtCore.pyqtSlot(dict, name="handle_available_fil_sensors") @@ -56,6 +57,7 @@ def handle_available_fil_sensors(self, sensors: dict) -> None: def handle_fil_state_change( self, sensor_name: str, parameter: str, value: bool ) -> None: + print("on handle fil state") if sensor_name in self.sensor_list: state = SensorWidget.FilamentState(value) _split = sensor_name.split(" ") @@ -68,13 +70,18 @@ def handle_fil_state_change( if isinstance(_item, SensorWidget) and hasattr( _item, "change_fil_sensor_state" ): - self.change_fil_sensor_state.connect( - _item.change_fil_sensor_state + _item.change_fil_sensor_state( + SensorWidget.FilamentState.PRESENT + ) + _item.repaint() + elif parameter == "filament_missing": + if isinstance(_item, SensorWidget) and hasattr( + _item, "change_fil_sensor_state" + ): + _item.change_fil_sensor_state( + SensorWidget.FilamentState.MISSING ) - self.change_fil_sensor_state.emit(state) - self.change_fil_sensor_state.disconnect() _item.repaint() - elif parameter == "enabled": if _item and isinstance(_item, SensorWidget): self.run_gcode_signal.emit( @@ -84,7 +91,8 @@ def handle_fil_state_change( @QtCore.pyqtSlot(QtWidgets.QListWidgetItem, name="handle_sensor_clicked") def handle_sensor_clicked(self, sensor: QtWidgets.QListWidgetItem) -> None: _item = self.fs_sensors_list.itemWidget(sensor) - + # FIXME: This is just not working + _item.toggle_button.state = ~_item.toggle_button.state if _item and isinstance(_item, SensorWidget): self.run_gcode_signal.emit(_item.toggle_sensor_gcode_command) @@ -100,6 +108,9 @@ def create_sensor_widget(self, name: str) -> SensorWidget: _list_item.setSizeHint( QtCore.QSize(self.fs_sensors_list.contentsRect().width(), 80) ) + _item_widget.toggle_button.stateChange.connect( + lambda: self.fs_sensors_list.itemClicked.emit(_item_widget) + ) self.fs_sensors_list.setItemWidget(_list_item, _item_widget) @@ -176,7 +187,6 @@ def setupUi(self): QtCore.Qt.LayoutDirection.LeftToRight ) self.fs_sensors_list.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) - self.fs_sensors_list.setAutoFillBackground(False) self.fs_sensors_list.setObjectName("fs_sensors_list") self.fs_sensors_list.setViewMode( self.fs_sensors_list.ViewMode.ListMode @@ -185,15 +195,7 @@ def setupUi(self): QtCore.Qt.AlignmentFlag.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignVCenter ) - self.fs_sensors_list.setMovement(self.fs_sensors_list.Movement.Static) self.fs_sensors_list.setFlow(self.fs_sensors_list.Flow.TopToBottom) - self.fs_sensors_list.setAttribute( - QtCore.Qt.WidgetAttribute.WA_TranslucentBackground, True - ) - self.fs_sensors_list.setWindowFlags( - self.fs_sensors_list.windowFlags() - | QtCore.Qt.WindowType.FramelessWindowHint - ) self.fs_sensors_list.setFrameStyle(0) palette = self.fs_sensors_list.palette() palette.setColor( @@ -212,7 +214,6 @@ def setupUi(self): | QtCore.Qt.AlignmentFlag.AlignVCenter, ) self.content_vertical_layout.addSpacing(5) - self.setLayout(self.content_vertical_layout) self.retranslateUi() diff --git a/BlocksScreen/lib/rest.py b/BlocksScreen/lib/rest.py deleted file mode 100644 index 7b78cbba..00000000 --- a/BlocksScreen/lib/rest.py +++ /dev/null @@ -1,89 +0,0 @@ -import tornado -from urllib3.util.url import Url -import pydantic -import fastapi - -import asyncio -import multiprocessing - -import concurrent.futures -import functools -import inspect -import time -import logging -import typing -import tornado.concurrent - -from fastapi import FastAPI, WebSocket - -from PyQt6 import QtCore -import tornado.websocket - - -class WebSocketClient(tornado.websocket.WebSocketClientConnection): - url = "ws://192.168.1.165:7125" - port = 7125 - - def __init__(self) -> None: - # super(WebSocketClient, self).__init__( ) - self.connect() - - tornado.ioloop.IOLoop.current().start() - - def connect(self): - tornado.websocket.websocket_connect( - self.url, - callback=self.on_connect, - ) - - def on_connect(self, future): - self.connection = future.results() - - def on_message(self, message): - print(message) - - def on_close(self): - print("websocket closed ") - - -# if __name__ == "__main__": -# client = WebSocketClient() - -# class WebSocketClientFastAPI(FastAPI): - -# def __init__(self, *args, **kwargs): -# super(WebSocketClientFastAPI, self).__init__() - - -# @FastAPI.websocket("/ws") -# async def websocket_endspoint(websocket:WebSocket): -# await websocket.accept() -# try: -# while True: -# data = await websocket.receive_text() -# # Process data and interact with Klipper -# response = {"status": "success", "data": data} -# await websocket.send_json(response) - -# except Exception as e: -# await websocket.close() - - -# if __name__ == "__main__": - -# eb = WebSocketClientFastAPI() - - -import asyncio -import uvicorn - -async def app(scope, receive, send): - ... - -async def main(): - config = uvicorn.Config("rest:app", port=5000, log_level="info") - server = uvicorn.Server(config) - await server.serve() - -if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file diff --git a/BlocksScreen/lib/ui/controlStackedWidget.ui b/BlocksScreen/lib/ui/controlStackedWidget.ui index 2be6a888..682bc810 100644 --- a/BlocksScreen/lib/ui/controlStackedWidget.ui +++ b/BlocksScreen/lib/ui/controlStackedWidget.ui @@ -32,7 +32,7 @@ StackedWidget - 3 + 2 @@ -554,7 +554,7 @@ Settings icon - :/button_borders/media/btn_icons/back.svg + :/button_borders/media/btn_icons/back.svg @@ -901,7 +901,7 @@ Steppers icon - :/button_borders/media/btn_icons/back.svg + :/button_borders/media/btn_icons/back.svg @@ -913,7 +913,7 @@ Steppers 20 80 671 - 328 + 330 @@ -2721,7 +2721,7 @@ Steppers icon - :/button_borders/media/btn_icons/back.svg + :/button_borders/media/btn_icons/back.svg @@ -3417,7 +3417,7 @@ Steppers 0 30 291 - 61 + 62 @@ -4488,7 +4488,7 @@ Steppers icon - :/button_borders/media/btn_icons/back.svg + :/button_borders/media/btn_icons/back.svg @@ -5074,7 +5074,7 @@ Steppers true - :/button_borders/media/btn_icons/back.svg + :/button_borders/media/btn_icons/back.svg icon @@ -5089,7 +5089,7 @@ Steppers 600 110 90 - 176 + 177 @@ -5506,13 +5506,13 @@ Steppers menu_btn - :/button_borders/media/buttons/btn_part1.svg + :/button_borders/media/buttons/btn_part1.svg - :/button_borders/media/buttons/btn_part2.svg + :/button_borders/media/buttons/btn_part2.svg - :/button_borders/media/buttons/btn_part3.svg + :/button_borders/media/buttons/btn_part3.svg icon @@ -5535,16 +5535,6 @@ Steppers - - BlocksCustomButton - QPushButton -
lib.utils.blocks_button
-
- - BlocksLabel - QLabel -
lib.utils.blocks_label
-
IconButton QPushButton @@ -5555,6 +5545,16 @@ Steppers QPushButton
lib.utils.display_button
+ + BlocksCustomButton + QPushButton +
lib.utils.blocks_button
+
+ + BlocksLabel + QLabel +
lib.utils.blocks_label
+
@@ -5571,8 +5571,8 @@ Steppers + - diff --git a/BlocksScreen/lib/ui/controlStackedWidget_ui.py b/BlocksScreen/lib/ui/controlStackedWidget_ui.py index 895a1987..bd95e6fb 100644 --- a/BlocksScreen/lib/ui/controlStackedWidget_ui.py +++ b/BlocksScreen/lib/ui/controlStackedWidget_ui.py @@ -378,7 +378,7 @@ def setupUi(self, controlStackedWidget): self.exp_back_btn.setObjectName("exp_back_btn") self.exp_header_layout.addWidget(self.exp_back_btn) self.verticalLayoutWidget_5 = QtWidgets.QWidget(parent=self.extrude_page) - self.verticalLayoutWidget_5.setGeometry(QtCore.QRect(20, 80, 671, 328)) + self.verticalLayoutWidget_5.setGeometry(QtCore.QRect(20, 80, 671, 330)) self.verticalLayoutWidget_5.setObjectName("verticalLayoutWidget_5") self.exp_vertical_content_layout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_5) self.exp_vertical_content_layout.setContentsMargins(5, 5, 5, 5) @@ -1270,7 +1270,7 @@ def setupUi(self, controlStackedWidget): self.mva_length_group_box.setFlat(True) self.mva_length_group_box.setObjectName("mva_length_group_box") self.horizontalLayoutWidget_5 = QtWidgets.QWidget(parent=self.mva_length_group_box) - self.horizontalLayoutWidget_5.setGeometry(QtCore.QRect(0, 30, 291, 61)) + self.horizontalLayoutWidget_5.setGeometry(QtCore.QRect(0, 30, 291, 62)) self.horizontalLayoutWidget_5.setObjectName("horizontalLayoutWidget_5") self.mva_length_intervals_layout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_5) self.mva_length_intervals_layout.setContentsMargins(0, 0, 0, 0) @@ -1864,7 +1864,7 @@ def setupUi(self, controlStackedWidget): self.z_adjust_back_button.setObjectName("z_adjust_back_button") self.z_adjustment_header_layout.addWidget(self.z_adjust_back_button) self.verticalLayoutWidget_8 = QtWidgets.QWidget(parent=self.z_adjustment_page) - self.verticalLayoutWidget_8.setGeometry(QtCore.QRect(600, 110, 90, 176)) + self.verticalLayoutWidget_8.setGeometry(QtCore.QRect(600, 110, 90, 177)) self.verticalLayoutWidget_8.setObjectName("verticalLayoutWidget_8") self.z_adjust_move_buttons_layout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_8) self.z_adjust_move_buttons_layout.setContentsMargins(5, 5, 5, 5) @@ -2031,7 +2031,7 @@ def setupUi(self, controlStackedWidget): controlStackedWidget.addWidget(self.printer_settings_page) self.retranslateUi(controlStackedWidget) - controlStackedWidget.setCurrentIndex(3) + controlStackedWidget.setCurrentIndex(2) QtCore.QMetaObject.connectSlotsByName(controlStackedWidget) def retranslateUi(self, controlStackedWidget): diff --git a/BlocksScreen/lib/ui/printStackedWidget.ui b/BlocksScreen/lib/ui/printStackedWidget.ui index 4dbbd24e..01d326fb 100644 --- a/BlocksScreen/lib/ui/printStackedWidget.ui +++ b/BlocksScreen/lib/ui/printStackedWidget.ui @@ -418,7 +418,7 @@ color: #ffffff;
- + --> @@ -765,7 +765,7 @@ background-color: transparent;
- + --> @@ -1308,7 +1308,7 @@ background-color: transparent; - + diff --git a/BlocksScreen/lib/ui/printStackedWidget_ui.py b/BlocksScreen/lib/ui/printStackedWidget_ui.py index 8b9f8c17..8fe619ed 100644 --- a/BlocksScreen/lib/ui/printStackedWidget_ui.py +++ b/BlocksScreen/lib/ui/printStackedWidget_ui.py @@ -1,6 +1,6 @@ -# Form implementation generated from reading ui file '/home/bugo/github/Blocks_Screen/BlocksScreen/lib/ui/printStackedWidget.ui' +# Form implementation generated from reading ui file 'printStackedWidget.ui' # -# Created by: PyQt6 UI code generator 6.4.2 +# Created by: PyQt6 UI code generator 6.9.1 # # WARNING: Any manual changes made to this file will be lost when pyuic6 is # run again. Do not edit this file unless you know what you are doing. @@ -772,85 +772,12 @@ def setupUi(self, printStackedWidget): self.verticalLayout.addLayout(self.bbp_header_layout) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.frame_2 = QtWidgets.QFrame(parent=self.babystep_page) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) - self.frame_2.setSizePolicy(sizePolicy) - self.frame_2.setMinimumSize(QtCore.QSize(350, 160)) - self.frame_2.setMaximumSize(QtCore.QSize(350, 160)) - self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.frame_2.setObjectName("frame_2") - self.bbp_babystep_graphic = QtWidgets.QLabel(parent=self.frame_2) - self.bbp_babystep_graphic.setGeometry(QtCore.QRect(0, 30, 371, 121)) - self.bbp_babystep_graphic.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft) - self.bbp_babystep_graphic.setText("") - self.bbp_babystep_graphic.setPixmap(QtGui.QPixmap(":/graphics/media/graphics/babystep_graphic.png")) - self.bbp_babystep_graphic.setScaledContents(False) - self.bbp_babystep_graphic.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.bbp_babystep_graphic.setObjectName("bbp_babystep_graphic") - self.bbp_z_offset_current_value = BlocksLabel(parent=self.frame_2) - self.bbp_z_offset_current_value.setGeometry(QtCore.QRect(130, 70, 200, 60)) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.bbp_z_offset_current_value.sizePolicy().hasHeightForWidth()) - self.bbp_z_offset_current_value.setSizePolicy(sizePolicy) - self.bbp_z_offset_current_value.setMinimumSize(QtCore.QSize(150, 60)) - self.bbp_z_offset_current_value.setMaximumSize(QtCore.QSize(200, 60)) - font = QtGui.QFont() - font.setPointSize(13) - self.bbp_z_offset_current_value.setFont(font) - self.bbp_z_offset_current_value.setStyleSheet("background: transparent; color: white;") - self.bbp_z_offset_current_value.setText("") - self.bbp_z_offset_current_value.setPixmap(QtGui.QPixmap(":/graphics/media/btn_icons/z_offset_adjust.svg")) - self.bbp_z_offset_current_value.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.bbp_z_offset_current_value.setObjectName("bbp_z_offset_current_value") - self.horizontalLayout_2.addWidget(self.frame_2, 0, QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignVCenter) - self.bbp_buttons_layout = QtWidgets.QVBoxLayout() - self.bbp_buttons_layout.setContentsMargins(5, 5, 5, 5) - self.bbp_buttons_layout.setObjectName("bbp_buttons_layout") - self.bbp_away_from_bed = BlocksCustomButton(parent=self.babystep_page) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.bbp_away_from_bed.sizePolicy().hasHeightForWidth()) - self.bbp_away_from_bed.setSizePolicy(sizePolicy) - self.bbp_away_from_bed.setMinimumSize(QtCore.QSize(80, 80)) - self.bbp_away_from_bed.setMaximumSize(QtCore.QSize(80, 80)) - self.bbp_away_from_bed.setFlat(True) - self.bbp_away_from_bed.setProperty("icon_pixmap", QtGui.QPixmap(":/arrow_icons/media/btn_icons/up_arrow.svg")) - self.bbp_away_from_bed.setObjectName("bbp_away_from_bed") - self.bbp_option_button_group = QtWidgets.QButtonGroup(printStackedWidget) - self.bbp_option_button_group.setObjectName("bbp_option_button_group") - self.bbp_option_button_group.addButton(self.bbp_away_from_bed) - self.bbp_buttons_layout.addWidget(self.bbp_away_from_bed, 0, QtCore.Qt.AlignmentFlag.AlignRight) - self.bbp_close_to_bed = BlocksCustomButton(parent=self.babystep_page) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.bbp_close_to_bed.sizePolicy().hasHeightForWidth()) - self.bbp_close_to_bed.setSizePolicy(sizePolicy) - self.bbp_close_to_bed.setMinimumSize(QtCore.QSize(80, 80)) - self.bbp_close_to_bed.setMaximumSize(QtCore.QSize(80, 80)) - self.bbp_close_to_bed.setFlat(True) - self.bbp_close_to_bed.setProperty("icon_pixmap", QtGui.QPixmap(":/arrow_icons/media/btn_icons/down_arrow.svg")) - self.bbp_close_to_bed.setObjectName("bbp_close_to_bed") - self.bbp_option_button_group.addButton(self.bbp_close_to_bed) - self.bbp_buttons_layout.addWidget(self.bbp_close_to_bed, 0, QtCore.Qt.AlignmentFlag.AlignRight) - self.bbp_buttons_layout.setStretch(0, 1) - self.bbp_buttons_layout.setStretch(1, 1) - self.horizontalLayout_2.addLayout(self.bbp_buttons_layout) - self.horizontalLayout_2.setStretch(0, 1) - self.verticalLayout.addLayout(self.horizontalLayout_2) - self.bbp_offset_steps_buttons = QtWidgets.QHBoxLayout() - self.bbp_offset_steps_buttons.setContentsMargins(9, 9, 9, 9) - self.bbp_offset_steps_buttons.setObjectName("bbp_offset_steps_buttons") - self.bbp_nozzle_offset_01 = QtWidgets.QPushButton(parent=self.babystep_page) - self.bbp_nozzle_offset_01.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_01.setMaximumSize(QtCore.QSize(100, 80)) + self.verticalLayout_6 = QtWidgets.QVBoxLayout() + self.verticalLayout_6.setContentsMargins(9, 9, 9, 9) + self.verticalLayout_6.setObjectName("verticalLayout_6") + self.bbp_nozzle_offset_1 = QtWidgets.QPushButton(parent=self.babystep_page) + self.bbp_nozzle_offset_1.setMinimumSize(QtCore.QSize(60, 60)) + self.bbp_nozzle_offset_1.setMaximumSize(QtCore.QSize(100, 80)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -870,26 +797,27 @@ def setupUi(self, printStackedWidget): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.ButtonText, brush) - self.bbp_nozzle_offset_01.setPalette(palette) + self.bbp_nozzle_offset_1.setPalette(palette) font = QtGui.QFont() font.setPointSize(14) - self.bbp_nozzle_offset_01.setFont(font) - self.bbp_nozzle_offset_01.setCheckable(True) - self.bbp_nozzle_offset_01.setFlat(True) - self.bbp_nozzle_offset_01.setProperty("button_type", "") - self.bbp_nozzle_offset_01.setObjectName("bbp_nozzle_offset_01") + self.bbp_nozzle_offset_1.setFont(font) + self.bbp_nozzle_offset_1.setCheckable(True) + self.bbp_nozzle_offset_1.setChecked(True) + self.bbp_nozzle_offset_1.setFlat(True) + self.bbp_nozzle_offset_1.setProperty("button_type", "") + self.bbp_nozzle_offset_1.setObjectName("bbp_nozzle_offset_1") self.bbp_offset_value_selector_group = QtWidgets.QButtonGroup(printStackedWidget) self.bbp_offset_value_selector_group.setObjectName("bbp_offset_value_selector_group") - self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_01) - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_01) - self.line_3 = QtWidgets.QFrame(parent=self.babystep_page) - self.line_3.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_3.setObjectName("line_3") - self.bbp_offset_steps_buttons.addWidget(self.line_3) - self.bbp_nozzle_offset_025 = QtWidgets.QPushButton(parent=self.babystep_page) - self.bbp_nozzle_offset_025.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_025.setMaximumSize(QtCore.QSize(100, 80)) + self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_1) + self.verticalLayout_6.addWidget(self.bbp_nozzle_offset_1) + self.line_2 = QtWidgets.QFrame(parent=self.babystep_page) + self.line_2.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_2.setObjectName("line_2") + self.verticalLayout_6.addWidget(self.line_2) + self.bbp_nozzle_offset_05 = QtWidgets.QPushButton(parent=self.babystep_page) + self.bbp_nozzle_offset_05.setMinimumSize(QtCore.QSize(60, 60)) + self.bbp_nozzle_offset_05.setMaximumSize(QtCore.QSize(100, 80)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -909,24 +837,24 @@ def setupUi(self, printStackedWidget): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.ButtonText, brush) - self.bbp_nozzle_offset_025.setPalette(palette) + self.bbp_nozzle_offset_05.setPalette(palette) font = QtGui.QFont() font.setPointSize(14) - self.bbp_nozzle_offset_025.setFont(font) - self.bbp_nozzle_offset_025.setCheckable(True) - self.bbp_nozzle_offset_025.setFlat(True) - self.bbp_nozzle_offset_025.setProperty("button_type", "") - self.bbp_nozzle_offset_025.setObjectName("bbp_nozzle_offset_025") - self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_025) - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_025) - self.line_4 = QtWidgets.QFrame(parent=self.babystep_page) - self.line_4.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_4.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_4.setObjectName("line_4") - self.bbp_offset_steps_buttons.addWidget(self.line_4) - self.bbp_nozzle_offset_05 = QtWidgets.QPushButton(parent=self.babystep_page) - self.bbp_nozzle_offset_05.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_05.setMaximumSize(QtCore.QSize(100, 80)) + self.bbp_nozzle_offset_05.setFont(font) + self.bbp_nozzle_offset_05.setCheckable(True) + self.bbp_nozzle_offset_05.setFlat(True) + self.bbp_nozzle_offset_05.setProperty("button_type", "") + self.bbp_nozzle_offset_05.setObjectName("bbp_nozzle_offset_05") + self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_05) + self.verticalLayout_6.addWidget(self.bbp_nozzle_offset_05) + self.line_3 = QtWidgets.QFrame(parent=self.babystep_page) + self.line_3.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_3.setObjectName("line_3") + self.verticalLayout_6.addWidget(self.line_3) + self.bbp_nozzle_offset_025 = QtWidgets.QPushButton(parent=self.babystep_page) + self.bbp_nozzle_offset_025.setMinimumSize(QtCore.QSize(60, 60)) + self.bbp_nozzle_offset_025.setMaximumSize(QtCore.QSize(100, 80)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -946,24 +874,24 @@ def setupUi(self, printStackedWidget): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.ButtonText, brush) - self.bbp_nozzle_offset_05.setPalette(palette) + self.bbp_nozzle_offset_025.setPalette(palette) font = QtGui.QFont() font.setPointSize(14) - self.bbp_nozzle_offset_05.setFont(font) - self.bbp_nozzle_offset_05.setCheckable(True) - self.bbp_nozzle_offset_05.setFlat(True) - self.bbp_nozzle_offset_05.setProperty("button_type", "") - self.bbp_nozzle_offset_05.setObjectName("bbp_nozzle_offset_05") - self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_05) - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_05) - self.line_5 = QtWidgets.QFrame(parent=self.babystep_page) - self.line_5.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_5.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_5.setObjectName("line_5") - self.bbp_offset_steps_buttons.addWidget(self.line_5) - self.bbp_nozzle_offset_1 = QtWidgets.QPushButton(parent=self.babystep_page) - self.bbp_nozzle_offset_1.setMinimumSize(QtCore.QSize(60, 60)) - self.bbp_nozzle_offset_1.setMaximumSize(QtCore.QSize(100, 80)) + self.bbp_nozzle_offset_025.setFont(font) + self.bbp_nozzle_offset_025.setCheckable(True) + self.bbp_nozzle_offset_025.setFlat(True) + self.bbp_nozzle_offset_025.setProperty("button_type", "") + self.bbp_nozzle_offset_025.setObjectName("bbp_nozzle_offset_025") + self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_025) + self.verticalLayout_6.addWidget(self.bbp_nozzle_offset_025) + self.line_4 = QtWidgets.QFrame(parent=self.babystep_page) + self.line_4.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_4.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_4.setObjectName("line_4") + self.verticalLayout_6.addWidget(self.line_4) + self.bbp_nozzle_offset_01 = QtWidgets.QPushButton(parent=self.babystep_page) + self.bbp_nozzle_offset_01.setMinimumSize(QtCore.QSize(60, 60)) + self.bbp_nozzle_offset_01.setMaximumSize(QtCore.QSize(100, 80)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -983,23 +911,100 @@ def setupUi(self, printStackedWidget): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.ButtonText, brush) - self.bbp_nozzle_offset_1.setPalette(palette) + self.bbp_nozzle_offset_01.setPalette(palette) font = QtGui.QFont() font.setPointSize(14) - self.bbp_nozzle_offset_1.setFont(font) - self.bbp_nozzle_offset_1.setCheckable(True) - self.bbp_nozzle_offset_1.setChecked(True) - self.bbp_nozzle_offset_1.setFlat(True) - self.bbp_nozzle_offset_1.setProperty("button_type", "") - self.bbp_nozzle_offset_1.setObjectName("bbp_nozzle_offset_1") - self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_1) - self.bbp_offset_steps_buttons.addWidget(self.bbp_nozzle_offset_1) - self.verticalLayout.addLayout(self.bbp_offset_steps_buttons) + self.bbp_nozzle_offset_01.setFont(font) + self.bbp_nozzle_offset_01.setCheckable(True) + self.bbp_nozzle_offset_01.setFlat(True) + self.bbp_nozzle_offset_01.setProperty("button_type", "") + self.bbp_nozzle_offset_01.setObjectName("bbp_nozzle_offset_01") + self.bbp_offset_value_selector_group.addButton(self.bbp_nozzle_offset_01) + self.verticalLayout_6.addWidget(self.bbp_nozzle_offset_01) + self.horizontalLayout_2.addLayout(self.verticalLayout_6) + self.line_5 = QtWidgets.QFrame(parent=self.babystep_page) + self.line_5.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_5.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_5.setObjectName("line_5") + self.horizontalLayout_2.addWidget(self.line_5) + self.frame_2 = QtWidgets.QFrame(parent=self.babystep_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) + self.frame_2.setSizePolicy(sizePolicy) + self.frame_2.setMinimumSize(QtCore.QSize(350, 160)) + self.frame_2.setMaximumSize(QtCore.QSize(350, 160)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_2.setObjectName("frame_2") + self.bbp_babystep_graphic = QtWidgets.QLabel(parent=self.frame_2) + self.bbp_babystep_graphic.setGeometry(QtCore.QRect(0, 30, 371, 121)) + self.bbp_babystep_graphic.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft) + self.bbp_babystep_graphic.setText("") + self.bbp_babystep_graphic.setPixmap(QtGui.QPixmap(":/graphics/media/graphics/babystep_graphic.png")) + self.bbp_babystep_graphic.setScaledContents(False) + self.bbp_babystep_graphic.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.bbp_babystep_graphic.setObjectName("bbp_babystep_graphic") + self.bbp_z_offset_current_value = BlocksLabel(parent=self.frame_2) + self.bbp_z_offset_current_value.setGeometry(QtCore.QRect(130, 70, 200, 60)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.bbp_z_offset_current_value.sizePolicy().hasHeightForWidth()) + self.bbp_z_offset_current_value.setSizePolicy(sizePolicy) + self.bbp_z_offset_current_value.setMinimumSize(QtCore.QSize(150, 60)) + self.bbp_z_offset_current_value.setMaximumSize(QtCore.QSize(200, 60)) + font = QtGui.QFont() + font.setPointSize(13) + self.bbp_z_offset_current_value.setFont(font) + self.bbp_z_offset_current_value.setStyleSheet("background: transparent; color: white;") + self.bbp_z_offset_current_value.setText("") + self.bbp_z_offset_current_value.setPixmap(QtGui.QPixmap(":/graphics/media/btn_icons/z_offset_adjust.svg")) + self.bbp_z_offset_current_value.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.bbp_z_offset_current_value.setObjectName("bbp_z_offset_current_value") + self.horizontalLayout_2.addWidget(self.frame_2, 0, QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.bbp_buttons_layout = QtWidgets.QVBoxLayout() + self.bbp_buttons_layout.setContentsMargins(5, 5, 5, 5) + self.bbp_buttons_layout.setObjectName("bbp_buttons_layout") + self.bbp_away_from_bed = BlocksCustomButton(parent=self.babystep_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.bbp_away_from_bed.sizePolicy().hasHeightForWidth()) + self.bbp_away_from_bed.setSizePolicy(sizePolicy) + self.bbp_away_from_bed.setMinimumSize(QtCore.QSize(80, 80)) + self.bbp_away_from_bed.setMaximumSize(QtCore.QSize(80, 80)) + self.bbp_away_from_bed.setFlat(True) + self.bbp_away_from_bed.setProperty("icon_pixmap", QtGui.QPixmap(":/arrow_icons/media/btn_icons/up_arrow.svg")) + self.bbp_away_from_bed.setObjectName("bbp_away_from_bed") + self.bbp_option_button_group = QtWidgets.QButtonGroup(printStackedWidget) + self.bbp_option_button_group.setObjectName("bbp_option_button_group") + self.bbp_option_button_group.addButton(self.bbp_away_from_bed) + self.bbp_buttons_layout.addWidget(self.bbp_away_from_bed, 0, QtCore.Qt.AlignmentFlag.AlignRight) + self.bbp_close_to_bed = BlocksCustomButton(parent=self.babystep_page) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.bbp_close_to_bed.sizePolicy().hasHeightForWidth()) + self.bbp_close_to_bed.setSizePolicy(sizePolicy) + self.bbp_close_to_bed.setMinimumSize(QtCore.QSize(80, 80)) + self.bbp_close_to_bed.setMaximumSize(QtCore.QSize(80, 80)) + self.bbp_close_to_bed.setFlat(True) + self.bbp_close_to_bed.setProperty("icon_pixmap", QtGui.QPixmap(":/arrow_icons/media/btn_icons/down_arrow.svg")) + self.bbp_close_to_bed.setObjectName("bbp_close_to_bed") + self.bbp_option_button_group.addButton(self.bbp_close_to_bed) + self.bbp_buttons_layout.addWidget(self.bbp_close_to_bed, 0, QtCore.Qt.AlignmentFlag.AlignRight) + self.bbp_buttons_layout.setStretch(0, 1) + self.bbp_buttons_layout.setStretch(1, 1) + self.horizontalLayout_2.addLayout(self.bbp_buttons_layout) + self.horizontalLayout_2.setStretch(2, 1) + self.verticalLayout.addLayout(self.horizontalLayout_2) self.verticalLayout.setStretch(1, 1) printStackedWidget.addWidget(self.babystep_page) self.retranslateUi(printStackedWidget) - printStackedWidget.setCurrentIndex(2) + printStackedWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(printStackedWidget) def retranslateUi(self, printStackedWidget): @@ -1060,14 +1065,14 @@ def retranslateUi(self, printStackedWidget): self.speed_display.setProperty("button_type", _translate("printStackedWidget", "display")) self.bbp_header_title.setText(_translate("printStackedWidget", "Z Babystep")) self.babystep_back_btn.setProperty("button_type", _translate("printStackedWidget", "icon")) + self.bbp_nozzle_offset_1.setText(_translate("printStackedWidget", "0.1")) + self.bbp_nozzle_offset_05.setText(_translate("printStackedWidget", "0.05")) + self.bbp_nozzle_offset_025.setText(_translate("printStackedWidget", "0.025")) + self.bbp_nozzle_offset_01.setText(_translate("printStackedWidget", "0.01")) self.bbp_away_from_bed.setText(_translate("printStackedWidget", "~^")) self.bbp_away_from_bed.setProperty("button_type", _translate("printStackedWidget", "icon")) self.bbp_close_to_bed.setText(_translate("printStackedWidget", "^")) self.bbp_close_to_bed.setProperty("button_type", _translate("printStackedWidget", "icon")) - self.bbp_nozzle_offset_01.setText(_translate("printStackedWidget", "0.01")) - self.bbp_nozzle_offset_025.setText(_translate("printStackedWidget", "0.025")) - self.bbp_nozzle_offset_05.setText(_translate("printStackedWidget", "0.05")) - self.bbp_nozzle_offset_1.setText(_translate("printStackedWidget", "0.1")) from lib.utils.blocks_button import BlocksCustomButton from lib.utils.blocks_label import BlocksLabel from lib.utils.display_button import DisplayButton diff --git a/BlocksScreen/lib/ui/resources/background_resources_rc.py b/BlocksScreen/lib/ui/resources/background_resources_rc.py index af33bd2a..b0d795b7 100644 --- a/BlocksScreen/lib/ui/resources/background_resources_rc.py +++ b/BlocksScreen/lib/ui/resources/background_resources_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14) +# Created by: The Resource Compiler for PyQt6 (Qt v5.15.14) # # WARNING! All changes made in this file will be lost! @@ -9358,9 +9358,9 @@ \x00\x00\x00\x1a\x00\x02\x00\x00\x00\x02\x00\x00\x00\x03\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x95\x80\xac\x82\x07\ +\x00\x00\x01\x98\x51\xb9\x78\xec\ \x00\x00\x00\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xfc\ -\x00\x00\x01\x95\x80\xac\x80\x2d\ +\x00\x00\x01\x98\x51\xb9\x78\x3c\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] diff --git a/BlocksScreen/lib/ui/resources/font_rc.py b/BlocksScreen/lib/ui/resources/font_rc.py index 739e03be..01d59ae7 100644 --- a/BlocksScreen/lib/ui/resources/font_rc.py +++ b/BlocksScreen/lib/ui/resources/font_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14) +# Created by: The Resource Compiler for PyQt6 (Qt v5.15.14) # # WARNING! All changes made in this file will be lost! @@ -5066,9 +5066,9 @@ \x00\x00\x00\x1e\x00\x02\x00\x00\x00\x02\x00\x00\x00\x04\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x40\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x95\x80\xac\x96\x55\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x9f\x10\ -\x00\x00\x01\x95\x80\xac\x96\x79\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] diff --git a/BlocksScreen/lib/ui/resources/graphic_resources_rc.py b/BlocksScreen/lib/ui/resources/graphic_resources_rc.py index 8130f61e..8bc7b1d3 100644 --- a/BlocksScreen/lib/ui/resources/graphic_resources_rc.py +++ b/BlocksScreen/lib/ui/resources/graphic_resources_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14) +# Created by: The Resource Compiler for PyQt6 (Qt v5.15.14) # # WARNING! All changes made in this file will be lost! @@ -568,7 +568,7 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x95\x80\xac\x9b\xc7\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] diff --git a/BlocksScreen/lib/ui/resources/icon_resources_rc.py b/BlocksScreen/lib/ui/resources/icon_resources_rc.py index 558a9252..7bb04534 100644 --- a/BlocksScreen/lib/ui/resources/icon_resources_rc.py +++ b/BlocksScreen/lib/ui/resources/icon_resources_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14) +# Created by: The Resource Compiler for PyQt6 (Qt v5.15.14) # # WARNING! All changes made in this file will be lost! @@ -25197,75 +25197,75 @@ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x0d\x00\x00\x00\x12\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x01\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x08\x66\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x01\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x09\x52\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x02\x20\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x35\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x02\x48\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x18\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x06\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x02\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x14\x42\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x02\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x1d\xf7\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x02\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x22\x41\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x03\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x26\x90\ -\x00\x00\x01\x96\x67\x94\xac\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x6e\ -\x00\x00\x01\x96\x67\x94\xac\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x03\x52\x00\x00\x00\x00\x00\x01\x00\x00\x30\xca\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x03\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x32\xb1\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x20\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x04\x00\x00\x00\x21\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x03\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x3a\x55\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x03\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x3c\xcf\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x03\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x3f\x43\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x03\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x41\xbf\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x26\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x27\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x04\x20\x00\x00\x00\x00\x00\x01\x00\x00\x44\x3b\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x04\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x45\x3c\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x04\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x54\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x56\x16\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x04\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x58\x86\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x04\xea\x00\x00\x00\x00\x00\x01\x00\x00\x5e\x1e\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x05\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x62\x7a\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x05\x48\x00\x00\x00\x00\x00\x01\x00\x00\x69\x07\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x05\x64\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x03\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x05\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x6d\x01\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x32\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x02\x00\x00\x00\x33\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x05\xbe\x00\x01\x00\x00\x00\x01\x00\x00\x77\x6b\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x05\xd0\x00\x00\x00\x00\x00\x01\x00\x02\x3a\xc0\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x02\x00\x00\x00\x36\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x06\x00\x00\x00\x3f\ @@ -25273,259 +25273,259 @@ \x00\x00\x05\xe4\x00\x02\x00\x00\x00\x07\x00\x00\x00\x38\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x05\xf6\x00\x00\x00\x00\x00\x01\x00\x02\x3f\x46\ -\x00\x00\x01\x95\x80\xac\x7d\x6d\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x06\x2a\x00\x00\x00\x00\x00\x01\x00\x02\x49\xaa\ -\x00\x00\x01\x95\x80\xac\x7f\x44\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x06\x5e\x00\x00\x00\x00\x00\x01\x00\x02\x53\xd3\ -\x00\x00\x01\x95\x80\xac\x7c\xdf\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x06\x98\x00\x00\x00\x00\x00\x01\x00\x02\x5e\x2b\ -\x00\x00\x01\x95\x80\xac\x7e\xbb\ +\x00\x00\x01\x98\x51\xb9\x78\xf8\ \x00\x00\x06\xcc\x00\x00\x00\x00\x00\x01\x00\x02\x68\x43\ -\x00\x00\x01\x95\x80\xac\x7e\x0c\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x07\x02\x00\x00\x00\x00\x00\x01\x00\x02\x72\x6c\ -\x00\x00\x01\x95\x80\xac\x80\x06\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x07\x3a\x00\x00\x00\x00\x00\x01\x00\x02\x7c\x82\ -\x00\x00\x01\x95\x80\xac\x7e\xe6\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x07\x70\x00\x00\x00\x00\x00\x01\x00\x02\x86\xe8\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x07\x98\x00\x00\x00\x00\x00\x01\x00\x02\x91\x17\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x07\xc4\x00\x00\x00\x00\x00\x01\x00\x02\x9b\x5e\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x08\x00\x00\x00\x00\x00\x00\x01\x00\x02\x9d\x5f\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x08\x2c\x00\x00\x00\x00\x00\x01\x00\x02\xb8\xa4\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x08\x58\x00\x00\x00\x00\x00\x01\x00\x02\xbd\xed\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x46\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x02\x00\x00\x00\x47\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x08\x8c\x00\x00\x00\x00\x00\x01\x00\x02\xc1\x65\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x08\xaa\x00\x00\x00\x00\x00\x01\x00\x02\xca\x47\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x4a\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x0d\x00\x00\x00\x4b\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x08\xbe\x00\x00\x00\x00\x00\x01\x00\x02\xcf\x7c\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x08\xe6\x00\x00\x00\x00\x00\x01\x00\x02\xd4\x77\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x09\x1e\x00\x00\x00\x00\x00\x01\x00\x02\xdd\x4b\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x09\x56\x00\x00\x00\x00\x00\x01\x00\x02\xe5\xef\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x09\x86\x00\x00\x00\x00\x00\x01\x00\x02\xed\x8e\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x09\xaa\x00\x00\x00\x00\x00\x01\x00\x02\xf5\x6a\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x09\xce\x00\x00\x00\x00\x00\x01\x00\x02\xfd\x20\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0a\x02\x00\x00\x00\x00\x00\x01\x00\x03\x05\x2e\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0a\x36\x00\x00\x00\x00\x00\x01\x00\x03\x0d\x10\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0a\x6a\x00\x00\x00\x00\x00\x01\x00\x03\x14\xda\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0a\xa4\x00\x00\x00\x00\x00\x01\x00\x03\x1c\x41\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0a\xc8\x00\x00\x00\x00\x00\x01\x00\x03\x1f\xfe\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0a\xf6\x00\x00\x00\x00\x00\x01\x00\x03\x23\xd7\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x59\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x07\x00\x00\x00\x5a\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x0b\x1c\x00\x00\x00\x00\x00\x01\x00\x03\x29\xe0\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x0b\x48\x00\x00\x00\x00\x00\x01\x00\x03\x4c\x64\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x0b\x76\x00\x00\x00\x00\x00\x01\x00\x03\x52\x51\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x0b\xa0\x00\x00\x00\x00\x00\x01\x00\x03\x54\x71\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x0b\xc8\x00\x00\x00\x00\x00\x01\x00\x03\x5d\x09\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x0b\xe2\x00\x00\x00\x00\x00\x01\x00\x03\x6c\x52\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x0c\x0e\x00\x00\x00\x00\x00\x01\x00\x03\x72\xd0\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x62\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x63\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x0c\x36\x00\x00\x00\x00\x00\x01\x00\x03\x7d\x4a\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0c\x64\x00\x00\x00\x00\x00\x01\x00\x03\x7f\xf1\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x0c\x92\x00\x01\x00\x00\x00\x01\x00\x03\x8c\x6e\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0c\xbe\x00\x00\x00\x00\x00\x01\x00\x03\xb9\xed\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0c\xde\x00\x00\x00\x00\x00\x01\x00\x03\xbe\xa4\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0d\x10\x00\x01\x00\x00\x00\x01\x00\x04\x17\x9d\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0d\x42\x00\x00\x00\x00\x00\x01\x00\x04\x4c\x37\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0d\x5c\x00\x00\x00\x00\x00\x01\x00\x04\x51\x81\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x0d\x76\x00\x00\x00\x00\x00\x01\x00\x04\x57\x10\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x0d\x90\x00\x00\x00\x00\x00\x01\x00\x04\x5c\x79\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x0d\xa8\x00\x00\x00\x00\x00\x01\x00\x04\x68\x57\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x0d\xc6\x00\x00\x00\x00\x00\x01\x00\x04\x6e\x5b\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x70\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x04\x00\x00\x00\x71\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x0d\xee\x00\x00\x00\x00\x00\x01\x00\x04\x73\x90\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0e\x02\x00\x00\x00\x00\x00\x01\x00\x04\x79\x8d\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0e\x14\x00\x00\x00\x00\x00\x01\x00\x04\x7b\x13\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0e\x26\x00\x00\x00\x00\x00\x01\x00\x04\x81\x0d\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x76\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x02\x00\x00\x00\x77\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x0e\x3a\x00\x00\x00\x00\x00\x01\x00\x04\x83\x63\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0e\x66\x00\x00\x00\x00\x00\x01\x00\x04\x8a\x4a\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x7a\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x09\x00\x00\x00\x7b\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x0e\x8a\x00\x00\x00\x00\x00\x01\x00\x04\x93\xae\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x3c\ \x00\x00\x0e\xaa\x00\x01\x00\x00\x00\x01\x00\x04\x96\x5a\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x0e\xce\x00\x00\x00\x00\x00\x01\x00\x04\xa1\xab\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x0e\xf0\x00\x00\x00\x00\x00\x01\x00\x04\xa9\x50\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x0f\x0c\x00\x00\x00\x00\x00\x01\x00\x04\xba\x50\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x0f\x30\x00\x00\x00\x00\x00\x01\x00\x04\xc3\xd1\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x0f\x50\x00\x00\x00\x00\x00\x01\x00\x04\xc9\x6e\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x0f\x78\x00\x00\x00\x00\x00\x01\x00\x04\xd3\x37\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x3c\ \x00\x00\x0f\x98\x00\x00\x00\x00\x00\x01\x00\x04\xd7\x1a\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x85\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x09\x00\x00\x00\x86\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x0f\xb4\x00\x00\x00\x00\x00\x01\x00\x04\xdd\x55\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x0f\xe4\x00\x00\x00\x00\x00\x01\x00\x04\xe6\xeb\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x10\x14\x00\x00\x00\x00\x00\x01\x00\x04\xf2\xc7\ -\x00\x00\x01\x96\x90\x6d\xef\x70\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x10\x38\x00\x00\x00\x00\x00\x01\x00\x04\xf9\x0b\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x10\x62\x00\x00\x00\x00\x00\x01\x00\x05\x00\x94\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x10\x8e\x00\x00\x00\x00\x00\x01\x00\x05\x06\xf2\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x10\xc4\x00\x00\x00\x00\x00\x01\x00\x05\x0e\xe1\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x08\xaa\x00\x00\x00\x00\x00\x01\x00\x05\x1c\x84\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x10\xe2\x00\x00\x00\x00\x00\x01\x00\x05\x21\xb9\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x90\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x01\x00\x00\x00\x91\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x10\xfc\x00\x00\x00\x00\x00\x01\x00\x05\x2b\x8e\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x01\x88\x00\x02\x00\x00\x00\x01\x00\x00\x00\x93\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x01\x98\x00\x02\x00\x00\x00\x23\x00\x00\x00\x94\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x11\x1c\x00\x00\x00\x00\x00\x01\x00\x05\x30\x54\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x11\x32\x00\x00\x00\x00\x00\x01\x00\x05\x38\x08\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x11\x4a\x00\x00\x00\x00\x00\x01\x00\x05\x3a\x2d\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x11\x82\x00\x00\x00\x00\x00\x01\x00\x05\x3b\xad\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x11\x9e\x00\x00\x00\x00\x00\x01\x00\x05\x43\x5a\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x11\xbe\x00\x00\x00\x00\x00\x01\x00\x05\x48\x2f\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x11\xd4\x00\x00\x00\x00\x00\x01\x00\x05\x49\x1f\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x11\xea\x00\x00\x00\x00\x00\x01\x00\x05\x4c\x03\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x12\x10\x00\x00\x00\x00\x00\x01\x00\x05\x52\x3a\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x12\x26\x00\x00\x00\x00\x00\x01\x00\x05\x55\x39\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x12\x3c\x00\x00\x00\x00\x00\x01\x00\x05\x5b\x43\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x12\x6e\x00\x00\x00\x00\x00\x01\x00\x05\x5e\x92\ -\x00\x00\x01\x97\xa7\xa2\x2a\x9b\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x12\x86\x00\x00\x00\x00\x00\x01\x00\x05\x68\x13\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x12\x9c\x00\x00\x00\x00\x00\x01\x00\x05\x6e\x0a\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x12\xc2\x00\x00\x00\x00\x00\x01\x00\x05\x77\xbe\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x12\xec\x00\x00\x00\x00\x00\x01\x00\x05\x7b\x0c\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x13\x0e\x00\x00\x00\x00\x00\x01\x00\x05\x7e\x9a\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x13\x22\x00\x00\x00\x00\x00\x01\x00\x05\x88\x6c\ -\x00\x00\x01\x96\x90\x7a\xe7\xc0\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x13\x4e\x00\x00\x00\x00\x00\x01\x00\x05\x8d\xb6\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x13\x76\x00\x00\x00\x00\x00\x01\x00\x05\x93\xbd\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x13\x8c\x00\x00\x00\x00\x00\x01\x00\x05\x94\xa1\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x13\xb8\x00\x00\x00\x00\x00\x01\x00\x05\x96\xea\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x50\ \x00\x00\x13\xce\x00\x00\x00\x00\x00\x01\x00\x05\x9d\x9a\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x13\xea\x00\x00\x00\x00\x00\x01\x00\x05\xa0\xde\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x14\x02\x00\x00\x00\x00\x00\x01\x00\x05\xa2\x0a\ -\x00\x00\x01\x96\x90\x7a\xd4\x38\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x14\x1c\x00\x00\x00\x00\x00\x01\x00\x05\xa7\xcb\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x14\x3e\x00\x00\x00\x00\x00\x01\x00\x05\xa8\xed\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x14\x5c\x00\x00\x00\x00\x00\x01\x00\x05\xae\xe0\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x14\x7c\x00\x00\x00\x00\x00\x01\x00\x05\xb1\xe4\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x14\x9e\x00\x00\x00\x00\x00\x01\x00\x05\xb3\x05\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x14\xbe\x00\x00\x00\x00\x00\x01\x00\x05\xb5\xd9\ -\x00\x00\x01\x96\x90\x7a\xdf\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ \x00\x00\x14\xec\x00\x00\x00\x00\x00\x01\x00\x05\xbe\x45\ -\x00\x00\x01\x96\x90\x6d\xf3\x58\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ \x00\x00\x15\x10\x00\x00\x00\x00\x00\x01\x00\x05\xc6\x05\ -\x00\x00\x01\x96\x90\x7a\xdc\x08\ +\x00\x00\x01\x98\x51\xb9\x78\x48\ \x00\x00\x15\x34\x00\x00\x00\x00\x00\x01\x00\x05\xcb\x20\ -\x00\x00\x01\x96\x90\x7a\xd8\x20\ +\x00\x00\x01\x98\x51\xb9\x78\x44\ \x00\x00\x15\x5c\x00\x00\x00\x00\x00\x01\x00\x05\xcc\x73\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x40\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] diff --git a/BlocksScreen/lib/ui/resources/main_menu_resources_rc.py b/BlocksScreen/lib/ui/resources/main_menu_resources_rc.py index c4e463df..a548aeab 100644 --- a/BlocksScreen/lib/ui/resources/main_menu_resources_rc.py +++ b/BlocksScreen/lib/ui/resources/main_menu_resources_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14) +# Created by: The Resource Compiler for PyQt6 (Qt v5.15.14) # # WARNING! All changes made in this file will be lost! @@ -28766,29 +28766,29 @@ \x00\x00\x00\x20\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x04\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x38\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x95\x80\xac\x7c\x4b\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x85\x4c\ -\x00\x00\x01\x95\x80\xac\x7a\x88\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x00\xd6\x9c\ -\x00\x00\x01\x95\x80\xac\x7b\x52\ +\x00\x00\x01\x98\x51\xb9\x78\xec\ \x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x01\x89\x56\ -\x00\x00\x01\x95\x80\xac\x7c\x8f\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x00\xe0\x00\x00\x00\x00\x00\x01\x00\x02\x61\x5c\ -\x00\x00\x01\x95\x80\xac\x7a\xbc\ +\x00\x00\x01\x98\x51\xb9\x78\xec\ \x00\x00\x01\x16\x00\x00\x00\x00\x00\x01\x00\x03\x01\x56\ -\x00\x00\x01\x95\x80\xac\x7a\xf4\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x01\x40\x00\x00\x00\x00\x00\x01\x00\x03\x5a\x9f\ -\x00\x00\x01\x95\x80\xac\x7b\x17\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x01\x70\x00\x00\x00\x00\x00\x01\x00\x03\xce\x01\ -\x00\x00\x01\x95\x80\xac\x7c\x04\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x01\xaa\x00\x00\x00\x00\x00\x01\x00\x04\x2d\x70\ -\x00\x00\x01\x95\x80\xac\x7c\x2c\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x01\xe2\x00\x00\x00\x00\x00\x01\x00\x05\x01\xcf\ -\x00\x00\x01\x95\x80\xac\x7b\x7f\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x02\x1c\x00\x00\x00\x00\x00\x01\x00\x05\xb6\xcc\ -\x00\x00\x01\x95\x80\xac\x7a\xd6\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ \x00\x00\x02\x52\x00\x00\x00\x00\x00\x01\x00\x06\x73\x46\ -\x00\x00\x01\x95\x80\xac\x7b\xdf\ +\x00\x00\x01\x98\x51\xb9\x78\xf0\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] diff --git a/BlocksScreen/lib/ui/resources/system_resources_rc.py b/BlocksScreen/lib/ui/resources/system_resources_rc.py index 5df0d511..7ab9977a 100644 --- a/BlocksScreen/lib/ui/resources/system_resources_rc.py +++ b/BlocksScreen/lib/ui/resources/system_resources_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14) +# Created by: The Resource Compiler for PyQt6 (Qt v5.15.14) # # WARNING! All changes made in this file will be lost! @@ -603,7 +603,7 @@ \x00\x00\x00\x2e\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x46\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x96\x90\x7a\xe3\xd8\ +\x00\x00\x01\x98\x51\xb9\x78\x4c\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] diff --git a/BlocksScreen/lib/ui/resources/top_bar_resources_rc.py b/BlocksScreen/lib/ui/resources/top_bar_resources_rc.py index 8444c31d..991a4727 100644 --- a/BlocksScreen/lib/ui/resources/top_bar_resources_rc.py +++ b/BlocksScreen/lib/ui/resources/top_bar_resources_rc.py @@ -2,7 +2,7 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.14) +# Created by: The Resource Compiler for PyQt6 (Qt v5.15.14) # # WARNING! All changes made in this file will be lost! @@ -2650,49 +2650,49 @@ \x00\x00\x00\x30\x00\x02\x00\x00\x00\x16\x00\x00\x00\x04\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x95\x80\xac\x7d\xd7\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x01\x4b\ -\x00\x00\x01\x95\x80\xac\x7d\xf0\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x09\xc2\ -\x00\x00\x01\x95\x80\xac\x7e\x29\ +\x00\x00\x01\x98\x51\xb9\x78\xf8\ \x00\x00\x00\xec\x00\x00\x00\x00\x00\x01\x00\x00\x13\xc4\ -\x00\x00\x01\x95\x80\xac\x7e\x68\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x01\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x18\xd6\ -\x00\x00\x01\x95\x80\xac\x7d\x15\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x01\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x20\x7e\ -\x00\x00\x01\x95\x80\xac\x7c\xb8\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x01\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x27\xbd\ -\x00\x00\x01\x95\x80\xac\x7d\x6d\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x32\x21\ -\x00\x00\x01\x95\x80\xac\x7f\x44\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x01\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x4a\ -\x00\x00\x01\x95\x80\xac\x7c\xdf\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x02\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x46\xa2\ -\x00\x00\x01\x95\x80\xac\x7e\xbb\ +\x00\x00\x01\x98\x51\xb9\x78\xf8\ \x00\x00\x02\x50\x00\x00\x00\x00\x00\x01\x00\x00\x50\xba\ -\x00\x00\x01\x95\x80\xac\x7d\x8d\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x02\x82\x00\x00\x00\x00\x00\x01\x00\x00\x51\xdf\ -\x00\x00\x01\x95\x80\xac\x7f\x65\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x02\xca\x00\x00\x00\x00\x00\x01\x00\x00\x5c\x7d\ -\x00\x00\x01\x95\x80\xac\x7f\xdb\ +\x00\x00\x01\x98\x51\xb9\x78\xf8\ \x00\x00\x02\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x5e\xd4\ -\x00\x00\x01\x95\x80\xac\x7e\x0c\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x03\x32\x00\x00\x00\x00\x00\x01\x00\x00\x68\xfd\ -\x00\x00\x01\x95\x80\xac\x80\x06\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x03\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x73\x13\ -\x00\x00\x01\x95\x80\xac\x7e\xe6\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x03\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x7d\x79\ -\x00\x00\x01\x95\x80\xac\x7d\xb7\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x03\xca\x00\x00\x00\x00\x00\x01\x00\x00\x83\x70\ -\x00\x00\x01\x95\x80\xac\x7f\xa6\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x04\x02\x00\x00\x00\x00\x00\x01\x00\x00\x8c\x1f\ -\x00\x00\x01\x95\x80\xac\x7d\x50\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x04\x36\x00\x00\x00\x00\x00\x01\x00\x00\x8e\x0b\ -\x00\x00\x01\x95\x80\xac\x7e\x48\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x04\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x8f\x70\ -\x00\x00\x01\x95\x80\xac\x7e\x89\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ \x00\x00\x04\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x92\xd2\ -\x00\x00\x01\x95\x80\xac\x7c\xfb\ +\x00\x00\x01\x98\x51\xb9\x78\xf4\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] diff --git a/BlocksScreen/lib/ui/wifiConnectivityWindow.ui b/BlocksScreen/lib/ui/wifiConnectivityWindow.ui index f5ce5b87..efbc5ba9 100644 --- a/BlocksScreen/lib/ui/wifiConnectivityWindow.ui +++ b/BlocksScreen/lib/ui/wifiConnectivityWindow.ui @@ -1,2295 +1,3187 @@ - - - wifi_stacked_page - - - - 0 - 0 - 800 - 480 - - - - - 0 - 0 - - - - StackedWidget - - - #wifi_stacked_page{ - - - background-image: url(:/background/media/1st_background.png); -} - - - - 0 - - - - - 0 - 0 - - - - - - 0 - 60 - 800 - 480 - - - - - 0 - 0 - - - - - - 0 - 50 - 800 - 360 - - - - - 0 - 0 - - - - QListWidget{background-color: transparent;} - -QLabel{ -color: #ffffff; -} - - - Qt::ScrollBarAlwaysOff - - - 20 - - - QAbstractItemView::ScrollPerPixel - - - true - - - - - - 0 - 0 - 100 - 50 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 0 - 0 - 100 - 50 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - SSID - - - Qt::AlignCenter - - - - - - - 100 - 0 - 3 - 50 - - - - Qt::Vertical - - - - - - 0 - 50 - 800 - 3 - - - - Qt::Horizontal - - - - - - - 0 - 0 - 800 - 60 - - - - - 0 - 0 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 350 - 0 - 100 - 60 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - - 15 - - - - Networks - - - Qt::AlignCenter - - - - - - 0 - 0 - 75 - 60 - - - - - 10 - - - - Back - - - - - - 725 - 0 - 75 - 60 - - - - Scan Again - - - - - - 170 - 20 - 75 - 23 - - - - Toggle wifi - - - - - - 550 - 20 - 75 - 23 - - - - Hotspot page - - - - - - - - - 0 - 80 - 800 - 400 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 50 - 100 - 700 - 50 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 0 - 0 - 100 - 50 - - - - Password - - - Qt::AlignCenter - - - - - - 100 - 0 - 3 - 50 - - - - Qt::Vertical - - - - - - 180 - 0 - 400 - 50 - - - - QLineEdit::Password - - - - - - 650 - 0 - 50 - 50 - - - - view - - - - - - - 340 - 260 - 161 - 51 - - - - Validation - - - - - - 50 - 190 - 700 - 50 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 0 - 0 - 700 - 50 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - TextLabel - - - - - - - - 0 - 0 - 800 - 80 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 350 - 0 - 100 - 80 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - - 10 - - - - NetworkName - - - Qt::AlignCenter - - - - - - 0 - 0 - 80 - 80 - - - - - 10 - - - - Back - - - - - - - - - 0 - 80 - 800 - 400 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 30 - 30 - 650 - 50 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 0 - 0 - 100 - 50 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - Security Type - - - Qt::AlignCenter - - - - - - 150 - 0 - 500 - 50 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - QFrame::Plain - - - TextLabel - - - Qt::AlignCenter - - - - - - - 30 - 100 - 650 - 50 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 0 - 0 - 100 - 50 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - Signal Strength - - - Qt::AlignCenter - - - - - - 150 - 0 - 500 - 50 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - TextLabel - - - Qt::AlignCenter - - - - - - - 30 - 170 - 650 - 50 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 0 - 0 - 100 - 50 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - Change Password - - - Qt::AlignCenter - - - - - - 112 - 9 - 471 - 31 - - - - - - - 600 - 10 - 41 - 23 - - - - view - - - - - - - 30 - 240 - 650 - 50 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - 0 - 0 - 800 - 80 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 350 - 0 - 100 - 80 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - SSID - - - Qt::AlignCenter - - - - - - 0 - 0 - 80 - 80 - - - - Back - - - - - - 720 - 0 - 80 - 80 - - - - Delete - - - - - - - - - 0 - 80 - 800 - 400 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 90 - 30 - 621 - 331 - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 10 - 10 - 101 - 81 - - - - - 0 - 0 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - Hotspot Name: - - - - - - 270 - 20 - 231 - 31 - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 10 - 10 - 111 - 71 - - - - - 0 - 0 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 127 - 127 - 127 - - - - - - - 170 - 170 - 170 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 220 - - - - - - - 0 - 0 - 0 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 127 - 127 - 127 - - - - - - - 170 - 170 - 170 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 220 - - - - - - - 0 - 0 - 0 - - - - - - - - - 127 - 127 - 127 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 127 - 127 - 127 - - - - - - - 170 - 170 - 170 - - - - - - - 127 - 127 - 127 - - - - - - - 255 - 255 - 255 - - - - - - - 127 - 127 - 127 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 220 - - - - - - - 0 - 0 - 0 - - - - - - - - Hotspot Password: - - - - - - 272 - 19 - 231 - 41 - - - - QLineEdit::Password - - - - - - 530 - 22 - 51 - 31 - - - - PushButton - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 10 - 10 - 121 - 81 - - - - - 0 - 1 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - Hotspot Machine Ip address - - - - - - 296 - 22 - 201 - 51 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - TextLabel - - - - - - - - - - - 0 - 0 - 800 - 80 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 0 - 0 - 80 - 80 - - - - Back - - - - - - 720 - 0 - 80 - 80 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - Toggle Hot - - - - - - 350 - 0 - 100 - 80 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - - - 120 - 120 - 120 - - - - - - - 120 - 120 - 120 - - - - - - - - - 15 - - - - Hotspot - - - Qt::AlignCenter - - - - - - - - - - - - - - + + + wifi_stacked_page + + + + 0 + 0 + 808 + 578 + + + + + 0 + 0 + + + + StackedWidget + + + #wifi_stacked_page{ + + + background-image: url(:/background/media/1st_background.png); +} + + + + 1 + + + + + 0 + 0 + + + + + + -10 + 90 + 381 + 401 + + + + + 0 + 0 + + + + + + 210 + 200 + 161 + 121 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 10 + 121 + 50 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 15 + + + + Security +Type + + + Qt::AlignCenter + + + + + + 10 + 60 + 141 + 41 + + + + + 11 + + + + color: rgb(255, 255, 255); + + + TextLabel + + + Qt::AlignCenter + + + + + + 10 + 50 + 140 + 21 + + + + Qt::Horizontal + + + + + + + 30 + 200 + 161 + 121 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 10 + 121 + 50 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 15 + + + + Signal +Strength + + + Qt::AlignCenter + + + + + + 10 + 65 + 141 + 41 + + + + + 11 + + + + color: rgb(255, 255, 255); + + + TextLabel + + + Qt::AlignCenter + + + + + + 10 + 60 + 140 + 3 + + + + Qt::Horizontal + + + + + + + 30 + 110 + 341 + 71 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 311 + 51 + + + + + 15 + + + + color: rgb(255, 255, 255); + + + TextLabel + + + Qt::AlignCenter + + + + + + -10 + -50 + 361 + 181 + + + + + 17 + + + + color: white + + + No network connection. + +Try connecting to Wi-Fi +or turn on the hotspot +using the buttons on the side. + + + Qt::PlainText + + + false + + + Qt::AlignCenter + + + + + + + 40 + 60 + 321 + 20 + + + + Qt::Horizontal + + + + + + 50 + 30 + 301 + 41 + + + + + 17 + + + + color: rgb(255, 255, 255); + + + TextLabel + + + false + + + Qt::AlignCenter + + + + + + + 0 + -20 + 800 + 91 + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 320 + 20 + 161 + 71 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 20 + + + + Networks + + + Qt::AlignCenter + + + + + + 0 + 20 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + Back + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + 620 + 140 + 111 + 50 + + + + + 0 + 0 + + + + + 160 + 50 + + + + + MS Shell Dlg 2 + 13 + false + PreferAntialias + + + + false + + + true + + + Qt::NoContextMenu + + + Qt::LeftToRight + + + + + + Toggle wifi + + + menu_btn + + + normal + + + :/network/media/btn_icons/no_wifi.svg + + + + + + 390 + 90 + 391 + 161 + + + + + 0 + 0 + + + + + 20 + + + + Wi-Fi + + + + + + 390 + 269 + 391 + 161 + + + + + 20 + + + + Hotspot + + + + + + 620 + 320 + 111 + 51 + + + + + 13 + + + + Toggle HOT + + + + + + 740 + 140 + 41 + 51 + + + + color:white; + + + + + + :/arrow_icons/media/btn_icons/right_arrow.svg + + + true + + + + + true + + + + 740 + 319 + 41 + 51 + + + + Qt::NoContextMenu + + + color:white; + + + + + + :/arrow_icons/media/btn_icons/right_arrow.svg + + + true + + + network_list_table_frame + window_header + wifi_button + Togglewifi + hotspot_button + Togglehot + label_3 + label + + + + + + 0 + -20 + 800 + 91 + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 320 + 20 + 161 + 71 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 20 + + + + Wi-fi List + + + Qt::AlignCenter + + + + + + 740 + 20 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + Reload + + + true + + + icon + + + :/ui/media/btn_icons/refresh.svg + + + + + + 0 + 20 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + Back + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + 0 + 90 + 801 + 421 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 0 + 801 + 421 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 120 + 215 + + + + + + + 0 + 0 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 120 + 215 + + + + + + + 0 + 0 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 120 + 215 + + + + + + + 0 + 0 + 255 + + + + + + + + Qt::NoFocus + + + background-color:transparent + + + QFrame::NoFrame + + + QFrame::Sunken + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QAbstractScrollArea::AdjustToContents + + + false + + + false + + + Qt::IgnoreAction + + + false + + + QAbstractItemView::NoSelection + + + QAbstractItemView::SelectItems + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + + + + + + + 0 + 79 + 801 + 481 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 20 + 70 + 761 + 81 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 100 + 61 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 15 + + + + Password + + + Qt::AlignCenter + + + + + + 120 + 20 + 541 + 41 + + + + + 0 + 40 + + + + + + + 680 + 10 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + View + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + 140 + 160 + 511 + 81 + + + + + 0 + 0 + + + + + 16777215 + 81 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + + + Qt::AlignCenter + + + + + true + + + + 510 + 270 + 60 + 60 + + + + + 1 + 1 + + + + + 60 + 60 + + + + + 60 + 60 + + + + + + + a + + + + 16 + 16 + + + + false + + + false + + + true + + + icon + + + :/dialog/media/btn_icons/yes.svg + + + + + true + + + + 220 + 270 + 60 + 60 + + + + + 1 + 1 + + + + + 60 + 60 + + + + + 60 + 60 + + + + + + + a + + + + 16 + 16 + + + + false + + + false + + + true + + + icon + + + :/dialog/media/btn_icons/no.svg + + + + + + + 0 + -21 + 800 + 91 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 50 + 20 + 681 + 71 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 20 + + + + NetworkName + + + Qt::AlignCenter + + + + + + 0 + 20 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + Back + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + + + -1 + 79 + 801 + 411 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 470 + 180 + 211 + 181 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 49 + 30 + 111 + 50 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 15 + + + + Security +Type + + + Qt::AlignCenter + + + + + + 30 + 100 + 151 + 61 + + + + + 20 + + + + color:white + + + TextLabel + + + Qt::AlignCenter + + + + + + 10 + 80 + 191 + 16 + + + + Qt::Horizontal + + + + + + + 140 + 180 + 211 + 181 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 50 + 30 + 111 + 50 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 15 + + + + Signal +Strength + + + Qt::AlignCenter + + + + + + 30 + 100 + 151 + 61 + + + + + 20 + + + + color:white + + + TextLabel + + + Qt::AlignCenter + + + + + + 10 + 80 + 191 + 16 + + + + Qt::Horizontal + + + + + + + 20 + 70 + 761 + 81 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 100 + 61 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 15 + + + + Change +Password + + + Qt::AlignCenter + + + + + + 120 + 20 + 541 + 41 + + + + + 0 + 40 + + + + + + + 680 + 10 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + View + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + + 0 + -21 + 800 + 91 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 70 + 20 + 651 + 71 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 20 + + + + SSID + + + Qt::AlignCenter + + + + + + 0 + 20 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + Back + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + 730 + 20 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + Delete + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/indf_svg.svg + + + + + + + + + 0 + -30 + 800 + 101 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 320 + 30 + 171 + 71 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + 20 + + + + Hotspot + + + Qt::AlignCenter + + + + + + 0 + 30 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + Back + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + 10 + 80 + 781 + 371 + + + + + + + + 16777215 + 81 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 30 + 150 + 21 + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 150 + 16777215 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 127 + 127 + 127 + + + + + + + 170 + 170 + 170 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 127 + 127 + 127 + + + + + + + 170 + 170 + 170 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 127 + 127 + 127 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 127 + 127 + 127 + + + + + + + 170 + 170 + 170 + + + + + + + 127 + 127 + 127 + + + + + + + 255 + 255 + 255 + + + + + + + 127 + 127 + 127 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + Momcake + 10 + + + + Hotspot Password: + + + Qt::AlignCenter + + + + + + 160 + 20 + 521 + 40 + + + + + 0 + 0 + + + + + 120 + 40 + + + + + 16777215 + 40 + + + + QLineEdit::Password + + + + + + 700 + 10 + 60 + 60 + + + + + 60 + 60 + + + + + 60 + 60 + + + + View + + + true + + + back_btn + + + icon + + + :/ui/media/btn_icons/back.svg + + + + + + + + + 16777215 + 81 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 30 + 150 + 21 + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 150 + 16777215 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + Momcake + 10 + + + + Hotspot Name: + + + Qt::AlignCenter + + + + + + 160 + 20 + 521 + 40 + + + + + 0 + 0 + + + + + 120 + 40 + + + + + 16777215 + 40 + + + + QLineEdit::Password + + + + + + + + + + + IconButton + QPushButton +
lib.utils.icon_button
+
+ + BlocksCustomFrame + QFrame +
lib.utils.blocks_frame
+ 1 +
+ + ToggleAnimatedButton + QPushButton +
lib.utils.toggleAnimatedButton
+
+ + ListCustomButton + QPushButton +
lib.utils.list_button
+
+ + BlocksCustomLinEdit + QLineEdit +
lib.utils.blocks_linedit
+
+
+ + + + + + + + +
diff --git a/BlocksScreen/lib/ui/wifiConnectivityWindow_ui.py b/BlocksScreen/lib/ui/wifiConnectivityWindow_ui.py index 07fb7e88..de78329d 100644 --- a/BlocksScreen/lib/ui/wifiConnectivityWindow_ui.py +++ b/BlocksScreen/lib/ui/wifiConnectivityWindow_ui.py @@ -12,7 +12,7 @@ class Ui_wifi_stacked_page(object): def setupUi(self, wifi_stacked_page): wifi_stacked_page.setObjectName("wifi_stacked_page") - wifi_stacked_page.resize(800, 480) + wifi_stacked_page.resize(808, 578) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -31,38 +31,21 @@ def setupUi(self, wifi_stacked_page): sizePolicy.setHeightForWidth(self.network_list_page.sizePolicy().hasHeightForWidth()) self.network_list_page.setSizePolicy(sizePolicy) self.network_list_page.setObjectName("network_list_page") - self.network_list_table_widget = QtWidgets.QWidget(parent=self.network_list_page) - self.network_list_table_widget.setGeometry(QtCore.QRect(0, 60, 800, 480)) + self.network_list_table_frame = BlocksCustomFrame(parent=self.network_list_page) + self.network_list_table_frame.setGeometry(QtCore.QRect(-10, 90, 381, 401)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.network_list_table_widget.sizePolicy().hasHeightForWidth()) - self.network_list_table_widget.setSizePolicy(sizePolicy) - self.network_list_table_widget.setObjectName("network_list_table_widget") - self.network_list_widget = QtWidgets.QListWidget(parent=self.network_list_table_widget) - self.network_list_widget.setGeometry(QtCore.QRect(0, 50, 800, 360)) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.network_list_widget.sizePolicy().hasHeightForWidth()) - self.network_list_widget.setSizePolicy(sizePolicy) - self.network_list_widget.setStyleSheet("QListWidget{background-color: transparent;}\n" -"\n" -"QLabel{\n" -"color: #ffffff;\n" -"}") - self.network_list_widget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) - self.network_list_widget.setAutoScrollMargin(20) - self.network_list_widget.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel) - self.network_list_widget.setUniformItemSizes(True) - self.network_list_widget.setObjectName("network_list_widget") - self.network_list_table_header_frame = QtWidgets.QFrame(parent=self.network_list_table_widget) - self.network_list_table_header_frame.setGeometry(QtCore.QRect(0, 0, 100, 50)) - self.network_list_table_header_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.network_list_table_header_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.network_list_table_header_frame.setObjectName("network_list_table_header_frame") - self.network_list_table_header_label = QtWidgets.QLabel(parent=self.network_list_table_header_frame) - self.network_list_table_header_label.setGeometry(QtCore.QRect(0, 0, 100, 50)) + sizePolicy.setHeightForWidth(self.network_list_table_frame.sizePolicy().hasHeightForWidth()) + self.network_list_table_frame.setSizePolicy(sizePolicy) + self.network_list_table_frame.setObjectName("network_list_table_frame") + self.stregth_frame = BlocksCustomFrame(parent=self.network_list_table_frame) + self.stregth_frame.setGeometry(QtCore.QRect(210, 200, 161, 121)) + self.stregth_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.stregth_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.stregth_frame.setObjectName("stregth_frame") + self.netlist_security_label = QtWidgets.QLabel(parent=self.stregth_frame) + self.netlist_security_label.setGeometry(QtCore.QRect(20, 10, 121, 50)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -82,21 +65,109 @@ def setupUi(self, wifi_stacked_page): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.network_list_table_header_label.setPalette(palette) - self.network_list_table_header_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.network_list_table_header_label.setObjectName("network_list_table_header_label") - self.line = QtWidgets.QFrame(parent=self.network_list_table_widget) - self.line.setGeometry(QtCore.QRect(100, 0, 3, 50)) - self.line.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line.setObjectName("line") - self.line_2 = QtWidgets.QFrame(parent=self.network_list_table_widget) - self.line_2.setGeometry(QtCore.QRect(0, 50, 800, 3)) + self.netlist_security_label.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(15) + self.netlist_security_label.setFont(font) + self.netlist_security_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.netlist_security_label.setObjectName("netlist_security_label") + self.netlist_security = QtWidgets.QLabel(parent=self.stregth_frame) + self.netlist_security.setGeometry(QtCore.QRect(10, 60, 141, 41)) + font = QtGui.QFont() + font.setPointSize(11) + self.netlist_security.setFont(font) + self.netlist_security.setStyleSheet("color: rgb(255, 255, 255);") + self.netlist_security.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.netlist_security.setObjectName("netlist_security") + self.line_3 = QtWidgets.QFrame(parent=self.stregth_frame) + self.line_3.setGeometry(QtCore.QRect(10, 50, 140, 21)) + self.line_3.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_3.setObjectName("line_3") + self.signal_frame = BlocksCustomFrame(parent=self.network_list_table_frame) + self.signal_frame.setGeometry(QtCore.QRect(30, 200, 161, 121)) + self.signal_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.signal_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.signal_frame.setObjectName("signal_frame") + self.netlist_strength_label = QtWidgets.QLabel(parent=self.signal_frame) + self.netlist_strength_label.setGeometry(QtCore.QRect(20, 10, 121, 50)) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) + self.netlist_strength_label.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(15) + self.netlist_strength_label.setFont(font) + self.netlist_strength_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.netlist_strength_label.setObjectName("netlist_strength_label") + self.netlist_strength = QtWidgets.QLabel(parent=self.signal_frame) + self.netlist_strength.setGeometry(QtCore.QRect(10, 65, 141, 41)) + font = QtGui.QFont() + font.setPointSize(11) + self.netlist_strength.setFont(font) + self.netlist_strength.setStyleSheet("color: rgb(255, 255, 255);") + self.netlist_strength.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.netlist_strength.setObjectName("netlist_strength") + self.line_2 = QtWidgets.QFrame(parent=self.signal_frame) + self.line_2.setGeometry(QtCore.QRect(10, 60, 140, 3)) self.line_2.setFrameShape(QtWidgets.QFrame.Shape.HLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) self.line_2.setObjectName("line_2") - self.window_header = QtWidgets.QFrame(parent=self.network_list_page) - self.window_header.setGeometry(QtCore.QRect(0, 0, 800, 60)) + self.ip_frame = BlocksCustomFrame(parent=self.network_list_table_frame) + self.ip_frame.setGeometry(QtCore.QRect(30, 110, 341, 71)) + self.ip_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.ip_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.ip_frame.setObjectName("ip_frame") + self.netlist_ip = QtWidgets.QLabel(parent=self.ip_frame) + self.netlist_ip.setGeometry(QtCore.QRect(10, 10, 311, 51)) + font = QtGui.QFont() + font.setPointSize(15) + self.netlist_ip.setFont(font) + self.netlist_ip.setStyleSheet("color: rgb(255, 255, 255);") + self.netlist_ip.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.netlist_ip.setObjectName("netlist_ip") + self.label_2 = QtWidgets.QLabel(parent=self.ip_frame) + self.label_2.setGeometry(QtCore.QRect(-10, -50, 361, 181)) + font = QtGui.QFont() + font.setPointSize(17) + self.label_2.setFont(font) + self.label_2.setStyleSheet("color: white") + self.label_2.setTextFormat(QtCore.Qt.TextFormat.PlainText) + self.label_2.setScaledContents(False) + self.label_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.label_2.setObjectName("label_2") + self.line = QtWidgets.QFrame(parent=self.network_list_table_frame) + self.line.setGeometry(QtCore.QRect(40, 60, 321, 20)) + self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.netlist_ssuid = QtWidgets.QLabel(parent=self.network_list_table_frame) + self.netlist_ssuid.setGeometry(QtCore.QRect(50, 30, 301, 41)) + font = QtGui.QFont() + font.setPointSize(17) + self.netlist_ssuid.setFont(font) + self.netlist_ssuid.setStyleSheet("color: rgb(255, 255, 255);") + self.netlist_ssuid.setScaledContents(False) + self.netlist_ssuid.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.netlist_ssuid.setObjectName("netlist_ssuid") + self.window_header = BlocksCustomFrame(parent=self.network_list_page) + self.window_header.setGeometry(QtCore.QRect(0, -20, 800, 91)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -105,8 +176,8 @@ def setupUi(self, wifi_stacked_page): self.window_header.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.window_header.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.window_header.setObjectName("window_header") - self.wifi_main_title = QtWidgets.QLabel(parent=self.window_header) - self.wifi_main_title.setGeometry(QtCore.QRect(350, 0, 100, 60)) + self.network_main_title = QtWidgets.QLabel(parent=self.window_header) + self.network_main_title.setGeometry(QtCore.QRect(320, 20, 161, 71)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -126,66 +197,266 @@ def setupUi(self, wifi_stacked_page): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.wifi_main_title.setPalette(palette) + self.network_main_title.setPalette(palette) font = QtGui.QFont() - font.setPointSize(15) - self.wifi_main_title.setFont(font) - self.wifi_main_title.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.wifi_main_title.setObjectName("wifi_main_title") - self.wifi_backButton = QtWidgets.QPushButton(parent=self.window_header) - self.wifi_backButton.setGeometry(QtCore.QRect(0, 0, 75, 60)) + font.setPointSize(20) + self.network_main_title.setFont(font) + self.network_main_title.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.network_main_title.setObjectName("network_main_title") + self.network_backButton = IconButton(parent=self.window_header) + self.network_backButton.setGeometry(QtCore.QRect(0, 20, 60, 60)) + self.network_backButton.setMinimumSize(QtCore.QSize(60, 60)) + self.network_backButton.setMaximumSize(QtCore.QSize(60, 60)) + self.network_backButton.setFlat(True) + self.network_backButton.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.network_backButton.setObjectName("network_backButton") + self.Togglewifi = ToggleAnimatedButton(parent=self.network_list_page) + self.Togglewifi.setGeometry(QtCore.QRect(620, 140, 111, 50)) + self.Togglewifi.setMinimumSize(QtCore.QSize(0, 0)) + self.Togglewifi.setMaximumSize(QtCore.QSize(160, 50)) font = QtGui.QFont() - font.setPointSize(10) - self.wifi_backButton.setFont(font) - self.wifi_backButton.setObjectName("wifi_backButton") - self.rescan_button = QtWidgets.QPushButton(parent=self.window_header) - self.rescan_button.setGeometry(QtCore.QRect(725, 0, 75, 60)) - self.rescan_button.setObjectName("rescan_button") - self.wifi_toggle_button = QtWidgets.QPushButton(parent=self.window_header) - self.wifi_toggle_button.setGeometry(QtCore.QRect(170, 20, 75, 23)) - self.wifi_toggle_button.setObjectName("wifi_toggle_button") - self.call_hotspot_button = QtWidgets.QPushButton(parent=self.window_header) - self.call_hotspot_button.setGeometry(QtCore.QRect(550, 20, 75, 23)) - self.call_hotspot_button.setObjectName("call_hotspot_button") + font.setFamily("MS Shell Dlg 2") + font.setPointSize(13) + font.setItalic(False) + font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias) + self.Togglewifi.setFont(font) + self.Togglewifi.setMouseTracking(False) + self.Togglewifi.setTabletTracking(True) + self.Togglewifi.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.Togglewifi.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) + self.Togglewifi.setStyleSheet("") + self.Togglewifi.setProperty("icon_pixmap", QtGui.QPixmap(":/network/media/btn_icons/no_wifi.svg")) + self.Togglewifi.setObjectName("Togglewifi") + self.wifi_button = ListCustomButton() + self.wifi_button.setGeometry(QtCore.QRect(390, 90, 391, 161)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.wifi_button.sizePolicy().hasHeightForWidth()) + self.wifi_button.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(20) + self.wifi_button.setFont(font) + self.wifi_button.setObjectName("wifi_button") + self.hotspot_button = ListCustomButton() + self.hotspot_button.setGeometry(QtCore.QRect(390, 269, 391, 161)) + font = QtGui.QFont() + font.setPointSize(20) + self.hotspot_button.setFont(font) + self.hotspot_button.setObjectName("hotspot_button") + self.Togglehot = ToggleAnimatedButton(parent=self.network_list_page) + self.Togglehot.setGeometry(QtCore.QRect(620, 320, 111, 51)) + font = QtGui.QFont() + font.setPointSize(13) + self.Togglehot.setFont(font) + self.Togglehot.setObjectName("Togglehot") + self.label = QtWidgets.QLabel(parent=self.network_list_page) + self.label.setGeometry(QtCore.QRect(740, 140, 41, 51)) + self.label.setStyleSheet("color:white;") + self.label.setText("") + self.label.setPixmap(QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg")) + self.label.setScaledContents(True) + self.label.setObjectName("label") + self.label_3 = QtWidgets.QLabel(parent=self.network_list_page) + self.label_3.setEnabled(True) + self.label_3.setGeometry(QtCore.QRect(740, 319, 41, 51)) + self.label_3.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.NoContextMenu) + self.label_3.setStyleSheet("color:white;") + self.label_3.setText("") + self.label_3.setPixmap(QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg")) + self.label_3.setScaledContents(True) + self.label_3.setObjectName("label_3") + self.network_list_table_frame.raise_() + self.window_header.raise_() + self.wifi_button.raise_() + self.Togglewifi.raise_() + self.hotspot_button.raise_() + self.Togglehot.raise_() + self.label_3.raise_() + self.label.raise_() wifi_stacked_page.addWidget(self.network_list_page) + self.wifi_page = QtWidgets.QWidget() + self.wifi_page.setObjectName("wifi_page") + self.window_header_2 = BlocksCustomFrame(parent=self.wifi_page) + self.window_header_2.setGeometry(QtCore.QRect(0, -20, 800, 91)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.window_header_2.sizePolicy().hasHeightForWidth()) + self.window_header_2.setSizePolicy(sizePolicy) + self.window_header_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.window_header_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.window_header_2.setObjectName("window_header_2") + self.network_main_title_2 = QtWidgets.QLabel(parent=self.window_header_2) + self.network_main_title_2.setGeometry(QtCore.QRect(320, 20, 161, 71)) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) + self.network_main_title_2.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(20) + self.network_main_title_2.setFont(font) + self.network_main_title_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.network_main_title_2.setObjectName("network_main_title_2") + self.rescan_button = IconButton(parent=self.window_header_2) + self.rescan_button.setGeometry(QtCore.QRect(740, 20, 60, 60)) + self.rescan_button.setMinimumSize(QtCore.QSize(60, 60)) + self.rescan_button.setMaximumSize(QtCore.QSize(60, 60)) + self.rescan_button.setFlat(True) + self.rescan_button.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/refresh.svg")) + self.rescan_button.setObjectName("rescan_button") + self.wifi_backButton = IconButton(parent=self.window_header_2) + self.wifi_backButton.setGeometry(QtCore.QRect(0, 20, 60, 60)) + self.wifi_backButton.setMinimumSize(QtCore.QSize(60, 60)) + self.wifi_backButton.setMaximumSize(QtCore.QSize(60, 60)) + self.wifi_backButton.setFlat(True) + self.wifi_backButton.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.wifi_backButton.setObjectName("wifi_backButton") + self.frame_3 = BlocksCustomFrame(parent=self.wifi_page) + self.frame_3.setGeometry(QtCore.QRect(0, 90, 801, 421)) + self.frame_3.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_3.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_3.setObjectName("frame_3") + self.network_list_widget = QtWidgets.QListWidget(parent=self.frame_3) + self.network_list_widget.setGeometry(QtCore.QRect(0, 0, 801, 421)) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Highlight, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Link, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Highlight, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Link, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Highlight, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 0)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Link, brush) + self.network_list_widget.setPalette(palette) + self.network_list_widget.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.network_list_widget.setStyleSheet("background-color:transparent") + self.network_list_widget.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) + self.network_list_widget.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.network_list_widget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + self.network_list_widget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + self.network_list_widget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents) + self.network_list_widget.setAutoScroll(False) + self.network_list_widget.setProperty("showDropIndicator", False) + self.network_list_widget.setDefaultDropAction(QtCore.Qt.DropAction.IgnoreAction) + self.network_list_widget.setAlternatingRowColors(False) + self.network_list_widget.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection) + self.network_list_widget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectItems) + self.network_list_widget.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel) + self.network_list_widget.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel) + self.network_list_widget.setObjectName("network_list_widget") + wifi_stacked_page.addWidget(self.wifi_page) self.add_network_page = QtWidgets.QWidget() self.add_network_page.setObjectName("add_network_page") - self.add_network_page_options = QtWidgets.QFrame(parent=self.add_network_page) - self.add_network_page_options.setGeometry(QtCore.QRect(0, 80, 800, 400)) + self.add_network_page_options = BlocksCustomFrame(parent=self.add_network_page) + self.add_network_page_options.setGeometry(QtCore.QRect(0, 79, 801, 481)) self.add_network_page_options.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.add_network_page_options.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.add_network_page_options.setObjectName("add_network_page_options") - self.add_network_frame = QtWidgets.QFrame(parent=self.add_network_page_options) - self.add_network_frame.setGeometry(QtCore.QRect(50, 100, 700, 50)) - self.add_network_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.add_network_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.add_network_frame.setObjectName("add_network_frame") - self.add_network_password_label = QtWidgets.QLabel(parent=self.add_network_frame) - self.add_network_password_label.setGeometry(QtCore.QRect(0, 0, 100, 50)) + self.saved_connection_change_password_frame_2 = BlocksCustomFrame(parent=self.add_network_page_options) + self.saved_connection_change_password_frame_2.setGeometry(QtCore.QRect(20, 70, 761, 81)) + self.saved_connection_change_password_frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.saved_connection_change_password_frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.saved_connection_change_password_frame_2.setObjectName("saved_connection_change_password_frame_2") + self.add_network_password_label = QtWidgets.QLabel(parent=self.saved_connection_change_password_frame_2) + self.add_network_password_label.setGeometry(QtCore.QRect(10, 10, 100, 61)) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) + self.add_network_password_label.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(15) + self.add_network_password_label.setFont(font) self.add_network_password_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.add_network_password_label.setObjectName("add_network_password_label") - self.line_3 = QtWidgets.QFrame(parent=self.add_network_frame) - self.line_3.setGeometry(QtCore.QRect(100, 0, 3, 50)) - self.line_3.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_3.setObjectName("line_3") - self.add_network_password_field = QtWidgets.QLineEdit(parent=self.add_network_frame) - self.add_network_password_field.setGeometry(QtCore.QRect(180, 0, 400, 50)) - self.add_network_password_field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.add_network_password_field = BlocksCustomLinEdit(parent=self.saved_connection_change_password_frame_2) + self.add_network_password_field.setGeometry(QtCore.QRect(120, 20, 541, 41)) + self.add_network_password_field.setMinimumSize(QtCore.QSize(0, 40)) self.add_network_password_field.setObjectName("add_network_password_field") - self.add_network_password_view = QtWidgets.QPushButton(parent=self.add_network_frame) - self.add_network_password_view.setGeometry(QtCore.QRect(650, 0, 50, 50)) + self.add_network_password_view = IconButton(parent=self.saved_connection_change_password_frame_2) + self.add_network_password_view.setGeometry(QtCore.QRect(680, 10, 60, 60)) + self.add_network_password_view.setMinimumSize(QtCore.QSize(60, 60)) + self.add_network_password_view.setMaximumSize(QtCore.QSize(60, 60)) + self.add_network_password_view.setFlat(True) + self.add_network_password_view.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) self.add_network_password_view.setObjectName("add_network_password_view") - self.add_network_validation_button = QtWidgets.QPushButton(parent=self.add_network_page_options) - self.add_network_validation_button.setGeometry(QtCore.QRect(340, 260, 161, 51)) - self.add_network_validation_button.setObjectName("add_network_validation_button") - self.add_network_messages_frame = QtWidgets.QFrame(parent=self.add_network_page_options) - self.add_network_messages_frame.setGeometry(QtCore.QRect(50, 190, 700, 50)) - self.add_network_messages_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.add_network_messages_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.add_network_messages_frame.setObjectName("add_network_messages_frame") - self.add_network_message_label = QtWidgets.QLabel(parent=self.add_network_messages_frame) - self.add_network_message_label.setGeometry(QtCore.QRect(0, 0, 700, 50)) + self.add_network_message_label = QtWidgets.QLabel(parent=self.add_network_page_options) + self.add_network_message_label.setGeometry(QtCore.QRect(140, 160, 511, 81)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.add_network_message_label.sizePolicy().hasHeightForWidth()) + self.add_network_message_label.setSizePolicy(sizePolicy) + self.add_network_message_label.setMaximumSize(QtCore.QSize(16777215, 81)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -206,14 +477,50 @@ def setupUi(self, wifi_stacked_page): brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) self.add_network_message_label.setPalette(palette) + self.add_network_message_label.setText("") + self.add_network_message_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.add_network_message_label.setObjectName("add_network_message_label") - self.add_network_page_header = QtWidgets.QFrame(parent=self.add_network_page) - self.add_network_page_header.setGeometry(QtCore.QRect(0, 0, 800, 80)) + self.add_network_validation_button = IconButton(parent=self.add_network_page_options) + self.add_network_validation_button.setEnabled(True) + self.add_network_validation_button.setGeometry(QtCore.QRect(510, 270, 60, 60)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) + sizePolicy.setHorizontalStretch(1) + sizePolicy.setVerticalStretch(1) + sizePolicy.setHeightForWidth(self.add_network_validation_button.sizePolicy().hasHeightForWidth()) + self.add_network_validation_button.setSizePolicy(sizePolicy) + self.add_network_validation_button.setMinimumSize(QtCore.QSize(60, 60)) + self.add_network_validation_button.setMaximumSize(QtCore.QSize(60, 60)) + self.add_network_validation_button.setStyleSheet("") + self.add_network_validation_button.setIconSize(QtCore.QSize(16, 16)) + self.add_network_validation_button.setCheckable(False) + self.add_network_validation_button.setChecked(False) + self.add_network_validation_button.setFlat(True) + self.add_network_validation_button.setProperty("icon_pixmap", QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg")) + self.add_network_validation_button.setObjectName("add_network_validation_button") + self.cancel_network_validation_button = IconButton(parent=self.add_network_page_options) + self.cancel_network_validation_button.setEnabled(True) + self.cancel_network_validation_button.setGeometry(QtCore.QRect(220, 270, 60, 60)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) + sizePolicy.setHorizontalStretch(1) + sizePolicy.setVerticalStretch(1) + sizePolicy.setHeightForWidth(self.cancel_network_validation_button.sizePolicy().hasHeightForWidth()) + self.cancel_network_validation_button.setSizePolicy(sizePolicy) + self.cancel_network_validation_button.setMinimumSize(QtCore.QSize(60, 60)) + self.cancel_network_validation_button.setMaximumSize(QtCore.QSize(60, 60)) + self.cancel_network_validation_button.setStyleSheet("") + self.cancel_network_validation_button.setIconSize(QtCore.QSize(16, 16)) + self.cancel_network_validation_button.setCheckable(False) + self.cancel_network_validation_button.setChecked(False) + self.cancel_network_validation_button.setFlat(True) + self.cancel_network_validation_button.setProperty("icon_pixmap", QtGui.QPixmap(":/dialog/media/btn_icons/no.svg")) + self.cancel_network_validation_button.setObjectName("cancel_network_validation_button") + self.add_network_page_header = BlocksCustomFrame(parent=self.add_network_page) + self.add_network_page_header.setGeometry(QtCore.QRect(0, -21, 800, 91)) self.add_network_page_header.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.add_network_page_header.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.add_network_page_header.setObjectName("add_network_page_header") self.add_network_network_label = QtWidgets.QLabel(parent=self.add_network_page_header) - self.add_network_network_label.setGeometry(QtCore.QRect(350, 0, 100, 80)) + self.add_network_network_label.setGeometry(QtCore.QRect(50, 20, 681, 71)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -235,31 +542,32 @@ def setupUi(self, wifi_stacked_page): palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) self.add_network_network_label.setPalette(palette) font = QtGui.QFont() - font.setPointSize(10) + font.setPointSize(20) self.add_network_network_label.setFont(font) self.add_network_network_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.add_network_network_label.setObjectName("add_network_network_label") - self.add_network_page_backButton = QtWidgets.QPushButton(parent=self.add_network_page_header) - self.add_network_page_backButton.setGeometry(QtCore.QRect(0, 0, 80, 80)) - font = QtGui.QFont() - font.setPointSize(10) - self.add_network_page_backButton.setFont(font) + self.add_network_page_backButton = IconButton(parent=self.add_network_page_header) + self.add_network_page_backButton.setGeometry(QtCore.QRect(0, 20, 60, 60)) + self.add_network_page_backButton.setMinimumSize(QtCore.QSize(60, 60)) + self.add_network_page_backButton.setMaximumSize(QtCore.QSize(60, 60)) + self.add_network_page_backButton.setFlat(True) + self.add_network_page_backButton.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) self.add_network_page_backButton.setObjectName("add_network_page_backButton") wifi_stacked_page.addWidget(self.add_network_page) self.saved_connection_page = QtWidgets.QWidget() self.saved_connection_page.setObjectName("saved_connection_page") - self.network_properties = QtWidgets.QFrame(parent=self.saved_connection_page) - self.network_properties.setGeometry(QtCore.QRect(0, 80, 800, 400)) + self.network_properties = BlocksCustomFrame(parent=self.saved_connection_page) + self.network_properties.setGeometry(QtCore.QRect(-1, 79, 801, 411)) self.network_properties.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.network_properties.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.network_properties.setObjectName("network_properties") - self.saved_connection_security_type_frame = QtWidgets.QFrame(parent=self.network_properties) - self.saved_connection_security_type_frame.setGeometry(QtCore.QRect(30, 30, 650, 50)) + self.saved_connection_security_type_frame = BlocksCustomFrame(parent=self.network_properties) + self.saved_connection_security_type_frame.setGeometry(QtCore.QRect(470, 180, 211, 181)) self.saved_connection_security_type_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.saved_connection_security_type_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.saved_connection_security_type_frame.setObjectName("saved_connection_security_type_frame") self.saved_connection_security_type_label = QtWidgets.QLabel(parent=self.saved_connection_security_type_frame) - self.saved_connection_security_type_label.setGeometry(QtCore.QRect(0, 0, 100, 50)) + self.saved_connection_security_type_label.setGeometry(QtCore.QRect(49, 30, 111, 50)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -280,40 +588,31 @@ def setupUi(self, wifi_stacked_page): brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) self.saved_connection_security_type_label.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(15) + self.saved_connection_security_type_label.setFont(font) self.saved_connection_security_type_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.saved_connection_security_type_label.setObjectName("saved_connection_security_type_label") self.saved_connection_security_type_info_label = QtWidgets.QLabel(parent=self.saved_connection_security_type_frame) - self.saved_connection_security_type_info_label.setGeometry(QtCore.QRect(150, 0, 500, 50)) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.saved_connection_security_type_info_label.setPalette(palette) - self.saved_connection_security_type_info_label.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) + self.saved_connection_security_type_info_label.setGeometry(QtCore.QRect(30, 100, 151, 61)) + font = QtGui.QFont() + font.setPointSize(20) + self.saved_connection_security_type_info_label.setFont(font) + self.saved_connection_security_type_info_label.setStyleSheet("color:white") self.saved_connection_security_type_info_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.saved_connection_security_type_info_label.setObjectName("saved_connection_security_type_info_label") - self.saved_connection_signal_strength_frame = QtWidgets.QFrame(parent=self.network_properties) - self.saved_connection_signal_strength_frame.setGeometry(QtCore.QRect(30, 100, 650, 50)) + self.line_5 = QtWidgets.QFrame(parent=self.saved_connection_security_type_frame) + self.line_5.setGeometry(QtCore.QRect(10, 80, 191, 16)) + self.line_5.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_5.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_5.setObjectName("line_5") + self.saved_connection_signal_strength_frame = BlocksCustomFrame(parent=self.network_properties) + self.saved_connection_signal_strength_frame.setGeometry(QtCore.QRect(140, 180, 211, 181)) self.saved_connection_signal_strength_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.saved_connection_signal_strength_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.saved_connection_signal_strength_frame.setObjectName("saved_connection_signal_strength_frame") self.sabed_connection_signal_strength_label = QtWidgets.QLabel(parent=self.saved_connection_signal_strength_frame) - self.sabed_connection_signal_strength_label.setGeometry(QtCore.QRect(0, 0, 100, 50)) + self.sabed_connection_signal_strength_label.setGeometry(QtCore.QRect(50, 30, 111, 50)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -334,39 +633,31 @@ def setupUi(self, wifi_stacked_page): brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) self.sabed_connection_signal_strength_label.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(15) + self.sabed_connection_signal_strength_label.setFont(font) self.sabed_connection_signal_strength_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.sabed_connection_signal_strength_label.setObjectName("sabed_connection_signal_strength_label") self.saved_connection_signal_strength_info_frame = QtWidgets.QLabel(parent=self.saved_connection_signal_strength_frame) - self.saved_connection_signal_strength_info_frame.setGeometry(QtCore.QRect(150, 0, 500, 50)) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.saved_connection_signal_strength_info_frame.setPalette(palette) + self.saved_connection_signal_strength_info_frame.setGeometry(QtCore.QRect(30, 100, 151, 61)) + font = QtGui.QFont() + font.setPointSize(20) + self.saved_connection_signal_strength_info_frame.setFont(font) + self.saved_connection_signal_strength_info_frame.setStyleSheet("color:white") self.saved_connection_signal_strength_info_frame.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.saved_connection_signal_strength_info_frame.setObjectName("saved_connection_signal_strength_info_frame") - self.saved_connection_change_password_frame = QtWidgets.QFrame(parent=self.network_properties) - self.saved_connection_change_password_frame.setGeometry(QtCore.QRect(30, 170, 650, 50)) + self.line_4 = QtWidgets.QFrame(parent=self.saved_connection_signal_strength_frame) + self.line_4.setGeometry(QtCore.QRect(10, 80, 191, 16)) + self.line_4.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_4.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_4.setObjectName("line_4") + self.saved_connection_change_password_frame = BlocksCustomFrame(parent=self.network_properties) + self.saved_connection_change_password_frame.setGeometry(QtCore.QRect(20, 70, 761, 81)) self.saved_connection_change_password_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.saved_connection_change_password_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.saved_connection_change_password_frame.setObjectName("saved_connection_change_password_frame") self.saved_connection_change_password_label = QtWidgets.QLabel(parent=self.saved_connection_change_password_frame) - self.saved_connection_change_password_label.setGeometry(QtCore.QRect(0, 0, 100, 50)) + self.saved_connection_change_password_label.setGeometry(QtCore.QRect(10, 10, 100, 61)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -387,26 +678,29 @@ def setupUi(self, wifi_stacked_page): brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) self.saved_connection_change_password_label.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(15) + self.saved_connection_change_password_label.setFont(font) self.saved_connection_change_password_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.saved_connection_change_password_label.setObjectName("saved_connection_change_password_label") - self.saved_connection_change_password_field = QtWidgets.QLineEdit(parent=self.saved_connection_change_password_frame) - self.saved_connection_change_password_field.setGeometry(QtCore.QRect(112, 9, 471, 31)) + self.saved_connection_change_password_field = BlocksCustomLinEdit(parent=self.saved_connection_change_password_frame) + self.saved_connection_change_password_field.setGeometry(QtCore.QRect(120, 20, 541, 41)) + self.saved_connection_change_password_field.setMinimumSize(QtCore.QSize(0, 40)) self.saved_connection_change_password_field.setObjectName("saved_connection_change_password_field") - self.saved_connection_change_password_view = QtWidgets.QPushButton(parent=self.saved_connection_change_password_frame) - self.saved_connection_change_password_view.setGeometry(QtCore.QRect(600, 10, 41, 23)) + self.saved_connection_change_password_view = IconButton(parent=self.saved_connection_change_password_frame) + self.saved_connection_change_password_view.setGeometry(QtCore.QRect(680, 10, 60, 60)) + self.saved_connection_change_password_view.setMinimumSize(QtCore.QSize(60, 60)) + self.saved_connection_change_password_view.setMaximumSize(QtCore.QSize(60, 60)) + self.saved_connection_change_password_view.setFlat(True) + self.saved_connection_change_password_view.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) self.saved_connection_change_password_view.setObjectName("saved_connection_change_password_view") - self.field_option_4 = QtWidgets.QFrame(parent=self.network_properties) - self.field_option_4.setGeometry(QtCore.QRect(30, 240, 650, 50)) - self.field_option_4.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.field_option_4.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.field_option_4.setObjectName("field_option_4") - self.saved_connection_page_header = QtWidgets.QFrame(parent=self.saved_connection_page) - self.saved_connection_page_header.setGeometry(QtCore.QRect(0, 0, 800, 80)) + self.saved_connection_page_header = BlocksCustomFrame(parent=self.saved_connection_page) + self.saved_connection_page_header.setGeometry(QtCore.QRect(0, -21, 800, 91)) self.saved_connection_page_header.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) self.saved_connection_page_header.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) self.saved_connection_page_header.setObjectName("saved_connection_page_header") self.saved_connection_network_name = QtWidgets.QLabel(parent=self.saved_connection_page_header) - self.saved_connection_network_name.setGeometry(QtCore.QRect(350, 0, 100, 80)) + self.saved_connection_network_name.setGeometry(QtCore.QRect(70, 20, 651, 71)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -427,39 +721,35 @@ def setupUi(self, wifi_stacked_page): brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) self.saved_connection_network_name.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(20) + self.saved_connection_network_name.setFont(font) self.saved_connection_network_name.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.saved_connection_network_name.setObjectName("saved_connection_network_name") - self.saved_connection_back_button = QtWidgets.QPushButton(parent=self.saved_connection_page_header) - self.saved_connection_back_button.setGeometry(QtCore.QRect(0, 0, 80, 80)) + self.saved_connection_back_button = IconButton(parent=self.saved_connection_page_header) + self.saved_connection_back_button.setGeometry(QtCore.QRect(0, 20, 60, 60)) + self.saved_connection_back_button.setMinimumSize(QtCore.QSize(60, 60)) + self.saved_connection_back_button.setMaximumSize(QtCore.QSize(60, 60)) + self.saved_connection_back_button.setFlat(True) + self.saved_connection_back_button.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) self.saved_connection_back_button.setObjectName("saved_connection_back_button") - self.saved_connection_delete_network_button = QtWidgets.QPushButton(parent=self.saved_connection_page_header) - self.saved_connection_delete_network_button.setGeometry(QtCore.QRect(720, 0, 80, 80)) + self.saved_connection_delete_network_button = IconButton(parent=self.saved_connection_page_header) + self.saved_connection_delete_network_button.setGeometry(QtCore.QRect(730, 20, 60, 60)) + self.saved_connection_delete_network_button.setMinimumSize(QtCore.QSize(60, 60)) + self.saved_connection_delete_network_button.setMaximumSize(QtCore.QSize(60, 60)) + self.saved_connection_delete_network_button.setFlat(True) + self.saved_connection_delete_network_button.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/indf_svg.svg")) self.saved_connection_delete_network_button.setObjectName("saved_connection_delete_network_button") wifi_stacked_page.addWidget(self.saved_connection_page) self.hotspot_page = QtWidgets.QWidget() self.hotspot_page.setObjectName("hotspot_page") - self.hotspot_main_frame = QtWidgets.QFrame(parent=self.hotspot_page) - self.hotspot_main_frame.setGeometry(QtCore.QRect(0, 80, 800, 400)) - self.hotspot_main_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.hotspot_main_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.hotspot_main_frame.setObjectName("hotspot_main_frame") - self.verticalLayoutWidget = QtWidgets.QWidget(parent=self.hotspot_main_frame) - self.verticalLayoutWidget.setGeometry(QtCore.QRect(90, 30, 621, 331)) - self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") - self.hotspot_main_frame_layout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) - self.hotspot_main_frame_layout.setContentsMargins(0, 0, 0, 0) - self.hotspot_main_frame_layout.setObjectName("hotspot_main_frame_layout") - self.hotspot_info_name_frame = QtWidgets.QFrame(parent=self.verticalLayoutWidget) - self.hotspot_info_name_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.hotspot_info_name_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.hotspot_info_name_frame.setObjectName("hotspot_info_name_frame") - self.hotspot_info_name_label = QtWidgets.QLabel(parent=self.hotspot_info_name_frame) - self.hotspot_info_name_label.setGeometry(QtCore.QRect(10, 10, 101, 81)) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Maximum) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.hotspot_info_name_label.sizePolicy().hasHeightForWidth()) - self.hotspot_info_name_label.setSizePolicy(sizePolicy) + self.hotspot_header_frame = BlocksCustomFrame(parent=self.hotspot_page) + self.hotspot_header_frame.setGeometry(QtCore.QRect(0, -30, 800, 101)) + self.hotspot_header_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.hotspot_header_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.hotspot_header_frame.setObjectName("hotspot_header_frame") + self.hotspot_header_title = QtWidgets.QLabel(parent=self.hotspot_header_frame) + self.hotspot_header_title.setGeometry(QtCore.QRect(320, 30, 171, 71)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -479,23 +769,39 @@ def setupUi(self, wifi_stacked_page): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.hotspot_info_name_label.setPalette(palette) - self.hotspot_info_name_label.setObjectName("hotspot_info_name_label") - self.hotspot_name_input_field = QtWidgets.QLineEdit(parent=self.hotspot_info_name_frame) - self.hotspot_name_input_field.setGeometry(QtCore.QRect(270, 20, 231, 31)) - self.hotspot_name_input_field.setObjectName("hotspot_name_input_field") - self.hotspot_main_frame_layout.addWidget(self.hotspot_info_name_frame) - self.hotspot_info_password_frame = QtWidgets.QFrame(parent=self.verticalLayoutWidget) - self.hotspot_info_password_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.hotspot_info_password_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.hotspot_info_password_frame.setObjectName("hotspot_info_password_frame") - self.hotspot_info_password_label = QtWidgets.QLabel(parent=self.hotspot_info_password_frame) - self.hotspot_info_password_label.setGeometry(QtCore.QRect(10, 10, 111, 71)) + self.hotspot_header_title.setPalette(palette) + font = QtGui.QFont() + font.setPointSize(20) + self.hotspot_header_title.setFont(font) + self.hotspot_header_title.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.hotspot_header_title.setObjectName("hotspot_header_title") + self.hotspot_back_button = IconButton(parent=self.hotspot_header_frame) + self.hotspot_back_button.setGeometry(QtCore.QRect(0, 30, 60, 60)) + self.hotspot_back_button.setMinimumSize(QtCore.QSize(60, 60)) + self.hotspot_back_button.setMaximumSize(QtCore.QSize(60, 60)) + self.hotspot_back_button.setFlat(True) + self.hotspot_back_button.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) + self.hotspot_back_button.setObjectName("hotspot_back_button") + self.gridLayoutWidget = QtWidgets.QWidget(parent=self.hotspot_page) + self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 80, 781, 371)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.frame_2 = BlocksCustomFrame(parent=self.gridLayoutWidget) + self.frame_2.setMaximumSize(QtCore.QSize(16777215, 81)) + self.frame_2.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame_2.setObjectName("frame_2") + self.hotspot_info_password_label = QtWidgets.QLabel(parent=self.frame_2) + self.hotspot_info_password_label.setGeometry(QtCore.QRect(10, 30, 150, 21)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.hotspot_info_password_label.sizePolicy().hasHeightForWidth()) self.hotspot_info_password_label.setSizePolicy(sizePolicy) + self.hotspot_info_password_label.setMinimumSize(QtCore.QSize(0, 0)) + self.hotspot_info_password_label.setMaximumSize(QtCore.QSize(150, 16777215)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -633,104 +939,45 @@ def setupUi(self, wifi_stacked_page): brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.ToolTipText, brush) self.hotspot_info_password_label.setPalette(palette) + font = QtGui.QFont() + font.setFamily("Momcake") + font.setPointSize(10) + self.hotspot_info_password_label.setFont(font) + self.hotspot_info_password_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.hotspot_info_password_label.setObjectName("hotspot_info_password_label") - self.hotspot_password_input_field = QtWidgets.QLineEdit(parent=self.hotspot_info_password_frame) - self.hotspot_password_input_field.setGeometry(QtCore.QRect(272, 19, 231, 41)) + self.hotspot_password_input_field = BlocksCustomLinEdit(parent=self.frame_2) + self.hotspot_password_input_field.setGeometry(QtCore.QRect(160, 20, 521, 40)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.hotspot_password_input_field.sizePolicy().hasHeightForWidth()) + self.hotspot_password_input_field.setSizePolicy(sizePolicy) + self.hotspot_password_input_field.setMinimumSize(QtCore.QSize(120, 40)) + self.hotspot_password_input_field.setMaximumSize(QtCore.QSize(16777215, 40)) self.hotspot_password_input_field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.hotspot_password_input_field.setObjectName("hotspot_password_input_field") - self.hotspot_password_view_button = QtWidgets.QPushButton(parent=self.hotspot_info_password_frame) - self.hotspot_password_view_button.setGeometry(QtCore.QRect(530, 22, 51, 31)) + self.hotspot_password_view_button = IconButton(parent=self.frame_2) + self.hotspot_password_view_button.setGeometry(QtCore.QRect(700, 10, 60, 60)) + self.hotspot_password_view_button.setMinimumSize(QtCore.QSize(60, 60)) + self.hotspot_password_view_button.setMaximumSize(QtCore.QSize(60, 60)) + self.hotspot_password_view_button.setFlat(True) + self.hotspot_password_view_button.setProperty("icon_pixmap", QtGui.QPixmap(":/ui/media/btn_icons/back.svg")) self.hotspot_password_view_button.setObjectName("hotspot_password_view_button") - self.hotspot_main_frame_layout.addWidget(self.hotspot_info_password_frame) - self.hotspot_info_ip_frame = QtWidgets.QFrame(parent=self.verticalLayoutWidget) - self.hotspot_info_ip_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.hotspot_info_ip_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.hotspot_info_ip_frame.setObjectName("hotspot_info_ip_frame") - self.hotspot_info_ip_label = QtWidgets.QLabel(parent=self.hotspot_info_ip_frame) - self.hotspot_info_ip_label.setGeometry(QtCore.QRect(10, 10, 121, 81)) + self.gridLayout.addWidget(self.frame_2, 1, 0, 1, 2) + self.frame = BlocksCustomFrame(parent=self.gridLayoutWidget) + self.frame.setMaximumSize(QtCore.QSize(16777215, 81)) + self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.frame.setObjectName("frame") + self.hotspot_info_name_label = QtWidgets.QLabel(parent=self.frame) + self.hotspot_info_name_label.setGeometry(QtCore.QRect(10, 30, 150, 21)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Maximum) sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(1) - sizePolicy.setHeightForWidth(self.hotspot_info_ip_label.sizePolicy().hasHeightForWidth()) - self.hotspot_info_ip_label.setSizePolicy(sizePolicy) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.hotspot_info_ip_label.setPalette(palette) - self.hotspot_info_ip_label.setObjectName("hotspot_info_ip_label") - self.hotspot_info_ip_field = QtWidgets.QLabel(parent=self.hotspot_info_ip_frame) - self.hotspot_info_ip_field.setGeometry(QtCore.QRect(296, 22, 201, 51)) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.hotspot_info_ip_field.setPalette(palette) - self.hotspot_info_ip_field.setObjectName("hotspot_info_ip_field") - self.hotspot_main_frame_layout.addWidget(self.hotspot_info_ip_frame) - self.hotspot_header_frame = QtWidgets.QFrame(parent=self.hotspot_page) - self.hotspot_header_frame.setGeometry(QtCore.QRect(0, 0, 800, 80)) - self.hotspot_header_frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.hotspot_header_frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.hotspot_header_frame.setObjectName("hotspot_header_frame") - self.hotspot_back_button = QtWidgets.QPushButton(parent=self.hotspot_header_frame) - self.hotspot_back_button.setGeometry(QtCore.QRect(0, 0, 80, 80)) - self.hotspot_back_button.setObjectName("hotspot_back_button") - self.hotspot_toggle = QtWidgets.QPushButton(parent=self.hotspot_header_frame) - self.hotspot_toggle.setGeometry(QtCore.QRect(720, 0, 80, 80)) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Text, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.WindowText, brush) - brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.hotspot_toggle.setPalette(palette) - self.hotspot_toggle.setObjectName("hotspot_toggle") - self.hotspot_header_title = QtWidgets.QLabel(parent=self.hotspot_header_frame) - self.hotspot_header_title.setGeometry(QtCore.QRect(350, 0, 100, 80)) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.hotspot_info_name_label.sizePolicy().hasHeightForWidth()) + self.hotspot_info_name_label.setSizePolicy(sizePolicy) + self.hotspot_info_name_label.setMinimumSize(QtCore.QSize(0, 0)) + self.hotspot_info_name_label.setMaximumSize(QtCore.QSize(150, 16777215)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -750,47 +997,104 @@ def setupUi(self, wifi_stacked_page): brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Text, brush) - self.hotspot_header_title.setPalette(palette) + self.hotspot_info_name_label.setPalette(palette) font = QtGui.QFont() - font.setPointSize(15) - self.hotspot_header_title.setFont(font) - self.hotspot_header_title.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.hotspot_header_title.setObjectName("hotspot_header_title") + font.setFamily("Momcake") + font.setPointSize(10) + self.hotspot_info_name_label.setFont(font) + self.hotspot_info_name_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.hotspot_info_name_label.setObjectName("hotspot_info_name_label") + self.hotspot_name_input_field = BlocksCustomLinEdit(parent=self.frame) + self.hotspot_name_input_field.setGeometry(QtCore.QRect(160, 20, 521, 40)) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.hotspot_name_input_field.sizePolicy().hasHeightForWidth()) + self.hotspot_name_input_field.setSizePolicy(sizePolicy) + self.hotspot_name_input_field.setMinimumSize(QtCore.QSize(120, 40)) + self.hotspot_name_input_field.setMaximumSize(QtCore.QSize(16777215, 40)) + self.hotspot_name_input_field.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.hotspot_name_input_field.setObjectName("hotspot_name_input_field") + self.gridLayout.addWidget(self.frame, 0, 0, 1, 2) wifi_stacked_page.addWidget(self.hotspot_page) self.retranslateUi(wifi_stacked_page) - wifi_stacked_page.setCurrentIndex(0) + wifi_stacked_page.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(wifi_stacked_page) def retranslateUi(self, wifi_stacked_page): _translate = QtCore.QCoreApplication.translate wifi_stacked_page.setWindowTitle(_translate("wifi_stacked_page", "StackedWidget")) - self.network_list_table_header_label.setText(_translate("wifi_stacked_page", "SSID")) - self.wifi_main_title.setText(_translate("wifi_stacked_page", "Networks")) + self.netlist_security_label.setText(_translate("wifi_stacked_page", "Security\n" +"Type")) + self.netlist_security.setText(_translate("wifi_stacked_page", "TextLabel")) + self.netlist_strength_label.setText(_translate("wifi_stacked_page", "Signal\n" +"Strength")) + self.netlist_strength.setText(_translate("wifi_stacked_page", "TextLabel")) + self.netlist_ip.setText(_translate("wifi_stacked_page", "TextLabel")) + self.label_2.setText(_translate("wifi_stacked_page", "No network connection.\n" +"\n" +"Try connecting to Wi-Fi \n" +"or turn on the hotspot\n" +"using the buttons on the side.")) + self.netlist_ssuid.setText(_translate("wifi_stacked_page", "TextLabel")) + self.network_main_title.setText(_translate("wifi_stacked_page", "Networks")) + self.network_backButton.setText(_translate("wifi_stacked_page", "Back")) + self.network_backButton.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.network_backButton.setProperty("button_type", _translate("wifi_stacked_page", "icon")) + self.Togglewifi.setText(_translate("wifi_stacked_page", "Toggle wifi")) + self.Togglewifi.setProperty("class", _translate("wifi_stacked_page", "menu_btn")) + self.Togglewifi.setProperty("button_type", _translate("wifi_stacked_page", "normal")) + self.wifi_button.setText(_translate("wifi_stacked_page", "Wi-Fi")) + self.hotspot_button.setText(_translate("wifi_stacked_page", "Hotspot")) + self.Togglehot.setText(_translate("wifi_stacked_page", "Toggle HOT")) + self.network_main_title_2.setText(_translate("wifi_stacked_page", "Wi-fi List")) + self.rescan_button.setText(_translate("wifi_stacked_page", "Reload")) + self.rescan_button.setProperty("button_type", _translate("wifi_stacked_page", "icon")) self.wifi_backButton.setText(_translate("wifi_stacked_page", "Back")) - self.rescan_button.setText(_translate("wifi_stacked_page", "Scan Again")) - self.wifi_toggle_button.setText(_translate("wifi_stacked_page", "Toggle wifi")) - self.call_hotspot_button.setText(_translate("wifi_stacked_page", "Hotspot page")) + self.wifi_backButton.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.wifi_backButton.setProperty("button_type", _translate("wifi_stacked_page", "icon")) self.add_network_password_label.setText(_translate("wifi_stacked_page", "Password")) - self.add_network_password_view.setText(_translate("wifi_stacked_page", "view")) - self.add_network_validation_button.setText(_translate("wifi_stacked_page", "Validation")) - self.add_network_message_label.setText(_translate("wifi_stacked_page", "TextLabel")) + self.add_network_password_view.setText(_translate("wifi_stacked_page", "View")) + self.add_network_password_view.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.add_network_password_view.setProperty("button_type", _translate("wifi_stacked_page", "icon")) + self.add_network_validation_button.setText(_translate("wifi_stacked_page", "a")) + self.add_network_validation_button.setProperty("button_type", _translate("wifi_stacked_page", "icon")) + self.cancel_network_validation_button.setText(_translate("wifi_stacked_page", "a")) + self.cancel_network_validation_button.setProperty("button_type", _translate("wifi_stacked_page", "icon")) self.add_network_network_label.setText(_translate("wifi_stacked_page", "NetworkName")) self.add_network_page_backButton.setText(_translate("wifi_stacked_page", "Back")) - self.saved_connection_security_type_label.setText(_translate("wifi_stacked_page", "Security Type")) + self.add_network_page_backButton.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.add_network_page_backButton.setProperty("button_type", _translate("wifi_stacked_page", "icon")) + self.saved_connection_security_type_label.setText(_translate("wifi_stacked_page", "Security\n" +"Type")) self.saved_connection_security_type_info_label.setText(_translate("wifi_stacked_page", "TextLabel")) - self.sabed_connection_signal_strength_label.setText(_translate("wifi_stacked_page", "Signal Strength")) + self.sabed_connection_signal_strength_label.setText(_translate("wifi_stacked_page", "Signal\n" +"Strength")) self.saved_connection_signal_strength_info_frame.setText(_translate("wifi_stacked_page", "TextLabel")) - self.saved_connection_change_password_label.setText(_translate("wifi_stacked_page", "Change Password")) - self.saved_connection_change_password_view.setText(_translate("wifi_stacked_page", "view")) + self.saved_connection_change_password_label.setText(_translate("wifi_stacked_page", "Change\n" +"Password")) + self.saved_connection_change_password_view.setText(_translate("wifi_stacked_page", "View")) + self.saved_connection_change_password_view.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.saved_connection_change_password_view.setProperty("button_type", _translate("wifi_stacked_page", "icon")) self.saved_connection_network_name.setText(_translate("wifi_stacked_page", "SSID")) self.saved_connection_back_button.setText(_translate("wifi_stacked_page", "Back")) + self.saved_connection_back_button.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.saved_connection_back_button.setProperty("button_type", _translate("wifi_stacked_page", "icon")) self.saved_connection_delete_network_button.setText(_translate("wifi_stacked_page", "Delete")) - self.hotspot_info_name_label.setText(_translate("wifi_stacked_page", "Hotspot Name: ")) - self.hotspot_info_password_label.setText(_translate("wifi_stacked_page", "Hotspot Password:")) - self.hotspot_password_view_button.setText(_translate("wifi_stacked_page", "PushButton")) - self.hotspot_info_ip_label.setText(_translate("wifi_stacked_page", "Hotspot Machine Ip address")) - self.hotspot_info_ip_field.setText(_translate("wifi_stacked_page", "TextLabel")) - self.hotspot_back_button.setText(_translate("wifi_stacked_page", "Back")) - self.hotspot_toggle.setText(_translate("wifi_stacked_page", "Toggle Hot")) + self.saved_connection_delete_network_button.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.saved_connection_delete_network_button.setProperty("button_type", _translate("wifi_stacked_page", "icon")) self.hotspot_header_title.setText(_translate("wifi_stacked_page", "Hotspot")) + self.hotspot_back_button.setText(_translate("wifi_stacked_page", "Back")) + self.hotspot_back_button.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.hotspot_back_button.setProperty("button_type", _translate("wifi_stacked_page", "icon")) + self.hotspot_info_password_label.setText(_translate("wifi_stacked_page", "Hotspot Password:")) + self.hotspot_password_view_button.setText(_translate("wifi_stacked_page", "View")) + self.hotspot_password_view_button.setProperty("class", _translate("wifi_stacked_page", "back_btn")) + self.hotspot_password_view_button.setProperty("button_type", _translate("wifi_stacked_page", "icon")) + self.hotspot_info_name_label.setText(_translate("wifi_stacked_page", "Hotspot Name: ")) +from lib.utils.blocks_frame import BlocksCustomFrame +from lib.utils.blocks_linedit import BlocksCustomLinEdit +from lib.utils.icon_button import IconButton +from lib.utils.list_button import ListCustomButton +from lib.utils.toggleAnimatedButton import ToggleAnimatedButton diff --git a/BlocksScreen/lib/util.py b/BlocksScreen/lib/util.py deleted file mode 100644 index e69de29b..00000000 diff --git a/BlocksScreen/lib/utils/blocks_ScrollBar.py b/BlocksScreen/lib/utils/blocks_ScrollBar.py new file mode 100644 index 00000000..08dc6b68 --- /dev/null +++ b/BlocksScreen/lib/utils/blocks_ScrollBar.py @@ -0,0 +1,78 @@ +from PyQt6 import QtCore, QtGui, QtWidgets +import numpy as np + + +class CustomScrollBar(QtWidgets.QScrollBar): + def __init__(self, parent=None): + super().__init__(parent) + self.setFixedWidth(40) + + def paintEvent(self, event): + painter = QtGui.QPainter(self) + painter.setRenderHint(painter.RenderHint.Antialiasing, True) + painter.setRenderHint(painter.RenderHint.SmoothPixmapTransform, True) + painter.setRenderHint(painter.RenderHint.LosslessImageRendering, True) + + groove = self.rect().adjusted(0, 0, -35, 0) + min_val, max_val = self.minimum(), self.maximum() + page_step = self.pageStep() + val = self.value() + + handle_width = 5 + + if max_val == min_val: + return + + handle_percentage = int((self.value() / max_val) * 100) + + if handle_percentage < 15: + base_handle_length = int( + (groove.height() * page_step / (max_val - min_val + page_step)) + + np.interp(handle_percentage, [0, 15], [0, 40]) + ) + handle_pos = 0 + + elif handle_percentage > 85: + base_handle_length = int( + (groove.height() * page_step / (max_val - min_val + page_step)) + + np.interp(handle_percentage, [85, 100], [40, 0]) + ) + handle_pos = int( + (groove.height() - base_handle_length) + * (max_val - min_val) + / (max_val - min_val) + ) + else: + val = ( + np.interp((handle_percentage), [15, 85], [0, 100]) + / 100 + * max_val + ) + + base_handle_length = int( + (groove.height() * page_step / (max_val - min_val + page_step)) + + 40 + ) + handle_pos = int( + (groove.height() - base_handle_length) + * (val - min_val) + / (max_val - min_val) + ) + + handle_rect = QtCore.QRect( + groove.x(), + int(groove.y() + handle_pos), + handle_width, + base_handle_length, + ) + + gradient = QtGui.QLinearGradient( + QtCore.QPointF(handle_rect.topLeft()), + QtCore.QPointF(handle_rect.bottomLeft()), + ) + + gradient.setColorAt(0.0, QtGui.QColor(164, 164, 164, 100)) # Top + gradient.setColorAt(0.5, QtGui.QColor(164, 164, 164, 164)) # Center + gradient.setColorAt(1.0, QtGui.QColor(164, 164, 164, 100)) # Bottom + painter.setBrush(gradient) + painter.drawRoundedRect(handle_rect, 1, 1) diff --git a/BlocksScreen/lib/utils/blocks_Scrollbar.py b/BlocksScreen/lib/utils/blocks_Scrollbar.py new file mode 100644 index 00000000..08dc6b68 --- /dev/null +++ b/BlocksScreen/lib/utils/blocks_Scrollbar.py @@ -0,0 +1,78 @@ +from PyQt6 import QtCore, QtGui, QtWidgets +import numpy as np + + +class CustomScrollBar(QtWidgets.QScrollBar): + def __init__(self, parent=None): + super().__init__(parent) + self.setFixedWidth(40) + + def paintEvent(self, event): + painter = QtGui.QPainter(self) + painter.setRenderHint(painter.RenderHint.Antialiasing, True) + painter.setRenderHint(painter.RenderHint.SmoothPixmapTransform, True) + painter.setRenderHint(painter.RenderHint.LosslessImageRendering, True) + + groove = self.rect().adjusted(0, 0, -35, 0) + min_val, max_val = self.minimum(), self.maximum() + page_step = self.pageStep() + val = self.value() + + handle_width = 5 + + if max_val == min_val: + return + + handle_percentage = int((self.value() / max_val) * 100) + + if handle_percentage < 15: + base_handle_length = int( + (groove.height() * page_step / (max_val - min_val + page_step)) + + np.interp(handle_percentage, [0, 15], [0, 40]) + ) + handle_pos = 0 + + elif handle_percentage > 85: + base_handle_length = int( + (groove.height() * page_step / (max_val - min_val + page_step)) + + np.interp(handle_percentage, [85, 100], [40, 0]) + ) + handle_pos = int( + (groove.height() - base_handle_length) + * (max_val - min_val) + / (max_val - min_val) + ) + else: + val = ( + np.interp((handle_percentage), [15, 85], [0, 100]) + / 100 + * max_val + ) + + base_handle_length = int( + (groove.height() * page_step / (max_val - min_val + page_step)) + + 40 + ) + handle_pos = int( + (groove.height() - base_handle_length) + * (val - min_val) + / (max_val - min_val) + ) + + handle_rect = QtCore.QRect( + groove.x(), + int(groove.y() + handle_pos), + handle_width, + base_handle_length, + ) + + gradient = QtGui.QLinearGradient( + QtCore.QPointF(handle_rect.topLeft()), + QtCore.QPointF(handle_rect.bottomLeft()), + ) + + gradient.setColorAt(0.0, QtGui.QColor(164, 164, 164, 100)) # Top + gradient.setColorAt(0.5, QtGui.QColor(164, 164, 164, 164)) # Center + gradient.setColorAt(1.0, QtGui.QColor(164, 164, 164, 100)) # Bottom + painter.setBrush(gradient) + painter.drawRoundedRect(handle_rect, 1, 1) diff --git a/BlocksScreen/lib/utils/blocks_frame.py b/BlocksScreen/lib/utils/blocks_frame.py new file mode 100644 index 00000000..a686e247 --- /dev/null +++ b/BlocksScreen/lib/utils/blocks_frame.py @@ -0,0 +1,28 @@ +from PyQt6.QtWidgets import QFrame +from PyQt6.QtGui import QPainter, QPen, QBrush, QColor +from PyQt6.QtCore import QRectF + + +class BlocksCustomFrame(QFrame): + def __init__(self, parent=None): + super().__init__(parent) + self._radius = 10 + + def setRadius(self, radius: int): + self._radius = radius + self.update() + + def radius(self): + return self._radius + + def paintEvent(self, event): + painter = QPainter(self) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) + rect = QRectF(self.rect()) + pen = QPen(QColor(190, 190, 190, 50)) + pen.setWidth(2) + painter.setPen(pen) + painter.setBrush(QBrush(QColor(84, 84, 84, 0))) + painter.drawRoundedRect( + rect.adjusted(1, 1, -1, -1), self._radius, self._radius + ) diff --git a/BlocksScreen/lib/utils/blocks_linedit.py b/BlocksScreen/lib/utils/blocks_linedit.py new file mode 100644 index 00000000..fde89e0c --- /dev/null +++ b/BlocksScreen/lib/utils/blocks_linedit.py @@ -0,0 +1,71 @@ +import typing +from PyQt6 import QtCore, QtGui, QtWidgets + + +class BlocksCustomLinEdit(QtWidgets.QLineEdit): + def __init__( + self, + parent: QtWidgets.QWidget, + ) -> None: + super(BlocksCustomLinEdit, self).__init__(parent) + + self.button_background = None + self.button_ellipse = None + self._text: str = "" + self.placeholder_str = "Type here" + self._name: str = "" + self.text_color: QtGui.QColor = QtGui.QColor(0, 0, 0) + self.secret: bool = False # NEW: controls masking + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True) + + @property + def name(self): + return self._name + + @name.setter + def name(self, new_name) -> None: + self._name = new_name + self.setObjectName(new_name) + + def setText(self, text: str) -> None: + super().setText(text) # let QLineEdit handle storing and editing + + def setHidden(self, hidden: bool) -> None: + self.secret = hidden + self.update() + + def paintEvent(self, e: typing.Optional[QtGui.QPaintEvent]): + painter = QtGui.QPainter(self) + painter.setRenderHint(painter.RenderHint.Antialiasing, True) + + # Draw background + bg_color = QtGui.QColor(223, 223, 223) + painter.setBrush(bg_color) + painter.setPen(QtCore.Qt.PenStyle.NoPen) + painter.drawRoundedRect(self.rect(), 8, 8) + + margin = 5 # adjust as needed + + # Get display text (masked if secret) + display_text = self.text() + if self.secret and display_text: + display_text = "*" * len(display_text) + + # Draw text + if self.text(): + painter.setPen(self.text_color) + painter.drawText( + self.rect().adjusted(margin, 0, 0, 0), + QtCore.Qt.AlignmentFlag.AlignLeft + | QtCore.Qt.AlignmentFlag.AlignVCenter, + display_text, + ) + else: + # Draw placeholder + painter.setPen(QtGui.QColor(150, 150, 150)) + painter.drawText( + self.rect().adjusted(margin, 0, 0, 0), + QtCore.Qt.AlignmentFlag.AlignLeft + | QtCore.Qt.AlignmentFlag.AlignVCenter, + self.placeholder_str, + ) diff --git a/BlocksScreen/lib/utils/blocks_slider.py b/BlocksScreen/lib/utils/blocks_slider.py index c8823c17..4d1078c7 100644 --- a/BlocksScreen/lib/utils/blocks_slider.py +++ b/BlocksScreen/lib/utils/blocks_slider.py @@ -1,36 +1,22 @@ -import typing +import sys from PyQt6 import QtCore, QtGui, QtWidgets class BlocksSlider(QtWidgets.QSlider): - valueChanged: typing.ClassVar[QtCore.pyqtSignal] = QtCore.pyqtSignal( - int, name="valueChanged" - ) - def __init__(self, parent) -> None: super().__init__(parent) - self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True) self.highlight_color = "#2AC9F9" self.gradient_pos = QtCore.QPointF(0.0, 0.0) - self.setMinimumSize(300, 130) - self.setMaximumSize(400, 130) + self.setMinimumSize(300, 100) + self.setMaximumSize(400, 100) self.setMouseTracking(True) self.setTracking(True) - self.setTabletTracking(True) - self.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.setTickInterval(20) self.setMinimum(0) self.setMaximum(100) - def setMinimum(self, a0: int) -> None: - super().setMinimum(a0) - return self.update() - - def setMaximum(self, a0: int) -> None: - super().setMaximum(a0) - return self.update() - def setOrientation(self, a0: QtCore.Qt.Orientation) -> None: return super().setOrientation(a0) @@ -41,21 +27,26 @@ def mousePressEvent(self, ev: QtGui.QMouseEvent) -> None: ): self.setSliderDown(True) ev.accept() + else: + return super().mousePressEvent(ev) def mouseReleaseEvent(self, ev: QtGui.QMouseEvent) -> None: """Handle mouse release events""" if self.isSliderDown(): self.setSliderDown(False) - self.valueChanged.emit(self.value()) - ev.accept() + return super().mouseReleaseEvent(ev) def mouseMoveEvent(self, ev: QtGui.QMouseEvent) -> None: """Handle mouse move events""" + opt = QtWidgets.QStyleOptionSlider() + self.initStyleOption(opt) if self.isSliderDown(): self._set_slider_pos(ev.position().toPoint().toPointF()) self.gradient_pos = ev.position().toPoint().toPointF() self.update() ev.accept() + else: + return super().mouseMoveEvent(ev) def hit_test(self, pos: QtCore.QPointF) -> bool: """Hit test to allow dragging larger handle area @@ -89,14 +80,10 @@ def _set_slider_pos(self, pos: QtCore.QPointF): min_val + (max_val - min_val) * (pos_y - slider_start) / slider_length ) + self.setSliderPosition(int(round(new_val))) self.setValue(int(round(new_val))) self.update() - def setSliderPosition(self, value) -> None: - if self.isVisible(): - self.valueChanged.emit(value) - super().setSliderPosition(value) - def paintEvent(self, ev: QtGui.QPaintEvent) -> None: opt = QtWidgets.QStyleOptionSlider() self.initStyleOption(opt) @@ -105,7 +92,7 @@ def paintEvent(self, ev: QtGui.QPaintEvent) -> None: # Clip the opt rect inside, so the handle and # groove doesn't exceed the limits opt.rect = opt.rect.adjusted( - 30, 10, -35, 20 + 12, 10, -18, 20 ) # This is a bit hardcoded self._groove_rect = _style.subControlRect( @@ -114,19 +101,37 @@ def paintEvent(self, ev: QtGui.QPaintEvent) -> None: QtWidgets.QStyle.SubControl.SC_SliderGroove, self, ) - self._groove_rect.setSize(QtCore.QSize(self.width() - 60, 30)) + + self._groove_rect.setSize(QtCore.QSize(self.width() - 25, 30)) + self._handle_rect = _style.subControlRect( QtWidgets.QStyle.ComplexControl.CC_Slider, opt, QtWidgets.QStyle.SubControl.SC_SliderHandle, self, ) + self._handle_rect.setSize(QtCore.QSize(20, 50)) + # self.style().subControlRect( + # QtWidgets.QStyle.ComplexControl.CC_Slider, opt, QtWidgets.QStyle.SubControl.SC_SliderGroove or QtWidgets.QStyle.SubControl.SC_SliderHandle + # ) + + # if opt.state & QtWidgets.QStyle.StateFlag.State_Sunken: + # # give the track a color + # ... + # elif opt.state & QtWidgets.QStyle.StateFlag.State_MouseOver: + # # Give another color when the mouse is over the track + # ... + # else: + # # give a default color for the track + # ... _groove_x = (self.width() - self._groove_rect.width()) // 2 - _groove_y = ((self.height() - self._groove_rect.height()) // 2) - 10 + _groove_y = (self.height() - self._groove_rect.height()) // 2 + self._groove_rect.moveTo(QtCore.QPoint(_groove_x, _groove_y)) - _handle_y = (self.height() - self._handle_rect.height()) // 2 - 10 + _handle_y = (self.height() - self._handle_rect.height()) // 2 self._handle_rect.moveTop(_handle_y) + _handle_color = ( QtGui.QColor(164, 164, 164) if self.isSliderDown() @@ -136,11 +141,13 @@ def paintEvent(self, ev: QtGui.QPaintEvent) -> None: _handle_path.addRoundedRect(self._handle_rect.toRectF(), 5, 5) _groove_path = QtGui.QPainterPath() _groove_path.addRoundedRect(self._groove_rect.toRectF(), 15, 15) + if self.isSliderDown(): _handle_x = ( self.sliderPosition() - _handle_path.currentPosition().x() ) // 2 _handle_path.moveTo(int(round(_handle_x)), _handle_y) + gradient_path = QtGui.QPainterPath() gradient_path.addRoundedRect( self._groove_rect.toRectF(), @@ -158,6 +165,7 @@ def paintEvent(self, ev: QtGui.QPaintEvent) -> None: painter.fillPath( _groove_path, _color ) # Primary groove background color + _color = QtGui.QColor(self.highlight_color) _color_1 = QtGui.QColor(self.highlight_color) _color_2 = QtGui.QColor(self.highlight_color) @@ -172,23 +180,24 @@ def paintEvent(self, ev: QtGui.QPaintEvent) -> None: _gradient.setColorAt(0, _color) _gradient.setColorAt(0.5, _color_1) _gradient.setColorAt(1, _color_2) + self.text_box_rect = _style.subControlRect( QtWidgets.QStyle.ComplexControl.CC_Slider, opt, QtWidgets.QStyle.SubControl.SC_SliderTickmarks, self, ) + tick_interval = self.tickInterval() or self.singleStep() min_v, max_v = self.minimum(), self.maximum() painter.setPen(QtGui.QColor("#888888")) - font = QtGui.QFont() - font.setPointSize(16) - painter.setFont(font) fm = QtGui.QFontMetrics(painter.font()) label_offset = 4 + _style.drawComplexControl( QtWidgets.QStyle.ComplexControl.CC_Slider, opt, painter, self ) self.setStyle(_style) + for v in [min_v, max_v]: x = ( QtWidgets.QStyle.sliderPositionFromValue( @@ -198,7 +207,7 @@ def paintEvent(self, ev: QtGui.QPaintEvent) -> None: ) y1 = self._groove_rect.bottom() y2 = y1 + 15 # tick length - label = str(v) + "%" + label = str(v) text_w = fm.horizontalAdvance(label) text_h = fm.ascent() text_x = x - text_w // 2 @@ -206,7 +215,8 @@ def paintEvent(self, ev: QtGui.QPaintEvent) -> None: painter.setPen(QtGui.QColor(255, 255, 255)) painter.drawLine(x, y1, x, y2) painter.drawText(text_x, text_y, label) - + + # Paint the elements with colors painter.setBrush(_gradient) painter.fillPath(gradient_path, painter.brush()) painter.fillPath(_handle_path, _handle_color) diff --git a/BlocksScreen/lib/utils/group_button.py b/BlocksScreen/lib/utils/group_button.py new file mode 100644 index 00000000..b9af752b --- /dev/null +++ b/BlocksScreen/lib/utils/group_button.py @@ -0,0 +1,154 @@ +import typing +from PyQt6 import QtCore, QtGui, QtWidgets + + +class GroupButton(QtWidgets.QPushButton): + """Custom Blocks QPushButton + Rounded button with a hole on the left side where an icon can be inserted + + Args: + parent (QWidget): Parent of the button + """ + + def __init__( + self, + parent: QtWidgets.QWidget, + ) -> None: + super(GroupButton, self).__init__(parent) + + self.icon_pixmap: QtGui.QPixmap = QtGui.QPixmap() + self._icon_rect: QtCore.QRectF = QtCore.QRectF() + self.button_background = None + self.button_ellipse = None + self._text: str = "" + self._name: str = "" + self.text_color: QtGui.QColor = QtGui.QColor(0, 0, 0) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True) + + @property + def name(self): + return self._name + + @name.setter + def name(self, new_name) -> None: + self._name = new_name + self.setObjectName(new_name) + + def text(self) -> str | None: + return self._text + + def setText(self, text: str) -> None: + self._text = text + self.update() # Force button update + return + + def setPixmap(self, pixmap: QtGui.QPixmap) -> None: + self.icon_pixmap = pixmap + self.repaint() + + def paintEvent(self, e: typing.Optional[QtGui.QPaintEvent]): + opt = QtWidgets.QStyleOptionButton() + self.initStyleOption(opt) + + painter = QtGui.QPainter(self) + painter.setRenderHint(painter.RenderHint.Antialiasing, True) + painter.setRenderHint(painter.RenderHint.SmoothPixmapTransform, True) + painter.setRenderHint(painter.RenderHint.LosslessImageRendering, True) + + _rect = self.rect() + _style = self.style() + + if _style is None or _rect is None: + return + + bg_color = ( + QtGui.QColor(223, 223, 223) + if self.isChecked() + else QtGui.QColor(164, 164, 164, 90) + if self.isDown() + else QtGui.QColor(0, 0, 0, 90) + ) + + path = QtGui.QPainterPath() + xRadius = self.rect().toRectF().normalized().height() / 5.0 + yRadius = self.rect().toRectF().normalized().height() / 5.0 + painter.setBackgroundMode(QtCore.Qt.BGMode.TransparentMode) + path.addRoundedRect( + 0, + 0, + self.rect().toRectF().normalized().width(), + self.rect().toRectF().normalized().height(), + xRadius, + yRadius, + QtCore.Qt.SizeMode.AbsoluteSize, + ) + + self.button_ellipse = QtCore.QRectF( + self.rect().toRectF().normalized().left() + + self.rect().toRectF().normalized().height() * 0.05, + self.rect().toRectF().normalized().top() + + self.rect().toRectF().normalized().height() * 0.05, + (self.rect().toRectF().normalized().height() * 0.40), + (self.rect().toRectF().normalized().height() * 0.40), + ) + + painter.setPen(QtCore.Qt.PenStyle.NoPen) + painter.setBrush(bg_color) + painter.fillPath(path, bg_color) + + if self.text(): + if self.isChecked(): + painter.setPen(QtGui.QColor(0, 0, 0)) + else: + painter.setPen(QtGui.QColor(255, 255, 255)) + _start_text_position = int(self.button_ellipse.width() / 2) + _text_rect = _rect + _pen = painter.pen() + _pen.setStyle(QtCore.Qt.PenStyle.SolidLine) + _pen.setWidth(1) + painter.setPen(_pen) + painter.setFont(QtGui.QFont("Momcake-Thin", 14)) + + painter.drawText( + _text_rect, + QtCore.Qt.AlignmentFlag.AlignCenter, + str(self.text()), + ) + painter.setPen(QtCore.Qt.PenStyle.NoPen) + + def setProperty(self, name: str, value: typing.Any): + if name == "name": + self._name = name + elif name == "text_color": + self.text_color = QtGui.QColor(value) + # return super().setProperty(name, value) + + def handleTouchBegin(self, e: QtCore.QEvent): + ... + # if not self.button_background: + # if self.button_background.contains(e.pos()): # type: ignore + # # super().mousePressEvent(e) + # self.mousePressEvent(e) # type: ignore + # return + # else: + # e.ignore() + # return + + def handleTouchUpdate(self, e: QtCore.QEvent): ... + def handleTouchEnd(self, e: QtCore.QEvent): ... + def handleTouchCancel(self, e: QtCore.QEvent): ... + + def event(self, e: QtCore.QEvent) -> bool: + if e.type() == QtCore.QEvent.Type.TouchBegin: + self.handleTouchBegin(e) + return False + elif e.type() == QtCore.QEvent.Type.TouchUpdate: + self.handleTouchUpdate(e) + return False + elif e.type() == QtCore.QEvent.Type.TouchEnd: + self.handleTouchEnd(e) + return False + elif e.type() == QtCore.QEvent.Type.TouchCancel: + self.handleTouchCancel(e) + return False + return super().event(e) diff --git a/BlocksScreen/lib/utils/list_button.py b/BlocksScreen/lib/utils/list_button.py new file mode 100644 index 00000000..87a1e3be --- /dev/null +++ b/BlocksScreen/lib/utils/list_button.py @@ -0,0 +1,248 @@ +from PyQt6 import QtCore, QtGui, QtWidgets + + +class ListCustomButton(QtWidgets.QPushButton): + def __init__(self) -> None: + super().__init__() + self.icon_pixmap: QtGui.QPixmap = QtGui.QPixmap() + self.second_icon_pixmap: QtGui.QPixmap = QtGui.QPixmap() + self.text_color: QtGui.QColor = QtGui.QColor(255, 255, 255) + self.pressed_color = "#1A8FBF" + self._text = "" + self._right_text = "" + + self._rfontsize = 15 + self._lfontsize = 11 + + self._is_pressed = False + self._is_hovered = False + + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_AcceptTouchEvents, True) + self.setSizePolicy( + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Fixed, + ) + self.setFixedHeight(48) + self.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + + def setText(self, text: str) -> None: + self._text = text + self.update() + + def setRightText(self, text: str) -> None: + self._right_text = text + self.update() + + def setLeftFontSize(self, size: int) -> None: + self._lfontsize = size + self.update() + + def setRightFontSize(self, size: int) -> None: + self._rfontsize = size + self.update() + + def setPixmap(self, pixmap: QtGui.QPixmap) -> None: + self.icon_pixmap = pixmap + self.update() + + def setSecondPixmap(self, pixmap: QtGui.QPixmap) -> None: + self.second_icon_pixmap = pixmap + self.update() + + def mousePressEvent(self, event: QtGui.QMouseEvent) -> None: + self._is_pressed = True + self.update() + super().mousePressEvent(event) + + def mouseReleaseEvent(self, event: QtGui.QMouseEvent) -> None: + self._is_pressed = False + self.update() + super().mouseReleaseEvent(event) + + def leaveEvent(self, event: QtCore.QEvent) -> None: + self._is_hovered = False + self.update() + super().leaveEvent(event) + + def paintEvent(self, e: QtGui.QPaintEvent | None) -> None: + painter = QtGui.QPainter(self) + painter.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing, True) + + rect = self.rect() + radius = rect.height() / 5.0 + + # Main rounded rectangle path + path = QtGui.QPainterPath() + path.addRoundedRect(QtCore.QRectF(rect), radius, radius) + + # Ellipse ("hole") for the icon on the right + ellipse_margin = rect.height() * 0.05 + ellipse_size = rect.height() * 0.90 + ellipse_rect = QtCore.QRectF( + rect.right() - ellipse_margin - ellipse_size, + rect.top() + ellipse_margin, + ellipse_size, + ellipse_size, + ) + ellipse_path = QtGui.QPainterPath() + ellipse_path.addEllipse(ellipse_rect) + self.button_ellipse = ellipse_rect + + # Ellipse ("hole") for the icon on the left (only if present) + left_icon_margin = rect.height() * 0.05 + left_icon_size = rect.height() * 0.90 + left_icon_rect = QtCore.QRectF( + rect.left() + left_icon_margin, + rect.top() + left_icon_margin, + left_icon_size, + left_icon_size, + ) + left_margin = 10 # default left margin + + # Gradient background (left to right) + if not self._is_pressed: + pressed_color = QtGui.QColor(self.pressed_color) + pressed_color.setAlpha(20) + painter.setPen(QtCore.Qt.PenStyle.NoPen) + painter.setBrush(pressed_color) + painter.fillPath(path, pressed_color) + else: + pressed_color = QtGui.QColor(self.pressed_color) + pressed_color.setAlpha(100) + painter.setPen(QtCore.Qt.PenStyle.NoPen) + painter.setBrush(pressed_color) + painter.fillPath(path, pressed_color) + + # Draw icon inside the ellipse "hole" (on the right) + if not self.icon_pixmap.isNull(): + icon_margin = ellipse_size * 0.10 + icon_rect = QtCore.QRectF( + ellipse_rect.left() + icon_margin / 2, + ellipse_rect.top() + icon_margin / 2, + ellipse_rect.width() - icon_margin, + ellipse_rect.height() - icon_margin, + ) + icon_scaled = self.icon_pixmap.scaled( + icon_rect.size().toSize(), + QtCore.Qt.AspectRatioMode.KeepAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation, + ) + # Center the icon in the ellipse + adjusted_x = ( + icon_rect.x() + (icon_rect.width() - icon_scaled.width()) / 2.0 + ) + adjusted_y = ( + icon_rect.y() + + (icon_rect.height() - icon_scaled.height()) / 2.0 + ) + adjusted_icon_rect = QtCore.QRectF( + adjusted_x, + adjusted_y, + icon_scaled.width(), + icon_scaled.height(), + ) + painter.drawPixmap( + adjusted_icon_rect, icon_scaled, icon_scaled.rect().toRectF() + ) + + # Draw second icon (on the left, if present) + if not self.second_icon_pixmap.isNull(): + left_icon_scaled = self.second_icon_pixmap.scaled( + left_icon_rect.size().toSize(), + QtCore.Qt.AspectRatioMode.KeepAspectRatio, + QtCore.Qt.TransformationMode.SmoothTransformation, + ) + # Center the icon in the rect + adjusted_x = ( + left_icon_rect.x() + + (left_icon_rect.width() - left_icon_scaled.width()) / 2.0 + ) + adjusted_y = ( + left_icon_rect.y() + + (left_icon_rect.height() - left_icon_scaled.height()) / 2.0 + ) # <-- FIXED HERE + adjusted_left_icon_rect = QtCore.QRectF( + adjusted_x, + adjusted_y, + left_icon_scaled.width(), + left_icon_scaled.height(), + ) + painter.drawPixmap( + adjusted_left_icon_rect, + left_icon_scaled, + left_icon_scaled.rect().toRectF(), + ) + left_margin = ( + left_icon_margin + left_icon_size + 8 + ) # 8px gap after icon + + # Draw text, area before the ellipse (adjusted for left icon) + text_margin = int( + rect.right() - ellipse_size - ellipse_margin - rect.height() * 0.10 + ) + text_rect = QtCore.QRectF( + rect.left() + left_margin, + rect.top(), + text_margin - rect.left() - left_margin, + rect.height(), + ) + + # Draw main text (left-aligned) + painter.setPen(self.text_color) + _font = painter.font() + _font.setPointSize(self._lfontsize) + painter.setFont(_font) + metrics = QtGui.QFontMetrics(_font) + main_text_height = metrics.height() + + # Vertically center text + text_y = ( + rect.top() + + (rect.height() + main_text_height) / 2 + - metrics.descent() + ) + + # Calculate where to start the right text: just left of the right icon ellipse + gap = 10 # gap between right text and icon ellipse + right_font = QtGui.QFont(_font) + right_font.setPointSize(self._rfontsize) + right_metrics = QtGui.QFontMetrics(right_font) + right_text_width = right_metrics.horizontalAdvance(self._right_text) + + # The right text should end at ellipse_rect.left() - gap + right_text_x = ellipse_rect.left() - gap - right_text_width + + # Draw main text (left-aligned, but don't overlap right text) + max_main_text_width = ( + right_text_x - text_rect.left() - 10 + ) # 10px gap between main and right text + elided_main_text = metrics.elidedText( + self._text, + QtCore.Qt.TextElideMode.ElideRight, + int(max_main_text_width), + ) + + painter.setFont(_font) + painter.drawText( + int(text_rect.left()), + int(text_y), + elided_main_text, + ) + + # Draw right text (smaller, grey, just left of the icon) + if self._right_text: + painter.setFont(right_font) + painter.setPen(QtGui.QColor(160, 160, 160)) # grey color + right_text_height = right_metrics.height() + right_text_y = ( + rect.top() + + (rect.height() + right_text_height) / 2 + - right_metrics.descent() + ) + painter.drawText( + int(right_text_x), + int(right_text_y), + self._right_text, + ) + + painter.end() diff --git a/BlocksScreen/lib/utils/loadAnimatedLabel.py b/BlocksScreen/lib/utils/loadAnimatedLabel.py new file mode 100644 index 00000000..4e091b48 --- /dev/null +++ b/BlocksScreen/lib/utils/loadAnimatedLabel.py @@ -0,0 +1,6 @@ +from PyQt6 import QtGui, QtWidgets, QtCore + +class LoadAnimatedLabel(QtWidgets.QLabel): + def __init__(self, parent) -> None: + super().__init__(parent) + \ No newline at end of file diff --git a/BlocksScreen/lib/utils/toggleAnimatedButton.py b/BlocksScreen/lib/utils/toggleAnimatedButton.py index 4b946f0e..48bce5d4 100644 --- a/BlocksScreen/lib/utils/toggleAnimatedButton.py +++ b/BlocksScreen/lib/utils/toggleAnimatedButton.py @@ -93,7 +93,6 @@ def state(self, new_state: State) -> None: if self.isVisible(): self.stateChange.emit(self._state) self.setup_animation() - self.update() @QtCore.pyqtProperty(float) @@ -158,7 +157,10 @@ def setPixmap(self, pixmap: QtGui.QPixmap) -> None: @QtCore.pyqtSlot(name="clicked") def setup_animation(self) -> None: - if self.underMouse(): + if ( + not self.slide_animation.state + == self.slide_animation.State.Running + ): self.slide_animation.setEndValue( self._handle_ONPosition if self.state == ToggleAnimatedButton.State.OFF diff --git a/BlocksScreen/manager.py b/BlocksScreen/manager.py deleted file mode 100644 index 609b723d..00000000 --- a/BlocksScreen/manager.py +++ /dev/null @@ -1,121 +0,0 @@ -from PyQt6.QtCore import QObject, QEvent, pyqtSignal, pyqtSlot -from enum import Enum, EnumType, IntEnum, Enum -from collections import deque -import typing - - - - -class Manager(QObject): - - class KlipperState(Enum): - KlipperKilled = 0 - KlipperError = 1 - KlipperStandby = 2 - KlipperIdle = 3 - KlipperPrinting = 4 - - def __init__(self, parent: typing.Optional[QObject], printer = None, ws = None ) -> None: - super(Manager, self).__init__(parent) - - - - - - - def add_connection(self): ... - - - - def rm_connection(self): ... - - - def register_qtobject(self, object: QObject): ... - - - - - - - - - -class PageViewManager(QObject): - - def __init__(self, parent: typing.Optional["QObject"]) -> None: - super(PageViewManager, self).__init__(parent) - - - self.index_stack = deque() - - def request_view(self, object: QObject, index: typing.Optional[int]= None) -> None: ... - - def clean_view(self) -> None: ... - - - - - - - - @pyqtSlot(name="request_back_button_pressed") - def global_back_button(self) -> None: - if not len(self.index_stack) : - _logger.debug("Index stack is empty") - - self.main_window.setCurrentIndex(self.index_stack[-1][0]) - self.set_current_panel_index( - self.index_stack[-1][1] - ) - - self.index_stack.pop() - - self.printer_object_report_signal.connect(self.printer.report_received) - self.printer_object_list_received_signal.connect( - self.printer.object_list_received - ) - - _logger.debug("Successfully went back a page") - - @pyqtSlot(int, int, name="request_change_page") - def global_change_page(self, tab_index: int, panel_index: int) -> None: - """global_change_page Changes panels pages globally - - Args: - tab_index (int): The tab index of the panel - panel_index (int): The index of the panel page - """ - if not isinstance(tab_index, int): - _logger.debug( - f"Tab index argument expected type int, got {type(tab_index)}" - ) - if not isinstance(panel_index, int): - _logger.debug(f"Panel page index expected type int, {type(panel_index)}") - current_page = [ - self.ui.mainTabWidget.currentIndex(), - self.current_panel_index(), - ] - requested_page = [tab_index, panel_index] - # * Return if user is already on the requested page - if requested_page == current_page: - _logger.debug("User is already on the requested page") - return - # * Add to the stack of indexes the indexes of current tab and page in tab to later be able to come back to them - self.index_stack.append(current_page) - # * Go to the requested tab and page - self.ui.mainTabWidget.setCurrentIndex(tab_index) - self.set_current_panel_index(panel_index) - _logger.debug( - f"Requested page change -> Tab index :{requested_page[0]}, pane panel index : {requested_page[1]}" - ) - - def event(self, a0: QEvent | None) -> bool: - return super().event(a0) - - def installEventFilter(self, a0: QObject | None) -> None: - return super().installEventFilter(a0) - - -class SearchWindow(): ... - - diff --git a/BlocksScreen/userauth.py b/BlocksScreen/userauth.py deleted file mode 100644 index 5efcf9d3..00000000 --- a/BlocksScreen/userauth.py +++ /dev/null @@ -1,4 +0,0 @@ -import logging - - -# TODO: Create User authentication for klipper diff --git a/Blocks_Screen.code-workspace b/Blocks_Screen.code-workspace index 92447a1b..f4f049d6 100644 --- a/Blocks_Screen.code-workspace +++ b/Blocks_Screen.code-workspace @@ -7,25 +7,25 @@ "settings": { "autoDocstring.docstringFormat": "google", "workbench.colorCustomizations": { - "activityBar.activeBackground": "#75a9bb", - "activityBar.background": "#75a9bb", - "activityBar.foreground": "#15202b", - "activityBar.inactiveForeground": "#15202b99", - "activityBarBadge.background": "#f4eaf2", + "activityBar.activeBackground": "#325665", + "activityBar.background": "#325665", + "activityBar.foreground": "#e7e7e7", + "activityBar.inactiveForeground": "#e7e7e799", + "activityBarBadge.background": "#b56a9f", "activityBarBadge.foreground": "#15202b", - "commandCenter.border": "#15202b99", - "sash.hoverBorder": "#75a9bb", - "statusBar.background": "#5493a9", - "statusBar.foreground": "#15202b", - "statusBarItem.hoverBackground": "#437587", - "statusBarItem.remoteBackground": "#5493a9", - "statusBarItem.remoteForeground": "#15202b", - "titleBar.activeBackground": "#5493a9", - "titleBar.activeForeground": "#15202b", - "titleBar.inactiveBackground": "#5493a999", - "titleBar.inactiveForeground": "#15202b99" + "commandCenter.border": "#e7e7e799", + "sash.hoverBorder": "#325665", + "statusBar.background": "#213943", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#325665", + "statusBarItem.remoteBackground": "#213943", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#213943", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#21394399", + "titleBar.inactiveForeground": "#e7e7e799" }, - "peacock.remoteColor": "#5493a9", + "peacock.remoteColor": "#213943", "todo-tree.tree.scanMode": "workspace", "todo-tree.tree.showCountsInTree": true, "todo-tree.tree.showBadges": true, @@ -33,15 +33,16 @@ "cSpell.words": [ "ENDSTOP", "logoblocks", + "Momcake", "Pixmap", "qtobject", "rescanning", - "TESTZ" + "TESTZ", + "topbar" ], "[python]": { "editor.wordBasedSuggestions": "allDocuments", "editor.defaultFormatter": "charliermarsh.ruff" - }, "ruff.lineLength": 79, "ruff.organizeImports": true, @@ -50,6 +51,5 @@ "python.analysis.autoImportCompletions": true, "editor.codeLensFontSize": 0, "editor.inlayHints.fontFamily": "Source Code Pro", - } } \ No newline at end of file