From 2e93c20c97d7a886a05d370fdc03d2d1fa892b80 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 27 Oct 2020 01:47:34 +0200 Subject: [PATCH 1/3] - fixed some minor issues when doing a project save --- CHANGELOG.md | 1 + appTranslation.py | 2 +- app_Main.py | 6 +++--- locale/ro/LC_MESSAGES/strings.mo | Bin 401098 -> 401091 bytes locale/ro/LC_MESSAGES/strings.po | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bda74a0..49931870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ CHANGELOG for FlatCAM beta - another GUI element for which I've overloaded the context menu to make it translatable: _ExpandableTextEdit - overloaded the context menu for FCSpinner and for FCDoubleSpinner - added new strings and therefore updated the translation strings +- fixed some minor issues when doing a project save 25.10.2020 diff --git a/appTranslation.py b/appTranslation.py index a0c043b2..40a990bf 100644 --- a/appTranslation.py +++ b/appTranslation.py @@ -218,7 +218,7 @@ def restart_program(app, ask=None): response = msgbox.clickedButton() if response == bt_yes: - app.on_file_saveprojectas(use_thread=True, quit_action=True) + app.f_handlers.on_file_saveprojectas(use_thread=True, quit_action=True) app.preferencesUiManager.save_defaults() python = sys.executable diff --git a/app_Main.py b/app_Main.py index cf8a526b..17b041da 100644 --- a/app_Main.py +++ b/app_Main.py @@ -9022,7 +9022,7 @@ class MenuFileHandlers(QtCore.QObject): date = str(datetime.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') - date = self.date.replace(' ', '_') + date = date.replace(' ', '_') filter_ = "FlatCAM Project .FlatPrj (*.FlatPrj);; All Files (*.*)" try: @@ -10390,8 +10390,8 @@ class MenuFileHandlers(QtCore.QObject): # Serialize the whole project d = { "objs": [obj.to_dict() for obj in self.app.collection.get_list()], - "options": self.options, - "version": self.version + "options": self.app.options, + "version": self.app.version } if self.defaults["global_save_compressed"] is True: diff --git a/locale/ro/LC_MESSAGES/strings.mo b/locale/ro/LC_MESSAGES/strings.mo index 28160604c81077b646a988316f19f5f944665547..89165b42fd78323a48b938d0363ec5dcf81d088b 100644 GIT binary patch delta 14526 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 delta 14533 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 diff --git a/locale/ro/LC_MESSAGES/strings.po b/locale/ro/LC_MESSAGES/strings.po index 3be20884..dfbca79d 100644 --- a/locale/ro/LC_MESSAGES/strings.po +++ b/locale/ro/LC_MESSAGES/strings.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2020-10-27 01:13+0200\n" -"PO-Revision-Date: 2020-10-27 01:17+0200\n" +"PO-Revision-Date: 2020-10-27 01:39+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: ro\n" @@ -356,7 +356,7 @@ msgstr "Găurire" #: appDatabase.py:2178 appTools/ToolIsolation.py:1101 #: appTools/ToolIsolation.py:2576 appTools/ToolNCC.py:4060 msgid "Isolation" -msgstr "Tip de izolare" +msgstr "Izolare" #: appDatabase.py:275 appDatabase.py:1850 appDatabase.py:2186 #: appEditors/AppGeoEditor.py:528 appGUI/MainGUI.py:1618 From 4077a486146cd1b90f316c281d373ddbe8f6423c Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 27 Oct 2020 10:51:00 +0200 Subject: [PATCH 2/3] - created custom classes derived from TextEdit and from LineEdit where I overloaded the context menu and I made all the other classes that were inheriting from them to inherit from those new classes --- CHANGELOG.md | 4 + appGUI/GUIElements.py | 804 ++++++++---------- .../preferences/tools/ToolsPreferencesUI.py | 16 +- 3 files changed, 372 insertions(+), 452 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49931870..dc1995b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta ================================================= +27.10.2020 + +- created custom classes derived from TextEdit and from LineEdit where I overloaded the context menu and I made all the other classes that were inheriting from them to inherit from those new classes + 26.10.2020 - added a new menu entry and functionality in the View category: enable all non-selected (shortcut key ALT+3) diff --git a/appGUI/GUIElements.py b/appGUI/GUIElements.py index 817a4901..339b3b84 100644 --- a/appGUI/GUIElements.py +++ b/appGUI/GUIElements.py @@ -276,256 +276,13 @@ class FCTree(QtWidgets.QTreeWidget): header.resizeSection(column, width) -class LengthEntry(QtWidgets.QLineEdit): - def __init__(self, output_units='IN', decimals=None, parent=None): - super(LengthEntry, self).__init__(parent) +class FCLineEdit(QtWidgets.QLineEdit): - self.output_units = output_units - self.format_re = re.compile(r"^([^\s]+)(?:\s([a-zA-Z]+))?$") - - # Unit conversion table OUTPUT-INPUT - self.scales = { - 'IN': {'IN': 1.0, - 'MM': 1 / 25.4}, - 'MM': {'IN': 25.4, - 'MM': 1.0} - } - self.readyToEdit = True - self.editingFinished.connect(self.on_edit_finished) - self.decimals = decimals if decimals is not None else 4 - - def on_edit_finished(self): - self.clearFocus() - - def mousePressEvent(self, e, Parent=None): - super(LengthEntry, self).mousePressEvent(e) # required to deselect on 2e click - if self.readyToEdit: - self.selectAll() - self.readyToEdit = False - - def focusOutEvent(self, e): - # don't focus out if the user requests an popup menu - if e.reason() != QtCore.Qt.PopupFocusReason: - super(LengthEntry, self).focusOutEvent(e) # required to remove cursor on focusOut - self.deselect() - self.readyToEdit = True - - def returnPressed(self, *args, **kwargs): - val = self.get_value() - if val is not None: - self.set_text(str(val)) - else: - log.warning("Could not interpret entry: %s" % self.get_text()) - - def get_value(self): - raw = str(self.text()).strip(' ') - # match = self.format_re.search(raw) - - try: - units = raw[-2:] - units = self.scales[self.output_units][units.upper()] - value = raw[:-2] - return float(eval(value)) * units - except IndexError: - value = raw - return float(eval(value)) - except KeyError: - value = raw - return float(eval(value)) - except Exception: - log.warning("Could not parse value in entry: %s" % str(raw)) - return None - - def set_value(self, val, decimals=None): - dec_digits = decimals if decimals is not None else self.decimals - self.setText(str('%.*f' % (dec_digits, val))) - - def sizeHint(self): - default_hint_size = super(LengthEntry, self).sizeHint() - return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) - - -class FloatEntry(QtWidgets.QLineEdit): - def __init__(self, decimals=None, parent=None): - super(FloatEntry, self).__init__(parent) - self.readyToEdit = True - self.editingFinished.connect(self.on_edit_finished) - self.decimals = decimals if decimals is not None else 4 - - def on_edit_finished(self): - self.clearFocus() - - def mousePressEvent(self, e, Parent=None): - super(FloatEntry, self).mousePressEvent(e) # required to deselect on 2e click - if self.readyToEdit is True: - self.selectAll() - self.readyToEdit = False - - def focusOutEvent(self, e): - # don't focus out if the user requests an popup menu - if e.reason() != QtCore.Qt.PopupFocusReason: - super(FloatEntry, self).focusOutEvent(e) # required to remove cursor on focusOut - self.deselect() - self.readyToEdit = True - - def returnPressed(self, *args, **kwargs): - val = self.get_value() - if val is not None: - self.set_text(str(val)) - else: - log.warning("Could not interpret entry: %s" % self.text()) - - def get_value(self): - raw = str(self.text()).strip(' ') - - try: - evaled = eval(raw) - return float(evaled) - except Exception as e: - if raw != '': - log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e))) - return None - - def set_value(self, val, decimals=None): - dig_digits = decimals if decimals is not None else self.decimals - if val is not None: - self.setText("%.*f" % (dig_digits, float(val))) - else: - self.setText("") - - def sizeHint(self): - default_hint_size = super(FloatEntry, self).sizeHint() - return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) - - -class FloatEntry2(QtWidgets.QLineEdit): - def __init__(self, decimals=None, parent=None): - super(FloatEntry2, self).__init__(parent) - self.readyToEdit = True - self.editingFinished.connect(self.on_edit_finished) - self.decimals = decimals if decimals is not None else 4 - - def on_edit_finished(self): - self.clearFocus() - - def mousePressEvent(self, e, Parent=None): - super(FloatEntry2, self).mousePressEvent(e) # required to deselect on 2e click - if self.readyToEdit: - self.selectAll() - self.readyToEdit = False - - def focusOutEvent(self, e): - # don't focus out if the user requests an popup menu - if e.reason() != QtCore.Qt.PopupFocusReason: - super(FloatEntry2, self).focusOutEvent(e) # required to remove cursor on focusOut - self.deselect() - self.readyToEdit = True - - def get_value(self): - raw = str(self.text()).strip(' ') - - try: - evaled = eval(raw) - return float(evaled) - except Exception as e: - if raw != '': - log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e))) - return None - - def set_value(self, val, decimals=None): - dig_digits = decimals if decimals is not None else self.decimals - self.setText("%.*f" % (dig_digits, val)) - - def sizeHint(self): - default_hint_size = super(FloatEntry2, self).sizeHint() - return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) - - -class IntEntry(QtWidgets.QLineEdit): - - def __init__(self, parent=None, allow_empty=False, empty_val=None): - super(IntEntry, self).__init__(parent) - self.allow_empty = allow_empty - self.empty_val = empty_val - self.readyToEdit = True - self.editingFinished.connect(self.on_edit_finished) - - def on_edit_finished(self): - self.clearFocus() - - def mousePressEvent(self, e, Parent=None): - super(IntEntry, self).mousePressEvent(e) # required to deselect on 2e click - if self.readyToEdit: - self.selectAll() - self.readyToEdit = False - - def focusOutEvent(self, e): - # don't focus out if the user requests an popup menu - if e.reason() != QtCore.Qt.PopupFocusReason: - super(IntEntry, self).focusOutEvent(e) # required to remove cursor on focusOut - self.deselect() - self.readyToEdit = True - - def get_value(self): - - if self.allow_empty: - if str(self.text()) == "": - return self.empty_val - # make the text() first a float and then int because if text is a float type, - # the int() can't convert directly a "text float" into a int type. - ret_val = float(self.text()) - ret_val = int(ret_val) - return ret_val - - def set_value(self, val): - - if val == self.empty_val and self.allow_empty: - self.setText("") - return - - self.setText(str(val)) - - def sizeHint(self): - default_hint_size = super(IntEntry, self).sizeHint() - return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) - - -class FCEntry(QtWidgets.QLineEdit): - def __init__(self, decimals=None, alignment=None, border_color=None, parent=None): - super(FCEntry, self).__init__(parent) - self.readyToEdit = True - self.editingFinished.connect(self.on_edit_finished) - self.decimals = decimals if decimals is not None else 4 - - if border_color: - self.setStyleSheet("QLineEdit {border: 1px solid %s;}" % border_color) - - if alignment: - if alignment == 'center': - align_val = QtCore.Qt.AlignHCenter - elif alignment == 'right': - align_val = QtCore.Qt.AlignRight - else: - align_val = QtCore.Qt.AlignLeft - self.setAlignment(align_val) + def __init__(self, *args, **kwargs): + super(FCLineEdit, self).__init__(*args, **kwargs) self.menu = None - def on_edit_finished(self): - self.clearFocus() - - def mousePressEvent(self, e, parent=None): - super(FCEntry, self).mousePressEvent(e) # required to deselect on 2e click - if self.readyToEdit: - self.selectAll() - self.readyToEdit = False - - def focusOutEvent(self, e): - if e.reason() != QtCore.Qt.PopupFocusReason: - super(FCEntry, self).focusOutEvent(e) # required to remove cursor on focusOut - self.deselect() - self.readyToEdit = True - def contextMenuEvent(self, event): self.menu = QtWidgets.QMenu() @@ -600,6 +357,255 @@ class FCEntry(QtWidgets.QLineEdit): txt = clipboard.text() self.insert(txt) + +class LengthEntry(FCLineEdit): + def __init__(self, output_units='IN', decimals=None, parent=None): + super(LengthEntry, self).__init__(parent) + + self.output_units = output_units + self.format_re = re.compile(r"^([^\s]+)(?:\s([a-zA-Z]+))?$") + + # Unit conversion table OUTPUT-INPUT + self.scales = { + 'IN': {'IN': 1.0, + 'MM': 1 / 25.4}, + 'MM': {'IN': 25.4, + 'MM': 1.0} + } + self.readyToEdit = True + self.editingFinished.connect(self.on_edit_finished) + self.decimals = decimals if decimals is not None else 4 + + def on_edit_finished(self): + self.clearFocus() + + def mousePressEvent(self, e, Parent=None): + super(LengthEntry, self).mousePressEvent(e) # required to deselect on 2e click + if self.readyToEdit: + self.selectAll() + self.readyToEdit = False + + def focusOutEvent(self, e): + # don't focus out if the user requests an popup menu + if e.reason() != QtCore.Qt.PopupFocusReason: + super(LengthEntry, self).focusOutEvent(e) # required to remove cursor on focusOut + self.deselect() + self.readyToEdit = True + + def returnPressed(self, *args, **kwargs): + val = self.get_value() + if val is not None: + self.set_text(str(val)) + else: + log.warning("Could not interpret entry: %s" % self.get_text()) + + def get_value(self): + raw = str(self.text()).strip(' ') + # match = self.format_re.search(raw) + + try: + units = raw[-2:] + units = self.scales[self.output_units][units.upper()] + value = raw[:-2] + return float(eval(value)) * units + except IndexError: + value = raw + return float(eval(value)) + except KeyError: + value = raw + return float(eval(value)) + except Exception: + log.warning("Could not parse value in entry: %s" % str(raw)) + return None + + def set_value(self, val, decimals=None): + dec_digits = decimals if decimals is not None else self.decimals + self.setText(str('%.*f' % (dec_digits, val))) + + def sizeHint(self): + default_hint_size = super(LengthEntry, self).sizeHint() + return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) + + +class FloatEntry(FCLineEdit): + def __init__(self, decimals=None, parent=None): + super(FloatEntry, self).__init__(parent) + self.readyToEdit = True + self.editingFinished.connect(self.on_edit_finished) + self.decimals = decimals if decimals is not None else 4 + + def on_edit_finished(self): + self.clearFocus() + + def mousePressEvent(self, e, Parent=None): + super(FloatEntry, self).mousePressEvent(e) # required to deselect on 2e click + if self.readyToEdit is True: + self.selectAll() + self.readyToEdit = False + + def focusOutEvent(self, e): + # don't focus out if the user requests an popup menu + if e.reason() != QtCore.Qt.PopupFocusReason: + super(FloatEntry, self).focusOutEvent(e) # required to remove cursor on focusOut + self.deselect() + self.readyToEdit = True + + def returnPressed(self, *args, **kwargs): + val = self.get_value() + if val is not None: + self.set_text(str(val)) + else: + log.warning("Could not interpret entry: %s" % self.text()) + + def get_value(self): + raw = str(self.text()).strip(' ') + + try: + evaled = eval(raw) + return float(evaled) + except Exception as e: + if raw != '': + log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e))) + return None + + def set_value(self, val, decimals=None): + dig_digits = decimals if decimals is not None else self.decimals + if val is not None: + self.setText("%.*f" % (dig_digits, float(val))) + else: + self.setText("") + + def sizeHint(self): + default_hint_size = super(FloatEntry, self).sizeHint() + return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) + + +class FloatEntry2(FCLineEdit): + def __init__(self, decimals=None, parent=None): + super(FloatEntry2, self).__init__(parent) + self.readyToEdit = True + self.editingFinished.connect(self.on_edit_finished) + self.decimals = decimals if decimals is not None else 4 + + def on_edit_finished(self): + self.clearFocus() + + def mousePressEvent(self, e, Parent=None): + super(FloatEntry2, self).mousePressEvent(e) # required to deselect on 2e click + if self.readyToEdit: + self.selectAll() + self.readyToEdit = False + + def focusOutEvent(self, e): + # don't focus out if the user requests an popup menu + if e.reason() != QtCore.Qt.PopupFocusReason: + super(FloatEntry2, self).focusOutEvent(e) # required to remove cursor on focusOut + self.deselect() + self.readyToEdit = True + + def get_value(self): + raw = str(self.text()).strip(' ') + + try: + evaled = eval(raw) + return float(evaled) + except Exception as e: + if raw != '': + log.error("Could not evaluate val: %s, error: %s" % (str(raw), str(e))) + return None + + def set_value(self, val, decimals=None): + dig_digits = decimals if decimals is not None else self.decimals + self.setText("%.*f" % (dig_digits, val)) + + def sizeHint(self): + default_hint_size = super(FloatEntry2, self).sizeHint() + return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) + + +class IntEntry(FCLineEdit): + + def __init__(self, parent=None, allow_empty=False, empty_val=None): + super(IntEntry, self).__init__(parent) + self.allow_empty = allow_empty + self.empty_val = empty_val + self.readyToEdit = True + self.editingFinished.connect(self.on_edit_finished) + + def on_edit_finished(self): + self.clearFocus() + + def mousePressEvent(self, e, Parent=None): + super(IntEntry, self).mousePressEvent(e) # required to deselect on 2e click + if self.readyToEdit: + self.selectAll() + self.readyToEdit = False + + def focusOutEvent(self, e): + # don't focus out if the user requests an popup menu + if e.reason() != QtCore.Qt.PopupFocusReason: + super(IntEntry, self).focusOutEvent(e) # required to remove cursor on focusOut + self.deselect() + self.readyToEdit = True + + def get_value(self): + + if self.allow_empty: + if str(self.text()) == "": + return self.empty_val + # make the text() first a float and then int because if text is a float type, + # the int() can't convert directly a "text float" into a int type. + ret_val = float(self.text()) + ret_val = int(ret_val) + return ret_val + + def set_value(self, val): + + if val == self.empty_val and self.allow_empty: + self.setText("") + return + + self.setText(str(val)) + + def sizeHint(self): + default_hint_size = super(IntEntry, self).sizeHint() + return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) + + +class FCEntry(FCLineEdit): + def __init__(self, decimals=None, alignment=None, border_color=None, parent=None): + super(FCEntry, self).__init__(parent) + self.readyToEdit = True + self.editingFinished.connect(self.on_edit_finished) + self.decimals = decimals if decimals is not None else 4 + + if border_color: + self.setStyleSheet("QLineEdit {border: 1px solid %s;}" % border_color) + + if alignment: + if alignment == 'center': + align_val = QtCore.Qt.AlignHCenter + elif alignment == 'right': + align_val = QtCore.Qt.AlignRight + else: + align_val = QtCore.Qt.AlignLeft + self.setAlignment(align_val) + + def on_edit_finished(self): + self.clearFocus() + + def mousePressEvent(self, e, parent=None): + super(FCEntry, self).mousePressEvent(e) # required to deselect on 2e click + if self.readyToEdit: + self.selectAll() + self.readyToEdit = False + + def focusOutEvent(self, e): + if e.reason() != QtCore.Qt.PopupFocusReason: + super(FCEntry, self).focusOutEvent(e) # required to remove cursor on focusOut + self.deselect() + self.readyToEdit = True + def get_value(self): return str(self.text()) @@ -650,7 +656,7 @@ class FCEntry3(FCEntry): return None -class EvalEntry(QtWidgets.QLineEdit): +class EvalEntry(FCLineEdit): def __init__(self, border_color=None, parent=None): super(EvalEntry, self).__init__(parent) self.readyToEdit = True @@ -700,7 +706,7 @@ class EvalEntry(QtWidgets.QLineEdit): return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) -class EvalEntry2(QtWidgets.QLineEdit): +class EvalEntry2(FCLineEdit): def __init__(self, parent=None): super(EvalEntry2, self).__init__(parent) self.readyToEdit = True @@ -1485,7 +1491,109 @@ class FCTextArea(QtWidgets.QPlainTextEdit): return QtCore.QSize(custom_sizehint, default_hint_size.height()) -class FCTextAreaRich(QtWidgets.QTextEdit): +class FCTextEdit(QtWidgets.QTextEdit): + + def __init__(self, *args, **kwargs): + super(FCTextEdit, self).__init__(*args, **kwargs) + + self.menu = None + self.undo_flag = False + self.redo_flag = False + + self.undoAvailable.connect(self.on_undo_available) + self.redoAvailable.connect(self.on_redo_available) + + def on_undo_available(self, val): + self.undo_flag = val + + def on_redo_available(self, val): + self.redo_flag = val + + def contextMenuEvent(self, event): + self.menu = QtWidgets.QMenu() + tcursor = self.textCursor() + txt = tcursor.selectedText() + + # UNDO + undo_action = QAction('%s\t%s' % (_("Undo"), _('Ctrl+Z')), self) + self.menu.addAction(undo_action) + undo_action.triggered.connect(self.undo) + if self.undo_flag is False: + undo_action.setDisabled(True) + + # REDO + redo_action = QAction('%s\t%s' % (_("Redo"), _('Ctrl+Y')), self) + self.menu.addAction(redo_action) + redo_action.triggered.connect(self.redo) + if self.redo_flag is False: + redo_action.setDisabled(True) + + self.menu.addSeparator() + + # CUT + cut_action = QAction('%s\t%s' % (_("Cut"), _('Ctrl+X')), self) + self.menu.addAction(cut_action) + cut_action.triggered.connect(self.cut_text) + if txt == '': + cut_action.setDisabled(True) + + # COPY + copy_action = QAction('%s\t%s' % (_("Copy"), _('Ctrl+C')), self) + self.menu.addAction(copy_action) + copy_action.triggered.connect(self.copy_text) + if txt == '': + copy_action.setDisabled(True) + + # PASTE + paste_action = QAction('%s\t%s' % (_("Paste"), _('Ctrl+V')), self) + self.menu.addAction(paste_action) + paste_action.triggered.connect(self.paste_text) + + # DELETE + delete_action = QAction('%s\t%s' % (_("Delete"), _('Del')), self) + self.menu.addAction(delete_action) + delete_action.triggered.connect(self.delete_text) + + self.menu.addSeparator() + + # SELECT ALL + sel_all_action = QAction('%s\t%s' % (_("Select All"), _('Ctrl+A')), self) + self.menu.addAction(sel_all_action) + sel_all_action.triggered.connect(self.selectAll) + + self.menu.exec_(event.globalPos()) + + def cut_text(self): + tcursor = self.textCursor() + clipboard = QtWidgets.QApplication.clipboard() + + txt = tcursor.selectedText() + clipboard.clear() + clipboard.setText(txt) + + tcursor.deleteChar() + + def copy_text(self): + tcursor = self.textCursor() + clipboard = QtWidgets.QApplication.clipboard() + + txt = tcursor.selectedText() + clipboard.clear() + clipboard.setText(txt) + + def paste_text(self): + tcursor = self.textCursor() + clipboard = QtWidgets.QApplication.clipboard() + + txt = clipboard.text() + tcursor.insertText(txt) + + def delete_text(self): + tcursor = self.textCursor() + tcursor.deleteChar() + + +class FCTextAreaRich(FCTextEdit): def __init__(self, parent=None): super(FCTextAreaRich, self).__init__(parent) @@ -1500,7 +1608,7 @@ class FCTextAreaRich(QtWidgets.QTextEdit): return QtCore.QSize(EDIT_SIZE_HINT, default_hint_size.height()) -class FCTextAreaExtended(QtWidgets.QTextEdit): +class FCTextAreaExtended(FCTextEdit): def __init__(self, parent=None): super().__init__(parent) @@ -1514,19 +1622,6 @@ class FCTextAreaExtended(QtWidgets.QTextEdit): self.completer_enable = False - self.menu = None - self.undo_flag = False - self.redo_flag = False - - self.undoAvailable.connect(self.on_undo_available) - self.redoAvailable.connect(self.on_redo_available) - - def on_undo_available(self, val): - self.undo_flag = val - - def on_redo_available(self, val): - self.redo_flag = val - def set_model_data(self, keyword_list): self.model.setStringList(keyword_list) @@ -1654,89 +1749,6 @@ class FCTextAreaExtended(QtWidgets.QTextEdit): else: self.completer.popup().hide() - def contextMenuEvent(self, event): - self.menu = QtWidgets.QMenu() - tcursor = self.textCursor() - txt = tcursor.selectedText() - - # UNDO - undo_action = QAction('%s\t%s' % (_("Undo"), _('Ctrl+Z')), self) - self.menu.addAction(undo_action) - undo_action.triggered.connect(self.undo) - if self.undo_flag is False: - undo_action.setDisabled(True) - - # REDO - redo_action = QAction('%s\t%s' % (_("Redo"), _('Ctrl+Y')), self) - self.menu.addAction(redo_action) - redo_action.triggered.connect(self.redo) - if self.redo_flag is False: - redo_action.setDisabled(True) - - self.menu.addSeparator() - - # CUT - cut_action = QAction('%s\t%s' % (_("Cut"), _('Ctrl+X')), self) - self.menu.addAction(cut_action) - cut_action.triggered.connect(self.cut_text) - if txt == '': - cut_action.setDisabled(True) - - # COPY - copy_action = QAction('%s\t%s' % (_("Copy"), _('Ctrl+C')), self) - self.menu.addAction(copy_action) - copy_action.triggered.connect(self.copy_text) - if txt == '': - copy_action.setDisabled(True) - - # PASTE - paste_action = QAction('%s\t%s' % (_("Paste"), _('Ctrl+V')), self) - self.menu.addAction(paste_action) - paste_action.triggered.connect(self.paste_text) - - # DELETE - delete_action = QAction('%s\t%s' % (_("Delete"), _('Del')), self) - self.menu.addAction(delete_action) - delete_action.triggered.connect(self.delete_text) - - self.menu.addSeparator() - - # SELECT ALL - sel_all_action = QAction('%s\t%s' % (_("Select All"), _('Ctrl+A')), self) - self.menu.addAction(sel_all_action) - sel_all_action.triggered.connect(self.selectAll) - - self.menu.exec_(event.globalPos()) - - def cut_text(self): - tcursor = self.textCursor() - clipboard = QtWidgets.QApplication.clipboard() - - txt = tcursor.selectedText() - clipboard.clear() - clipboard.setText(txt) - - tcursor.deleteChar() - - def copy_text(self): - tcursor = self.textCursor() - clipboard = QtWidgets.QApplication.clipboard() - - txt = tcursor.selectedText() - clipboard.clear() - clipboard.setText(txt) - - def paste_text(self): - tcursor = self.textCursor() - clipboard = QtWidgets.QApplication.clipboard() - - txt = clipboard.text() - tcursor.insertText(txt) - - def delete_text(self): - tcursor = self.textCursor() - tcursor.deleteChar() - def comment(self): """ Got it from here: @@ -3602,7 +3614,7 @@ class _BrowserTextEdit(QTextEdit): app.save_to_file(content_to_save=html_content, txt_content=txt_content) -class _ExpandableTextEdit(QTextEdit): +class _ExpandableTextEdit(FCTextEdit): """ Class implements edit line, which expands themselves automatically """ @@ -3611,7 +3623,7 @@ class _ExpandableTextEdit(QTextEdit): historyPrev = QtCore.pyqtSignal() def __init__(self, termwidget, *args): - QTextEdit.__init__(self, *args) + FCTextEdit.__init__(self, *args) self.setStyleSheet("font: 9pt \"Courier\";") self._fittedHeight = 1 self.textChanged.connect(self._fit_to_document) @@ -3626,19 +3638,6 @@ class _ExpandableTextEdit(QTextEdit): self.completer.insertText.connect(self.insertCompletion) self.completer.popup().clicked.connect(self.insert_completion_click) - self.menu = None - self.undo_flag = False - self.redo_flag = False - - self.undoAvailable.connect(self.on_undo_available) - self.redoAvailable.connect(self.on_redo_available) - - def on_undo_available(self, val): - self.undo_flag = val - - def on_redo_available(self, val): - self.redo_flag = val - def set_model_data(self, keyword_list): self.model.setStringList(keyword_list) @@ -3725,89 +3724,6 @@ class _ExpandableTextEdit(QTextEdit): else: self.completer.popup().hide() - def contextMenuEvent(self, event): - self.menu = QtWidgets.QMenu() - tcursor = self.textCursor() - txt = tcursor.selectedText() - - # UNDO - undo_action = QAction('%s\t%s' % (_("Undo"), _('Ctrl+Z')), self) - self.menu.addAction(undo_action) - undo_action.triggered.connect(self.undo) - if self.undo_flag is False: - undo_action.setDisabled(True) - - # REDO - redo_action = QAction('%s\t%s' % (_("Redo"), _('Ctrl+Y')), self) - self.menu.addAction(redo_action) - redo_action.triggered.connect(self.redo) - if self.redo_flag is False: - redo_action.setDisabled(True) - - self.menu.addSeparator() - - # CUT - cut_action = QAction('%s\t%s' % (_("Cut"), _('Ctrl+X')), self) - self.menu.addAction(cut_action) - cut_action.triggered.connect(self.cut_text) - if txt == '': - cut_action.setDisabled(True) - - # COPY - copy_action = QAction('%s\t%s' % (_("Copy"), _('Ctrl+C')), self) - self.menu.addAction(copy_action) - copy_action.triggered.connect(self.copy_text) - if txt == '': - copy_action.setDisabled(True) - - # PASTE - paste_action = QAction('%s\t%s' % (_("Paste"), _('Ctrl+V')), self) - self.menu.addAction(paste_action) - paste_action.triggered.connect(self.paste_text) - - # DELETE - delete_action = QAction('%s\t%s' % (_("Delete"), _('Del')), self) - self.menu.addAction(delete_action) - delete_action.triggered.connect(self.delete_text) - - self.menu.addSeparator() - - # SELECT ALL - sel_all_action = QAction('%s\t%s' % (_("Select All"), _('Ctrl+A')), self) - self.menu.addAction(sel_all_action) - sel_all_action.triggered.connect(self.selectAll) - - self.menu.exec_(event.globalPos()) - - def cut_text(self): - tcursor = self.textCursor() - clipboard = QtWidgets.QApplication.clipboard() - - txt = tcursor.selectedText() - clipboard.clear() - clipboard.setText(txt) - - tcursor.deleteChar() - - def copy_text(self): - tcursor = self.textCursor() - clipboard = QtWidgets.QApplication.clipboard() - - txt = tcursor.selectedText() - clipboard.clear() - clipboard.setText(txt) - - def paste_text(self): - tcursor = self.textCursor() - clipboard = QtWidgets.QApplication.clipboard() - - txt = clipboard.text() - tcursor.insertText(txt) - - def delete_text(self): - tcursor = self.textCursor() - tcursor.deleteChar() - def sizeHint(self): """ QWidget sizeHint impelemtation diff --git a/appGUI/preferences/tools/ToolsPreferencesUI.py b/appGUI/preferences/tools/ToolsPreferencesUI.py index cd9cf1ab..989a348f 100644 --- a/appGUI/preferences/tools/ToolsPreferencesUI.py +++ b/appGUI/preferences/tools/ToolsPreferencesUI.py @@ -81,26 +81,26 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay = QtWidgets.QVBoxLayout() self.vlay.addWidget(self.tools_iso_group) - self.vlay.addWidget(self.tools_drill_group) + self.vlay.addWidget(self.tools_2sided_group) + self.vlay.addWidget(self.tools_cutout_group) self.vlay1 = QtWidgets.QVBoxLayout() - self.vlay1.addWidget(self.tools_ncc_group) - self.vlay1.addWidget(self.tools_2sided_group) - self.vlay1.addWidget(self.tools_cutout_group) - self.vlay1.addWidget(self.tools_sub_group) + self.vlay1.addWidget(self.tools_drill_group) + self.vlay1.addWidget(self.tools_panelize_group) self.vlay2 = QtWidgets.QVBoxLayout() + self.vlay2.addWidget(self.tools_ncc_group) self.vlay2.addWidget(self.tools_paint_group) - self.vlay2.addWidget(self.tools_transform_group) self.vlay3 = QtWidgets.QVBoxLayout() self.vlay3.addWidget(self.tools_film_group) - self.vlay3.addWidget(self.tools_calculators_group) + self.vlay3.addWidget(self.tools_transform_group) self.vlay4 = QtWidgets.QVBoxLayout() self.vlay4.addWidget(self.tools_solderpaste_group) self.vlay4.addWidget(self.tools_corners_group) - self.vlay4.addWidget(self.tools_panelize_group) + self.vlay4.addWidget(self.tools_calculators_group) + self.vlay4.addWidget(self.tools_sub_group) self.layout.addLayout(self.vlay) self.layout.addLayout(self.vlay1) From 043f26008b63fc2a38cb3f6b0de67adb8c626068 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 27 Oct 2020 11:14:47 +0200 Subject: [PATCH 3/3] - minor fix in ToolsDB2UI --- CHANGELOG.md | 1 + appDatabase.py | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1995b6..d3dc9781 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ CHANGELOG for FlatCAM beta 27.10.2020 - created custom classes derived from TextEdit and from LineEdit where I overloaded the context menu and I made all the other classes that were inheriting from them to inherit from those new classes +- minor fix in ToolsDB2UI 26.10.2020 diff --git a/appDatabase.py b/appDatabase.py index baebaa8d..b2bda071 100644 --- a/appDatabase.py +++ b/appDatabase.py @@ -177,20 +177,19 @@ class ToolsDB2UI: descript_vlay.addLayout(tools_vlay) descript_vlay.addStretch() - milling_vlay = QtWidgets.QVBoxLayout() - milling_vlay.addWidget(self.milling_box) - milling_vlay.addStretch() + mill_vlay = QtWidgets.QVBoxLayout() + mill_vlay.addWidget(self.milling_box) + mill_vlay.addStretch() drilling_vlay = QtWidgets.QVBoxLayout() drilling_vlay.addWidget(self.drill_box) param_hlay.addLayout(descript_vlay) - param_hlay.addLayout(milling_vlay) param_hlay.addLayout(drilling_vlay) param_hlay.addLayout(tools_vlay) # always visible, always to be included last - param_hlay.addLayout(milling_vlay) + param_hlay.addLayout(mill_vlay) param_hlay.addStretch()