From 3ba96ba2ee562e5d4d8084300401d38d16122b4a Mon Sep 17 00:00:00 2001 From: jorenchik Date: Mon, 7 Oct 2024 07:23:00 +0300 Subject: [PATCH] added qscintilla and edit button for mdems --- src/cpp/qtapp/CMakeLists.txt | 6 +- src/cpp/qtapp/main.cpp | 184 ++++++++++++++++++++++------------- 2 files changed, 124 insertions(+), 66 deletions(-) diff --git a/src/cpp/qtapp/CMakeLists.txt b/src/cpp/qtapp/CMakeLists.txt index 31b450d..ecdbcc7 100644 --- a/src/cpp/qtapp/CMakeLists.txt +++ b/src/cpp/qtapp/CMakeLists.txt @@ -12,11 +12,15 @@ set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt5 COMPONENTS Widgets REQUIRED) + +# find_package(QScintilla REQUIRED) +include_directories(/usr/include/qt/Qsci) + add_executable( MdemoryApp main.cpp trainWindow.cpp ) -target_link_libraries(MdemoryApp Qt5::Widgets api) +target_link_libraries(MdemoryApp Qt5::Widgets /usr/lib/libqscintilla2_qt5.so api) target_include_directories(MdemoryApp PRIVATE ${CMAKE_SOURCE_DIR}/include) diff --git a/src/cpp/qtapp/main.cpp b/src/cpp/qtapp/main.cpp index 083adbd..58e002e 100644 --- a/src/cpp/qtapp/main.cpp +++ b/src/cpp/qtapp/main.cpp @@ -18,6 +18,9 @@ #include #include +#include +#include + #include #include #include @@ -61,9 +64,11 @@ struct Mdem { QHBoxLayout hFront; QWidget wBack; QVBoxLayout hBack; - QVector backLabels; + QToolButton editButton; QToolButton showButton; int labelCount; + QVector backLabels; + Question *question; }; struct ErrorView { @@ -110,6 +115,9 @@ QToolButton *save; QToolButton *load; QToolButton *practice; +QsciScintilla *editor; +QMainWindow* editorWindow; + const std::regex lastPathElementExp = std::regex("(.+\\/)*(.+)"); void showBacklabels(Mdem *mdem) { @@ -126,6 +134,64 @@ void showBacklabels(Mdem *mdem) { } } +std::string outputMdem(std::vector questions) { + std::stringstream ss; + for (auto question: questions) { + std::string cooldownPart; + if (question->Cooldown != 0) { + cooldownPart = std::format("[{:.2f}]", question->Cooldown); + } + ss << wrapText( + std::format("- {} {} >\n", + cooldownPart, + escapeText(question->QuestionText)), + WRAP_WIDTH + ); + if (MultiElementQuestion* mw = dynamic_cast(question)) { + for (auto choice: mw->Choices) { + char opener; + if (choice.IsCorrect) { + opener = '+'; + } else { + opener = '-'; + } + std::string orderModifier; + if (mw->type == MultiElementType::Order) { + orderModifier = "^"; + } + ss << + wrapText( + std::format( + "\t{}{} {}\n", + opener, + orderModifier, + escapeText(choice.Answer) + ) + , WRAP_WIDTH); + } + } else if (GroupQuestion* gq = dynamic_cast(question)) { + for (auto group: gq->Groups) { + ss << wrapText( + std::format( + "\t- {}:\n", + escapeText(group.name) + ) + , WRAP_WIDTH); + for (auto element: group.elements) { + ss << wrapText( + std::format( + "\t\t- {}\n", + escapeText(element) + ) + , WRAP_WIDTH); + } + } + } + ss << std::endl; + } + return ss.str(); +} + Mdem* makeMdem() { auto mdem = new Mdem; mdem->wMdem.setLayout(&mdem->vMdem); @@ -152,6 +218,20 @@ Mdem* makeMdem() { // Add Front Content mdem->hFront.addWidget(&mdem->wFrontText); mdem->hFront.addStretch(1); + + mdem->editButton.setText("Edit"); + mdem->hFront.addWidget(&mdem->editButton); + + QObject::connect(&mdem->editButton, &QToolButton::clicked, [mdem]() { + if (mdem->question) { + editor->setText( + QString::fromStdString( + outputMdem(std::vector{mdem->question}) + ) + ); + editorWindow->show(); + } + }); mdem->showButton.setText("Show"); mdem->hFront.addWidget(&mdem->showButton); @@ -211,6 +291,7 @@ void CreateMdems(std::vector& questions) { for (size_t i = 0; i < questions.size(); ++i) { + mdems[i]->question = questions[i]; if (MultiElementQuestion* mw = dynamic_cast(questions[i])) { mdems[i]->wFrontText.setText( QString::fromStdString(mw->QuestionText) @@ -501,6 +582,7 @@ void pickDirectory(QString directory) { reloadMdem(); } + int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow window; @@ -525,16 +607,43 @@ int main(int argc, char *argv[]) { window.setMenuBar(menuBar); + { // Setup editor. + editorWindow = new QMainWindow; + + editorWindow->setWindowTitle("QScintilla Simple Editor"); + editorWindow->resize(800, 600); + QWidget *wEditor = new QWidget; + QVBoxLayout *vlEditor = new QVBoxLayout; + wEditor->setLayout(vlEditor); + + editor = new QsciScintilla; + QsciLexerCPP *lexer = new QsciLexerCPP; + editor->setLexer(lexer); + editor->setUtf8(true); + editor->setMarginWidth(0, 15); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + QWidget *editorButtons = new QWidget; + auto save = new QToolButton; + editorButtons->setLayout(buttonLayout); + save->setText(QString::fromStdString("Save")); + buttonLayout->addWidget(save); + + vlEditor->addWidget(editor); + vlEditor->addWidget(editorButtons); + editorWindow->setCentralWidget(wEditor); + } + QSplitter *hSplitter = new QSplitter(); // LeftSide - QWidget *leftWidget = new QWidget(); - QVBoxLayout *leftLayout = new QVBoxLayout(); - QWidget *leftTop = new QWidget(); - QVBoxLayout *vLeftTop = new QVBoxLayout(); - mdemList = new QTreeView(); - mdemLabel = new QLabel(); - model = new QFileSystemModel(); + QWidget *leftWidget = new QWidget(); + QVBoxLayout *leftLayout = new QVBoxLayout(); + QWidget *leftTop = new QWidget(); + QVBoxLayout *vLeftTop = new QVBoxLayout(); + mdemList = new QTreeView(); + mdemLabel = new QLabel(); + model = new QFileSystemModel(); mdemLabel->setStyleSheet( "font-size: 17px;" "font-weight: 400;" @@ -599,63 +708,8 @@ int main(int argc, char *argv[]) { practice->setText("Practice"); QObject::connect(save, &QToolButton::clicked, []() { auto filename = getFilename(currentMdem); - std::stringstream ss; - for (auto question: questions) { - std::string cooldownPart; - if (question->Cooldown != 0) { - cooldownPart = std::format("[{:.2f}]", question->Cooldown); - } - ss << wrapText( - std::format("- {} {} >\n", - cooldownPart, - escapeText(question->QuestionText)), - WRAP_WIDTH - ); - if (MultiElementQuestion* mw = dynamic_cast(question)) { - for (auto choice: mw->Choices) { - char opener; - if (choice.IsCorrect) { - opener = '+'; - } else { - opener = '-'; - } - std::string orderModifier; - if (mw->type == MultiElementType::Order) { - orderModifier = "^"; - } - ss << - wrapText( - std::format( - "\t{}{} {}\n", - opener, - orderModifier, - escapeText(choice.Answer) - ) - , WRAP_WIDTH); - } - } else if (GroupQuestion* gq = dynamic_cast(question)) { - for (auto group: gq->Groups) { - ss << wrapText( - std::format( - "\t- {}:\n", - escapeText(group.name) - ) - , WRAP_WIDTH); - for (auto element: group.elements) { - ss << wrapText( - std::format( - "\t\t- {}\n", - escapeText(element) - ) - , WRAP_WIDTH); - } - } - } - ss << std::endl; - - std::ofstream out("generated.mdem"); - out << ss.str(); - } + std::ofstream out("generated.mdem"); + out << outputMdem(questions);; }); QObject::connect(load, &QToolButton::clicked, &reloadMdem);