Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from PyQt5.QtCore import pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QWidget, QLineEdit
from windows import editable_title
class EditableTitle(QWidget, editable_title.Ui_Form):
button_width = 50
min_length = 0
max_length = 30
textConfirmed = pyqtSignal(str)
def __init__(self, text, parent=None):
"""
widget with title that is editable by user
:param text: text to be displayed before edit
:param parent:
"""
super(EditableTitle, self).__init__(parent)
self.setupUi(self)
self.btnEdit.setFixedWidth(self.button_width)
self.label.setText(text)
self.editLine = QLineEdit()
self.editLine.textChanged.connect(self.onEditChanged)
self.editLine.returnPressed.connect(self.displayMode)
self.btnEdit.clicked.connect(self.editMode)
@pyqtSlot()
def editMode(self):
"""
change to edit mode - display line edit and change button to confirmation
also sets focus to edit
"""
self.btnEdit.setText("OK")
self.label.hide()
if self.label.width() > 100:
self.editLine.setFixedWidth(self.label.width())
else:
self.editLine.setFixedWidth(100)
self.editLine.setFixedHeight(self.label.height())
self.editLine.setText(self.label.text())
self.layout().replaceWidget(self.label, self.editLine)
self.editLine.show()
# focus
self.editLine.setFocus()
self.editLine.selectAll()
self.btnEdit.clicked.disconnect(self.editMode)
self.btnEdit.clicked.connect(self.displayMode)
@pyqtSlot()
def displayMode(self):
"""
change to display mode (this is the default mode)
"""
self.btnEdit.setText("Edit")
self.editLine.hide()
self.label.setText(self.editLine.text())
self.layout().replaceWidget(self.editLine, self.label)
self.label.show()
self.btnEdit.clicked.disconnect(self.displayMode)
self.btnEdit.clicked.connect(self.editMode)
self.textConfirmed.emit(self.editLine.text())
@pyqtSlot()
def onEditChanged(self):
"""
check if the text in edit fits requirements and disable/enable confirm button
"""
if self.min_length < len(self.editLine.text()) < self.max_length:
self.btnEdit.setDisabled(False)
else:
self.btnEdit.setDisabled(True)
def text(self):
"""
:return: current text of label (there can be a different text in edit line currently, if we're in edit mode)
"""
return self.label.text()