10010
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
10439
|
3
|
# Copyright (c) 2023 - 2024 Detlev Offenbach <detlev@die-offenbachs.de> |
10010
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7
|
Module implementing a dialog to enter the WebREPL connection parameters. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10
|
from PyQt6.QtCore import pyqtSlot |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QLineEdit |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
from eric7.EricGui import EricPixmapCache |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
from .Devices import getSupportedDevices |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
from .Ui_MicroPythonWebreplConnectionDialog import Ui_MicroPythonWebreplConnectionDialog |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
class MicroPythonWebreplConnectionDialog( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
QDialog, Ui_MicroPythonWebreplConnectionDialog |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
Class implementing a dialog to enter the WebREPL connection parameters. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
def __init__(self, currentWebreplUrl, currentType, parent=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
@param currentWebreplUrl WebREPL URL most recently configured |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
@param currentType device type most recently selected |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
@param parent reference to the parent widget (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35
|
@type QWidget (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
super().__init__(parent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
self.setupUi(self) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
self.deviceTypeComboBox.addItem("", "") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
for board, description in sorted(getSupportedDevices(), key=lambda x: x[1]): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
self.deviceTypeComboBox.addItem(description, board) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
self.showPasswordButton.setIcon(EricPixmapCache.getIcon("showPassword")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
self.hostEdit.textChanged.connect(self.__updateOkButton) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
self.portEdit.textChanged.connect(self.__updateOkButton) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
self.deviceTypeComboBox.currentIndexChanged.connect(self.__updateOkButton) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
if currentWebreplUrl: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
url = currentWebreplUrl.replace("ws://", "") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
password, hostPort = url.split("@", 1) if "@" in url else ("", url) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
host, port = hostPort.split(":", 1) if ":" in hostPort else (hostPort, "") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
self.hostEdit.setText(host) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
self.portEdit.setText(port) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
self.passwordEdit.setText(password) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
typeIndex = self.deviceTypeComboBox.findData(currentType) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
self.deviceTypeComboBox.setCurrentIndex(typeIndex) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
self.__updateOkButton() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
msh = self.minimumSizeHint() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
self.resize(max(self.width(), msh.width()), msh.height()) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
def __updateOkButton(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
Private slot to update the enabled state of the OK button. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
port = self.portEdit.text() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
if port == "": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
portOk = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76
|
portNo = int(port) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
portOk = 1024 < portNo <= 65535 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78
|
except ValueError: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
portOk = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
bool(self.hostEdit.text()) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
and portOk |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
and bool(self.deviceTypeComboBox.currentData()) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
@pyqtSlot(bool) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
def on_showPasswordButton_clicked(self, checked): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89
|
Private slot to show or hide the password. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
@param checked state of the button |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
@type bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
if checked: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
self.passwordEdit.setEchoMode(QLineEdit.EchoMode.Normal) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
self.showPasswordButton.setIcon(EricPixmapCache.getIcon("hidePassword")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
self.showPasswordButton.setToolTip(self.tr("Press to hide the password.")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
self.passwordEdit.setEchoMode(QLineEdit.EchoMode.Password) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
self.showPasswordButton.setIcon(EricPixmapCache.getIcon("showPassword")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
self.showPasswordButton.setToolTip(self.tr("Press to show the password.")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
def getWebreplConnectionParameters(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
Public method to retrieve the entered WebREPL connection data. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
@return tuple containing the URL and device type for the WebREPL connection |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
@rtype tuple of (str, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
password = self.passwordEdit.text() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
host = self.hostEdit.text() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
port = self.portEdit.text() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
if password and port: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
url = f"ws://{password}@{host}:{port}" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
elif password: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117
|
url = f"ws://{password}@{host}" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
elif port: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
url = f"ws://{host}:{port}" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
url = f"ws://{host}" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
return (url, self.deviceTypeComboBox.currentData()) |