settingspage.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. // 教师端
  43. answerDirLineEdit = new QLineEdit;
  44. using namespace Layouting;
  45. auto student = Group{title(tr("student configuration")),
  46. Form{tr("exam content dir:"),
  47. examContentDirLineEdit,
  48. PushButton{text(tr("open dir")), onClicked([this]() {
  49. const QString dir = QFileDialog::getExistingDirectory(
  50. this,
  51. QObject::tr("选择目录"),
  52. "./",
  53. QFileDialog::ShowDirsOnly
  54. | QFileDialog::DontResolveSymlinks);
  55. examContentDirLineEdit->setText(dir);
  56. })},
  57. br,
  58. tr("window x:"),
  59. windowXSpinBox,
  60. tr("window y:"),
  61. windowYSpinBox,
  62. st,
  63. br,
  64. tr("exam answer dir:"),
  65. examAnswerDirLineEdit,
  66. PushButton{text(tr("open dir")), onClicked([this]() {
  67. const QString dir = QFileDialog::getExistingDirectory(
  68. this,
  69. QObject::tr("选择目录"),
  70. "./",
  71. QFileDialog::ShowDirsOnly
  72. | QFileDialog::DontResolveSymlinks);
  73. examAnswerDirLineEdit->setText(dir);
  74. })},
  75. br,
  76. tr("lock max time"),
  77. lockMaxTimeSpinBox,
  78. tr("s")}};
  79. auto teacher = Group{title(tr("teacher configuration")),
  80. Form{
  81. tr("answer dir:"),
  82. answerDirLineEdit,
  83. PushButton{text(tr("open dir")), onClicked([this]() {
  84. const QString dir = QFileDialog::getExistingDirectory(
  85. this,
  86. QObject::tr("选择目录"),
  87. "./",
  88. QFileDialog::ShowDirsOnly
  89. | QFileDialog::DontResolveSymlinks);
  90. answerDirLineEdit->setText(dir);
  91. })},
  92. }};
  93. Column{student, teacher}.attachTo(this);
  94. // init config
  95. const QVariant examContentDir = AppEvent::instance()->configValue("examContentDir");
  96. const QVariant windowX = AppEvent::instance()->configValue("windowX");
  97. const QVariant windowY = AppEvent::instance()->configValue("windowY");
  98. const QVariant examAnswerDir = AppEvent::instance()->configValue("examAnswerDir");
  99. const QVariant lockMaxTime = AppEvent::instance()->configValue("lockMaxTime");
  100. examContentDirLineEdit->setText(examContentDir.toString());
  101. windowXSpinBox->setValue(windowX.toInt());
  102. windowYSpinBox->setValue(windowY.toInt());
  103. examAnswerDirLineEdit->setText(examAnswerDir.toString());
  104. lockMaxTimeSpinBox->setValue(lockMaxTime.toInt());
  105. // 教师端
  106. const QVariant answerDir = AppEvent::instance()->configValue("answerDir");
  107. answerDirLineEdit->setText(answerDir.toString());
  108. // 学生端
  109. connect(examContentDirLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  110. const QString &test = examContentDirLineEdit->text();
  111. AppEvent::instance()->setConfigValue("examContentDir", test);
  112. });
  113. connect(windowXSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [](int value) {
  114. AppEvent::instance()->setConfigValue("windowX", value);
  115. });
  116. connect(windowYSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [](int value) {
  117. AppEvent::instance()->setConfigValue("windowY", value);
  118. });
  119. connect(examAnswerDirLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  120. const QString &test = examAnswerDirLineEdit->text();
  121. AppEvent::instance()->setConfigValue("examAnswerDir", test);
  122. });
  123. connect(lockMaxTimeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [](int value) {
  124. AppEvent::instance()->setConfigValue("lockMaxTime", value);
  125. });
  126. // 教师端
  127. connect(answerDirLineEdit, &QLineEdit::textChanged, [this](const QString &) {
  128. const QString &test = answerDirLineEdit->text();
  129. AppEvent::instance()->setConfigValue("answerDir", test);
  130. });
  131. }