- trying to improve the performance of View CNC Code command by using QPlainTextEdit; made the mods for it

- when using the Find function in the TextEditor and the result reach the bottom of the document, the next find will be the first in the document (before it defaulted to the beginning of the document)
This commit is contained in:
Marius Stanciu
2019-11-13 02:06:16 +02:00
committed by Marius
parent 548d16a7d5
commit 63e22cf3ee
5 changed files with 197 additions and 13 deletions

View File

@@ -6099,7 +6099,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
else: else:
self.app.gcode_edited = gco self.app.gcode_edited = gco
self.gcode_editor_tab = TextEditor(app=self.app) self.gcode_editor_tab = TextEditor(app=self.app, plain_text=True)
# add the tab if it was closed # add the tab if it was closed
self.app.ui.plot_tab_area.addTab(self.gcode_editor_tab, '%s' % _("Code Editor")) self.app.ui.plot_tab_area.addTab(self.gcode_editor_tab, '%s' % _("Code Editor"))
@@ -6129,8 +6129,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
self.gcode_editor_tab.code_editor.append(proc_line) self.gcode_editor_tab.code_editor.append(proc_line)
except Exception as e: except Exception as e:
log.debug('FlatCAMCNNJob.on_edit_code_click() -->%s' % str(e)) log.debug('FlatCAMCNNJob.on_edit_code_click() -->%s' % str(e))
self.app.inform.emit('[ERROR] %s %s' % self.app.inform.emit('[ERROR] %s %s' % ('FlatCAMCNNJob.on_edit_code_click() -->', str(e)))
('FlatCAMCNNJob.on_edit_code_click() -->', str(e)))
return return
self.gcode_editor_tab.code_editor.moveCursor(QtGui.QTextCursor.Start) self.gcode_editor_tab.code_editor.moveCursor(QtGui.QTextCursor.Start)
@@ -6328,8 +6327,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
# if it did not find 'G20' and it did not find 'G21' then there is an error and return # if it did not find 'G20' and it did not find 'G21' then there is an error and return
if g_idx == -1: if g_idx == -1:
self.app.inform.emit('[ERROR_NOTCL] %s' % self.app.inform.emit('[ERROR_NOTCL] %s' % _("G-code does not have a units code: either G20 or G21"))
_("G-code does not have a units code: either G20 or G21"))
return return
footer = self.app.defaults['cncjob_footer'] footer = self.app.defaults['cncjob_footer']

View File

@@ -9,6 +9,11 @@ CAD program, and create G-Code for Isolation routing.
================================================= =================================================
13.11.2019
- trying to improve the performance of View CNC Code command by using QPlainTextEdit; made the mods for it
- when using the Find function in the TextEditor and the result reach the bottom of the document, the next find will be the first in the document (before it defaulted to the beginning of the document)
12.11.2019 12.11.2019
- added two new postprocessor files for ISEL CNC and for BERTA CNC - added two new postprocessor files for ISEL CNC and for BERTA CNC

View File

@@ -19,7 +19,7 @@ if '_' not in builtins.__dict__:
class TextEditor(QtWidgets.QWidget): class TextEditor(QtWidgets.QWidget):
def __init__(self, app, text=None): def __init__(self, app, text=None, plain_text=None):
super().__init__() super().__init__()
self.app = app self.app = app
@@ -39,6 +39,14 @@ class TextEditor(QtWidgets.QWidget):
self.work_editor_layout.setContentsMargins(2, 2, 2, 2) self.work_editor_layout.setContentsMargins(2, 2, 2, 2)
self.t_frame.setLayout(self.work_editor_layout) self.t_frame.setLayout(self.work_editor_layout)
if plain_text:
self.code_editor = FCPlainTextAreaExtended()
stylesheet = """
QPlainTextEdit { selection-background-color:yellow;
selection-color:black;
}
"""
else:
self.code_editor = FCTextAreaExtended() self.code_editor = FCTextAreaExtended()
stylesheet = """ stylesheet = """
QTextEdit { selection-background-color:yellow; QTextEdit { selection-background-color:yellow;
@@ -233,6 +241,7 @@ class TextEditor(QtWidgets.QWidget):
r = self.code_editor.find(str(text_to_be_found), flags) r = self.code_editor.find(str(text_to_be_found), flags)
if r is False: if r is False:
self.code_editor.moveCursor(QtGui.QTextCursor.Start) self.code_editor.moveCursor(QtGui.QTextCursor.Start)
r = self.code_editor.find(str(text_to_be_found), flags)
def handleReplaceGCode(self): def handleReplaceGCode(self):
self.app.report_usage("handleReplaceGCode()") self.app.report_usage("handleReplaceGCode()")

View File

@@ -884,6 +884,178 @@ class FCTextAreaExtended(QtWidgets.QTextEdit):
self.setTextCursor(cursor) self.setTextCursor(cursor)
class FCPlainTextAreaExtended(QtWidgets.QPlainTextEdit):
def __init__(self, parent=None):
super().__init__(parent)
self.completer = MyCompleter()
self.model = QtCore.QStringListModel()
self.completer.setModel(self.model)
self.set_model_data(keyword_list=[])
self.completer.insertText.connect(self.insertCompletion)
self.completer_enable = False
def append(self, text):
"""
Added this to make this subclass compatible with FCTextAreaExtended
:param text: string
:return:
"""
self.appendPlainText(text)
def set_model_data(self, keyword_list):
self.model.setStringList(keyword_list)
def insertCompletion(self, completion):
tc = self.textCursor()
extra = (len(completion) - len(self.completer.completionPrefix()))
# don't insert if the word is finished but add a space instead
if extra == 0:
tc.insertText(' ')
self.completer.popup().hide()
return
tc.movePosition(QTextCursor.Left)
tc.movePosition(QTextCursor.EndOfWord)
tc.insertText(completion[-extra:])
# add a space after inserting the word
tc.insertText(' ')
self.setTextCursor(tc)
self.completer.popup().hide()
def focusInEvent(self, event):
if self.completer:
self.completer.setWidget(self)
QtWidgets.QPlainTextEdit.focusInEvent(self, event)
def set_value(self, val):
self.setPlainText(val)
def get_value(self):
self.toPlainText()
def insertFromMimeData(self, data):
"""
Reimplemented such that when SHIFT is pressed and doing click Paste in the contextual menu, the '\' symbol
is replaced with the '/' symbol. That's because of the difference in path separators in Windows and TCL
:param data:
:return:
"""
modifier = QtWidgets.QApplication.keyboardModifiers()
if modifier == Qt.ShiftModifier:
text = data.text()
text = text.replace('\\', '/')
self.insertPlainText(text)
else:
self.insertPlainText(data.text())
def keyPressEvent(self, event):
"""
Reimplemented so the CTRL + SHIFT + V shortcut key combo will paste the text but replacing '\' with '/'
:param event:
:return:
"""
key = event.key()
modifier = QtWidgets.QApplication.keyboardModifiers()
if modifier & Qt.ControlModifier and modifier & Qt.ShiftModifier:
if key == QtCore.Qt.Key_V:
clipboard = QtWidgets.QApplication.clipboard()
clip_text = clipboard.text()
clip_text = clip_text.replace('\\', '/')
self.insertPlainText(clip_text)
if modifier & Qt.ControlModifier and key == Qt.Key_Slash:
self.comment()
tc = self.textCursor()
if (key == Qt.Key_Tab or key == Qt.Key_Enter or key == Qt.Key_Return) and self.completer.popup().isVisible():
self.completer.insertText.emit(self.completer.getSelected())
self.completer.setCompletionMode(QCompleter.PopupCompletion)
return
elif key == Qt.Key_BraceLeft:
tc.insertText('{}')
self.moveCursor(QtGui.QTextCursor.Left)
elif key == Qt.Key_BracketLeft:
tc.insertText('[]')
self.moveCursor(QtGui.QTextCursor.Left)
elif key == Qt.Key_ParenLeft:
tc.insertText('()')
self.moveCursor(QtGui.QTextCursor.Left)
elif key == Qt.Key_BraceRight:
tc.select(QtGui.QTextCursor.WordUnderCursor)
if tc.selectedText() == '}':
tc.movePosition(QTextCursor.Right)
self.setTextCursor(tc)
else:
tc.clearSelection()
self.textCursor().insertText('}')
elif key == Qt.Key_BracketRight:
tc.select(QtGui.QTextCursor.WordUnderCursor)
if tc.selectedText() == ']':
tc.movePosition(QTextCursor.Right)
self.setTextCursor(tc)
else:
tc.clearSelection()
self.textCursor().insertText(']')
elif key == Qt.Key_ParenRight:
tc.select(QtGui.QTextCursor.WordUnderCursor)
if tc.selectedText() == ')':
tc.movePosition(QTextCursor.Right)
self.setTextCursor(tc)
else:
tc.clearSelection()
self.textCursor().insertText(')')
else:
super(FCPlainTextAreaExtended, self).keyPressEvent(event)
if self.completer_enable:
tc.select(QTextCursor.WordUnderCursor)
cr = self.cursorRect()
if len(tc.selectedText()) > 0:
self.completer.setCompletionPrefix(tc.selectedText())
popup = self.completer.popup()
popup.setCurrentIndex(self.completer.completionModel().index(0, 0))
cr.setWidth(self.completer.popup().sizeHintForColumn(0)
+ self.completer.popup().verticalScrollBar().sizeHint().width())
self.completer.complete(cr)
else:
self.completer.popup().hide()
def comment(self):
"""
Got it from here:
https://stackoverflow.com/questions/49898820/how-to-get-text-next-to-cursor-in-qtextedit-in-pyqt4
:return:
"""
pos = self.textCursor().position()
self.moveCursor(QtGui.QTextCursor.StartOfLine)
line_text = self.textCursor().block().text()
if self.textCursor().block().text().startswith(" "):
# skip the white space
self.moveCursor(QtGui.QTextCursor.NextWord)
self.moveCursor(QtGui.QTextCursor.NextCharacter, QtGui.QTextCursor.KeepAnchor)
character = self.textCursor().selectedText()
if character == "#":
# delete #
self.textCursor().deletePreviousChar()
# delete white space
self.moveCursor(QtGui.QTextCursor.NextWord, QtGui.QTextCursor.KeepAnchor)
self.textCursor().removeSelectedText()
else:
self.moveCursor(QtGui.QTextCursor.PreviousCharacter, QtGui.QTextCursor.KeepAnchor)
self.textCursor().insertText("# ")
cursor = QtGui.QTextCursor(self.textCursor())
cursor.setPosition(pos)
self.setTextCursor(cursor)
class FCComboBox(QtWidgets.QComboBox): class FCComboBox(QtWidgets.QComboBox):
def __init__(self, parent=None, callback=None): def __init__(self, parent=None, callback=None):

View File

@@ -9,7 +9,7 @@
from FlatCAMPostProc import * from FlatCAMPostProc import *
class default(FlatCAMPostProc): class PP_ISEL_CNC(FlatCAMPostProc):
coordinate_format = "%.*f" coordinate_format = "%.*f"
feedrate_format = '%.*f' feedrate_format = '%.*f'