diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ I18n XmlGui ConfigWidgets + TextEditor ) find_package(Qt5 REQUIRED COMPONENTS diff --git a/atelierui.rc b/atelierui.rc --- a/atelierui.rc +++ b/atelierui.rc @@ -25,5 +25,6 @@ + diff --git a/src/mainwindow.h b/src/mainwindow.h --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -18,11 +18,13 @@ #pragma once #include +#include #include #include #include #include + namespace Ui { class MainWindow; @@ -40,7 +42,7 @@ Ui::MainWindow *ui; AtCore core; QStringList firmwaresList; - QString fileName; + QUrl fileName; void initConnectsToAtCore(); void initLocalVariables(); void initWidgets(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -21,6 +21,7 @@ #include #include #include +#include MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent), @@ -91,12 +92,11 @@ action->setText(i18n("&Edit GCode")); connect(action, &QAction::triggered, this, [ = ] { ui->gcodeEditorWidget->setVisible(!ui->gcodeEditorWidget->isVisible()); - }); - - action = actionCollection()->addAction(QStringLiteral("edit_gcode")); - action->setText(i18n("&Edit GCode")); - connect(action, &QAction::triggered, this, [ = ] { - ui->gcodeEditorWidget->setVisible(!ui->gcodeEditorWidget->isVisible()); + if(ui->gcodeEditorWidget->isVisible()) { + guiFactory()->addClient(ui->gcodeEditorWidget->gcodeView()); + } else { + guiFactory()->removeClient(ui->gcodeEditorWidget->gcodeView()); + } }); QAction *quit = KStandardAction::quit(qApp, SLOT(quit()), actionCollection()); @@ -109,7 +109,7 @@ QUrl fileNameFromDialog = QFileDialog::getOpenFileUrl(this, i18n("Open GCode"), QDir::homePath(), i18n("GCode (*.gco *.gcode)")); if (!fileNameFromDialog.isEmpty()) { - fileName = fileNameFromDialog.toLocalFile(); + fileName = fileNameFromDialog; ui->gcodeEditorWidget->loadFile(fileName); } } @@ -127,7 +127,8 @@ void MainWindow::printFile() { if (!fileName.isEmpty() && (core.state() == PrinterState::IDLE)) { - core.print(fileName); + QString f = fileName.toLocalFile(); + core.print(f); } } diff --git a/src/mainwindow.ui b/src/mainwindow.ui --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 102 - 132 + 94 + 123 @@ -21,7 +21,7 @@ - + @@ -31,8 +31,8 @@ 0 0 - 102 - 30 + 94 + 19 diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -6,4 +6,4 @@ add_library(AtelierWidgets STATIC ${widgets_SRCS}) -target_link_libraries(AtelierWidgets Qt5::Core Qt5::Widgets Qt5::SerialPort KF5::Solid KF5::I18n) +target_link_libraries(AtelierWidgets Qt5::Core Qt5::Widgets Qt5::SerialPort KF5::Solid KF5::I18n KF5::TextEditor) diff --git a/src/widgets/gcodeeditorwidget.h b/src/widgets/gcodeeditorwidget.h --- a/src/widgets/gcodeeditorwidget.h +++ b/src/widgets/gcodeeditorwidget.h @@ -18,6 +18,10 @@ #pragma once #include +#include +#include +#include +#include namespace Ui { @@ -31,8 +35,14 @@ public: explicit GCodeEditorWidget(QWidget *parent = nullptr); ~GCodeEditorWidget(); - void loadFile(const QString &fileName); + void loadFile(const QUrl &fileName); + KTextEditor::View* gcodeView() const; private: + KTextEditor::Editor *editor; + KTextEditor::Document *doc; + KTextEditor::View *view; + KTextEditor::ConfigInterface *interface; Ui::GCodeEditorWidget *ui; + void setupInterface(); }; diff --git a/src/widgets/gcodeeditorwidget.cpp b/src/widgets/gcodeeditorwidget.cpp --- a/src/widgets/gcodeeditorwidget.cpp +++ b/src/widgets/gcodeeditorwidget.cpp @@ -17,47 +17,42 @@ */ #include "gcodeeditorwidget.h" #include "ui_gcodeeditorwidget.h" -#include +#include +#include + GCodeEditorWidget::GCodeEditorWidget(QWidget *parent) : QWidget(parent), ui(new Ui::GCodeEditorWidget) { ui->setupUi(this); + editor = KTextEditor::Editor::instance(); + doc = editor->createDocument(this); + doc->setMode("G-Code"); + view = doc->createView(ui->containerWidget); + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(view); + ui->containerWidget->setLayout(layout); + setupInterface(); } GCodeEditorWidget::~GCodeEditorWidget() { delete ui; } -void GCodeEditorWidget::loadFile(const QString &fileName) +void GCodeEditorWidget::loadFile(const QUrl &fileName) +{ + doc->openUrl(fileName); + doc->setHighlightingMode(QString("G-Code")); +} + +KTextEditor::View* GCodeEditorWidget::gcodeView() const +{ + return view; +} + +void GCodeEditorWidget::setupInterface() { - QRegularExpression cacthMov("G(?.) .*\\bX(?[0-9.-]+) Y(?[0-9.-]+) Z(?[0-9].+)"); - QRegularExpression catchEnd(";(\\s?)(End)(\\s?\\w+\\s?(\\w+)?)"); - catchEnd.setPatternOptions(QRegularExpression::CaseInsensitiveOption); - QRegularExpressionMatch match; - QFile gcode(fileName); - if (!gcode.open(QFile::ReadOnly)) { - return; - } - QTextStream gcodeStream(&gcode); - QString content = gcodeStream.readAll(); - //TODO: Send this content to 3DView - QStringList list = content.split(QStringLiteral("\n"), QString::SkipEmptyParts); - QString header, footer; - foreach (const auto &line, list) { - match = cacthMov.match(line); - if (match.hasMatch()) { - break; - } - header += (line + QStringLiteral("\n")); - } - int last = list.lastIndexOf(catchEnd); - if (last != -1) { - for (int i = last; i <= list.size() - 1; ++i) { - footer += (list.at(i) + QStringLiteral("\n")); - } - } - ui->headerPT->setPlainText(header); - ui->footerPT->setPlainText(footer); + interface = qobject_cast(view); + interface->setConfigValue("line-numbers", true); } diff --git a/src/widgets/gcodeeditorwidget.ui b/src/widgets/gcodeeditorwidget.ui --- a/src/widgets/gcodeeditorwidget.ui +++ b/src/widgets/gcodeeditorwidget.ui @@ -6,87 +6,23 @@ 0 0 - 400 + 458 300 Form - - + + - - Qt::LeftToRight - - Header - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - - - Save - - - - - - - Cancel - - - - - - - Undo - - - - - - - Redo - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Footer - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + GCode Editor - - + +