#include #include #include #include #include #include using namespace std; // czyszczenie ekranu dla Windows/Linux/Unix/macOS void clear_screen() { #if defined(_WIN32) || defined(_WIN64) system("cls"); #elif defined(__linux__) || defined(__unix__) || defined(__APPLE__) system("clear"); #endif } // znaczniki stanu programu enum class Stan { menu, dodaj_zadanie, dodaj_kategorie, lista, wizualizacja, zakoncz }; enum class Dane { poprawne, bledne }; // klasy class Zadanie { public: string tresc; string data; int dzien, miesiac, rok; bool zakonczone = false; // konstruktor Zadanie() {} Zadanie(string _tresc, string _data) { tresc = _tresc; data = _data; string data_dane = ""; // DD-**-** data_dane = data.substr(0, 2); dzien = stoi(data_dane); // **-MM-** data_dane = data.substr(3, 2); miesiac = stoi(data_dane); // **-**-RR data_dane = data.substr(6, 2); rok = stoi(data_dane); } // metody void zmien_date(string nowa_data) { data = nowa_data; } void odznacz_zadanie() { if (zakonczone) { zakonczone = false; } else { zakonczone = true; } } string zwroc_znacznik() { if (zakonczone) { return "x"; } else { return " "; } } }; class Kategoria: public Zadanie { public: string nazwa; vector kategoria; // konstruktor Kategoria(string _nazwa) { nazwa = _nazwa; } // metody void dodaj_zadanie(Zadanie zadanie) { if (kategoria.size() == 0) { kategoria.push_back(zadanie); } else { // ustawienie zadan uporzadkowanych od najwczesniejszego for (int i = 0; static_cast(i) < kategoria.size(); i++) { if ((zadanie.rok < kategoria[i].rok) || ((zadanie.rok == kategoria[i].rok) && (zadanie.miesiac < kategoria[i].miesiac)) || ((zadanie.rok == kategoria[i].rok) && (zadanie.miesiac == kategoria[i].miesiac) && (zadanie.dzien <= kategoria[i].dzien))) { kategoria.insert(kategoria.begin() + i, zadanie); break; } else if (static_cast(i) == kategoria.size() - 1) { kategoria.push_back(zadanie); break; } } } } void usun_zadanie(int wybor) { kategoria.erase(kategoria.begin() + wybor); } }; // funkcje do obslugi interface'u void wyswietl_menu(Dane dane) { clear_screen(); if (dane == Dane::poprawne) { cout << "Twoja lista zadan To-Do\n\n"; cout << "1: Dodaj nowe zadanie\n"; cout << "2: Dodaj nowa kategorie\n"; cout << "3: Sprawdz liste zadan\n"; cout << "4: Otworz wizualizacje\n"; cout << "5: Zakoncz\n"; cout << "\nCo chcesz wykonac? "; } else if (dane == Dane::bledne) { cout << "Niepoprawna akcja, wprowadz dane ponownie zgodnie z podanymi mozliwosciami [1, 2, 3, 4, 5].\n\n"; cout << "1: Dodaj nowe zadanie\n"; cout << "2: Dodaj nowa kategorie\n"; cout << "3: Sprawdz liste zadan\n"; cout << "4: Otworz wizualizacje\n"; cout << "5: Zakoncz\n"; cout << "\nWykonaj: "; } } void wyswietl_wybor_kategorii(vector katalogi) { clear_screen(); cout << "[0: powrot do menu]\n\n"; for (int i = 0; static_cast(i) < katalogi.size(); i++) { cout << i + 1 << ". " << katalogi[i].nazwa << endl; } cout << "\nDo ktorej kategorii chcesz dodac nowe zadanie? "; } void wyswietl_dodawanie_zadania(vector katalogi, int wybor) { clear_screen(); cout << "[0: powrot do menu]\n\n"; cout << "Dodawanie zadania w kategorii: " << katalogi[wybor].nazwa; } void wyswietl_liste_zadan(vector katalogi) { clear_screen(); cout << "[0: powrot do menu]\n\n"; for (int i = 0; static_cast(i) < katalogi.size(); i++) { cout << "\n\n"; cout << i + 1 << ". " << katalogi[i].nazwa << ":"; for (int j = 0; static_cast(j) < katalogi[i].kategoria.size(); j++) { cout << "\n\t(" << j + 1 << ") [" << katalogi[i].kategoria[j].zwroc_znacznik() << "] " << katalogi[i].kategoria[j].data << "\t" << katalogi[i].kategoria[j].tresc; } } } // zapis do plikow void zapisz_liste_txt(vector katalogi, string plik_txt) { ofstream outFile(plik_txt, ofstream::trunc); if (outFile.is_open()) { outFile << "" << endl; outFile << "" << endl; outFile << "" << endl; outFile << "To-Do" << endl; outFile << "" << endl; outFile << "" << endl; outFile << "" << endl; outFile << "" << endl; outFile << "" << endl; outFile << "
" << endl; outFile << "

Twoja lista zadan To-Do

" << endl; for (int i = 0; static_cast(i) < katalogi.size(); i++) { outFile << "
" << endl; outFile << "

" + katalogi[i].nazwa + "

" << endl; outFile << "
    " << endl; for (int j = 0; static_cast(j) < katalogi[i].kategoria.size(); j++) { string zadanie = ""; zadanie += " " + katalogi[i].kategoria[j].data; zadanie += "  " + katalogi[i].kategoria[j].tresc; if (katalogi[i].kategoria[j].zakonczone) { outFile << "
  • " + zadanie + "
  • " << endl; } else { outFile << "
  • " << zadanie << "
  • " << endl; } } outFile << "
" << endl; outFile << "
" << endl; } outFile << "
" << endl; outFile << "" << endl; outFile << "" << endl; } outFile.close(); } void zapisz_liste_html(vector katalogi, string plik_txt, string plik_html) { ifstream inFile(plik_txt); ofstream outFile(plik_html, ofstream::trunc); string linia; while (getline(inFile, linia)) { outFile << linia; } inFile.close(); outFile.close(); } int main() { Stan stan_programu = Stan::menu; Dane dane = Dane::poprawne; int wybor; Kategoria zadania_podstawowe("Zadania"); // wszystkie katalogi vector katalogi{ zadania_podstawowe }; // glowna petla programu while (stan_programu != Stan::zakoncz) { // menu if (stan_programu == Stan::menu) { // wybor akcji do { wyswietl_menu(dane); cin >> wybor; if (cin.fail() || wybor < 1 || wybor > 5) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); dane = Dane::bledne; } else if (wybor == 1) { stan_programu = Stan::dodaj_zadanie; dane = Dane::poprawne; } else if (wybor == 2) { stan_programu = Stan::dodaj_kategorie; dane = Dane::poprawne; } else if (wybor == 3) { stan_programu = Stan::lista; dane = Dane::poprawne; } else if (wybor == 4) { stan_programu = Stan::wizualizacja; dane = Dane::poprawne; } else if (wybor == 5) { stan_programu = Stan::zakoncz; dane = Dane::poprawne; } } while (dane == Dane::bledne); } // dodaj zadanie else if (stan_programu == Stan::dodaj_zadanie) { // wybor akcji do { wyswietl_wybor_kategorii(katalogi); cin >> wybor; if (cin.fail() || wybor < 0 || static_cast(wybor) > katalogi.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); dane = Dane::bledne; } else if (wybor == 0) { stan_programu = Stan::menu; dane = Dane::poprawne; } else { wyswietl_dodawanie_zadania(katalogi, wybor - 1); string tytul_zadania; string data_zadania; cout << "\n\tTytul: "; getline(cin >> ws, tytul_zadania); cout << "\tDeadline [DD-MM-RR]: "; getline(cin >> ws, data_zadania); Zadanie nowe_zadanie(tytul_zadania, data_zadania); katalogi[wybor - 1].dodaj_zadanie(nowe_zadanie); stan_programu = Stan::menu; dane = Dane::poprawne; } } while (dane == Dane::bledne); } // dodaj kategorie else if (stan_programu == Stan::dodaj_kategorie) { string tytul_kategorii; clear_screen(); cout << "Tytul nowej kategorii: "; getline(cin >> ws, tytul_kategorii); Kategoria nowa_kategoria(tytul_kategorii); katalogi.push_back(nowa_kategoria); stan_programu = Stan::menu; } // lista zadan else if (stan_programu == Stan::lista) { do { wyswietl_liste_zadan(katalogi); cout << "\n\n\n\n\n"; cout << "1: Odznacz zadanie jako (nie)wykonane\n"; cout << "2: Usun zadanie\n"; cout << "3: Usun kategorie (wszystkie zadania)\n"; cout << "4: Zmien date\n"; cout << "5: Pozostaly czas do wykonania zadania\n"; cout << "\nCo chcesz wykonac? "; cin >> wybor; if (cin.fail() || wybor < 0 || wybor > 5) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } // powrot do menu else if (wybor == 0) { stan_programu = Stan::menu; } // znacznik else if (wybor == 1) { int wybor_kategorii; wyswietl_liste_zadan(katalogi); cout << "\n\n\n\n\nZ ktorej kategorii chcesz odznaczyc zadanie? "; cin >> wybor_kategorii; if (cin.fail() || wybor_kategorii < 1 || static_cast(wybor_kategorii) > katalogi.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); continue; } cout << "Ktore zadanie chcesz odznaczyc? "; cin >> wybor; if (cin.fail() || wybor < 1 || static_cast(wybor) > katalogi[wybor_kategorii - 1].kategoria.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } else { if (!katalogi[wybor_kategorii - 1].kategoria.empty()) { katalogi[wybor_kategorii - 1].kategoria[wybor - 1].odznacz_zadanie(); } } } // usun zadanie else if (wybor == 2) { int wybor_kategorii; wyswietl_liste_zadan(katalogi); cout << "\n\n\n\n\nZ ktorej kategorii chcesz usunac zadanie? "; cin >> wybor_kategorii; if (cin.fail() || wybor_kategorii < 1 || static_cast(wybor_kategorii) > katalogi.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); continue; } cout << "Ktore zadanie chcesz usunac? "; cin >> wybor; if (cin.fail() || wybor < 1 || static_cast(wybor) > katalogi[wybor_kategorii - 1].kategoria.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } else { if (!katalogi[wybor_kategorii - 1].kategoria.empty()) { katalogi[wybor_kategorii - 1].usun_zadanie(wybor - 1); } } } // usun kategorie else if (wybor == 3) { int wybor_kategorii; wyswietl_liste_zadan(katalogi); cout << "\n\n\n\n\nKtora kategorie chcesz usunac? "; cin >> wybor_kategorii; if (cin.fail() || wybor_kategorii < 1 || static_cast(wybor_kategorii) > katalogi.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); continue; } else { if (wybor_kategorii == 1) { katalogi[wybor_kategorii - 1].kategoria.clear(); } else { katalogi.erase(katalogi.begin() + wybor_kategorii - 1); } } } // aktualizacja daty else if (wybor == 4) { int wybor_kategorii; wyswietl_liste_zadan(katalogi); cout << "\n\n\n\n\nW ktorej kategorii chcesz zmienic date? "; cin >> wybor_kategorii; if (cin.fail() || wybor_kategorii < 1 || static_cast(wybor_kategorii) > katalogi.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); continue; } cout << "Ktorego zadania date chcesz zmienic? "; cin >> wybor; if (cin.fail() || wybor < 1 || static_cast(wybor) > katalogi[wybor_kategorii - 1].kategoria.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } else { string nowa_data; cout << "Nowa data [DD-MM-RR]: "; getline(cin >> ws, nowa_data); katalogi[wybor_kategorii - 1].kategoria[wybor - 1].zmien_date(nowa_data); } } // Python; obliczanie czasu na wykonanie zadan else if (wybor == 5) { int wybor_kategorii; wyswietl_liste_zadan(katalogi); cout << "\n\n\n\n\nW ktorej kategorii chcesz odczytac pozostaly czas? "; cin >> wybor_kategorii; if (cin.fail() || wybor_kategorii < 1 || static_cast(wybor_kategorii) > katalogi.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); continue; } cout << "Ktore zadanie wybrac? "; cin >> wybor; if (cin.fail() || wybor < 1 || static_cast(wybor) > katalogi[wybor_kategorii - 1].kategoria.size()) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } else { wyswietl_liste_zadan(katalogi); Py_Initialize(); PyObject* my_module = PyImport_ImportModule("python_modules.my_module"); PyErr_Print(); PyObject* oblicz_czas = PyObject_GetAttrString(my_module, "oblicz_czas"); PyObject* args = PyTuple_Pack(1, PyUnicode_FromString(katalogi[wybor_kategorii - 1].kategoria[wybor - 1].data.c_str())); cout << "\n\n\n\n\n"; PyObject* my_result = PyObject_CallObject(oblicz_czas, args); cout << "Powrot: "; cin >> wybor; Py_Finalize(); } } } while (wybor != 0); } // otwarcie wizualizacji else if (stan_programu == Stan::wizualizacja) { zapisz_liste_txt(katalogi, "todo_list.txt"); zapisz_liste_html(katalogi, "todo_list.txt", "todo_list.html"); // Pełna ścieżka do pliku HTML string plik = "todo_list.html"; // Komenda do otwarcia pliku w domyślnej przeglądarce string polecenie = "start \"\" \"" + plik + "\""; // Uruchomienie komendy system(polecenie.c_str()); stan_programu = Stan::menu; } } return 0; }