settingspage.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "settingspage.h"
  2. #include "appevent.h"
  3. #include "qglobal.h"
  4. #include "qjsonobject.h"
  5. #include "qlineedit.h"
  6. #include "qpainter.h"
  7. #include "qspinbox.h"
  8. #include "tmodel.h"
  9. #include "widgets/examsmodel.h"
  10. #include "widgets/pagination.h"
  11. #include <QCheckBox>
  12. #include <QComboBox>
  13. #include <QDialog>
  14. #include <QFileDialog>
  15. #include <QHeaderView>
  16. #include <QLabel>
  17. #include <QLineEdit>
  18. #include <QStatusBar>
  19. #include <QStyledItemDelegate>
  20. #include <QTableView>
  21. #include <QJsonArray>
  22. #include <layoutbuilder.h>
  23. #include "cwf/sqlquery.h"
  24. #include <cwf/constants.h>
  25. #include <cwf/cppwebapplication.h>
  26. #include <cwf/filter.h>
  27. #include <cwf/sqldatabasestorage.h>
  28. #include "teachertr.h"
  29. static CWF::SqlDatabaseStorage storage("QSQLITE", "localhost", "data.db", "", "");
  30. SettingsPage::SettingsPage(QWidget *parent)
  31. : QWidget{parent}
  32. {
  33. examContentDirLineEdit = new QLineEdit;
  34. windowXSpinBox = new QSpinBox;
  35. windowYSpinBox = new QSpinBox;
  36. windowXSpinBox->setRange(0, 3000);
  37. windowYSpinBox->setRange(0, 3000);
  38. examAnswerDirLineEdit = new QLineEdit;
  39. lockMaxTimeSpinBox = new QSpinBox;
  40. lockMaxTimeSpinBox->setRange(0, 999999999);
  41. lockMaxTimeSpinBox->setToolTip(tr("Setting to 0 means unlimited time"));
  42. submitTextEdit = new QLineEdit;
  43. lockTextEdit = new QLineEdit;
  44. // 教师端
  45. answerDirLineEdit = new QLineEdit;
  46. using namespace Layouting;
  47. auto student = Group{title(tr("student configuration")),
  48. Form{
  49. tr("exam content dir:"),
  50. examContentDirLineEdit,
  51. PushButton{text(tr("open dir")), onClicked([this]() {
  52. const QString dir = QFileDialog::getExistingDirectory(
  53. this,
  54. QObject::tr("选择目录"),
  55. "./",
  56. QFileDialog::ShowDirsOnly
  57. | QFileDialog::DontResolveSymlinks);
  58. examContentDirLineEdit->setText(dir);
  59. })},
  60. br,
  61. tr("window x:"),
  62. windowXSpinBox,
  63. tr("window y:"),
  64. windowYSpinBox,
  65. st,
  66. br,
  67. tr("exam answer dir:"),
  68. examAnswerDirLineEdit,
  69. PushButton{text(tr("open dir")), onClicked([this]() {
  70. const QString dir = QFileDialog::getExistingDirectory(
  71. this,
  72. QObject::tr("选择目录"),
  73. "./",
  74. QFileDialog::ShowDirsOnly
  75. | QFileDialog::DontResolveSymlinks);
  76. examAnswerDirLineEdit->setText(dir);
  77. })},
  78. br,
  79. tr("lock max time"),
  80. lockMaxTimeSpinBox,
  81. tr("s"),
  82. br,
  83. tr("submitText"),
  84. submitTextEdit,
  85. br,
  86. tr("lockText"),
  87. lockTextEdit,
  88. }};
  89. auto teacher = Group{title(tr("teacher configuration")),
  90. Form{
  91. tr("answer dir:"),
  92. answerDirLineEdit,
  93. PushButton{text(tr("open dir")), onClicked([this]() {
  94. const QString dir = QFileDialog::getExistingDirectory(
  95. this,
  96. QObject::tr("选择目录"),
  97. "./",
  98. QFileDialog::ShowDirsOnly
  99. | QFileDialog::DontResolveSymlinks);
  100. answerDirLineEdit->setText(dir);
  101. })},
  102. }};
  103. Column{student, teacher}.attachTo(this);
  104. // init config
  105. const QVariant examContentDir = AppEvent::instance()->configValue("examContentDir");
  106. const QVariant windowX = AppEvent::instance()->configValue("windowX");
  107. const QVariant windowY = AppEvent::instance()->configValue("windowY");
  108. const QVariant examAnswerDir = AppEvent::instance()->configValue("examAnswerDir");
  109. const QVariant lockMaxTime = AppEvent::instance()->configValue("lockMaxTime");
  110. const QVariant submitText = AppEvent::instance()->configValue("submitText");
  111. const QVariant lockText = AppEvent::instance()->configValue("lockText");
  112. examContentDirLineEdit->setText(examContentDir.toString());
  113. windowXSpinBox->setValue(windowX.toInt());
  114. windowYSpinBox->setValue(windowY.toInt());
  115. examAnswerDirLineEdit->setText(examAnswerDir.toString());
  116. lockMaxTimeSpinBox->setValue(lockMaxTime.toInt());
  117. submitTextEdit->setText(submitText.toString());
  118. lockTextEdit->setText(lockText.toString());
  119. // 教师端
  120. const QVariant answerDir = AppEvent::instance()->configValue("answerDir");
  121. answerDirLineEdit->setText(answerDir.toString());
  122. // 学生端
  123. connect(examContentDirLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  124. const QString &test = examContentDirLineEdit->text();
  125. AppEvent::instance()->setConfigValue("examContentDir", test);
  126. });
  127. connect(windowXSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [](int value) {
  128. AppEvent::instance()->setConfigValue("windowX", value);
  129. });
  130. connect(windowYSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [](int value) {
  131. AppEvent::instance()->setConfigValue("windowY", value);
  132. });
  133. connect(examAnswerDirLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  134. const QString &test = examAnswerDirLineEdit->text();
  135. AppEvent::instance()->setConfigValue("examAnswerDir", test);
  136. });
  137. connect(lockMaxTimeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [](int value) {
  138. AppEvent::instance()->setConfigValue("lockMaxTime", value);
  139. });
  140. connect(submitTextEdit, &QLineEdit::textChanged, [this](const QString &) {
  141. const QString &test = submitTextEdit->text();
  142. AppEvent::instance()->setConfigValue("submitText", test);
  143. });
  144. connect(lockTextEdit, &QLineEdit::textChanged, [this](const QString &) {
  145. const QString &test = lockTextEdit->text();
  146. AppEvent::instance()->setConfigValue("lockText", test);
  147. });
  148. // 教师端
  149. connect(answerDirLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  150. const QString &test = answerDirLineEdit->text();
  151. AppEvent::instance()->setConfigValue("answerDir", test);
  152. });
  153. }