This commit is contained in:
parent
0f7719caeb
commit
57d8b13f19
253
src/editor_easy.cpp
Normal file
253
src/editor_easy.cpp
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
#include <form.h>
|
||||||
|
#include <format> // C++20/C++23 feature
|
||||||
|
#include <ncurses.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#define WHITE_ON_BLUE 9
|
||||||
|
#define BLACK_ON_WHITE 10
|
||||||
|
|
||||||
|
[[nodiscard]] std::string vytvorTrestniOznameni() {
|
||||||
|
// Pomocná funkce pro ořezání mezer (ncurses vyplňuje pole mezerami)
|
||||||
|
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);
|
||||||
|
};
|
||||||
|
|
||||||
|
init_pair(WHITE_ON_BLUE, COLOR_WHITE, COLOR_BLUE);
|
||||||
|
init_pair(BLACK_ON_WHITE, COLOR_BLACK, COLOR_WHITE);
|
||||||
|
|
||||||
|
// Velikost terminalu
|
||||||
|
int max_y, max_x;
|
||||||
|
getmaxyx(stdscr, max_y, max_x);
|
||||||
|
|
||||||
|
echo();
|
||||||
|
|
||||||
|
// Nadpis
|
||||||
|
attron(COLOR_PAIR(WHITE_ON_BLUE));
|
||||||
|
mvprintw(0, 0, "TRESTNÍ OZNÁMENÍ - ZADÁNÍ ÚDAJŮ");
|
||||||
|
for (int i = strlen("TRESTNÍ OZNÁMENÍ - ZADÁNÍ ÚDAJŮ"); i < max_x; i++)
|
||||||
|
addch(' ');
|
||||||
|
attroff(COLOR_PAIR(WHITE_ON_BLUE));
|
||||||
|
|
||||||
|
// Vytvoření polí formuláře
|
||||||
|
const int NUM_FIELDS = 10;
|
||||||
|
FIELD *fields[NUM_FIELDS + 1]; // +1 pro NULL terminátor
|
||||||
|
|
||||||
|
// Definice popisků a vlastností polí
|
||||||
|
struct FieldInfo {
|
||||||
|
const char *label;
|
||||||
|
int height;
|
||||||
|
int width;
|
||||||
|
bool multiline;
|
||||||
|
};
|
||||||
|
|
||||||
|
FieldInfo field_info[NUM_FIELDS] = {
|
||||||
|
{"Jméno a příjmení:", 1, 40, false},
|
||||||
|
{"Adresa:", 1, 50, false},
|
||||||
|
{"Telefon:", 1, 20, false},
|
||||||
|
{"Email:", 1, 30, false},
|
||||||
|
{"Místo činu:", 1, 40, false},
|
||||||
|
{"Datum činu (dd.mm.rrrr):", 1, 15, false},
|
||||||
|
{"Popis činu:", 5, 60, true},
|
||||||
|
{"Jméno pachatele (pokud známo):", 1, 40, false},
|
||||||
|
{"Důkazy:", 4, 60, true},
|
||||||
|
{"Další informace:", 3, 60, true}};
|
||||||
|
|
||||||
|
// Vytvoření polí
|
||||||
|
int row = 2;
|
||||||
|
for (int i = 0; i < NUM_FIELDS; i++) {
|
||||||
|
mvprintw(row, 2, "%s", field_info[i].label);
|
||||||
|
|
||||||
|
fields[i] = new_field(field_info[i].height, field_info[i].width, row,
|
||||||
|
30, // Začátek pole po popisku
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
// Nastavení vlastností pole
|
||||||
|
set_field_back(fields[i], A_UNDERLINE);
|
||||||
|
field_opts_off(fields[i], O_AUTOSKIP);
|
||||||
|
|
||||||
|
// Pro víceřádková pole
|
||||||
|
if (field_info[i].multiline) {
|
||||||
|
field_opts_off(fields[i], O_STATIC);
|
||||||
|
field_opts_on(fields[i], O_WRAP);
|
||||||
|
}
|
||||||
|
|
||||||
|
row += field_info[i].height + 1;
|
||||||
|
}
|
||||||
|
fields[NUM_FIELDS] = NULL;
|
||||||
|
|
||||||
|
// Vytvoření formuláře
|
||||||
|
FORM *form = new_form(fields);
|
||||||
|
|
||||||
|
// Vytvoření oken pro formulář
|
||||||
|
WINDOW *win_body = newwin(max_y, max_x, 0, 0);
|
||||||
|
WINDOW *win_form = derwin(win_body, max_y - 5, max_x - 4, 1, 2);
|
||||||
|
|
||||||
|
// Přiřazení oken k formuláři
|
||||||
|
set_form_win(form, win_body);
|
||||||
|
set_form_sub(form, win_form);
|
||||||
|
|
||||||
|
// Zobrazení formuláře
|
||||||
|
post_form(form);
|
||||||
|
|
||||||
|
// Zobrazení instrukcí
|
||||||
|
mvprintw(max_y - 3, 2,
|
||||||
|
"Navigace: šipky - pohyb | Tab - další pole | Enter - nový řádek | "
|
||||||
|
"F10 - uložit");
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
wrefresh(win_body);
|
||||||
|
|
||||||
|
// Zpracování vstupu od uživatele
|
||||||
|
int ch;
|
||||||
|
while ((ch = getch()) != KEY_F(10)) {
|
||||||
|
switch (ch) {
|
||||||
|
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 key
|
||||||
|
case KEY_ENTER: {
|
||||||
|
int idx = field_index(current_field(form));
|
||||||
|
if (field_info[idx].multiline) {
|
||||||
|
form_driver(form, REQ_NEW_LINE);
|
||||||
|
} else {
|
||||||
|
form_driver(form, REQ_NEXT_FIELD);
|
||||||
|
form_driver(form, REQ_END_LINE);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
case '\t':
|
||||||
|
form_driver(form, REQ_NEXT_FIELD);
|
||||||
|
form_driver(form, REQ_END_LINE);
|
||||||
|
break;
|
||||||
|
case KEY_BTAB:
|
||||||
|
form_driver(form, REQ_PREV_FIELD);
|
||||||
|
form_driver(form, REQ_END_LINE);
|
||||||
|
break;
|
||||||
|
case KEY_HOME:
|
||||||
|
form_driver(form, REQ_BEG_LINE);
|
||||||
|
break;
|
||||||
|
case KEY_END:
|
||||||
|
form_driver(form, REQ_END_LINE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
form_driver(form, ch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
wrefresh(win_form);
|
||||||
|
wrefresh(win_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validace před čtením dat (důležité pro získání aktuálních hodnot)[1][5]
|
||||||
|
form_driver(form, REQ_VALIDATION);
|
||||||
|
|
||||||
|
// Sběr dat z formuláře
|
||||||
|
std::vector<std::string> field_values;
|
||||||
|
for (int i = 0; i < NUM_FIELDS; i++) {
|
||||||
|
char *buffer = field_buffer(fields[i], 0);
|
||||||
|
field_values.push_back(trim(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uvolnění prostředků
|
||||||
|
unpost_form(form);
|
||||||
|
free_form(form);
|
||||||
|
for (int i = 0; i < NUM_FIELDS; i++) {
|
||||||
|
free_field(fields[i]);
|
||||||
|
}
|
||||||
|
delwin(win_form);
|
||||||
|
delwin(win_body);
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// Formátování trestního oznámení pomocí std::format (C++20/C++23)
|
||||||
|
std::string complaint =
|
||||||
|
std::format(R"(
|
||||||
|
TRESTNÍ OZNÁMENÍ
|
||||||
|
|
||||||
|
Policie České republiky
|
||||||
|
Krajské ředitelství policie
|
||||||
|
Obvodní oddělení
|
||||||
|
|
||||||
|
V {} dne {}
|
||||||
|
|
||||||
|
Oznamovatel:
|
||||||
|
Jméno a příjmení: {}
|
||||||
|
Adresa: {}
|
||||||
|
Telefon: {}
|
||||||
|
Email: {}
|
||||||
|
|
||||||
|
Věc: Oznámení o skutečnostech nasvědčujících tomu, že byl spáchán trestný čin
|
||||||
|
|
||||||
|
{}
|
||||||
|
|
||||||
|
K trestnému činu došlo dne {} v {}.
|
||||||
|
|
||||||
|
Popis skutku:
|
||||||
|
{}
|
||||||
|
|
||||||
|
Důkazy:
|
||||||
|
{}
|
||||||
|
|
||||||
|
Další informace:
|
||||||
|
{}
|
||||||
|
|
||||||
|
S úctou,
|
||||||
|
|
||||||
|
............................
|
||||||
|
{}
|
||||||
|
(podpis oznamovatele)
|
||||||
|
)",
|
||||||
|
field_values[4], // Místo
|
||||||
|
date_str, // Aktuální datum
|
||||||
|
field_values[0], // Jméno a příjmení
|
||||||
|
field_values[1], // Adresa
|
||||||
|
field_values[2], // Telefon
|
||||||
|
field_values[3], // Email
|
||||||
|
field_values[7].empty()
|
||||||
|
? "Tímto podávám trestní oznámení na neznámého pachatele "
|
||||||
|
"pro podezření ze spáchání trestného činu."
|
||||||
|
: std::format("Tímto podávám trestní oznámení na: {} pro "
|
||||||
|
"podezření ze spáchání trestného činu.",
|
||||||
|
field_values[7]),
|
||||||
|
field_values[5], // Datum činu
|
||||||
|
field_values[4], // Místo činu
|
||||||
|
field_values[6], // Popis činu
|
||||||
|
field_values[8], // Důkazy
|
||||||
|
field_values[9], // Další informace
|
||||||
|
field_values[0] // Jméno pro podpis
|
||||||
|
);
|
||||||
|
noecho();
|
||||||
|
return complaint;
|
||||||
|
}
|
8
src/editor_easy.h
Normal file
8
src/editor_easy.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifndef PARADOCS_EDEA_H_
|
||||||
|
#define PARADOCS_EDEA_H_
|
||||||
|
|
||||||
|
[[nodiscard]] std::string vytvorTrestniOznameni();
|
||||||
|
|
||||||
|
#endif
|
73
src/menu.cpp
73
src/menu.cpp
@ -1,21 +1,22 @@
|
|||||||
#include <curses.h>
|
#include "const.h"
|
||||||
#include <menu.h>
|
#include "cups.h"
|
||||||
#include <ncurses.h>
|
#include "editor_easy.h"
|
||||||
|
#include "gameske_funkce.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "types.h"
|
||||||
#include <clocale>
|
#include <clocale>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "const.h"
|
#include <curses.h>
|
||||||
#include "cups.h"
|
#include <menu.h>
|
||||||
#include "gameske_funkce.h"
|
#include <ncurses.h>
|
||||||
#include "memory.h"
|
|
||||||
#include "types.h"
|
|
||||||
|
|
||||||
std::vector<allocation> main_menu_allocated;
|
std::vector<allocation> main_menu_allocated;
|
||||||
|
|
||||||
const char* choices[] = {"paradox", "kompromis", "Stereotyp", "Žena"};
|
const char *choices[] = {"paradox", "kompromis", "Stereotyp", "Žena"};
|
||||||
const char* date[] = {"2023-10-01", "2023-10-02", "2023-10-03", "2023-10-04"};
|
const char *date[] = {"2023-10-01", "2023-10-02", "2023-10-03", "2023-10-04"};
|
||||||
const char* choices2[] = {"PRINT", "EDIT", "DELETE", "Žena"};
|
const char *choices2[] = {"PRINT", "EDIT", "DELETE", "Žena"};
|
||||||
|
|
||||||
void menu() {
|
void menu() {
|
||||||
current_allocated = &main_menu_allocated;
|
current_allocated = &main_menu_allocated;
|
||||||
@ -25,7 +26,7 @@ void menu() {
|
|||||||
start_color();
|
start_color();
|
||||||
cbreak();
|
cbreak();
|
||||||
noecho();
|
noecho();
|
||||||
curs_set(0); // Makes cursor invisible
|
curs_set(0); // Makes cursor invisible
|
||||||
keypad(stdscr, TRUE);
|
keypad(stdscr, TRUE);
|
||||||
for (uint8_t i = 0; i < 8; i++) {
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
init_pair(i, i, COLOR_BLACK);
|
init_pair(i, i, COLOR_BLACK);
|
||||||
@ -37,7 +38,7 @@ void menu() {
|
|||||||
complete_menu main_menu = {nullptr, nullptr, 0, nullptr};
|
complete_menu main_menu = {nullptr, nullptr, 0, nullptr};
|
||||||
main_menu_allocated.push_back({COMPLETE_MENU_TYPE, &main_menu, 1});
|
main_menu_allocated.push_back({COMPLETE_MENU_TYPE, &main_menu, 1});
|
||||||
|
|
||||||
main_menu.items = new ITEM*[ARRAY_SIZE(choices) + 1];
|
main_menu.items = new ITEM *[ARRAY_SIZE(choices) + 1];
|
||||||
main_menu.items_size = ARRAY_SIZE(choices) + 1;
|
main_menu.items_size = ARRAY_SIZE(choices) + 1;
|
||||||
for (size_t i = 0; i < n_choices; ++i) {
|
for (size_t i = 0; i < n_choices; ++i) {
|
||||||
main_menu.items[i] = new_item(choices[i], date[i]);
|
main_menu.items[i] = new_item(choices[i], date[i]);
|
||||||
@ -74,29 +75,33 @@ void menu() {
|
|||||||
int c;
|
int c;
|
||||||
while ((c = wgetch(main_menu.win)) != KEY_F(1)) {
|
while ((c = wgetch(main_menu.win)) != KEY_F(1)) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case KEY_DOWN:
|
case KEY_DOWN:
|
||||||
menu_driver(main_menu.menu, REQ_DOWN_ITEM);
|
menu_driver(main_menu.menu, REQ_DOWN_ITEM);
|
||||||
break;
|
break;
|
||||||
case KEY_UP:
|
case KEY_UP:
|
||||||
menu_driver(main_menu.menu, REQ_UP_ITEM);
|
menu_driver(main_menu.menu, REQ_UP_ITEM);
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
|
break;
|
||||||
|
case ':':
|
||||||
|
switch (hash_djb2a(spawncmd())) {
|
||||||
|
case "print"_sh:
|
||||||
|
case "p"_sh:
|
||||||
|
// DONT FORGET TO PRINT ACTUAL DOCUMENT
|
||||||
|
printDocument("test");
|
||||||
|
current_allocated = &main_menu_allocated;
|
||||||
break;
|
break;
|
||||||
case ':':
|
case "easy_edit"_sh:
|
||||||
switch (hash_djb2a(spawncmd())) {
|
case "ee"_sh:
|
||||||
case "print"_sh:
|
vytvorTrestniOznameni();
|
||||||
case "p"_sh:
|
break;
|
||||||
// DONT FORGET TO PRINT ACTUAL DOCUMENT
|
default:
|
||||||
printDocument("test");
|
print_in_middle(main_menu.win, 10, 0, 40, "Unknown command",
|
||||||
current_allocated = &main_menu_allocated;
|
COLOR_PAIR(1));
|
||||||
break;
|
break;
|
||||||
default:
|
}
|
||||||
print_in_middle(main_menu.win, 10, 0, 40, "Unknown command",
|
|
||||||
COLOR_PAIR(1));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
wrefresh(main_menu.win);
|
wrefresh(main_menu.win);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user