diff --git a/src/menu.cpp b/src/menu.cpp index f3867fb..a1383a8 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -12,6 +13,7 @@ #include #include #include +#include "color.h" #include "const.h" #include "cups.h" #include "editor_easy.h" @@ -82,6 +84,7 @@ void menu() { } items.push_back(nullptr); main_menu.items = new ITEM*[items.size()]; + main_menu.items_size = items.size() - 1; memcpy(main_menu.items, items.data(), (items.size() * sizeof(ITEM*))); } @@ -168,18 +171,106 @@ void menu() { break; } break; - case 'm': - std::stringstream item_name_ss(item_name(current_item(main_menu.menu))); + case 'm': { + std::stringstream item_desc_ss( + item_description(current_item(main_menu.menu))); std::string name_date[2]; - for (uint8_t i = 0; i < ARRAY_SIZE(name_date); i++) { - std::getline(item_name_ss, name_date[i], ' '); - } + name_date[0] = item_name(current_item(main_menu.menu)); + std::getline(item_desc_ss, name_date[1], ' '); + { + uint8_t n = 0; + size_t indexes[2]; + for (size_t i = 0; (i < main_menu_allocated.size()); i++) { + if (main_menu_allocated[i].ptr == + item_name(current_item(main_menu.menu))) { + delete[] static_cast(main_menu_allocated[i].ptr); + indexes[0] = i; + n++; + } else if (main_menu_allocated[i].ptr == + item_description(current_item(main_menu.menu))) { + delete[] static_cast(main_menu_allocated[i].ptr); + indexes[1] = i; + n++; + } + if (n >= 2) { + break; + } + } + if (indexes[0] > indexes[1]) { + std::swap(indexes[0], indexes[1]); + } + main_menu_allocated.erase(main_menu_allocated.begin() + indexes[1]); + main_menu_allocated.erase(main_menu_allocated.begin() + indexes[0]); + } + { + std::ifstream selected_file(COMPLAINTS_DIR "/" + name_date[0] + '_' + + name_date[1]); + if (!selected_file.is_open()) { + std::clog << selected_file.rdstate() << "\n"; + std::cerr << RED "[ERROR] " RESET << loc_strings->invalid_input + << "\n" + << "File: " + << COMPLAINTS_DIR "/" + name_date[0] + '_' + name_date[1] + << "\n"; + exit(EINVAL); + } + json selected_file_json = json::parse(selected_file); + selected_file.close(); + if (selected_file_json["status"].is_null() || + selected_file_json["status"].get() < STATUS_COUNT) { + + (selected_file_json["status"].get() + 1 >= STATUS_COUNT) + ? selected_file_json["status"] = NOT_SEND + : selected_file_json["status"] = + selected_file_json["status"].get() + 1; + + std::ofstream selected_file(COMPLAINTS_DIR "/" + name_date[0] + + '_' + name_date[1]); + selected_file << selected_file_json; + selected_file.close(); + } else { + std::cerr << RED "[ERROR] " RESET << loc_strings->invalid_input + << "\n"; + exit(EINVAL); + } + + name_date[1].append(" "); + name_date[1].append( + loc_strings->status_strings[selected_file_json["status"] + .get()]); + char* date_status = new char[name_date[1].length() + 1]; + main_menu_allocated.push_back({GENERIC_TYPE, date_status, 1}); + strlcpy(date_status, name_date[1].c_str(), name_date[1].length() + 1); + + char* name = new char[name_date[0].length() + 1]; + main_menu_allocated.push_back({GENERIC_TYPE, name, 1}); + strlcpy(name, name_date[0].c_str(), name_date[0].length() + 1); + + for (size_t i = 0; i < main_menu.items_size; i++) { + if (main_menu.items[i] == current_item(main_menu.menu)) { + free_item(main_menu.items[i]); + main_menu.items[i] = new_item(name, date_status); + break; + } + } + } + WINDOW* old_win_sub = menu_sub(main_menu.menu); + unpost_menu(main_menu.menu); + free_menu(main_menu.menu); + main_menu.menu = new_menu(main_menu.items); + set_menu_win(main_menu.menu, main_menu.win); + set_menu_sub(main_menu.menu, old_win_sub); + set_menu_format(main_menu.menu, 7, 1); + set_menu_mark(main_menu.menu, " * "); + post_menu(main_menu.menu); break; + } } - redrawwin(main_menu.win); wrefresh(main_menu.win); refresh(); + redrawwin(main_menu.win); + wrefresh(main_menu.win); } unpost_menu(main_menu.menu);