mainwindow.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. #include "mainwindow.h"
  2. #include "taskcreator.h"
  3. #include "database.h"
  4. #include "View.h"
  5. #include "DataHelper.h"
  6. #include "QKeyEvent"
  7. #include "QDateTime"
  8. #include "QInputDialog"
  9. #include "QFileDialog"
  10. #include "QAbstractItemView"
  11. #include "QVBoxLayout"
  12. #include "QHBoxLayout"
  13. #include "QPushButton"
  14. #include "QApplication"
  15. #include "QFile"
  16. #include "QDir"
  17. #include "QLabel"
  18. #include "QCheckBox"
  19. #include "QPair"
  20. #include "QMessageBox"
  21. #include "QDebug"
  22. #include "QThread"
  23. MainWindow::MainWindow(QWidget *parent)
  24. : QMainWindow(parent)
  25. {
  26. mainWidget = new QWidget();
  27. mainWidget->setMinimumSize(580, 200);
  28. QLabel l("[ЗАГРУЗКА]");
  29. l.show();
  30. QVBoxLayout *mainGroup = new QVBoxLayout();
  31. editTasks = new QRadioButton("Шаблоны");
  32. editGroups = new QRadioButton("Группы");
  33. editTasks->setChecked(true);
  34. connect(editTasks, &QPushButton::clicked, this, &MainWindow::on_editTasks_clicked);
  35. connect(editGroups, &QPushButton::clicked, this, &MainWindow::on_editGroups_clicked);
  36. QHBoxLayout *rbGroup = new QHBoxLayout;
  37. rbGroup->addWidget(editTasks);
  38. rbGroup->addWidget(editGroups);
  39. mainGroup->addLayout(rbGroup);
  40. treeWidget = new View();
  41. treeWidget->setColumnCount(5);
  42. treeWidget->setHeaderLabels({ "id", "Имя", "Группа", "Таймер", "Статус"});
  43. treeWidget->setDragDropMode(QAbstractItemView::InternalMove);
  44. treeWidget->setAcceptDrops(true);
  45. mainGroup->addWidget(treeWidget);
  46. QPushButton *howToUse = new QPushButton("Работа с программой");
  47. QPushButton *selectTaskDB = new QPushButton("Указать Task.db");
  48. QPushButton *saveChanges = new QPushButton("Сохранить изменения");
  49. QHBoxLayout *hbox = new QHBoxLayout;
  50. hbox->addWidget(howToUse);
  51. hbox->addWidget(selectTaskDB);
  52. hbox->addWidget(saveChanges);
  53. connect(howToUse, &QPushButton::clicked, this, &MainWindow::on_howToUse_clicked);
  54. connect(selectTaskDB, &QPushButton::clicked, this, &MainWindow::on_selectTaskDB_clicked);
  55. connect(saveChanges, &QPushButton::clicked, this, &MainWindow::on_saveChanges_clicked);
  56. mainGroup->addLayout(hbox);
  57. mainWidget->setLayout(mainGroup);
  58. mainWidget->setWindowTitle("mpSorter v" + version);
  59. mainWidget->show();
  60. connect(&colorSelector, &QColorDialog::colorSelected, this, &MainWindow::on_userSelectColor);
  61. connect(treeWidget, &View::create, this, &MainWindow::on_create);
  62. connect(treeWidget, &View::moveUp, this, &MainWindow::on_moveUp);
  63. connect(treeWidget, &View::moveDown, this, &MainWindow::on_moveDown);
  64. connect(treeWidget, &View::duplicate,this, &MainWindow::on_duplicate);
  65. connect(treeWidget, &View::remove, this, &MainWindow::on_remove);
  66. connect(treeWidget, &View::restore, this, &MainWindow::on_restore);
  67. connect(treeWidget, &View::updateId, this, &MainWindow::updateId);
  68. connect(treeWidget, &QTreeWidget::itemDoubleClicked, this, &MainWindow::on_treeWidget_itemDoubleClicked);
  69. connect(&taskCreator, &TaskCreator::sendTaskToParent, this, &MainWindow::getTaskFromChild);
  70. connect(&taskCreator, &TaskCreator::sendGroupToParent, this, &MainWindow::getGroupFromChild);
  71. tasks = new QVector<Task*>;
  72. groups = new QVector<Group*>;
  73. l.close();
  74. }
  75. MainWindow::~MainWindow()
  76. { mainWidget->deleteLater(); }
  77. void MainWindow::on_selectTaskDB_clicked(){
  78. QString sFile = dlg.getOpenFileName();
  79. if(sFile.isNull()) return;
  80. isTaskDbFileSelected = true;
  81. QFileInfo f(sFile);
  82. saveDir = QDir(f.path());
  83. DataBase::init(&sFile);
  84. DataBase::selectGroups(groups);
  85. DataBase::selectTasks(tasks);
  86. if(tasks->count() == 0 || groups->count() == 0)
  87. return;
  88. for(auto &task : *tasks)
  89. task->group->usingCount++;
  90. if(editTasks->isChecked())
  91. showTasks();
  92. else
  93. showGroups();
  94. //--- проверка создан ли соответствующий файл для каждого задания
  95. bool isRemember = false;
  96. bool isRememberNOButton = false;
  97. if(msg == nullptr){
  98. msg = new QMessageBox();
  99. QCheckBox *cb = new QCheckBox("Запомнить выбор");
  100. msg->setText("Проверка наличия файла задания");
  101. msg->setCheckBox(cb);
  102. connect(cb, &QCheckBox::stateChanged, this, [&](int state){
  103. isRemember = state;
  104. });
  105. msg->addButton("Да", QMessageBox::AcceptRole);
  106. no_b = msg->addButton("Нет", QMessageBox::RejectRole);
  107. }
  108. for(auto &task : *tasks){
  109. QFile qf(saveDir.path() + QDir::separator() + "task-model" + QDir::separator() + *task->name + ".txt");
  110. qf.open(QIODevice::ReadOnly);
  111. if(!qf.exists()){
  112. if(isRemember && isRememberNOButton)//Запомнили 'Нет'
  113. { qf.close(); continue; }
  114. if(!isRemember){//Не запомнили 'Да'
  115. msg->setDetailedText("Задание [" + *task->name + "] не имеет соответствующего файла в save/task-model/, создать?");
  116. msg->exec();
  117. if (msg->clickedButton() == no_b) {
  118. if(isRemember)
  119. isRememberNOButton = true;
  120. qf.close(); continue;
  121. }
  122. }
  123. qf.close(); qf.open(QIODevice::WriteOnly);
  124. qf.write("1"); qf.close();
  125. }
  126. }
  127. }
  128. void MainWindow::showTasks(){
  129. treeWidget->clear();
  130. for(auto &task : *tasks)
  131. createTreeTaskItem(task);
  132. }
  133. void MainWindow::showGroups(){
  134. treeWidget->clear();
  135. for(auto &group : *groups)
  136. createTreeGroupItem(group);
  137. }
  138. void MainWindow::on_saveChanges_clicked(){
  139. if(!isTaskDbFileSelected || tasks->count() == 0 || groups->count() == 0)
  140. return;
  141. treeWidget->setEnabled(false);
  142. QString dbFile = saveDir.path() + QDir::separator() + "Task.db";
  143. QFile::copy(dbFile, dbFile + "_old_" + currDateTime());
  144. DataBase::saveTasks(tasks);
  145. DataBase::saveGroups(groups);
  146. if(needToBackUp.count() > 0){//Делаем резервную копию удалённых заданий
  147. QDir bakDir(saveDir.path() + QDir::separator() + "task-model.bak");
  148. if(!bakDir.exists()) bakDir.mkpath(bakDir.path());
  149. for(auto &name : needToBackUp){
  150. QFile qf(saveDir.path() + QDir::separator() + "task-model" + QDir::separator() + name + ".txt");
  151. qf.open(QIODevice::ReadWrite);
  152. qf.rename(saveDir.path() + QDir::separator() + "task-model.bak" + QDir::separator() + name + "-" + currDateTime() + ".txt");
  153. qf.close();
  154. }
  155. needToBackUp.clear();
  156. }
  157. for(auto &task : *tasks){
  158. if(task->isRenamed){//У задания сменилось имя
  159. QFile qf(saveDir.path() + QDir::separator() + "task-model" + QDir::separator() + task->firstName + ".txt");
  160. qf.open(QIODevice::ReadWrite);
  161. qf.rename(saveDir.path() + QDir::separator() + "task-model" + QDir::separator() + *task->name + ".txt");
  162. qf.close();
  163. task->isRenamed = false;
  164. task->firstName = task->name;
  165. }
  166. else if(task->isNeedToCreateFile){//Добавлено новое задание
  167. QFile qf(saveDir.path() + QDir::separator() + "task-model" + QDir::separator() + *task->name + ".txt");
  168. qf.open(QIODevice::WriteOnly);
  169. qf.write("1");
  170. qf.close();
  171. task->isNeedToCreateFile = false;
  172. }
  173. }
  174. treeWidget->setEnabled(true);
  175. }
  176. void MainWindow::on_howToUse_clicked(){
  177. if(!howToUse.isVisible())
  178. howToUse.show();
  179. QApplication::setActiveWindow(&howToUse);
  180. }
  181. void MainWindow::on_create(){
  182. if(!isTaskDbFileSelected){
  183. on_selectTaskDB_clicked();
  184. return;
  185. }
  186. if(!taskCreator.isVisible())
  187. taskCreator.show();
  188. taskCreator.setTaskCreation(editTasks->isChecked(), groups);
  189. QApplication::setActiveWindow(&taskCreator);
  190. }
  191. void MainWindow::on_moveUp(){
  192. QList<QTreeWidgetItem *> items = treeWidget->selectedItems();
  193. if(items.count() == 0) return;
  194. int index = treeWidget->indexOfTopLevelItem(items.first());
  195. if(index == 0)
  196. return;
  197. if(editGroups->isChecked()){
  198. Group *currGroup = groups->at(index);
  199. Group *groupAbove = groups->at(index - 1);
  200. int tmpId = currGroup->id;
  201. currGroup->id = groupAbove->id;
  202. groupAbove->id = tmpId;
  203. groups->swapItemsAt(index, index - 1);
  204. showGroups();
  205. return;
  206. }
  207. tasks->at(index)->id -= 1;
  208. tasks->at(index - 1)->id += 1;
  209. tasks->swapItemsAt(index, index - 1);
  210. QTreeWidgetItem *item = treeWidget->takeTopLevelItem(index - 1);
  211. items.first()->setData(0, 0, tasks->at(index - 1)->id);
  212. item-> setData(0, 0, tasks->at(index)->id);
  213. treeWidget->insertTopLevelItem(index, item);
  214. }
  215. void MainWindow::on_moveDown(){
  216. QList<QTreeWidgetItem *> items = treeWidget->selectedItems();
  217. if(items.count() == 0) return;
  218. int index = treeWidget->indexOfTopLevelItem(items.first());
  219. int rowCount = treeWidget->topLevelItemCount();
  220. if(index == rowCount - 1)
  221. return;
  222. if(editGroups->isChecked()){
  223. Group *currGroup = groups->at(index);
  224. Group *groupBelow = groups->at(index + 1);
  225. int tmpId = currGroup->id;
  226. currGroup->id = groupBelow->id;
  227. groupBelow->id = tmpId;
  228. groups->swapItemsAt(index, index + 1);
  229. showGroups();
  230. return;
  231. }
  232. tasks->at(index)->id += 1;
  233. tasks->at(index + 1)->id -= 1;
  234. tasks->swapItemsAt(index, index + 1);
  235. QTreeWidgetItem *item = treeWidget->takeTopLevelItem(index + 1);
  236. items.first()->setData(0, 0, tasks->at(index + 1)->id);
  237. item-> setData(0, 0, tasks->at(index)->id);
  238. treeWidget->insertTopLevelItem(index, item);
  239. }
  240. void MainWindow::on_duplicate(){
  241. QTreeWidgetItem *item = treeWidget->currentItem();
  242. Task *task = taskById(item->data(0, 0).toInt());
  243. int times = QInputDialog::getInt(this, "Дублирование [" + *task->name + "]", "Укажите число дублей", 1, 1);
  244. tasks->reserve(tasks->count() + times);
  245. if(!saveDir.exists()) saveDir.mkpath(saveDir.path());
  246. QDir taskModel(saveDir.path() + QDir::separator() + "task-model" + QDir::separator());
  247. if(!taskModel.exists()) taskModel.mkpath(taskModel.path());
  248. // bool isRemember = false;
  249. // bool isRememberNOButton = false;
  250. // if(msg1 == nullptr){
  251. // QCheckBox *cb = new QCheckBox("Запомнить выбор");
  252. // msg1 = new QMessageBox();
  253. // msg1->setText("Дублирование [" + *task->name + "]");
  254. // msg1->setCheckBox(cb);
  255. // connect(cb, &QCheckBox::stateChanged, this, [&](int state){
  256. // isRemember = state;
  257. // });
  258. // msg1->addButton("Да", QMessageBox::AcceptRole);
  259. // no_b1 = msg1->addButton("Нет", QMessageBox::RejectRole);
  260. // }
  261. int index = treeWidget->indexOfTopLevelItem(item);
  262. int tasksExist = 0;
  263. for(int i = 1; i <= times; ++i){
  264. QString newName = *task->name + "_" + QString::number(i);
  265. if(isTaskNameExists(&newName)){
  266. // if(isRemember && isRememberNOButton)//Запомнили 'Нет'
  267. // { ++tasksExist; continue; }
  268. // if(!isRemember){//Не запомнили 'Да'
  269. // msg1->setDetailedText("Задание [" + *task->name + "] уже существует, желаете перезаписать?");
  270. // msg1->exec();
  271. // if (msg1->clickedButton() == no_b1) {
  272. // if(isRemember)
  273. // isRememberNOButton = true;
  274. ++tasksExist;
  275. // continue;
  276. // }
  277. // else {}//task->isNeedToCreateFile = true;
  278. // }
  279. }
  280. else{
  281. Task *t = createTask(task->id + i - tasksExist, task->timer, &newName, task->group, task->status);
  282. tasks->insert(index + i - tasksExist, t);
  283. }
  284. }
  285. task->group->usingCount += times - tasksExist;
  286. for(int i = task->id + times - tasksExist; i < tasks->count(); ++i)
  287. tasks->at(i)->id = i + 1;
  288. if(tasksExist != 0)
  289. QMessageBox::information(this, "Дублирование [" + *task->name + "]", "[" + QString::number(tasksExist) + "]" + " заданий не было создано, так как они уже существуют");
  290. showTasks();
  291. }
  292. void MainWindow::on_remove(){
  293. QTreeWidgetItem *item = treeWidget->currentItem();
  294. if(item == nullptr)
  295. return;
  296. int index = treeWidget->indexOfTopLevelItem(item);
  297. if(editTasks->isChecked()){
  298. Task *task = tasks->at(index);
  299. if(task->isRemoveCandidate){
  300. needToBackUp.append(task->name);
  301. task->group->usingCount -= 1;
  302. delete tasks->takeAt(index);
  303. delete treeWidget->takeTopLevelItem(index);
  304. for(int i = index; i < tasks->count(); ++i){
  305. tasks->at(i)->id -= 1;
  306. treeWidget->topLevelItem(i)->setData(0, 0, tasks->at(i)->id);
  307. }
  308. }
  309. else{
  310. task->isRemoveCandidate = true;
  311. item->setBackground(0, Qt::red);
  312. }
  313. }
  314. else if(editGroups->isChecked()){
  315. Group *group = groups->at(index);
  316. if(group->usingCount > 0){
  317. QMessageBox::information(this, "Удаление группы", "Группа используется [" + QString::number(group->usingCount) + "] раз");
  318. return;
  319. }
  320. if(group->isRemoveCandidate){
  321. delete groups->takeAt(index);
  322. delete treeWidget->takeTopLevelItem(index);
  323. }
  324. else{
  325. group->isRemoveCandidate = true;
  326. item->setBackground(0, Qt::red);
  327. }
  328. }
  329. }
  330. void MainWindow::on_restore(){
  331. QTreeWidgetItem *item = treeWidget->currentItem();
  332. if(item == nullptr)
  333. return;
  334. int index = treeWidget->indexOfTopLevelItem(item);
  335. if(editTasks->isChecked()){
  336. tasks->at(index)->isRemoveCandidate = false;
  337. }
  338. else if(editGroups->isChecked()){
  339. groups->at(index)->isRemoveCandidate = false;
  340. }
  341. item->setBackground(0, QBrush());
  342. }
  343. void MainWindow::createTreeTaskItem(Task *task){
  344. QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
  345. item->setData(0, 0, task->id);//id
  346. item->setData(1, 0, *task->name);//Имя
  347. item->setData(2, 0, *task->group->name);
  348. item->setBackground(2, task->group->color);
  349. item->setData(3, 0, task->timer);//Таймер
  350. item->setData(4, 0, task->status ? "ON" : "OFF");//Статус
  351. if(task->isRemoveCandidate)
  352. item->setBackground(0, Qt::red);
  353. item->setFlags(Qt::ItemIsSelectable |
  354. Qt::ItemIsUserCheckable |
  355. Qt::ItemIsEnabled |
  356. Qt::ItemIsDragEnabled );
  357. int rowsCount = treeWidget->topLevelItemCount();
  358. treeWidget->insertTopLevelItem(rowsCount, item);
  359. }
  360. void MainWindow::createTreeGroupItem(Group *group){
  361. QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);
  362. item->setData(0, 0, group->id);//id
  363. item->setData(1, 0, *group->name);//Имя
  364. item->setBackground(2, group->color);
  365. item->setData(3, 0, group->usingCount);
  366. item->setFlags(Qt::ItemIsSelectable |
  367. Qt::ItemIsUserCheckable |
  368. Qt::ItemIsEnabled);
  369. int rowsCount = treeWidget->topLevelItemCount();
  370. treeWidget->insertTopLevelItem(rowsCount, item);
  371. }
  372. Task* MainWindow::taskById(int id){
  373. for(auto &task : *tasks){
  374. if(task->id == id)
  375. return task;
  376. }
  377. return nullptr;
  378. }
  379. Task* MainWindow::taskByName(QString *name){
  380. for(auto &task : *tasks){
  381. if(*task->name == name)
  382. return task;
  383. }
  384. return nullptr;
  385. }
  386. Group* MainWindow::groupById(int id){
  387. for(auto &group : *groups){
  388. if(group->id == id)
  389. return group;
  390. }
  391. return nullptr;
  392. }
  393. Group* MainWindow::groupByName(QString *name){
  394. for(auto &group : *groups){
  395. if(*group->name == name)
  396. return group;
  397. }
  398. return nullptr;
  399. }
  400. bool MainWindow::isTaskNameExists(QString *name){
  401. for(auto &task : *tasks){
  402. if(*task->name == name)
  403. return true;
  404. }
  405. return false;
  406. }
  407. Task* MainWindow::createTask(int id, int timer, QString *name, Group *group, bool status = true){
  408. Task* task = new Task;
  409. task->id = id;
  410. task->timer = timer;
  411. task->name = new QString(*name);
  412. task->firstName = task->name;
  413. task->group = group;
  414. task->status = status;
  415. task->isNeedToCreateFile = true;
  416. return task;
  417. }
  418. Group* MainWindow::createGroup(int id, QString *name, QColor *color){
  419. Group *group = new Group;
  420. group->id = id;
  421. group->name = new QString(*name);
  422. group->color = *color;
  423. return group;
  424. }
  425. QString MainWindow::currDateTime(){
  426. return (QDate::currentDate().toString("dd.MM.yyyy") + "." + QTime::currentTime().toString("hh.mm.s"));
  427. }
  428. void MainWindow::on_editTasks_clicked(){
  429. treeWidget->setColumnCount(5);
  430. treeWidget->setHeaderLabels({ "id", "Имя", "Группа", "Таймер", "Статус"});
  431. if(tasks->count() == 0)
  432. return;
  433. showTasks();
  434. }
  435. void MainWindow::on_editGroups_clicked(){
  436. treeWidget->setColumnCount(4);
  437. treeWidget->setHeaderLabels({ "id", "Имя", "Цвет", "Число использований"});
  438. if(groups->count() == 0)
  439. return;
  440. showGroups();
  441. }
  442. void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column){
  443. if(column == 1){//Два раза кликнули на Имя
  444. QString currentName = item->data(1, 0).toString();
  445. QString *newName = new QString(QInputDialog::getText(this, tr("Имя"), tr("Изменение имени"), QLineEdit::Normal, currentName));
  446. if(newName->length() > 0 && newName != currentName){
  447. if(isTaskNameExists(newName)){
  448. QMessageBox::information(this, "Изменение имени", "Имя уже используется");
  449. delete newName; return;
  450. }
  451. if(editTasks->isChecked()){
  452. if(needToBackUp.contains(newName)){
  453. auto answer = QMessageBox::information(this, "Изменение имени", "Обнаружено совпадение с заданием требующим сохранение. Выполнить сохранение?", QMessageBox::Yes|QMessageBox::No);
  454. if(answer == QMessageBox::Yes)
  455. on_saveChanges_clicked();
  456. else { delete newName; return; }
  457. }
  458. int index = treeWidget->indexOfTopLevelItem(item);
  459. tasks->at(index)->rename(newName);
  460. }
  461. else{
  462. if(groupByName(newName) != nullptr){
  463. QMessageBox::information(this, "Изменение имени", "Имя уже используется");
  464. delete newName; return;
  465. }
  466. groupById(item->data(0, 0).toInt())->name = newName;
  467. }
  468. item->setData(column, 0, *newName);
  469. }
  470. else delete newName;
  471. }
  472. else if(column == 2){//Два раза кликнули на Group или Color
  473. if(editTasks->isChecked()){
  474. Task *task = taskById(item->data(0, 0).toInt());
  475. QVector<QString> names(groups->count());
  476. for(auto &group : *groups)
  477. names.append(*group->name);
  478. QString selItem = QInputDialog::getItem(this, "Группа", "Изменение группы задания", names.toList(), names.indexOf(*task->group->name), false);
  479. Group *selectedGroup = groupByName(&selItem);
  480. if(task->group != selectedGroup){
  481. task->group->usingCount--;
  482. selectedGroup->usingCount++;
  483. task->group = selectedGroup;
  484. item->setData(column, 0, *selectedGroup->name);//Группа
  485. item->setBackground(column, selectedGroup->color);
  486. }
  487. }
  488. else{//выбранна группа и нажали на Color
  489. int id = item->data(0, 0).toInt();
  490. colorSelector.setCurrentColor(groupById(id)->color);
  491. colorSelector.show();
  492. }
  493. }
  494. else if(column == 3){//Два раза кликнули на Timer
  495. if(!editTasks->isChecked())
  496. return;
  497. int currentTimer = item->data(column, 0).toInt();
  498. int newTimer = QInputDialog::getInt(this, "Таймер", "Изменение таймера задания", currentTimer, 1);
  499. if(newTimer != currentTimer){
  500. int index = treeWidget->indexOfTopLevelItem(item);
  501. tasks->at(index)->timer = newTimer;
  502. item->setData(column, 0, newTimer);
  503. }
  504. }
  505. else if(column == 4 && editTasks->isChecked()){//Два раза кликнули на Статус
  506. int index = treeWidget->indexOfTopLevelItem(item);
  507. Task *task = tasks->at(index);
  508. task->status = !task->status;
  509. item->setData(4, 0, tasks->at(index)->status ? "ON" : "OFF");
  510. }
  511. }
  512. void MainWindow::on_userSelectColor(const QColor &color){
  513. QTreeWidgetItem *item = treeWidget->currentItem();
  514. int id = item->data(0, 0).toInt();
  515. groupById(id)->color = color;
  516. item->setBackground(2, color);
  517. }
  518. void MainWindow::updateId(const QPoint *point) {
  519. QTreeWidgetItem *item = treeWidget->itemAt(*point);
  520. int movedTo;
  521. if(item == nullptr){
  522. item = treeWidget->currentItem();
  523. movedTo = treeWidget->topLevelItemCount() - 1;
  524. }
  525. else movedTo = treeWidget->indexOfTopLevelItem(item);
  526. Task *t = tasks->takeAt(item->data(0, 0).toInt() - 1);
  527. tasks->insert(movedTo, t);
  528. for(int i = item->data(0, 0).toInt() - 1; i < tasks->count(); ++i){
  529. tasks->at(i)->id = i + 1;
  530. }
  531. showTasks();
  532. }
  533. void MainWindow::getTaskFromChild(QString *name, int groupId, int timer, int times){
  534. if(needToBackUp.contains(name)){
  535. auto answer = QMessageBox::information(this, "Добавление задания", "Имя совпало с заданием требующим сохранения. Выполнить сохранение?", QMessageBox::Yes|QMessageBox::No);
  536. if(answer == QMessageBox::Yes)
  537. on_saveChanges_clicked();
  538. else return;
  539. }
  540. if(tasks->capacity() < tasks->count() + times){
  541. tasks->reserve(tasks->count() + times);
  542. }
  543. int lasTaskId = tasks->count() ? tasks->last()->id : 1;
  544. Group *group = groupById(groupId);
  545. if(group == nullptr) return;
  546. if(times == 1){
  547. if(isTaskNameExists(name)){
  548. QMessageBox::information(this, "Добавление задания", "Имя уже используется");
  549. return;
  550. }
  551. Task *task = createTask(++lasTaskId, timer, name, group);
  552. tasks->append(task);
  553. createTreeTaskItem(task);
  554. }
  555. else{
  556. QVector<QString*> validNames(times);
  557. for(int i = 1; i <= times; ++i)
  558. validNames[i - 1] = new QString(*name + "_" + QString::number(i));
  559. int badNames = 0;
  560. for(auto &task : *tasks){
  561. if(task->name->contains('_')){
  562. for(int i = 0; i < validNames.count(); ++i){
  563. if(*task->name == validNames.at(i)){
  564. delete validNames.takeAt(i);
  565. ++badNames;
  566. break;
  567. }
  568. }
  569. }
  570. if(validNames.count() == 0) return;
  571. }
  572. for(auto &tname : validNames){
  573. Task *tnew = createTask(++lasTaskId, timer, tname, group);
  574. tasks->append(tnew);
  575. createTreeTaskItem(tnew);
  576. }
  577. group->usingCount += validNames.count();
  578. if(badNames != 0)
  579. QMessageBox::information(this, "Добавление задания", "[" + QString::number(badNames) + "] заданий не было создано, такак как имена совпали с существующими дублями");
  580. }
  581. }
  582. void MainWindow::getGroupFromChild(QString *name, QColor *color){
  583. if(groupByName(name) != nullptr){
  584. QMessageBox::information(this, "Добавление группы", "Имя уже используется");
  585. return;
  586. }
  587. int lastGroupId = groups->count() ? groups->last()->id : 1;
  588. Group *group = createGroup(lastGroupId + 1, name, color);
  589. groups->append(group);
  590. createTreeGroupItem(group);
  591. }