mirror of
https://github.com/jorenchik/mdemory.git
synced 2026-03-22 00:26:21 +00:00
comments and some improvements
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
Result<ParseInfo> transpile(std::string fileContent);
|
||||
|
||||
std::string escapeText(std::string text);
|
||||
std::string wrapText(std::string text, size_t width);
|
||||
std::string wrapLine(std::string text, size_t width);
|
||||
|
||||
|
||||
extern std::chrono::high_resolution_clock::time_point start;
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
#include "parser.h"
|
||||
#include "qscilexer.h"
|
||||
|
||||
// Memorybase.
|
||||
// Atmiņas bāze.
|
||||
QString currentPath = "";
|
||||
std::string currentMdem = "";
|
||||
QFileSystemModel *model;
|
||||
@@ -81,7 +81,7 @@ QTreeView *mdemList;
|
||||
std::map<std::string, MdemBuffer*> buffers;
|
||||
MdemBuffer *currentMdemBuffer;
|
||||
|
||||
// Mdem list.
|
||||
// Atmiņas kaartīšu saraksts.
|
||||
std::vector<Mdem*> mdems = std::vector<Mdem*>();
|
||||
QVBoxLayout *hMdemScroll;
|
||||
QSpacerItem *mdemSpacer;
|
||||
@@ -89,17 +89,20 @@ ErrorView *errorView;
|
||||
Pagination *pagination;
|
||||
int perPage;
|
||||
|
||||
// Editor
|
||||
// Redaktors.
|
||||
QsciScintilla *editor;
|
||||
QMainWindow *editorWindow;
|
||||
Mdem *editMdem;
|
||||
|
||||
// Top labels.
|
||||
QLabel *membaseLabel;
|
||||
QLabel *mdemLabel;
|
||||
QLabel *lastPracticeLabel;
|
||||
QMainWindow *trainWindow;
|
||||
// Augšēja informācija.
|
||||
QLabel *membaseLabel;
|
||||
QLabel *mdemLabel;
|
||||
QLabel *lastPracticeLabel;
|
||||
QMainWindow *trainWindow;
|
||||
|
||||
/*
|
||||
* Atmiņas kartītei parāda visus slēptos elementus.
|
||||
* */
|
||||
void showBacklabels(Mdem *mdem) {
|
||||
for (size_t i = 0; i < mdem->backLabels.size(); ++i) {
|
||||
if (i < mdem->labelCount) {
|
||||
@@ -114,14 +117,19 @@ void showBacklabels(Mdem *mdem) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Izveido jautājuma kartīšu pirmkodu ar norādītu trenešanas laiku.
|
||||
* Papildus konfigurācijai var norādīt platumu pirms jaunas rindas un laika zonu.
|
||||
*/
|
||||
std::string outputMdem(
|
||||
std::vector<Question*> questions,
|
||||
time_t time = 0,
|
||||
const int wrap_width = 80,
|
||||
const int wrapWidth = 80,
|
||||
const int timezoneOffset = 0
|
||||
) {
|
||||
std::stringstream ss;
|
||||
|
||||
// Ja ir saistīts laiks, ja tāds ir.
|
||||
if (time > 0) {
|
||||
std::tm* tm = std::localtime(&time);
|
||||
char buffer[100];
|
||||
@@ -130,18 +138,25 @@ std::string outputMdem(
|
||||
ss << time << std::endl;
|
||||
}
|
||||
|
||||
// Detranspilē katru jautājumu.
|
||||
for (auto question: questions) {
|
||||
|
||||
// Pārtraukums.
|
||||
ss << std::endl;
|
||||
std::string cooldownPart;
|
||||
if (question->cooldown != 0) {
|
||||
cooldownPart = std::format(" [{:.2f}]", question->cooldown);
|
||||
}
|
||||
ss << wrapText(
|
||||
|
||||
// Jautājuma teksts.
|
||||
ss << wrapLine(
|
||||
std::format("-{}{} >\n",
|
||||
cooldownPart,
|
||||
" " + escapeText(question->questionText)),
|
||||
wrap_width
|
||||
wrapWidth
|
||||
);
|
||||
|
||||
// Detranspilē atbilstoši veidam.
|
||||
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(question)) {
|
||||
for (auto choice: mw->choices) {
|
||||
char opener;
|
||||
@@ -155,30 +170,32 @@ std::string outputMdem(
|
||||
orderModifier = "^";
|
||||
}
|
||||
ss <<
|
||||
wrapText(
|
||||
wrapLine(
|
||||
std::format(
|
||||
"\t{}{} {}\n",
|
||||
opener,
|
||||
orderModifier,
|
||||
escapeText(choice.answer)
|
||||
)
|
||||
, wrap_width);
|
||||
, wrapWidth);
|
||||
}
|
||||
|
||||
} else if (GroupQuestion* gq = dynamic_cast<GroupQuestion*>(question)) {
|
||||
|
||||
for (auto group: gq->groups) {
|
||||
ss << wrapText(
|
||||
ss << wrapLine(
|
||||
std::format(
|
||||
"\t- {}:\n",
|
||||
escapeText(group.name)
|
||||
)
|
||||
, wrap_width);
|
||||
, wrapWidth);
|
||||
for (auto element: group.elements) {
|
||||
ss << wrapText(
|
||||
ss << wrapLine(
|
||||
std::format(
|
||||
"\t\t- {}\n",
|
||||
escapeText(element)
|
||||
)
|
||||
, wrap_width);
|
||||
, wrapWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -186,14 +203,21 @@ std::string outputMdem(
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
/*
|
||||
* Izveido lappušu objektus atbilstoši jautājumu skaitam vienā lapā.
|
||||
* */
|
||||
void makePages() {
|
||||
pagination->pages.clear();
|
||||
auto len = currentMdemBuffer->questions.size();
|
||||
perPage = settings->value(SETTING_PER_PAGE).toInt();
|
||||
auto pageAmount = len / perPage;
|
||||
|
||||
// Papildus lapa, ja objektu skaits nedalās tieši un paliek papildus kartītes.
|
||||
if (len % perPage != 0) {
|
||||
pageAmount += 1;
|
||||
}
|
||||
|
||||
// Veido lappuses objektus.
|
||||
for (size_t i = 0; i < pageAmount; i++) {
|
||||
size_t startingIndex = perPage * i ;
|
||||
size_t amount = perPage;
|
||||
@@ -204,9 +228,20 @@ void makePages() {
|
||||
Page{startingIndex, startingIndex + amount}
|
||||
);
|
||||
}
|
||||
|
||||
// Ja tiek noņemts pēdējais lappuses elements, pārliek lappusi uz iepriekšējo.
|
||||
if (pagination->pages.size() > 1 && pagination->currentPage >= pagination->pages.size()) {
|
||||
--pagination->currentPage;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Uzstāda atmiņas kartīti ar jebkura veida jautājuma.
|
||||
* Uzstāda jautājuma tekstu un pievieno/uzstāda atbildes elementus.
|
||||
* */
|
||||
void setupMdem(Mdem *mdem, Question *question) {
|
||||
|
||||
// Priekšas teksts.
|
||||
std::stringstream ss;
|
||||
if (question->cooldown > 0) {
|
||||
ss << std::format("[{:.2f}] ", question->cooldown);
|
||||
@@ -215,10 +250,15 @@ void setupMdem(Mdem *mdem, Question *question) {
|
||||
mdem->wFrontText.setText(
|
||||
QString::fromStdString(ss.str())
|
||||
);
|
||||
|
||||
if (MultiElementQuestion* mw = dynamic_cast<MultiElementQuestion*>(question)) {
|
||||
auto choices = mw->choices;
|
||||
|
||||
// Pievieno vairākus elementus atbilstoši veidam.
|
||||
for (size_t k = 0; k < choices.size(); ++k) {
|
||||
auto answer = choices[k].answer;
|
||||
|
||||
// Sagatavo elementu.
|
||||
switch (mw->type) {
|
||||
case MultiElementType::Order:
|
||||
answer = std::format("{}. {}", k + 1, answer);
|
||||
@@ -233,7 +273,9 @@ void setupMdem(Mdem *mdem, Question *question) {
|
||||
case MultiElementType::Regular:
|
||||
answer = std::format("- {}", answer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Pievieno elementu.
|
||||
if (k < mdem->backLabels.size()) {
|
||||
mdem->backLabels[k]->setText(QString::fromStdString(answer));
|
||||
} else {
|
||||
@@ -243,10 +285,13 @@ void setupMdem(Mdem *mdem, Question *question) {
|
||||
mdem->wBack.layout()->addWidget(label);
|
||||
}
|
||||
}
|
||||
|
||||
mdem->labelCount = choices.size();
|
||||
} else if (GroupQuestion* mw = dynamic_cast<GroupQuestion*>(question)) {
|
||||
auto groups = mw->groups;
|
||||
std::vector<std::string> elements;
|
||||
|
||||
// Sagatovo grupas un elementus.
|
||||
for (size_t k = 0; k < groups.size(); ++k) {
|
||||
auto answer = groups[k].name;
|
||||
elements.push_back(std::format("- {}:", answer));
|
||||
@@ -254,6 +299,8 @@ void setupMdem(Mdem *mdem, Question *question) {
|
||||
elements.push_back(std::format(" - {}", groups[k].elements[l]));
|
||||
}
|
||||
}
|
||||
|
||||
// Pievieno grupas un elementus.
|
||||
for (size_t k = 0; k < elements.size(); ++k) {
|
||||
if (k < mdem->backLabels.size()) {
|
||||
mdem->backLabels[k]->setText(QString::fromStdString(elements[k]));
|
||||
@@ -264,12 +311,16 @@ void setupMdem(Mdem *mdem, Question *question) {
|
||||
mdem->wBack.layout()->addWidget(label);
|
||||
}
|
||||
}
|
||||
|
||||
mdem->labelCount = elements.size();
|
||||
}
|
||||
}
|
||||
|
||||
void switchPage(int pageIdx);
|
||||
|
||||
/*
|
||||
* Iegūst faila nosaukumu no faila ceļa.
|
||||
*/
|
||||
std::string getFilename(std::string path) {
|
||||
static const std::regex lastPathElementExp = std::regex("(.+\\/)*(.+)");
|
||||
std::smatch matches;
|
||||
@@ -277,6 +328,9 @@ std::string getFilename(std::string path) {
|
||||
return matches[2].str();
|
||||
}
|
||||
|
||||
/*
|
||||
* Atjauno atmiņas kartīšu faila augšējo informāciju.
|
||||
* */
|
||||
void updateMdemInfo(std::string filename, bool isChanged) {
|
||||
currentMdemBuffer->isModified = isChanged;
|
||||
if (filename.length() > 0) {
|
||||
@@ -301,14 +355,16 @@ void updateMdemInfo(std::string filename, bool isChanged) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Izveido atmiņas kartīti un visus tās elementus.
|
||||
* */
|
||||
Mdem* makeMdem() {
|
||||
auto mdem = new Mdem;
|
||||
mdem->wMdem.setLayout(&mdem->vMdem);
|
||||
|
||||
|
||||
// Priekša.
|
||||
QString id = QString("mdem_%1").arg(1);
|
||||
mdem->wMdem.setObjectName(id);
|
||||
|
||||
// Front
|
||||
mdem->wFront.setMinimumHeight(70);
|
||||
mdem->wFront.setLayout(&mdem->hFront);
|
||||
mdem->wFront.setProperty("first", "true");
|
||||
@@ -324,7 +380,7 @@ Mdem* makeMdem() {
|
||||
"}"
|
||||
).arg(id, MDEM_BACKGROUND));
|
||||
|
||||
// Add Front Content
|
||||
// Saturs.
|
||||
mdem->wFrontText.setWordWrap(true);
|
||||
mdem->wFrontText.setSizePolicy(
|
||||
QSizePolicy::Expanding,
|
||||
@@ -332,6 +388,7 @@ Mdem* makeMdem() {
|
||||
);
|
||||
mdem->hFront.addWidget(&mdem->wFrontText);
|
||||
|
||||
// Rediģēšanas poga.
|
||||
mdem->editButton.setText("Rediģēt");
|
||||
QObject::connect(
|
||||
&mdem->editButton,
|
||||
@@ -355,6 +412,7 @@ Mdem* makeMdem() {
|
||||
);
|
||||
mdem->hFront.addWidget(&mdem->editButton);
|
||||
|
||||
// Dzēšanas poga.
|
||||
mdem->deleteButton.setText("Dzēst");
|
||||
QObject::connect(
|
||||
&mdem->deleteButton,
|
||||
@@ -380,15 +438,12 @@ Mdem* makeMdem() {
|
||||
}
|
||||
);
|
||||
mdem->hFront.addWidget(&mdem->deleteButton);
|
||||
|
||||
mdem->toggleVisibility.setText("Parādīt");
|
||||
mdem->hFront.addWidget(&mdem->toggleVisibility);
|
||||
|
||||
// Back
|
||||
// Aizmugura.
|
||||
mdem->wBack.setLayout(&mdem->hBack);
|
||||
mdem->vMdem.addWidget(&mdem->wBack);
|
||||
|
||||
// Add Back Content
|
||||
// Aizmuguras saturs.
|
||||
for (size_t i = 0; i < 20; ++i) {
|
||||
// @Improve: back label pooling
|
||||
QLabel *elBackText = new QLabel();
|
||||
@@ -404,7 +459,9 @@ Mdem* makeMdem() {
|
||||
mdem->wBack.hide();
|
||||
mdem->wMdem.hide();
|
||||
|
||||
// Connect button to toggle view
|
||||
// Atbildes parādīšanas poga.
|
||||
mdem->toggleVisibility.setText("Parādīt");
|
||||
mdem->hFront.addWidget(&mdem->toggleVisibility);
|
||||
QObject::connect(&mdem->toggleVisibility, &QToolButton::clicked, [mdem]() {
|
||||
if (mdem->wBack.isVisible()) {
|
||||
mdem->wBack.hide();
|
||||
@@ -418,17 +475,22 @@ Mdem* makeMdem() {
|
||||
return mdem;
|
||||
}
|
||||
|
||||
/*
|
||||
* Izveido rādāmās kartītes (argumentam nedrīkst pārniegt maksimāli iespējamo daudzumu lapā).
|
||||
* */
|
||||
void createMdems(std::vector<Question*>& questions) {
|
||||
|
||||
void CreateMdems(std::vector<Question*>& questions) {
|
||||
hMdemScroll->removeItem(mdemSpacer);
|
||||
|
||||
// Paslēp visas atmiņas kartītes.
|
||||
for (Mdem *mdem : mdems) {
|
||||
if (mdem->wMdem.isVisible()) {
|
||||
mdem->wMdem.hide();
|
||||
}
|
||||
}
|
||||
|
||||
perPage = settings->value(SETTING_PER_PAGE).toInt();
|
||||
// Pievieno atmiņas kartītes, ja nepieciešamais daudzums pārsniedz esošo.
|
||||
perPage = settings->value(SETTING_PER_PAGE).toInt();
|
||||
if (perPage > mdems.size()) {
|
||||
for (size_t i = mdems.size(); i < perPage; i++) {
|
||||
if (i >= mdems.size()) {
|
||||
@@ -439,6 +501,7 @@ void CreateMdems(std::vector<Question*>& questions) {
|
||||
}
|
||||
}
|
||||
|
||||
// Parāda nepieciešamās atmiņas kartītes.
|
||||
for (size_t i = 0; i < questions.size(); ++i) {
|
||||
mdems[i]->question = questions[i];
|
||||
setupMdem(mdems[i], questions[i]);
|
||||
@@ -450,6 +513,9 @@ void CreateMdems(std::vector<Question*>& questions) {
|
||||
hMdemScroll->addItem(mdemSpacer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Atjauno sarakstu un tā informāciju.
|
||||
*/
|
||||
void update(bool isChanged) {
|
||||
if (pagination->currentPage > -1) {
|
||||
switchPage(pagination->currentPage);
|
||||
@@ -460,9 +526,10 @@ void update(bool isChanged) {
|
||||
}
|
||||
|
||||
void switchPage(int pageIdx) {
|
||||
|
||||
pagination->currentPage = pageIdx;
|
||||
|
||||
// Hide all pagination buttons
|
||||
// Paslēp visas lappušu pogas.
|
||||
for (auto& button : pagination->paginationButtons) {
|
||||
button->hide();
|
||||
}
|
||||
@@ -472,7 +539,7 @@ void switchPage(int pageIdx) {
|
||||
snprintf(buffer, sizeof(buffer), "Lappuse: %d", pageIdx + 1);
|
||||
pagination->paginationLabel.setText(buffer);
|
||||
|
||||
// Adjust mdem amount, hide widgets in mdems
|
||||
// Paslēp atbilžu elementus.
|
||||
for (auto& mdem : mdems) {
|
||||
if (mdem->wBack.isVisible()) {
|
||||
mdem->wBack.hide();
|
||||
@@ -480,7 +547,7 @@ void switchPage(int pageIdx) {
|
||||
}
|
||||
}
|
||||
|
||||
// Update pagination buttons
|
||||
// Atjauno lappušu pogas.
|
||||
for (int k = -DISTANCE; k <= DISTANCE; ++k) {
|
||||
if (pageIdx + k >= 0 && pageIdx + k < pagination->pages.size()) {
|
||||
auto button = pagination->paginationButtons[l];
|
||||
@@ -496,50 +563,51 @@ void switchPage(int pageIdx) {
|
||||
}
|
||||
}
|
||||
|
||||
// Handle first and last buttons
|
||||
// Pirmās un pēdējās pogas redzamība.
|
||||
if (pageIdx > 0 && pagination->pages.size() > 1) {
|
||||
pagination->firstButton.show();
|
||||
} else {
|
||||
pagination->firstButton.hide();
|
||||
}
|
||||
|
||||
if (pageIdx < pagination->pages.size() - 1 && pagination->pages.size() > 1) {
|
||||
pagination->lastButton.show();
|
||||
} else {
|
||||
pagination->lastButton.hide();
|
||||
}
|
||||
|
||||
// Handle next and previous buttons
|
||||
if (!pagination->pages.empty() && pagination->currentPage < pagination->pages.size() - 1) {
|
||||
pagination->nextButton.show();
|
||||
} else {
|
||||
pagination->nextButton.hide();
|
||||
}
|
||||
|
||||
// Iepriekšējās pogas redzamība.
|
||||
if (!pagination->pages.empty() && pagination->currentPage >= 1) {
|
||||
pagination->prevButton.show();
|
||||
} else {
|
||||
pagination->prevButton.hide();
|
||||
}
|
||||
|
||||
// Nākamās pogas redzamība.
|
||||
if (!pagination->pages.empty() && pagination->currentPage < pagination->pages.size() - 1) {
|
||||
pagination->nextButton.show();
|
||||
} else {
|
||||
pagination->nextButton.hide();
|
||||
}
|
||||
|
||||
Page page;
|
||||
// Samazina lappuses numuru, ja pēdējai lappusei nepietiek atmiņas kartīšu.
|
||||
if (pagination->pages.size() <= 0) {
|
||||
// Nav lapu -> veidojam tukšu lapu.
|
||||
page = Page();
|
||||
} else if (pageIdx < pagination->pages.size()){
|
||||
page = pagination->pages[pageIdx];
|
||||
// Pieprasītā lapa eksistē -> atgriežam to.
|
||||
page = pagination->pages[pageIdx];
|
||||
} else {
|
||||
if (pageIdx - 1 < pagination->pages.size()) {
|
||||
page = pagination->pages[pageIdx -1];
|
||||
} else {
|
||||
page = pagination->pages[0];
|
||||
}
|
||||
// Pieprasītā lapa eksistē -> atgriežam iepriekšējo.
|
||||
page = pagination->pages[pageIdx - 1];
|
||||
}
|
||||
|
||||
// Izveido lappusi.
|
||||
std::vector<Question*> pageSlice(
|
||||
currentMdemBuffer->questions.begin() + page.start,
|
||||
currentMdemBuffer->questions.begin() + page.end
|
||||
);
|
||||
CreateMdems(pageSlice);
|
||||
createMdems(pageSlice);
|
||||
}
|
||||
|
||||
void reloadMdem(std::string path) {
|
||||
@@ -586,7 +654,7 @@ void reloadMdem(std::string path) {
|
||||
auto file = std::ifstream(path);
|
||||
std::string content;
|
||||
|
||||
// Reset the mdem list.
|
||||
// Atiestata atmiņas kartīšu sarakstu.
|
||||
for (auto mdem: mdems) {
|
||||
mdem->wMdem.hide();
|
||||
}
|
||||
@@ -631,7 +699,7 @@ void reloadMdem(std::string path) {
|
||||
delete question;
|
||||
}
|
||||
|
||||
// Show errors.
|
||||
// Parāda kļūdu.
|
||||
hMdemScroll->removeItem(mdemSpacer);
|
||||
errorView->label.setText(
|
||||
QString::fromStdString(
|
||||
@@ -680,7 +748,7 @@ void pickDirectory(QString directory) {
|
||||
|
||||
currentPath = directory;
|
||||
|
||||
// Update tree view.
|
||||
// Atjauno failu sarakstu.
|
||||
if (directory.length() <= 0) {
|
||||
membaseLabel->setText(directory);
|
||||
return;
|
||||
@@ -688,7 +756,7 @@ void pickDirectory(QString directory) {
|
||||
mdemList->setRootIndex(model->setRootPath(directory));
|
||||
std::smatch matches;
|
||||
|
||||
// Update label.
|
||||
// Atjauno teksta elementu.
|
||||
membaseLabel->setText(QString::fromStdString(
|
||||
std::format(
|
||||
"Atmiņas bāze: {}",
|
||||
@@ -794,17 +862,20 @@ void saveMdem() {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Inicializē visus atmiņas kartīšu saraksta elementus un izvēlni.
|
||||
*/
|
||||
QMainWindow *initMdemListWindow() {
|
||||
QMainWindow* window = new QMainWindow;
|
||||
pagination = new Pagination;
|
||||
auto *toolbar = new Toolbar();
|
||||
|
||||
// Setup the related windows.
|
||||
// Saistīti logi.
|
||||
auto *settingsWindow = initSettings();
|
||||
trainWindow = initTrainWindow();
|
||||
|
||||
QMainWindow *guideWindow = new QMainWindow;
|
||||
{ // Guide window.
|
||||
{ // Apmācības logs.
|
||||
auto guideWidget = new QWidget;
|
||||
auto *layout = new QVBoxLayout;
|
||||
auto *textBrowser = new QTextBrowser;
|
||||
@@ -818,13 +889,13 @@ QMainWindow *initMdemListWindow() {
|
||||
QAction *actionOpen;
|
||||
QAction *openSettings;
|
||||
QAction *actionHelp;
|
||||
{ // Menu bar.
|
||||
{ // Izvēlne.
|
||||
QMenuBar *menuBar = new QMenuBar;
|
||||
QFileDialog *fileDialog = new QFileDialog;
|
||||
|
||||
QMenu *menu = new QMenu("Fails");
|
||||
menu->setStyleSheet("font-size: 15px;");
|
||||
actionOpen = menu->addAction("Atvērt atmņas bāzi (Ctrl+O)");
|
||||
actionOpen = menu->addAction("Atvērt atmiņas bāzi (Ctrl+O)");
|
||||
QObject::connect(
|
||||
actionOpen,
|
||||
&QAction::triggered,
|
||||
@@ -862,7 +933,7 @@ QMainWindow *initMdemListWindow() {
|
||||
window->setMenuBar(menuBar);
|
||||
}
|
||||
|
||||
{ // Editor.
|
||||
{ // Redaktors.
|
||||
editorWindow = new QMainWindow;
|
||||
|
||||
editorWindow->setWindowTitle("Jautājumu redaktors");
|
||||
@@ -905,26 +976,26 @@ QMainWindow *initMdemListWindow() {
|
||||
}
|
||||
|
||||
auto *wTop = new QWidget();
|
||||
{ // Top.
|
||||
{ // Augša.
|
||||
|
||||
// Main top layout.
|
||||
// Pamata augšējais izklājums.
|
||||
QHBoxLayout *hlTop = new QHBoxLayout();
|
||||
wTop->setLayout(hlTop);
|
||||
|
||||
// Labels
|
||||
auto *wLabels = new QWidget();
|
||||
// Teksta elementi.
|
||||
auto *wLabels = new QWidget();
|
||||
auto *vlLeftTop = new QVBoxLayout();
|
||||
wLabels->setLayout(vlLeftTop);
|
||||
wLabels->setMinimumSize(0, 40);
|
||||
|
||||
// Atmiņas bāzes teksta elements.
|
||||
QString labelStyle = "font-size: 20px; font-weight: 400;";
|
||||
// Memorybase label.
|
||||
membaseLabel = new QLabel();
|
||||
membaseLabel = new QLabel();
|
||||
membaseLabel->setStyleSheet(labelStyle);
|
||||
vlLeftTop->addWidget(membaseLabel);
|
||||
|
||||
// Memorybase label.
|
||||
mdemLabel = new QLabel();
|
||||
// Atmiņas kartīšu faila teksta elements.
|
||||
mdemLabel = new QLabel();
|
||||
mdemLabel->setStyleSheet(labelStyle);
|
||||
vlLeftTop->addWidget(mdemLabel);
|
||||
|
||||
@@ -932,9 +1003,9 @@ QMainWindow *initMdemListWindow() {
|
||||
lastPracticeLabel->setStyleSheet(labelStyle);
|
||||
vlLeftTop->addWidget(lastPracticeLabel);
|
||||
|
||||
// Button layout.
|
||||
auto buttons = new QWidget();
|
||||
auto vlButtons = new QVBoxLayout();
|
||||
// Pogu izklājums.
|
||||
auto buttons = new QWidget();
|
||||
auto vlButtons = new QVBoxLayout();
|
||||
buttons->setLayout(vlButtons);
|
||||
buttons->setStyleSheet("font-size: 15px;");
|
||||
|
||||
@@ -946,8 +1017,7 @@ QMainWindow *initMdemListWindow() {
|
||||
auto hlButtonsBottom = new QHBoxLayout();
|
||||
buttonsBottom->setLayout(hlButtonsBottom);
|
||||
|
||||
// Define buttons.
|
||||
|
||||
// Pogu definēšana.
|
||||
QObject::connect(&toolbar->btnAdd, &QToolButton::clicked, []() {
|
||||
editMdem = nullptr;
|
||||
editorWindow->show();
|
||||
@@ -976,7 +1046,7 @@ QMainWindow *initMdemListWindow() {
|
||||
}
|
||||
);
|
||||
|
||||
// Button content.
|
||||
// Pogu saturs.
|
||||
toolbar->btnAdd.setText("Pievienot");
|
||||
toolbar->btnSave.setText("Saglabāt");
|
||||
toolbar->btnLoad.setText("Ielādēt");
|
||||
@@ -987,7 +1057,7 @@ QMainWindow *initMdemListWindow() {
|
||||
toolbar->cbAlgorithm.addItem("Primārais", PRIMARY);
|
||||
toolbar->btnPractice.setText("Mācīties");
|
||||
|
||||
// Add buttons.
|
||||
// Pievieno pogas.
|
||||
hlButtonsTop->addWidget(&toolbar->btnAdd);
|
||||
hlButtonsTop->addWidget(&toolbar->btnSave);
|
||||
hlButtonsTop->addWidget(&toolbar->btnLoad);
|
||||
@@ -1008,8 +1078,8 @@ QMainWindow *initMdemListWindow() {
|
||||
hlTop->addWidget(buttons);
|
||||
}
|
||||
|
||||
QWidget *leftWidget = new QWidget();
|
||||
{ // Left side.
|
||||
QWidget *leftWidget = new QWidget();
|
||||
{ // Kreisā puse.
|
||||
|
||||
QVBoxLayout *leftLayout = new QVBoxLayout();
|
||||
leftWidget->setLayout(leftLayout);
|
||||
@@ -1032,7 +1102,6 @@ QMainWindow *initMdemListWindow() {
|
||||
if (currentPath.size() > 0) {
|
||||
pickDirectory(currentPath);
|
||||
}
|
||||
/*leftLayout->addWidget(leftTop);*/
|
||||
|
||||
QObject::connect(
|
||||
mdemList,
|
||||
@@ -1049,14 +1118,13 @@ QMainWindow *initMdemListWindow() {
|
||||
for (int col = 1; col < model->columnCount(); ++col) {
|
||||
mdemList->hideColumn(col);
|
||||
}
|
||||
// TODO: name -> nosaukums in HEADER
|
||||
leftLayout->addWidget(mdemList);
|
||||
}
|
||||
|
||||
auto wMain = new QWidget;
|
||||
auto *rightWidget = new QWidget();
|
||||
auto *rightLayout = new QVBoxLayout();
|
||||
{ // Main layout.
|
||||
{ // Pamata izklājums.
|
||||
auto vlMain = new QVBoxLayout;
|
||||
wMain->setLayout(vlMain);
|
||||
|
||||
@@ -1072,7 +1140,7 @@ QMainWindow *initMdemListWindow() {
|
||||
vlMain->addWidget(hSplitter);
|
||||
}
|
||||
|
||||
{ // Error.
|
||||
{ // Kļūda.
|
||||
errorView = new ErrorView;
|
||||
errorView->box.setObjectName("error-box");
|
||||
errorView->box.setLayout(&errorView->layout);
|
||||
@@ -1089,7 +1157,7 @@ QMainWindow *initMdemListWindow() {
|
||||
errorView->label.setWordWrap(true);
|
||||
}
|
||||
|
||||
{ // Mdems
|
||||
{ // Atmiņas kartītes.
|
||||
QScrollArea *mdemScroll = new QScrollArea();
|
||||
QWidget *mdemContainer = new QWidget();
|
||||
hMdemScroll = new QVBoxLayout();
|
||||
@@ -1104,10 +1172,9 @@ QMainWindow *initMdemListWindow() {
|
||||
QSizePolicy::Minimum,
|
||||
QSizePolicy::Expanding
|
||||
);
|
||||
/*hMdemScroll->addItem(mdemSpacer);*/
|
||||
}
|
||||
|
||||
{ // Pagination
|
||||
{ // Lappušu pogas.
|
||||
|
||||
auto wPagination = new QWidget();
|
||||
auto hPagination = new QHBoxLayout();
|
||||
@@ -1171,7 +1238,7 @@ QMainWindow *initMdemListWindow() {
|
||||
rightLayout->addWidget(wPagination);
|
||||
}
|
||||
|
||||
{ // Setup shortcuts.
|
||||
{ // Uzstāda īsceļus.
|
||||
auto addShortcut = [window](QString key, std::function<void()> func) {
|
||||
QShortcut* shortcut = new QShortcut(QKeySequence(key), window);
|
||||
QObject::connect(shortcut, &QShortcut::activated, [func]() {
|
||||
|
||||
@@ -63,19 +63,25 @@
|
||||
|
||||
QSettings *settings;
|
||||
|
||||
/*
|
||||
* Inicializē uzstādījumu logu.
|
||||
* */
|
||||
QWidget *initSettings () {
|
||||
QString configDir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
|
||||
|
||||
// Uzstādījumu fails - paņem standarta atrašanās vietu operētājsistēmā.
|
||||
auto configDir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
|
||||
QDir().mkpath(configDir);
|
||||
QString settingsFile = configDir + "/mdem.ini";
|
||||
settings = new QSettings(settingsFile, QSettings::IniFormat);
|
||||
auto* settingsWindow = new QWidget;
|
||||
|
||||
// Logs.
|
||||
auto* settingsWindow = new QWidget;
|
||||
settingsWindow->setWindowTitle("Iestatījumi");
|
||||
|
||||
// Augšējais izklājums.
|
||||
auto top = new QWidget;
|
||||
auto hlTop = new QVBoxLayout;
|
||||
top->setLayout(hlTop);
|
||||
|
||||
auto settingsLabel = new QLabel;
|
||||
settingsLabel->setText("Iestatījumi");
|
||||
settingsLabel->setStyleSheet(
|
||||
@@ -83,62 +89,67 @@ QWidget *initSettings () {
|
||||
);
|
||||
hlTop->addWidget(settingsLabel);
|
||||
|
||||
// Forma.
|
||||
auto wForm = new QWidget;
|
||||
auto formLayout = new QFormLayout;
|
||||
wForm->setLayout(formLayout);
|
||||
auto mbaseInput = new QLineEdit;
|
||||
auto browseButton = new QPushButton("Izvēlēties");
|
||||
auto pathLayout = new QHBoxLayout;
|
||||
wForm->setLayout(formLayout);
|
||||
pathLayout->addWidget(mbaseInput);
|
||||
pathLayout->addWidget(browseButton);
|
||||
wForm->setStyleSheet("font-size: 15px;");
|
||||
|
||||
formLayout->addRow("Noklusējuma memorybase:", pathLayout);
|
||||
QObject::connect(browseButton, &QPushButton::clicked, [mbaseInput]() {
|
||||
QString dir = QFileDialog::getExistingDirectory(
|
||||
nullptr,
|
||||
"Izvēlēties noklusēto direktoriju",
|
||||
mbaseInput->text()
|
||||
);
|
||||
if (!dir.isEmpty()) {
|
||||
mbaseInput->setText(dir);
|
||||
}
|
||||
});
|
||||
|
||||
// Lauki.
|
||||
auto perPage = new QSpinBox;
|
||||
perPage->setRange(5, 50);
|
||||
formLayout->addRow("Mdems per page [5-50]:", perPage);
|
||||
|
||||
auto characterWrap = new QSpinBox;
|
||||
characterWrap->setRange(30, 150);
|
||||
formLayout->addRow("Rindas pārnešanas platums jautājumu teksta ģenerēšanā [30-150]:", characterWrap);
|
||||
|
||||
auto* timezone = new QSpinBox;
|
||||
timezone->setRange(-12, 12);
|
||||
formLayout->addRow("Laika zona (e.g. +2 as 2):", timezone);
|
||||
|
||||
auto* notRemembered = new QDoubleSpinBox;
|
||||
notRemembered->setRange(0, 100);
|
||||
formLayout->addRow("Neatcerējos:", notRemembered);
|
||||
|
||||
auto* hard = new QDoubleSpinBox;
|
||||
hard->setRange(0, 100);
|
||||
formLayout->addRow("Grūti:", hard);
|
||||
|
||||
auto* medium = new QDoubleSpinBox;
|
||||
medium->setRange(0, 100);
|
||||
formLayout->addRow("Vidēji:", medium);
|
||||
|
||||
auto* easy = new QDoubleSpinBox;
|
||||
easy->setRange(0, 100);
|
||||
formLayout->addRow("Viegli:", easy);
|
||||
|
||||
auto* debug = new QCheckBox;
|
||||
formLayout->addRow("Atkļūdošana:", debug);
|
||||
|
||||
auto* showTimes = new QCheckBox;
|
||||
formLayout->addRow("Rādīt laikus komandrindā:", showTimes);
|
||||
{ // Uzstāda uzstādījumu laukus.
|
||||
formLayout->addRow("Noklusējuma atmiņas bāze:", pathLayout);
|
||||
QObject::connect(browseButton, &QPushButton::clicked, [mbaseInput]() {
|
||||
QString dir = QFileDialog::getExistingDirectory(
|
||||
nullptr,
|
||||
"Izvēlēties noklusēto direktoriju",
|
||||
mbaseInput->text()
|
||||
);
|
||||
if (!dir.isEmpty()) {
|
||||
mbaseInput->setText(dir);
|
||||
}
|
||||
});
|
||||
|
||||
perPage->setRange(5, 50);
|
||||
formLayout->addRow("Mdems per page [5-50]:", perPage);
|
||||
|
||||
characterWrap->setRange(30, 150);
|
||||
formLayout->addRow("Rindas pārnešanas platums jautājumu teksta ģenerēšanā [30-150]:", characterWrap);
|
||||
|
||||
timezone->setRange(-12, 12);
|
||||
formLayout->addRow("Laika zona (e.g. +2 as 2):", timezone);
|
||||
|
||||
notRemembered->setRange(0, 100);
|
||||
formLayout->addRow("Neatcerējos:", notRemembered);
|
||||
|
||||
hard->setRange(0, 100);
|
||||
formLayout->addRow("Grūti:", hard);
|
||||
|
||||
medium->setRange(0, 100);
|
||||
formLayout->addRow("Vidēji:", medium);
|
||||
|
||||
easy->setRange(0, 100);
|
||||
formLayout->addRow("Viegli:", easy);
|
||||
|
||||
formLayout->addRow("Atkļūdošana:", debug);
|
||||
|
||||
formLayout->addRow("Rādīt laikus komandrindā:", showTimes);
|
||||
}
|
||||
|
||||
// Uzstādījumu pogas.
|
||||
auto wButtons = new QWidget;
|
||||
auto btnLayout = new QHBoxLayout;
|
||||
wButtons->setLayout(btnLayout);
|
||||
@@ -149,7 +160,7 @@ QWidget *initSettings () {
|
||||
btnLayout->addWidget(btnLoad);
|
||||
wButtons->setStyleSheet("font-size: 15px;");
|
||||
|
||||
// @Improve: validate setting values
|
||||
// Uzstāda lauku vērtības no uzstādījumu vērtībām.
|
||||
auto setSettingInputs = [
|
||||
perPage,
|
||||
mbaseInput,
|
||||
@@ -174,6 +185,7 @@ QWidget *initSettings () {
|
||||
showTimes->setChecked(settings->value(SETTING_SHOW_TIMES).toBool() == true);
|
||||
};
|
||||
|
||||
// Parāda izmaiņas indikatoru.
|
||||
auto updateSettingsLabel = [settingsLabel](bool isChanged) {
|
||||
if (isChanged) {
|
||||
settingsLabel->setText("Iestatījumi *");
|
||||
@@ -182,6 +194,7 @@ QWidget *initSettings () {
|
||||
}
|
||||
};
|
||||
|
||||
// Pievieno klausītāju atbilstoši izmantotam lauku tipam.
|
||||
auto attachChangeListener = [settingsLabel, updateSettingsLabel](QObject *input, QString key) {
|
||||
if (QLineEdit *lineInput = qobject_cast<QLineEdit*>(input)) {
|
||||
QObject::connect(
|
||||
@@ -224,6 +237,7 @@ QWidget *initSettings () {
|
||||
}
|
||||
};
|
||||
|
||||
// Izmaiņas laukos parāda indikatoros.
|
||||
attachChangeListener(perPage, SETTING_PER_PAGE);
|
||||
attachChangeListener(mbaseInput, SETTING_MEMORYBASE);
|
||||
attachChangeListener(characterWrap, SETTING_CHARACTER_WRAP);
|
||||
@@ -235,6 +249,7 @@ QWidget *initSettings () {
|
||||
attachChangeListener(debug, SETTING_DEBUG);
|
||||
attachChangeListener(showTimes, SETTING_SHOW_TIMES);
|
||||
|
||||
// Atjauno uzstādījumus no lauku vērtībām.
|
||||
auto saveSettings = [
|
||||
perPage,
|
||||
mbaseInput,
|
||||
@@ -260,7 +275,6 @@ QWidget *initSettings () {
|
||||
settings->setValue(SETTING_SHOW_TIMES, showTimes->isChecked());
|
||||
updateSettingsLabel(false);
|
||||
};
|
||||
|
||||
auto loadSettings = [setSettingInputs, updateSettingsLabel]() {
|
||||
settings->sync();
|
||||
setSettingInputs();
|
||||
@@ -274,6 +288,17 @@ QWidget *initSettings () {
|
||||
saveSettings();
|
||||
}
|
||||
);
|
||||
auto shortcutSave = new QShortcut(
|
||||
QKeySequence("Ctrl+S"),
|
||||
settingsWindow
|
||||
);
|
||||
QObject::connect(
|
||||
shortcutSave,
|
||||
&QShortcut::activated,
|
||||
[saveSettings]() {
|
||||
saveSettings();
|
||||
}
|
||||
);
|
||||
QObject::connect(
|
||||
btnLoad,
|
||||
&QPushButton::clicked,
|
||||
@@ -283,11 +308,7 @@ QWidget *initSettings () {
|
||||
);
|
||||
loadSettings();
|
||||
|
||||
QShortcut* shortcutSave = new QShortcut(QKeySequence("Ctrl+S"), settingsWindow);
|
||||
QObject::connect(shortcutSave, &QShortcut::activated, [saveSettings]() {
|
||||
saveSettings();
|
||||
});
|
||||
|
||||
// Lai pogas ir lejā.
|
||||
auto spacer = new QSpacerItem(
|
||||
50,
|
||||
50,
|
||||
@@ -295,6 +316,7 @@ QWidget *initSettings () {
|
||||
QSizePolicy::Expanding
|
||||
);
|
||||
|
||||
// Pievieno elementus.
|
||||
mainLayout->addWidget(top);
|
||||
mainLayout->addWidget(wForm);
|
||||
mainLayout->addItem(spacer);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,11 +16,17 @@ bool showTimes = false;
|
||||
std::chrono::high_resolution_clock::time_point start;
|
||||
std::chrono::high_resolution_clock::time_point end;
|
||||
|
||||
std::string wrapText(std::string text, size_t width) {
|
||||
/*
|
||||
* Pārveido teksta rindu tā, lai teksts nepārsniegtu doto
|
||||
* platumu. Pievieno nākamās rindās atstarpi ar platumu kurā sākas pirmās rindas
|
||||
* teksts.
|
||||
* */
|
||||
std::string wrapLine(std::string text, size_t width) {
|
||||
std::string result;
|
||||
size_t currentLineLength = 0;
|
||||
size_t wordStart = 0;
|
||||
|
||||
|
||||
// Nosaka, cik tālu no rindas sākuma atrodas teksts pirmā rindā.
|
||||
size_t preservedSpaceCount = 0;
|
||||
for (size_t i = 0; i < text.length(); ++i) {
|
||||
if (text[i] == '\t') {
|
||||
@@ -37,13 +43,15 @@ std::string wrapText(std::string text, size_t width) {
|
||||
|
||||
for (size_t i = wordStart; i < text.length(); ++i) {
|
||||
if (text[i] == ' ' || i == text.length() - 1) {
|
||||
size_t wordEnd = (i == text.length() - 1) ? i + 1 : i; // Handle the last word
|
||||
size_t wordLength = wordEnd - wordStart;
|
||||
if (currentLineLength + wordLength > width) {
|
||||
result += '\n';
|
||||
result.append(preservedSpaceCount / TABWIDTH, '\t');
|
||||
result.append(preservedSpaceCount % TABWIDTH, ' ');
|
||||
currentLineLength = preservedSpaceCount;
|
||||
// Ja vārds pārsniedz norādīto platumu, pievieno
|
||||
// jaunās rindas simbolu un turpina no iepriekš noteiktā attāluma.
|
||||
size_t wordEnd = (i == text.length() - 1) ? i + 1 : i;
|
||||
size_t wordLength = wordEnd - wordStart;
|
||||
if (currentLineLength + wordLength > width) {
|
||||
result += '\n';
|
||||
result.append(preservedSpaceCount / TABWIDTH, '\t');
|
||||
result.append(preservedSpaceCount % TABWIDTH, ' ');
|
||||
currentLineLength = preservedSpaceCount;
|
||||
}
|
||||
result += text.substr(wordStart, wordLength) + ' ';
|
||||
currentLineLength += wordLength + 1;
|
||||
@@ -53,6 +61,9 @@ std::string wrapText(std::string text, size_t width) {
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tekstā katram rezervētam tekstvienību simbolam pievieno '\' pirms simbola.
|
||||
*/
|
||||
std::string escapeText(std::string text) {
|
||||
std::stringstream ss;
|
||||
for (auto c: text) {
|
||||
@@ -89,6 +100,10 @@ std::string escapeText(std::string text) {
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
/*
|
||||
* Transpilē tekstu jautājumos un metadatos.
|
||||
* Veic leksisko analīzi un parsēšanu.
|
||||
* */
|
||||
Result<ParseInfo> transpile(std::string fileContent) {
|
||||
start = std::chrono::high_resolution_clock::now();
|
||||
end = std::chrono::high_resolution_clock::now();
|
||||
@@ -125,7 +140,9 @@ Result<ParseInfo> transpile(std::string fileContent) {
|
||||
return {questions};
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Parāda nomērīta laika sekundes un milisekundes.
|
||||
*/
|
||||
std::string showTime(std::string label) {
|
||||
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
|
||||
double_t seconds = (double_t) duration.count() / 1000000;
|
||||
|
||||
Reference in New Issue
Block a user