#include #include #include #include "inter.h" //standard year int year = 2025; int get_current_year(){ time_t t = time(NULL); struct tm tm = *localtime(&t); // tm_year is years since 1900 return year = tm.tm_year + 1900; } bool is_leap_year(int year) { return ((year % 4) == 0 && (year % 100) != 0) || year % 400 == 0; } int weekday_from_day(int year, int month, int day) { int a = (14 - month) / 12; int y = year - a; int m = month + (12 * a) - 2; return (day + y + (y / 4) - (y / 100) + (y / 400) + ((31 * m) / 12) - 1) % 7; } int calendar_week_from_day(int year, int month, int day){ int days_sum[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; int days = days_sum[month - 1]; if(is_leap_year(year) && month > 2) days++; return (10 + days + day - weekday_from_day(year, month, day)) / 7; } int days_per_month(int year, int month){ int days_in_month[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; if (month == 2) { return is_leap_year(year) ? 29 : 28; } return days_in_month[month - 1]; } void init(){ ImGuiIO &io = ImGui::GetIO(); io.Fonts->AddFontFromMemoryCompressedTTF(inter_compressed_data, inter_compressed_size); year = get_current_year(); } static const char* month_names[] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}; void per_frame(){ ImGuiID main_viewport_dock = ImGui::GetID("main_viewport_dock"); if (!ImGui::DockBuilderGetNode(main_viewport_dock)) { ImGui::DockBuilderAddNode (main_viewport_dock, ImGuiDockNodeFlags_DockSpace | ImGuiDockNodeFlags_NoTabBar); ImGui::DockBuilderSetNodePos (main_viewport_dock, ImGui::GetMainViewport()->WorkPos); ImGui::DockBuilderSetNodeSize(main_viewport_dock, ImGui::GetMainViewport()->WorkSize); ImGuiID left_dock = 0; ImGuiID right_dock = ImGui::DockBuilderSplitNode(main_viewport_dock, ImGuiDir_Right, 0.15f, NULL, &left_dock); ImGui::DockBuilderDockWindow("Work Calendar", left_dock); ImGui::DockBuilderDockWindow("Legende", right_dock); ImGui::DockBuilderFinish(main_viewport_dock); } ImGui::DockSpaceOverViewport(main_viewport_dock, ImGui::GetMainViewport(), ImGuiDockNodeFlags_NoTabBar); if (ImGui::Begin("Work Calendar", 0)) { ImGui::PushStyleColor(ImGuiCol_TableHeaderBg, {0,0,0,0}); ImGui::PushStyleColor(ImGuiCol_HeaderHovered, {0,0,0,0}); ImGui::PushStyleColor(ImGuiCol_HeaderActive, {0,0,0,0}); ImGui::BeginGroup(); if (ImGui::ArrowButton("##left", ImGuiDir_Left)) year--; ImGui::SameLine(0, 0); if (ImGui::ArrowButton("##right", ImGuiDir_Right)) year++; ImGui::SameLine(0, 0); ImGui::TextAligned(0.5, -FLT_MIN, "%d", year); ImGui::EndGroup(); for (int month = 1; month <= 12; month++) { ImGui::PushID(month); ImGui::PushStyleColor(ImGuiCol_TableBorderStrong, {0,0,0,0}); ImGui::PushStyleColor(ImGuiCol_TableBorderLight, {0,0,0,0}); if(ImGui::BeginTable("Month", 1, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX)) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); ImGui::TextAligned(0.5, -FLT_MIN, month_names[month - 1]); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); //calendar week table if(ImGui::BeginTable("CalendarWeek", 1, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_Borders)){ ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); ImGui::TextAligned(0.5, -FLT_MIN, "KW"); for (int day = 1; day <= days_per_month(year, month); day++) { int weekday = weekday_from_day(year, month, day); if(weekday == 0 || day == 1){ ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); //if first week has 3 or less days, last week from previous year int calender_week = calendar_week_from_day(year, month, day); if(calender_week == 0) { ImGui::TextAligned(0.5, -FLT_MIN, "%d", 53); } else { ImGui::TextAligned(0.5, -FLT_MIN, "%d", calender_week); } } } ImGui::EndTable(); } ImGui::SameLine(0, 0); ImGui::BeginGroup(); ImGui::PushStyleVarY(ImGuiStyleVar_ItemSpacing, 0); if(ImGui::BeginTable("Weekdays", 7, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_Borders)){ ImGui::TableSetupColumn("Mo"); ImGui::TableSetupColumn("Di"); ImGui::TableSetupColumn("Mi"); ImGui::TableSetupColumn("Do"); ImGui::TableSetupColumn("Fr"); ImGui::TableSetupColumn("Sa"); ImGui::TableSetupColumn("So"); ImGui::TableHeadersRow(); ImGui::EndTable(); } ImGui::PopStyleColor(2); ImGui::PushStyleColor(ImGuiCol_TableBorderStrong, {119/255.0f,119/255.0f,119/255.0f,83/255.0f}); ImGui::PushStyleColor(ImGuiCol_TableBorderLight, {119/255.0f,119/255.0f,119/255.0f,83/255.0f}); //days of month table if(ImGui::BeginTable("Weekdays", 7, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_Borders)) { int offset = weekday_from_day(year, month, 1); for (int day = 1; day <= days_per_month(2025, month); day++) { int weekday = weekday_from_day(year, month, day); if(weekday == 0 || day == 1){ ImGui::TableNextRow(); } ImGui::TableSetColumnIndex(weekday); ImU32 cell_bg_color_workweek = ImGui::GetColorU32(ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color_workweek); //weekend coloring if(weekday == 5){ ImU32 cell_bg_color_sat = ImGui::GetColorU32(ImVec4(0.0f, 0.0f, 0.0f, 0.1f)); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color_sat); } if(weekday == 6){ ImU32 cell_bg_color_sun = ImGui::GetColorU32(ImVec4(0.0f, 0.0f, 0.0f, 0.2f)); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color_sun); } ImGui::TextAligned(0.5, -FLT_MIN, "%d", day); } ImGui::EndTable(); } ImGui::PopStyleColor(2); ImGui::PopStyleVar(); //weekday header table + days of month table ImGui::EndGroup(); //month table ImGui::EndTable(); } if ((month % 4) != 0) ImGui::SameLine(); ImGui::PopID(); } ImGui::PopStyleColor(3); } ImGui::End(); // Legende if (ImGui::Begin("Legende", 0)) { static float col[3] = {}; static bool editing = false; static char name[64] = "color"; if(ImGui::BeginTable("Legend", 4, ImGuiTableFlags_SizingStretchProp)) { ImGui::TableSetupColumn("Color", ImGuiTableColumnFlags_WidthFixed); ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("Edit", ImGuiTableColumnFlags_WidthFixed); ImGui::TableSetupColumn("Delete", ImGuiTableColumnFlags_WidthFixed ); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); //ImGui::ColorPicker3("colortest", col); ImGui::ColorEdit3(name, col, ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoInputs); ImGui::TableSetColumnIndex(1); if (editing) { ImGui::SetNextItemWidth(-1); if(ImGui::InputText("##name", name, IM_ARRAYSIZE(name), ImGuiInputTextFlags_EnterReturnsTrue)) { editing = false; } } else { ImGui::Text("%s", name); } ImGui::TableSetColumnIndex(2); if(ImGui::Button("e")) { editing = true; } //TODO ImGui::TableSetColumnIndex(3); ImGui::Button("d"); ImGui::EndTable(); } } ImGui::End(); }