From cde695da2a5f3b4e90d46094c0169edf7de5515d Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sun, 22 Sep 2024 16:32:53 +0300 Subject: [PATCH] flashcard training widget drafts --- src/cpp/include/trainWindow.h | 8 + .../index/main.cpp.6DE93E662B25E657.idx | Bin 13886 -> 14846 bytes src/cpp/qtapp/CMakeLists.txt | 1 + src/cpp/qtapp/main.cpp | 103 +++++--- src/cpp/qtapp/trainWindow.cpp | 237 ++++++++++++++++++ .../index/parser.cpp.1DA6C31FD012A889.idx | Bin 7792 -> 7840 bytes 6 files changed, 317 insertions(+), 32 deletions(-) create mode 100644 src/cpp/include/trainWindow.h create mode 100644 src/cpp/qtapp/trainWindow.cpp diff --git a/src/cpp/include/trainWindow.h b/src/cpp/include/trainWindow.h new file mode 100644 index 0000000..d8491a5 --- /dev/null +++ b/src/cpp/include/trainWindow.h @@ -0,0 +1,8 @@ +#pragma once + + +#include + +extern QMainWindow *trainWindow; + +void initTrainWindow(); diff --git a/src/cpp/qtapp/.cache/clangd/index/main.cpp.6DE93E662B25E657.idx b/src/cpp/qtapp/.cache/clangd/index/main.cpp.6DE93E662B25E657.idx index 1d9bd4f44f2a81eb637f5a0280b05a5c3b4a4c9f..f2fa27358b53ab07ab2b743173506628b6016a79 100644 GIT binary patch literal 14846 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 diff --git a/src/cpp/qtapp/CMakeLists.txt b/src/cpp/qtapp/CMakeLists.txt index 0e0c272..31b450d 100644 --- a/src/cpp/qtapp/CMakeLists.txt +++ b/src/cpp/qtapp/CMakeLists.txt @@ -15,6 +15,7 @@ find_package(Qt5 COMPONENTS Widgets REQUIRED) add_executable( MdemoryApp main.cpp + trainWindow.cpp ) target_link_libraries(MdemoryApp Qt5::Widgets api) diff --git a/src/cpp/qtapp/main.cpp b/src/cpp/qtapp/main.cpp index b9aa857..5f49a18 100644 --- a/src/cpp/qtapp/main.cpp +++ b/src/cpp/qtapp/main.cpp @@ -5,7 +5,11 @@ #include #include #include +#include #include +#include +#include +#include #include #include @@ -27,10 +31,12 @@ #include #include #include +#include #include #include "api.h" #include "parser.h" +#include "trainWindow.h" struct Page { int start; @@ -130,23 +136,28 @@ public: }; -QString workingPath = "/home/jorenchik/Code/mdemory/memorybase"; -QList mdems = QList(); -std::vector questions = std::vector(); -QLabel *deckListLabel; -QVBoxLayout *hMdemScroll; -QSpacerItem *mdemSpacer; +QString workingPath = "/home/jorenchik/Code/mdemory/memorybase"; +std::string currentPath = ""; +QList mdems = QList(); +std::vector questions = std::vector(); +QLabel *deckListLabel; +QVBoxLayout *hMdemScroll; +QSpacerItem *mdemSpacer; const int PER_PAGE = 8; int currentPage = -1; std::vector pages; +QList paginationButtons; QToolButton* prevButton; QToolButton* firstButton; QToolButton* lastButton; QToolButton* nextButton; -QList paginationButtons; QLabel* paginationLabel; +QToolButton *load; +QToolButton *practice; + + const std::regex doubleSpaceExp( " ", std::regex_constants::ECMAScript | std::regex_constants::icase @@ -313,6 +324,35 @@ void SwitchPage(int pageIdx) { CreateMdems(pageSlice); } +void loadMdem() { + auto file = std::ifstream(currentPath); + std::string content; + if (file) { + std::stringstream buffer; + buffer << file.rdbuf(); + content = buffer.str(); + auto parseRes = Transpile(content, true); + for (auto question: questions) { + delete question; + } + questions.clear(); + if (parseRes.error == "") { + questions = parseRes.value; + makePages(); + SwitchPage(0); + } else { + std::cout << "Compilation error." << std::endl; + for (auto mdem: mdems) { + if (mdem->wMdem->isVisible()) { + mdem->wMdem->hide(); + } + } + } + } else { + std::cout << std::format("Could not open the file: {}", currentPath) << std::endl; + } +} + int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow window; @@ -331,30 +371,16 @@ int main(int argc, char *argv[]) { leftWidget->setLayout(leftLayout); leftLayout->addWidget(mdemLabel); model->setRootPath(workingPath); + // Hide all columns except the first one mdemList->setModel(model); + QObject::connect( mdemList, &QTreeView::doubleClicked, [model](const QModelIndex &index) { auto fileInfo = model->fileInfo(index); - auto path = fileInfo.filePath().toStdString(); - auto file = std::ifstream(path); - std::string content; - if (file) { - std::stringstream buffer; - buffer << file.rdbuf(); - content = buffer.str(); - auto parseRes = Transpile(content, true); - for (auto question: questions) { - delete question; - } - questions.clear(); - questions = parseRes.value; - makePages(); - SwitchPage(0); - } else { - std::cout << std::format("Could not open the file: {}", path) << std::endl; - } + currentPath = fileInfo.filePath().toStdString(); + loadMdem(); } ); @@ -362,8 +388,13 @@ int main(int argc, char *argv[]) { "/home/jorenchik/Code/mdemory/memorybase" ); mdemList->setRootIndex(rootIndex); + for (int col = 1; col < model->columnCount(); ++col) { + mdemList->hideColumn(col); + } + model->setHeaderData(0, Qt::Horizontal, QObject::tr("Custom Name")); leftLayout->addWidget(mdemList); + // DeckList QLabel *deckLabel = new QLabel("Decks"); QListView *deckList = new QListView(); @@ -384,18 +415,16 @@ int main(int argc, char *argv[]) { hTop->addWidget(deckListLabel); hTop->addStretch(1); - QToolButton *refresh = new QToolButton(); - QToolButton *practice = new QToolButton(); - QToolButton *shuffle = new QToolButton(); + load = new QToolButton(); + practice = new QToolButton(); - hTop->addWidget(refresh); - hTop->addWidget(shuffle); + hTop->addWidget(load); hTop->addWidget(practice); // Buttons - refresh->setText("Refresh"); - shuffle->setText("Shuffle"); + load->setText("Load"); practice->setText("Practice"); + QObject::connect(load, &QToolButton::clicked, &loadMdem); // Mdems QScrollArea *mdemScroll = new QScrollArea(); @@ -477,7 +506,17 @@ int main(int argc, char *argv[]) { hPagination->addWidget(paginationLabel); rightLayout->addWidget(pagination); + initTrainWindow(); + QObject::connect( + practice, + &QToolButton::clicked, + [](bool checked) { + trainWindow->show(); + trainWindow->resize(600, 300); + }); + window.setCentralWidget(hSplitter); window.show(); + return app.exec(); } diff --git a/src/cpp/qtapp/trainWindow.cpp b/src/cpp/qtapp/trainWindow.cpp new file mode 100644 index 0000000..6f01a59 --- /dev/null +++ b/src/cpp/qtapp/trainWindow.cpp @@ -0,0 +1,237 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "trainWindow.h" + +QWidget *wMaster; +QVBoxLayout *hMaster; + +QWidget *questionBox; +QVBoxLayout *vQuestionBox; +QLabel *lQuestionText; +QLabel *answerText; + +QVBoxLayout *vButtonBox; +QWidget *actionButtons; +QHBoxLayout *hButtons; +QToolButton *btnPrev; +QToolButton *btnShowAnswer; +QToolButton *btnNext; + +QMainWindow *trainWindow; +QWidget *trainWidget; +QVBoxLayout *vTrainWidget; + +class CustomListView : public QListView +{ + Q_OBJECT + +public: + explicit CustomListView(QWidget *parent = nullptr) : QListView(parent) {} + +protected: + void dropEvent(QDropEvent *event) override + { + QModelIndex sourceIndex = currentIndex(); + QModelIndex targetIndex = indexAt(event->pos()); + + if (sourceIndex.isValid() && targetIndex.isValid()) { + QStandardItemModel *model = qobject_cast(this->model()); + if (model) { + QVariant sourceData = model->data(sourceIndex); + QVariant targetData = model->data(targetIndex); + model->setData(sourceIndex, targetData); + model->setData(targetIndex, sourceData); + event->ignore(); + } + } else { + event->ignore(); + } + } +}; +#include "trainWindow.moc" + +void initTrainWindow() { + // # Types of question + // + // - AnswerQuestion: + // One answer (could be on multiple lines). + // - ChoiceQuestion: + // One or many correct answers that are showed to user. + // - OrderQuestion: + // Many items that should be ordered in a list. + // - MatchQuestion: + // Match some items to other items. + + trainWindow = new QMainWindow(); + trainWidget = new QWidget(); + vTrainWidget = new QVBoxLayout(); + + /*wMaster = new QWidget();*/ + /*hMaster = new QVBoxLayout();*/ + trainWidget->setLayout(vTrainWidget); + trainWindow->setCentralWidget(trainWidget); + trainWidget->setLayout(vTrainWidget); + vTrainWidget->setAlignment(Qt::AlignCenter); + trainWidget->setObjectName("answer-question-widget"); + + { // Make the question box. + vQuestionBox = new QVBoxLayout(); + questionBox = new QWidget(); + questionBox->setLayout(vQuestionBox); + questionBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); + vQuestionBox->setAlignment(Qt::AlignCenter); + } + + { // Make question text. + lQuestionText = new QLabel(); + lQuestionText->setText("What is the capital of Latvia?"); + lQuestionText->setWordWrap(true); + lQuestionText->setStyleSheet(QString( + "QLabel {" + "font-size: 20px;" + "}" + )); + lQuestionText->setTextInteractionFlags(Qt::TextSelectableByMouse); + vQuestionBox->addWidget(lQuestionText); + } + + { // Make answer text. + answerText = new QLabel(); + answerText->setText("- Riga\n- Second line"); + answerText->setWordWrap(true); + answerText->hide(); + answerText->setStyleSheet(QString( + "QLabel {" + "font-size: 15px;" + "}" + )); + answerText->setTextInteractionFlags(Qt::TextSelectableByMouse); + vQuestionBox->addWidget(answerText); + } + + + auto listStyle = + "QListView {" + " background-color: white;" + " border: 1px solid black;" + "}" + "QListView::item::first {" + " padding: 5px 0 0 0;" + "}" + "QListView::item {" + " color: blue;" + " padding: 5px;" + " border: 1px solid gray;" + " background-color: white;" + "}" + "QListView::item:selected {" + "}" + "QListView::item:hover {" + " background-color: lightyellow;" + "}"; + + { // Make multi-choice list. + auto *multiChoiceModel = new QStandardItemModel(); + QListView *listView = new QListView(); + listView->setModel(multiChoiceModel); + + auto *firstItem = new QStandardItem(); + firstItem->setText("Item 1"); + firstItem->setCheckable(true); + auto *secondItem = new QStandardItem(); + secondItem->setText("Item 2"); + secondItem->setCheckable(true); + multiChoiceModel->setItem(0, firstItem); + multiChoiceModel->setItem(1, secondItem); + + listView->setStyleSheet(listStyle); + + questionBox->layout()->addWidget(listView); + listView->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + listView->setEditTriggers(QAbstractItemView::NoEditTriggers); + } + + { // Make order list. + auto *orderModel = new QStandardItemModel(); + QListView *orderList = new CustomListView(); + orderList->setModel(orderModel); + + auto *firstItem = new QStandardItem(); + firstItem->setText("Item 1"); + auto *secondItem = new QStandardItem(); + secondItem->setText("Item 2"); + auto *thirdItem = new QStandardItem(); + thirdItem->setText("Item 3"); + orderModel->setItem(0, firstItem); + orderModel->setItem(1, secondItem); + orderModel->setItem(2, thirdItem); + + + questionBox->layout()->addWidget(orderList); + orderList->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + orderList->setEditTriggers(QAbstractItemView::NoEditTriggers); + orderList->setDragDropMode(QAbstractItemView::InternalMove); + orderList->setFocusPolicy(Qt::NoFocus); + + orderList->setStyleSheet(listStyle); + + // Connect to handle the drop event properly + QObject::connect( + orderModel, + &QStandardItemModel::rowsMoved, + [orderModel](const QModelIndex &, int sourceRow, int, const QModelIndex &, int destinationRow) { + if (sourceRow != destinationRow - 1) { + auto *movedItem = orderModel->takeItem(sourceRow); + orderModel->insertRow(destinationRow > sourceRow ? destinationRow - 1 : destinationRow, movedItem); + } + } + ); + } + + { // Make buttons menu. There are left middle and right buttons. + vButtonBox = new QVBoxLayout(); + actionButtons = new QWidget(); + hButtons = new QHBoxLayout(); + btnPrev = new QToolButton(); + btnShowAnswer = new QToolButton(); + btnNext = new QToolButton(); + + hButtons->addWidget(btnPrev); + hButtons->addWidget(btnShowAnswer); + hButtons->addWidget(btnNext); + vButtonBox->addWidget(actionButtons); + actionButtons->setLayout(hButtons); + btnPrev->setText("Previous"); + btnShowAnswer->setText("Show answer"); + btnNext->setText("Next"); + QObject::connect(btnShowAnswer, &QToolButton::clicked, [](bool checked) { + answerText->show(); + btnShowAnswer->hide(); + }); + actionButtons->setStyleSheet(QString( + "QToolButton {" + "padding: 4px 5px;" + "font-size: 15px;" + "}" + )); + questionBox->setObjectName("question-box"); + } + + + vTrainWidget->addWidget(questionBox); + vTrainWidget->addWidget(actionButtons); + vTrainWidget->addWidget(wMaster); +} diff --git a/src/cpp/transpiler/.cache/clangd/index/parser.cpp.1DA6C31FD012A889.idx b/src/cpp/transpiler/.cache/clangd/index/parser.cpp.1DA6C31FD012A889.idx index 8e42f308c15a9078cb9a0a2d51d00bc836291664..f1ff5367ad1d21e0665180a2b1f0447e886606a4 100644 GIT binary patch delta 2716 zcmYk8e@s(X6vzEuZY`A8)@GH1*-XPk+P$)a(KaUok~ zH-oEY5rr!-<1Z!yi<@LiOSjHWL1VUAOjL+qP@)LJ#3?Mq1}C^@miFG{{quSE+;dLO zz2|$+NO9d_-Rc#krQiId+Y#ehpE702rPQ*%xH6MYPgw;F6-X>;%DeE-r@GH5JBXNr zPz0Za{w$^mehA$|m;^tC?y1ZbgjNuvSU*IRL&O&0HLLhvF)rE&OC#Sx-*D9=BX?Y8H_3JLGm1+4 zVe998ikjJu^mh5CbRnk;1;Rr==JxX(<3ien)Gof+IL8{m#sIbmiy&SP@*j*U?S;LU zcNmLZov?KxBVw`r)U{yMp7%eGRahA-n^CoO$5+1_gYPPAAC!IaDV#vk38X}}Da;Gi zE2kE~tbm-_MPy#YOksZ&8CQ{2(zNXV9#q(E%)Bj*r`qmLD%ok>8AI7&OgjvFWG7_} za5RX>&pEAuUoffk8q%-v`=)iXTaed+lE@B4D|FGYIEnSYefgbp_~>pZY!|WaB7D2K zK)W0X^|B&(kmQkrHX*f1^cZEQkabG52xZO4YL?lHd0uh3DDxrLhrCEil(oRzBFaf! z%n!3)`oRJy4u~G5EQtIdW(x|?7FBdnHiGyO zSp!EAKPvMW(#GHv4#$x^E*wxciTFv`{u$z*$?PV{ZW6sPlpP?310#sy%vG?8g=!e8`8x?KX)O%3{A5B_VH+%M;@}lF3iBwUQm(LPFh7&Il9(#15{nC4 zVQG~;kH9>F1QBTx=1G|k5YqwvQKCvaVC&$uiCJPzG)SyOKz_76Cmy_tb zsIWamzena8qN^cM%{KDUBu8d1%)PKga-iCqU>=e=jI1!vx6gUek32t$B8CbZN6|Qz zMtHN^Q+~4PahpzIO;DSV%a7VqGMka#EZRz8?O4z*_9$!&nPWU;SDk&Z^@(HrV4Xo- zl`;Pht>v%7dY#8R7ScONzr$BJHd#HG@4>Q2Tt#cul|J6)$f7kc)bRU`^7UT4<;8o# z!cB_YB>JHKQd(Ws{L)}IeLh#%DnwMu&Ov|fxyVK4jQxb}Crt1mVn4*sBo}M5K~5w8 zH+k#Zjc_!|GI|NqE{R#;@9k&&-dkByFBoMVaC9J9tapNS3ZIm9LHnXHDeHl=NA}kTN1wd^ zF4$ekehKSGTEDCz18@$=4#r>|6F2+nz4P0CUD`Pas%@Oz&uddR&>Kj;!JnjVa@9ep zll86_tQVOg_aSIEPvS64VOd|pC^?dKED?f(G@;m<4p delta 2657 zcmYk8eN59w7{~WLu2jme)Iw`Zp$PW_UqA>Vm`!m^Go3GU%iQ8#+~Uk!=9ZadF>dV5 zN{Z8{5aq@+%4870>0bI`x-|;Rbc?N96cr5GDHbJSL=pn2QAx~xW@+z|{`2|W_nx~x z_dMUb?-z_#>Q*gVvSfo#w>jyZV#gCt{GC;OBc(b`mrU6nB<+E+@JP|0W1s83pzJvG z$1z#(9q8^LP4Io_?#sNB(4E96#v6&!$VZZP(N>sS`Iq!XS2LzGV`^NXur}nhVY*-s z=6mq0U@ywNm@n9e3?H%u`;p<7Ie=vWtP@E@$7x>}!t%riE$xLvm?Job!kEl%Qt0OYC@PJ@8s%e(njc1P zSgw>F%f_U>_`lB@ZQG|T++x|1MA<$}-UnM;Nm&c*En?-zoZZ52rm6HCa?f#t zX-$a_MLsNy&rr0)Rt$;EztvUK<{bWR8x-~kmPg>+RH_w2dNVTOQ>fO1Q`+Q3+mY2S zdWy0R6m*D|pzJ6Lj>_!89FHg_%DgD_qDaK|!Q>M~OkKUPjwL}6!;cLs&=Eh+30@-Fei=Ixe!NZALI7-)gHg)d51E%h+f!y*Ru!myWrmcE>F z7&s557nFCw+$9cPVIwe&z$#`;z%(Iq9Z9R>xfzw^oiKOGq3^{Y``}$>88wM(2t2jQ`lCb-%1jfpTcU1zEiKo(zjQ3L8cKC?B?|&VE??#W}va#-P5CH#e;H{6$zU@*?{@dJVbP`1|(t zmNv|7!{Ye5iq@;ky?nr4KpS9a;D*fFl^(q8!J9(iCKYayxIu$U8moVKX6Ul!RVSc7 zAzY2JT|_HX7N1C2Be6B|;mk_y@}JqtiyRv_w8Gvh`{rp(J}n*tBb!eA`eXI<0j=0C z!*LmEJe0z2z;Q$H#&18c&-*v$mXT`N%4ipb_}HqP9mwIM4u>m@8DVinQPvH6H!|Zf zDLW7Cmso?c9%w&_`{3+Dj?nkR-Y?I;4t8DEN0A+sJfnmSz&RiX7=>k2RPu#er#?Df z)jI^rq9}>-P}W*{37MC8VfK1g6O<;|;38lVQreTtbKfovr2o6n1{t3PPNB~`2oM+d}Y$k Qzb5v7@>5_PFV5NYAH%@4a{vGU