#include "gameske_funkce.h" #include "memory.h" #include "strings.h" #include #include #include #include #include #include #include #define HEADER_COLOR_PAIR COLOR_RED #define FIELD_NAME_COLOR_PAIR 10 #define INPUT_COLOR_PAIR 11 std::vector editor_easy_allocated; [[nodiscard]] std::string vytvorTrestniOznameni() { current_allocated = &editor_easy_allocated; auto trim = [](const char *str) -> std::string { std::string s(str); if (s.empty()) return s; size_t start = s.find_first_not_of(" \t\n\r\f\v"); if (start == std::string::npos) return ""; size_t end = s.find_last_not_of(" \t\n\r\f\v"); return s.substr(start, end - start + 1); }; curs_set(1); // Minimální velikost terminálu const int MIN_WIDTH = 90; const int MIN_HEIGHT = 28; if (COLS < MIN_WIDTH || LINES < MIN_HEIGHT) { endwin(); throw std::runtime_error(loc_strings->min_terminal_size); } // Nastavení barev start_color(); init_pair(FIELD_NAME_COLOR_PAIR, COLOR_BLACK, COLOR_CYAN); // Popisky init_pair(INPUT_COLOR_PAIR, COLOR_WHITE, COLOR_BLACK); // Vstupní pole // Hlavní okno s rámečkem WINDOW *main_win = newwin(LINES - 4, COLS - 4, 2, 2); box(main_win, 0, 0); wrefresh(main_win); // Okno pro popisky WINDOW *label_win = derwin(main_win, LINES - 8, 30, 1, 1); wbkgd(label_win, COLOR_PAIR(FIELD_NAME_COLOR_PAIR)); // Okno pro vstupní pole WINDOW *field_win = derwin(main_win, LINES - 8, COLS - 38, 1, 32); wbkgd(field_win, COLOR_PAIR(INPUT_COLOR_PAIR)); keypad(field_win, TRUE); // Definice polí struct FieldConfig { const char *label; int height; int width; bool multiline; }; FieldConfig field_configs[] = { {loc_strings->name_of_submiter, 1, 40, false}, {loc_strings->address_of_submiter, 1, 50, false}, {loc_strings->phone_of_submiter, 1, 20, false}, {loc_strings->email_of_submiter, 1, 30, false}, {loc_strings->name_of_recipient, 1, 40, false}, {loc_strings->address_of_recipient, 1, 50, false}, {loc_strings->phone_of_recipient, 1, 20, false}, {loc_strings->email_of_recipient, 1, 30, false}, {loc_strings->place_of_incident, 1, 40, false}, {loc_strings->date_of_incident, 1, 15, false}, {loc_strings->description_of_incident, 4, 60, true}, {loc_strings->evidence_of_incident, 4, 60, true}, {loc_strings->additional_info, 4, 60, true}}; // Vykreslení popisků int label_row = 0; for (const FieldConfig &cfg : field_configs) { mvwprintw(label_win, label_row, 0, "%s", cfg.label); label_row += cfg.height + 1; } wrefresh(label_win); // Vytvoření formuláře std::vector fields; int field_row = 0; for (const FieldConfig &cfg : field_configs) { FIELD *field = new_field(cfg.height, cfg.width, field_row, 0, 0, 0); set_field_back(field, A_UNDERLINE | COLOR_PAIR(INPUT_COLOR_PAIR)); field_opts_off(field, O_AUTOSKIP | O_STATIC); if (cfg.multiline) { field_opts_on(field, O_WRAP); set_max_field(field, 500); } fields.push_back(field); field_row += cfg.height + 1; } fields.push_back(nullptr); FORM *form = new_form(&fields[0]); set_form_win(form, field_win); set_form_sub(form, derwin(field_win, LINES - 10, COLS - 40, 0, 1)); post_form(form); form_driver(form, REQ_FIRST_FIELD); // Hlavička attron(COLOR_PAIR(HEADER_COLOR_PAIR)); mvprintw(0, (COLS - 40) / 2, "%s", loc_strings->cease_and_desist_entry_of_information); mvprintw(1, 2, "%s", loc_strings->enter_all_information_and_press_f10); refresh(); // Hlavní smyčka int ch; bool exit_loop = false; while (!exit_loop && (ch = wgetch(field_win))) { switch (ch) { case KEY_F(10): exit_loop = true; break; case KEY_DOWN: form_driver(form, REQ_NEXT_FIELD); form_driver(form, REQ_END_LINE); break; case KEY_UP: form_driver(form, REQ_PREV_FIELD); form_driver(form, REQ_END_LINE); break; case KEY_LEFT: form_driver(form, REQ_PREV_CHAR); break; case KEY_RIGHT: form_driver(form, REQ_NEXT_CHAR); break; case KEY_BACKSPACE: case 127: form_driver(form, REQ_DEL_PREV); break; case KEY_DC: form_driver(form, REQ_DEL_CHAR); break; case 10: // Enter if (field_configs[current_field(form)->index].multiline) { form_driver(form, REQ_NEW_LINE); } else { form_driver(form, REQ_NEXT_FIELD); } break; case '\t': form_driver(form, REQ_NEXT_FIELD); break; case KEY_BTAB: form_driver(form, REQ_PREV_FIELD); break; default: form_driver(form, ch); break; } // Ruční aktualizace všech oken touchwin(main_win); wrefresh(main_win); wrefresh(label_win); wrefresh(field_win); } // Získání dat form_driver(form, REQ_VALIDATION); std::vector field_values; for (size_t i = 0; i < ARRAY_SIZE(field_configs); i++) { field_values.push_back(trim(field_buffer(fields[i], 0))); } // Úklid unpost_form(form); free_form(form); for (fieldnode *&f : fields) if (f) free_field(f); delwin(label_win); delwin(field_win); delwin(main_win); curs_set(0); clear(); // Aktuální datum std::time_t t = std::time(nullptr); std::tm *now = std::localtime(&t); char date_str[100]; std::strftime(date_str, sizeof(date_str), "%d.%m.%Y", now); auto comp_args = std::make_format_args(field_values[0], // Jméno a příjmení odesílatele field_values[1], // Adresa odesílatele field_values[2], // Telefon odesílatele field_values[3], // Email odesílatele field_values[4], // Jméno a příjmení adresáta field_values[5], // Adresa adresáta field_values[6], // Telefon adresáta field_values[7], // Email adresáta date_str, // Aktuální datum field_values[8], // Místo činu field_values[9], // Datum činu field_values[10], // Popis činu field_values[11], // Důkazy field_values[12], // Další informace field_values[0] // Jméno pro podpis ); std::string complaint = std::vformat(loc_strings->criminal_complaint_template, comp_args); delete_all(&editor_easy_allocated); return complaint; }