Compare commits

..

2 Commits

Author SHA1 Message Date
Ammerhai 37f54f3dee add icons
add visual feedback when changes were made

#9
2026-05-23 15:07:38 +02:00
Ammerhai 5883f457a3 add localization
keep selected language after closing

#17
2026-05-10 13:30:08 +02:00
6 changed files with 4942 additions and 59 deletions
+6
View File
@@ -32,6 +32,7 @@ target_include_directories(imgui PUBLIC
add_subdirectory(libs/libhydrogen EXCLUDE_FROM_ALL) add_subdirectory(libs/libhydrogen EXCLUDE_FROM_ALL)
add_executable(work-calendar add_executable(work-calendar
src/localization.c
$<$<PLATFORM_ID:Windows>:src/main_win32.cpp> $<$<PLATFORM_ID:Windows>:src/main_win32.cpp>
$<$<PLATFORM_ID:Linux>:src/main_linux.cpp> $<$<PLATFORM_ID:Linux>:src/main_linux.cpp>
) )
@@ -46,3 +47,8 @@ target_link_libraries(work-calendar
glfw glfw
> >
) )
target_compile_definitions(work-calendar
PRIVATE
$<$<PLATFORM_ID:Windows>:_CRT_SECURE_NO_WARNINGS=1>
)
File diff suppressed because it is too large Load Diff
+99
View File
@@ -0,0 +1,99 @@
#include "localization.h"
const char *localized_strings_storage[LANGUAGE_COUNT][LOCALIZED_STRING_COUNT] = {
[L_GERMAN] = {
[LS_LANGUAGE_NAME] = "Deutsch",
[LS_JANUARY] = "Januar",
[LS_FEBRUARY] = "Februar",
[LS_MARCH] = "März",
[LS_APRIL] = "April",
[LS_MAY] = "Mai",
[LS_JUNE] = "Juni",
[LS_JULY] = "Juli",
[LS_AUGUST] = "August",
[LS_SEPTEMBER] = "September",
[LS_OCTOBER] = "Oktober",
[LS_NOVEMBER] = "November",
[LS_DECEMBER] = "Dezember",
[LS_FILE] = "Datei",
[LS_OPEN] = "Öffnen",
[LS_SAVE] = "Speichern",
[LS_SAVE_AS] = "Speichern unter",
[LS_CLOSE_CALENDAR] = "Kalender schließen",
[LS_EXIT] = "Beenden",
[LS_VIEW] = "Ansicht",
[LS_LEGEND] = "Legende",
[LS_LANGUAGE] = "Sprache",
[LS_HELP] = "Hilfe",
[LS_DEMO] = "Demo",
[LS_WIKI] = "Wiki",
[LS_ABOUT] = "Über",
[LS_CALENDAR_WEEK_SHORT] = "KW",
[LS_MONDAY_SHORT] = "Mo",
[LS_TUESDAY_SHORT] = "Di",
[LS_WEDNESDAY_SHORT] = "Mi",
[LS_THURSDAY_SHORT] = "Do",
[LS_FRIDAY_SHORT] = "Fr",
[LS_SATURDAY_SHORT] = "Sa",
[LS_SUNDAY_SHORT] = "So",
[LS_TITLE_ENTER_PASSWORD] = "Passwort eingeben###Save",
[LS_PASSWORD] = "Passwort",
[LS_CONFIRM_PASSWORD] = "Passwort bestätigen",
[LS_OK] = "Ok",
[LS_CANCEL] = "Abbrechen",
[LS_TITLE_OPEN_PASSWORD] = "Passwort eingeben###Open",
[LS_CLOSE] = "Schließen",
[LS_QUESTION_DO_YOU_REALLY_WANT_TO_QUIT] = "Möchten Sie wirklich beenden?",
[LS_YES] = "Ja",
[LS_NO] = "Nein",
},
[L_ENGLISH] = {
[LS_LANGUAGE_NAME] = "English",
[LS_JANUARY] = "January",
[LS_FEBRUARY] = "February",
[LS_MARCH] = "March",
[LS_APRIL] = "April",
[LS_MAY] = "May",
[LS_JUNE] = "June",
[LS_JULY] = "July",
[LS_AUGUST] = "August",
[LS_SEPTEMBER] = "September",
[LS_OCTOBER] = "October",
[LS_NOVEMBER] = "November",
[LS_DECEMBER] = "December",
[LS_FILE] = "File",
[LS_OPEN] = "Open",
[LS_SAVE] = "Save",
[LS_SAVE_AS] = "Save as",
[LS_CLOSE_CALENDAR] = "Close Calendar",
[LS_EXIT] = "Exit",
[LS_VIEW] = "View",
[LS_LEGEND] = "Legend",
[LS_LANGUAGE] = "Language",
[LS_HELP] = "Help",
[LS_DEMO] = "Demo",
[LS_WIKI] = "Wiki",
[LS_ABOUT] = "About",
[LS_CALENDAR_WEEK_SHORT] = "No.",
[LS_MONDAY_SHORT] = "Mo",
[LS_TUESDAY_SHORT] = "Tu",
[LS_WEDNESDAY_SHORT] = "We",
[LS_THURSDAY_SHORT] = "Th",
[LS_FRIDAY_SHORT] = "Fr",
[LS_SATURDAY_SHORT] = "Sa",
[LS_SUNDAY_SHORT] = "Su",
[LS_TITLE_ENTER_PASSWORD] = "Enter Password###Save",
[LS_PASSWORD] = "Password",
[LS_CONFIRM_PASSWORD] = "Confirm Password",
[LS_OK] = "Ok",
[LS_CANCEL] = "Cancel",
[LS_TITLE_OPEN_PASSWORD] = "Enter Password###Open",
[LS_CLOSE] = "Close",
[LS_QUESTION_DO_YOU_REALLY_WANT_TO_QUIT] = "Do you really want to quit?",
[LS_YES] = "Yes",
[LS_NO] = "No",
},
[L_FRENCH] = {
[LS_LANGUAGE_NAME] = "Français",
}
};
+66
View File
@@ -0,0 +1,66 @@
#pragma once
enum Localized_String {
LS_JANUARY,
LS_FEBRUARY,
LS_MARCH,
LS_APRIL,
LS_MAY,
LS_JUNE,
LS_JULY,
LS_AUGUST,
LS_SEPTEMBER,
LS_OCTOBER,
LS_NOVEMBER,
LS_DECEMBER,
LS_LANGUAGE_NAME,
LS_FILE,
LS_OPEN,
LS_SAVE,
LS_SAVE_AS,
LS_CLOSE_CALENDAR,
LS_EXIT,
LS_VIEW,
LS_LEGEND,
LS_LANGUAGE,
LS_HELP,
LS_DEMO,
LS_WIKI,
LS_ABOUT,
LS_CALENDAR_WEEK_SHORT,
LS_MONDAY_SHORT,
LS_TUESDAY_SHORT,
LS_WEDNESDAY_SHORT,
LS_THURSDAY_SHORT,
LS_FRIDAY_SHORT,
LS_SATURDAY_SHORT,
LS_SUNDAY_SHORT,
LS_TITLE_ENTER_PASSWORD,
LS_PASSWORD,
LS_CONFIRM_PASSWORD,
LS_OK,
LS_CANCEL,
LS_TITLE_OPEN_PASSWORD,
LS_CLOSE,
LS_QUESTION_DO_YOU_REALLY_WANT_TO_QUIT,
LS_YES,
LS_NO,
LOCALIZED_STRING_COUNT
};
enum Language {
L_GERMAN,
L_ENGLISH,
L_FRENCH,
LANGUAGE_COUNT
};
#ifdef __cplusplus
extern "C" {
#endif
extern const char *localized_strings_storage[LANGUAGE_COUNT][LOCALIZED_STRING_COUNT];
#ifdef __cplusplus
}
#endif
+139 -55
View File
@@ -4,11 +4,12 @@
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <hydrogen.h> #include <hydrogen.h>
#include <inttypes.h>
#include "localization.h"
#include "inter.h" #include "inter.h"
#include "inter-bold.h" #include "inter-bold.h"
#include "font-awesome-solid.h"
extern bool should_exit; extern bool should_exit;
extern bool show_demo_window; extern bool show_demo_window;
@@ -23,6 +24,7 @@ static int current_day;
//fonts //fonts
static ImFont *inter_regular; static ImFont *inter_regular;
static ImFont *inter_bold; static ImFont *inter_bold;
static ImFont *font_awesome;
char *open_file_dialog(); char *open_file_dialog();
char *save_file_dialog(); char *save_file_dialog();
@@ -78,19 +80,53 @@ static uint8_t derived_key[hydro_secretbox_KEYBYTES];
static char password_input_buffer[256]; static char password_input_buffer[256];
static char password_confirmation_input_buffer[256]; static char password_confirmation_input_buffer[256];
static Language current_language = L_GERMAN;
static Language selected_language = L_GERMAN;
const char *get_localized_string(Localized_String localized_string) {
if(localized_strings_storage[current_language][localized_string]) {
return localized_strings_storage[current_language][localized_string];
}
return localized_strings_storage[L_ENGLISH][localized_string];
}
static Localized_String month_names[] = { LS_JANUARY, LS_FEBRUARY, LS_MARCH, LS_APRIL, LS_MAY, LS_JUNE, LS_JULY, LS_AUGUST, LS_SEPTEMBER, LS_OCTOBER, LS_NOVEMBER, LS_DECEMBER };
static char *save_file_path = NULL;
static const char *wiki_url = "https://gitea.ammerhai.com/Ammerhai/work-calendar/wiki";
void init() { void init() {
hydro_init(); hydro_init();
ImGuiIO &io = ImGui::GetIO(); ImGuiIO &io = ImGui::GetIO();
inter_regular = io.Fonts->AddFontFromMemoryCompressedTTF(inter_compressed_data, inter_compressed_size); inter_regular = io.Fonts->AddFontFromMemoryCompressedTTF(inter_compressed_data, inter_compressed_size);
inter_bold = io.Fonts->AddFontFromMemoryCompressedTTF(inter_bold_compressed_data, inter_bold_compressed_size); inter_bold = io.Fonts->AddFontFromMemoryCompressedTTF(inter_bold_compressed_data, inter_bold_compressed_size);
font_awesome = io.Fonts->AddFontFromMemoryCompressedTTF(font_awesome_solid_compressed_data, font_awesome_solid_compressed_size, 16.0f);
year = get_current_year(); year = get_current_year();
save_file_path = (char *)calloc(1, 1);
ImGuiSettingsHandler settings_handler = {};
settings_handler.TypeName = "Calendar";
settings_handler.TypeHash = ImHashStr("Calendar");
settings_handler.ReadOpenFn = [](ImGuiContext *context, ImGuiSettingsHandler *handler, const char *name) -> void * {
return (void *)-1;
};
settings_handler.ReadLineFn = [](ImGuiContext *context, ImGuiSettingsHandler *handler, void *entry, const char *line) {
if (strncmp(line, "language", sizeof("language") - 1) == 0) {
for (int i = 0; i < LANGUAGE_COUNT; i++) {
if (strncmp(line + sizeof("language"), localized_strings_storage[i][LS_LANGUAGE_NAME], strlen(localized_strings_storage[i][LS_LANGUAGE_NAME])) == 0)
selected_language = (Language)i;
}
}
};
settings_handler.WriteAllFn = [](ImGuiContext *context, ImGuiSettingsHandler *handler, ImGuiTextBuffer *buffer) {
buffer->append("[Calendar][Settings]\n");
buffer->appendf("language=%s\n\n", get_localized_string(LS_LANGUAGE_NAME));
};
ImGui::AddSettingsHandler(&settings_handler);
} }
static char *save_file_path = NULL;
static const char *wiki_url = "https://gitea.ammerhai.com/Ammerhai/work-calendar/wiki";
static const char *month_names[] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
typedef struct Category { typedef struct Category {
bool editing; bool editing;
ImColor color; ImColor color;
@@ -125,6 +161,10 @@ static ImVec4 table_hover_color = ImVec4(0.0f, 0.3f, 0.6f, 0.2f);
static char plaintext_buffer[2 * 1024 * 1024] = {}; static char plaintext_buffer[2 * 1024 * 1024] = {};
static char encrypted_buffer[hydro_secretbox_HEADERBYTES + sizeof(plaintext_buffer)]; static char encrypted_buffer[hydro_secretbox_HEADERBYTES + sizeof(plaintext_buffer)];
static bool unsaved_changes;
static bool last_frame_unsaved_changes;
static char *category_name_before_editing = NULL;
void save(){ void save(){
if (!save_file_path) return; if (!save_file_path) return;
@@ -166,10 +206,11 @@ void save(){
set_window_title(title); set_window_title(title);
free(title); free(title);
unsaved_changes = false;
} }
void load(){ void load(){
FILE *save_file = fopen(save_file_path, "rb"); FILE *save_file = fopen(save_file_path, "rb");
size_t num_bytes = fread(encrypted_buffer, 1, sizeof(encrypted_buffer), save_file); size_t num_bytes = fread(encrypted_buffer, 1, sizeof(encrypted_buffer), save_file);
fclose (save_file); fclose (save_file);
@@ -220,9 +261,26 @@ void load(){
set_window_title(title); set_window_title(title);
free(title); free(title);
unsaved_changes = false;
} }
void per_frame(){ void per_frame(){
current_language = selected_language;
if(last_frame_unsaved_changes != unsaved_changes) {
char *title = (char *)calloc(1, strlen("Work Calendar - ") + strlen(save_file_path) + 2);
memcpy(title, "Work Calendar - ", strlen("Work Calendar - "));
memcpy(title + strlen(title), save_file_path, strlen(save_file_path));
if(unsaved_changes)
memcpy(title + strlen(title), "*", 1);
set_window_title(title);
free(title);
last_frame_unsaved_changes = unsaved_changes;
}
ImGuiStyle &style = ImGui::GetStyle(); ImGuiStyle &style = ImGui::GetStyle();
ImVec2 center = ImGui::GetMainViewport()->GetCenter(); ImVec2 center = ImGui::GetMainViewport()->GetCenter();
@@ -243,12 +301,12 @@ void per_frame(){
ImGui::DockSpaceOverViewport(main_viewport_dock, ImGui::GetMainViewport(), ImGuiDockNodeFlags_NoTabBar); ImGui::DockSpaceOverViewport(main_viewport_dock, ImGui::GetMainViewport(), ImGuiDockNodeFlags_NoTabBar);
ImGuiID close_popup = ImGui::GetID("Close"); ImGuiID close_popup = ImGui::GetID("Close");
ImGuiID save_password_popup = ImGui::GetID("Passwort eingeben##Save"); ImGuiID save_password_popup = ImGui::GetID("###Save");
ImGuiID open_password_popup = ImGui::GetID("Passwort eingeben##Open"); ImGuiID open_password_popup = ImGui::GetID("###Open");
if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMainMenuBar()) {
if (ImGui::BeginMenu("Datei")) { if (ImGui::BeginMenu(get_localized_string(LS_FILE))) {
if (ImGui::MenuItem("Öffnen", "Ctrl + O")) { if (ImGui::MenuItem(get_localized_string(LS_OPEN), "Ctrl + O")) {
char *new_save_file_path = open_file_dialog(); char *new_save_file_path = open_file_dialog();
if (new_save_file_path) { if (new_save_file_path) {
if (save_file_path) free(save_file_path); if (save_file_path) free(save_file_path);
@@ -256,11 +314,11 @@ void per_frame(){
ImGui::OpenPopup(open_password_popup); ImGui::OpenPopup(open_password_popup);
} }
} }
if (ImGui::MenuItem("Speichern", "Ctrl + S", false, !!save_file_path)) { if (ImGui::MenuItem(get_localized_string(LS_SAVE), "Ctrl + S", false, !!save_file_path)) {
save(); save();
} }
if (ImGui::MenuItem("Speichern unter", "Ctrl + Shift + S")) { if (ImGui::MenuItem(get_localized_string(LS_SAVE_AS), "Ctrl + Shift + S")) {
char *new_save_file_path = save_file_dialog(); char *new_save_file_path = save_file_dialog();
if (new_save_file_path) { if (new_save_file_path) {
if (save_file_path) free(save_file_path); if (save_file_path) free(save_file_path);
@@ -271,7 +329,7 @@ void per_frame(){
//TODO //TODO
ImGui::Separator(); ImGui::Separator();
if (ImGui::MenuItem("Kalender Schließen", "Ctrl + X")) { if (ImGui::MenuItem(get_localized_string(LS_CLOSE_CALENDAR), "Ctrl + X")) {
//TODO if calendar is opened warning //TODO if calendar is opened warning
if (save_file_path) free(save_file_path); if (save_file_path) free(save_file_path);
@@ -285,49 +343,57 @@ void per_frame(){
} }
ImGui::Separator(); ImGui::Separator();
if (ImGui::MenuItem("Beenden", NULL)) { if (ImGui::MenuItem(get_localized_string(LS_EXIT), NULL)) {
ImGui::OpenPopup(close_popup); ImGui::OpenPopup(close_popup);
} }
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (ImGui::BeginMenu("Ansicht")) { if (ImGui::BeginMenu(get_localized_string(LS_VIEW))) {
ImGui::MenuItem("Legende", NULL, &legend_visible); ImGui::MenuItem(get_localized_string(LS_LEGEND), NULL, &legend_visible);
if (ImGui::BeginMenu(get_localized_string(LS_LANGUAGE))) {
for (int language = 0; language < LANGUAGE_COUNT; language++) {
if (ImGui::MenuItem(localized_strings_storage[language][LS_LANGUAGE_NAME], NULL, current_language == language))
selected_language = (Language) language;
}
ImGui::EndMenu();
}
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (ImGui::BeginMenu("Hilfe")) { if (ImGui::BeginMenu(get_localized_string(LS_HELP))) {
ImGui::MenuItem("Demo", NULL, &show_demo_window); ImGui::MenuItem(get_localized_string(LS_DEMO), NULL, &show_demo_window);
if (ImGui::MenuItem("Wiki", NULL)) { if (ImGui::MenuItem(get_localized_string(LS_WIKI), NULL)) {
ImGui::GetPlatformIO().Platform_OpenInShellFn(ImGui::GetCurrentContext(), wiki_url); ImGui::GetPlatformIO().Platform_OpenInShellFn(ImGui::GetCurrentContext(), wiki_url);
} }
ImGui::Separator(); ImGui::Separator();
ImGui::MenuItem("Über", NULL); //TODO ImGui::MenuItem(get_localized_string(LS_ABOUT), NULL); //TODO
ImGui::EndMenu(); ImGui::EndMenu();
} }
ImGui::EndMainMenuBar(); ImGui::EndMainMenuBar();
} }
// save calendar file with password modal dialogue
ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
if (ImGui::BeginPopupModal("Passwort eingeben##Save", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { if (ImGui::BeginPopupModal(get_localized_string(LS_TITLE_ENTER_PASSWORD), NULL, ImGuiWindowFlags_AlwaysAutoResize)) {
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
ImGui::AlignTextToFramePadding(); ImGui::AlignTextToFramePadding();
ImGui::Text("Passwort"); ImGui::Text("%s", get_localized_string(LS_PASSWORD));
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetNextItemWidth(-1); ImGui::SetNextItemWidth(-1);
ImGui::InputText("##Passwort", password_input_buffer, sizeof(password_input_buffer), ImGuiInputTextFlags_Password); ImGui::InputText("##Password", password_input_buffer, sizeof(password_input_buffer), ImGuiInputTextFlags_Password);
ImGui::AlignTextToFramePadding(); ImGui::AlignTextToFramePadding();
ImGui::Text("Passwort bestätigen"); ImGui::Text("%s", get_localized_string(LS_CONFIRM_PASSWORD));
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetNextItemWidth(-1); ImGui::SetNextItemWidth(-1);
ImGui::InputText("##Passwort bestätigen", password_confirmation_input_buffer, sizeof(password_confirmation_input_buffer), ImGuiInputTextFlags_Password); ImGui::InputText("##Confirm_Password", password_confirmation_input_buffer, sizeof(password_confirmation_input_buffer), ImGuiInputTextFlags_Password);
ImGui::PopStyleVar(); ImGui::PopStyleVar();
if (ImGui::Button("OK", ImVec2(120, 0))) { if (ImGui::Button(get_localized_string(LS_OK), ImVec2(120, 0))) {
if (hydro_compare((uint8_t *)password_input_buffer, (uint8_t *) password_confirmation_input_buffer, sizeof(password_input_buffer)) == 0) { if (hydro_compare((uint8_t *)password_input_buffer, (uint8_t *) password_confirmation_input_buffer, sizeof(password_input_buffer)) == 0) {
hydro_pwhash_deterministic(derived_key, sizeof derived_key, password_input_buffer, strlen(password_input_buffer), HYDROGEN_CONTEXT, hydro_pwhash_deterministic(derived_key, sizeof derived_key, password_input_buffer, strlen(password_input_buffer), HYDROGEN_CONTEXT,
master_key, HYDROGEN_OPSLIMIT, HYDROGEN_MEMLIMIT, HYDROGEN_THREADS); master_key, HYDROGEN_OPSLIMIT, HYDROGEN_MEMLIMIT, HYDROGEN_THREADS);
@@ -340,7 +406,7 @@ void per_frame(){
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Abbrechen", ImVec2(120, 0))) { if (ImGui::Button(get_localized_string(LS_CANCEL), ImVec2(120, 0))) {
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
hydro_memzero(password_input_buffer, sizeof(password_input_buffer)); hydro_memzero(password_input_buffer, sizeof(password_input_buffer));
hydro_memzero(password_confirmation_input_buffer, sizeof(password_confirmation_input_buffer)); hydro_memzero(password_confirmation_input_buffer, sizeof(password_confirmation_input_buffer));
@@ -349,19 +415,20 @@ void per_frame(){
ImGui::EndPopup(); ImGui::EndPopup();
} }
// open calendar file with password modal dialogue
ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
if (ImGui::BeginPopupModal("Passwort eingeben##Open", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { if (ImGui::BeginPopupModal(get_localized_string(LS_TITLE_OPEN_PASSWORD), NULL, ImGuiWindowFlags_AlwaysAutoResize)) {
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
ImGui::AlignTextToFramePadding(); ImGui::AlignTextToFramePadding();
ImGui::Text("Passwort"); ImGui::Text("%s", get_localized_string(LS_PASSWORD));
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetNextItemWidth(-1); ImGui::SetNextItemWidth(-1);
ImGui::InputText("##Passwort", password_input_buffer, sizeof(password_input_buffer), ImGuiInputTextFlags_Password); ImGui::InputText("##Passwort", password_input_buffer, sizeof(password_input_buffer), ImGuiInputTextFlags_Password);
ImGui::PopStyleVar(); ImGui::PopStyleVar();
if (ImGui::Button("OK", ImVec2(120, 0))) { if (ImGui::Button(get_localized_string(LS_OK), ImVec2(120, 0))) {
hydro_pwhash_deterministic(derived_key, sizeof derived_key, password_input_buffer, strlen(password_input_buffer), HYDROGEN_CONTEXT, hydro_pwhash_deterministic(derived_key, sizeof derived_key, password_input_buffer, strlen(password_input_buffer), HYDROGEN_CONTEXT,
master_key, HYDROGEN_OPSLIMIT, HYDROGEN_MEMLIMIT, HYDROGEN_THREADS); master_key, HYDROGEN_OPSLIMIT, HYDROGEN_MEMLIMIT, HYDROGEN_THREADS);
hydro_memzero(password_input_buffer, sizeof(password_input_buffer)); hydro_memzero(password_input_buffer, sizeof(password_input_buffer));
@@ -371,7 +438,7 @@ void per_frame(){
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Abbrechen", ImVec2(120, 0))) { if (ImGui::Button(get_localized_string(LS_CANCEL), ImVec2(120, 0))) {
if (save_file_path) free(save_file_path); if (save_file_path) free(save_file_path);
save_file_path = NULL; save_file_path = NULL;
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
@@ -381,18 +448,19 @@ void per_frame(){
ImGui::EndPopup(); ImGui::EndPopup();
} }
// close application modal dialogue
ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
if (ImGui::BeginPopupModal("Close", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize)) { if (ImGui::BeginPopupModal(get_localized_string(LS_CLOSE), NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize)) {
ImGui::Text("Möchten Sie wirklich beenden?"); ImGui::Text("%s", get_localized_string(LS_QUESTION_DO_YOU_REALLY_WANT_TO_QUIT));
ImGui::SetItemDefaultFocus(); ImGui::SetItemDefaultFocus();
if (ImGui::Button("Ja", ImVec2(120, 0))) { if (ImGui::Button(get_localized_string(LS_YES), ImVec2(120, 0))) {
should_exit = true; should_exit = true;
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Nein", ImVec2(120, 0))) { if (ImGui::Button(get_localized_string(LS_NO), ImVec2(120, 0))) {
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
} }
@@ -438,7 +506,7 @@ void per_frame(){
if (ImGui::BeginTable("Month", 1, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX)) { if (ImGui::BeginTable("Month", 1, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX)) {
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::TableSetColumnIndex(0);
ImGui::TextAligned(0.5, -FLT_MIN, month_names[month - 1]); ImGui::TextAligned(0.5, -FLT_MIN, get_localized_string(month_names[month - 1]));
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::TableSetColumnIndex(0);
@@ -447,7 +515,7 @@ void per_frame(){
if (ImGui::BeginTable("CalendarWeek", 1, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_Borders)){ if (ImGui::BeginTable("CalendarWeek", 1, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_Borders)){
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::TableSetColumnIndex(0);
ImGui::TextAligned(0.5, -FLT_MIN, "KW"); ImGui::TextAligned(0.5, -FLT_MIN, get_localized_string(LS_CALENDAR_WEEK_SHORT));
for (int day = 1; day <= days_per_month(year, month); day++) { for (int day = 1; day <= days_per_month(year, month); day++) {
int weekday = weekday_from_day(year, month, day); int weekday = weekday_from_day(year, month, day);
@@ -475,13 +543,13 @@ void per_frame(){
if (ImGui::BeginTable("Weekdays", 7, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_Borders)){ if (ImGui::BeginTable("Weekdays", 7, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_Borders)){
ImGui::TableSetupColumn("Mo"); ImGui::TableSetupColumn(get_localized_string(LS_MONDAY_SHORT));
ImGui::TableSetupColumn("Di"); ImGui::TableSetupColumn(get_localized_string(LS_TUESDAY_SHORT));
ImGui::TableSetupColumn("Mi"); ImGui::TableSetupColumn(get_localized_string(LS_WEDNESDAY_SHORT));
ImGui::TableSetupColumn("Do"); ImGui::TableSetupColumn(get_localized_string(LS_THURSDAY_SHORT));
ImGui::TableSetupColumn("Fr"); ImGui::TableSetupColumn(get_localized_string(LS_FRIDAY_SHORT));
ImGui::TableSetupColumn("Sa"); ImGui::TableSetupColumn(get_localized_string(LS_SATURDAY_SHORT));
ImGui::TableSetupColumn("So"); ImGui::TableSetupColumn(get_localized_string(LS_SUNDAY_SHORT));
ImGui::TableHeadersRow(); ImGui::TableHeadersRow();
ImGui::EndTable(); ImGui::EndTable();
@@ -555,6 +623,7 @@ void per_frame(){
//apply selected color to field //apply selected color to field
if (selected_category != -1 && ImGui::IsItemClicked()) { if (selected_category != -1 && ImGui::IsItemClicked()) {
unsaved_changes = true;
for (int i = 0; i < num_categorized_days; i++) { for (int i = 0; i < num_categorized_days; i++) {
if (categorized_days[i].year != year) continue; if (categorized_days[i].year != year) continue;
if (categorized_days[i].month != month) continue; if (categorized_days[i].month != month) continue;
@@ -633,24 +702,34 @@ void per_frame(){
if (category.editing) { if (category.editing) {
ImGui::SetNextItemWidth(-1); ImGui::SetNextItemWidth(-1);
if (ImGui::InputText("##name", category.name, IM_ARRAYSIZE(category.name), ImGuiInputTextFlags_EnterReturnsTrue)) { if (ImGui::InputText("##name", category.name, IM_ARRAYSIZE(category.name), ImGuiInputTextFlags_EnterReturnsTrue)) {
if (strcmp(category_name_before_editing, category.name) != 0) {
unsaved_changes = true;
}
free(category_name_before_editing);
category.editing = false; category.editing = false;
} }
} else { } else {
uint64_t num_days_this_year = 0; ImGui::Text("%s", category.name);
for (size_t j = 0; j < num_categorized_days; j++) {
if (categorized_days[j].category == i && categorized_days[j].year == year) {
num_days_this_year++;
}
}
ImGui::Text("%s (%" PRIu64 ")", category.name, num_days_this_year);
} }
ImGui::TableSetColumnIndex(2); ImGui::TableSetColumnIndex(2);
if (ImGui::Button("e")) ImGui::PushFont(font_awesome);
if (ImGui::Button("\uf304")) {
if(!category.editing) {
category_name_before_editing = _strdup(category.name);
} else {
if (strcmp(category_name_before_editing, category.name) != 0) {
unsaved_changes = true;
}
free(category_name_before_editing);
}
category.editing = !category.editing; category.editing = !category.editing;
}
ImGui::PopFont();
ImGui::TableSetColumnIndex(3); ImGui::TableSetColumnIndex(3);
if (ImGui::Button("d")) { ImGui::PushFont(font_awesome);
if (ImGui::Button("\uf1f8")) {
for (size_t j = 0; j < num_categorized_days; j++) { for (size_t j = 0; j < num_categorized_days; j++) {
// Remove categorized days that have the to be deleted category // Remove categorized days that have the to be deleted category
if (categorized_days[j].category == i) { if (categorized_days[j].category == i) {
@@ -664,17 +743,22 @@ void per_frame(){
// Remove the category // Remove the category
for (size_t j = i; j < num_categories - 1; j++) categories[j] = categories[j + 1]; for (size_t j = i; j < num_categories - 1; j++) categories[j] = categories[j + 1];
num_categories--; num_categories--;
unsaved_changes = true;
} }
ImGui::PopFont();
ImGui::PopID(); ImGui::PopID();
} }
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0); ImGui::TableSetColumnIndex(0);
ImGui::PushFont(font_awesome);
if (ImGui::Button("+")) { if (ImGui::Button("+")) {
categories[num_categories] = {}; categories[num_categories] = {};
num_categories++; num_categories++;
unsaved_changes = true;
} }
ImGui::PopFont();
ImGui::EndTable(); ImGui::EndTable();
} }
Binary file not shown.