Fixed some code style and formatting issues.
9797
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3
|
# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> |
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 widget to enter an IPv4 address. |
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
|
import ipaddress |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
|
9830
|
12
|
from PyQt6.QtCore import QEvent, QRegularExpression, Qt, pyqtSignal, pyqtSlot |
9797
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
from PyQt6.QtGui import QRegularExpressionValidator |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
from PyQt6.QtWidgets import QWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
from eric7.EricGui import EricPixmapCache |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
from .Ui_EricIPv4InputWidget import Ui_EricIPv4InputWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
class EricIPv4InputWidget(QWidget, Ui_EricIPv4InputWidget): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
Class implementing a widget to enter an IPv4 address. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
@signal addressChanged() emitted to indicate a change of the entered IPv4 address |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
""" |
9830
|
27
|
|
9797
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
addressChanged = pyqtSignal() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
def __init__(self, parent=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
|
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.clearButton.setIcon(EricPixmapCache.getIcon("clearLeft")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
self.clearButton.clicked.connect(self.__clear) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
ipRange = r"(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
self.ip1Edit.setValidator( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
QRegularExpressionValidator(QRegularExpression(ipRange)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
self.ip2Edit.setValidator( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
QRegularExpressionValidator(QRegularExpression(ipRange)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
self.ip3Edit.setValidator( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
QRegularExpressionValidator(QRegularExpression(ipRange)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
self.ip4Edit.setValidator( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
QRegularExpressionValidator(QRegularExpression(ipRange)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
self.ip1Edit.installEventFilter(self) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
self.ip2Edit.installEventFilter(self) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
self.ip3Edit.installEventFilter(self) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
self.ip1Edit.textChanged.connect(self.addressChanged) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
self.ip2Edit.textChanged.connect(self.addressChanged) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
self.ip3Edit.textChanged.connect(self.addressChanged) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
self.ip4Edit.textChanged.connect(self.addressChanged) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
def eventFilter(self, obj, evt): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
Public method to filter pressing '.' to give focus to the next input field. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
@param obj reference to the object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
@type QObject |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
@param evt reference to the event object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
@type QEvent |
9830
|
75
|
@return flag indicating, that the event was handled |
|
76
|
@rtype bool |
9797
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
""" |
9830
|
78
|
if evt.type() == QEvent.Type.KeyPress and evt.text() == ".": |
|
79
|
if obj is self.ip1Edit: |
|
80
|
nextWidget = self.ip2Edit |
|
81
|
elif obj is self.ip2Edit: |
|
82
|
nextWidget = self.ip3Edit |
|
83
|
elif obj is self.ip3Edit: |
|
84
|
nextWidget = self.ip4Edit |
|
85
|
else: |
|
86
|
nextWidget = None |
|
87
|
if nextWidget: |
|
88
|
nextWidget.setFocus(Qt.FocusReason.TabFocusReason) |
|
89
|
return True |
9797
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
return super().eventFilter(obj, evt) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
def hasAcceptableInput(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
Public method to check, if the input is acceptable. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
@return flag indicating acceptable input |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
ipaddress.IPv4Address(self.text()) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
except ipaddress.AddressValueError: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
# leading zeros are not allowed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
return ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
self.ip1Edit.hasAcceptableInput() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
and self.ip2Edit.hasAcceptableInput() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
and self.ip3Edit.hasAcceptableInput() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
and self.ip4Edit.hasAcceptableInput() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
def text(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
Public method to get the IPv4 address as a string. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117
|
@return IPv4 address |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
return "{0}.{1}.{2}.{3}".format( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
self.ip1Edit.text(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
self.ip2Edit.text(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
self.ip3Edit.text(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124
|
self.ip4Edit.text(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127
|
def setText(self, address): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129
|
Public method to set the IPv4 address given a string. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131
|
@param address IPv4 address |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132
|
@type str |
9830
|
133
|
@exception ValueError raised to indicate an invalid IPv4 address |
9797
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
if address: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
ipaddress.IPv4Address(address) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
except ipaddress.AddressValueError as err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
raise ValueError(str(err)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
addressParts = address.split(".") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
self.ip1Edit.setText(addressParts[0]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
self.ip2Edit.setText(addressParts[1]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
self.ip3Edit.setText(addressParts[2]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
self.ip4Edit.setText(addressParts[3]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
self.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
def address(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
Public method to get the IPv4 address as an ipaddress.IPv4Address object. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153
|
@return IPv4 address |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
@rtype ipaddress.IPv4Address |
9830
|
155
|
@exception ValueError raised to indicate an invalid IPv4 address |
9797
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158
|
return ipaddress.IPv4Address(self.text()) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159
|
except ipaddress.AddressValueError as err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160
|
raise ValueError(str(err)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162
|
def setAddress(self, address): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164
|
Public method to set the IPv4 address given an ipaddress.IPv4Address object. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166
|
@param address IPv4 address |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167
|
@type ipaddress.IPv4Address |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169
|
if address: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170
|
self.setText(str(address)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172
|
self.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175
|
def clear(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177
|
Public slot to clear the input fields. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179
|
self.ip1Edit.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180
|
self.ip2Edit.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181
|
self.ip3Edit.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182
|
self.ip4Edit.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185
|
def __clear(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187
|
Private slot to handle the clear button press. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189
|
self.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190
|
self.ip1Edit.setFocus(Qt.FocusReason.OtherFocusReason) |