From 3ecaf255d7e09695ab600a212dc04c77a598eaa8 Mon Sep 17 00:00:00 2001 From: Asuro Date: Sun, 26 Mar 2023 17:29:32 +0200 Subject: [PATCH] timer stuff --- AsuroTool/AsuroTool.cpp | 97 ++++++++++++++++++++++++++++++----------- AsuroTool/Settings.cpp | 6 +-- 2 files changed, 75 insertions(+), 28 deletions(-) diff --git a/AsuroTool/AsuroTool.cpp b/AsuroTool/AsuroTool.cpp index d38ae91..d57423e 100644 --- a/AsuroTool/AsuroTool.cpp +++ b/AsuroTool/AsuroTool.cpp @@ -137,12 +137,13 @@ void draw(DrawData& drawData, ApplicationData& appData) // Timer ImGui::SetNextWindowPos(ImVec2(0, customYCursor)); ImGui::SetNextWindowSize(ImVec2(viewportSize.x / 2.f, 0)); - timerWindow(drawData, appData); + float timerWindowHeight = timerWindow(drawData, appData).y; // Base Stations ImGui::SetNextWindowPos(ImVec2(viewportSize.x / 2.f, customYCursor)); ImGui::SetNextWindowSize(ImVec2(viewportSize.x / 2.f, 0)); - customYCursor += baseStationWindow(appData).y; + float baseStationWindowHeight = baseStationWindow(appData).y; + customYCursor += max(baseStationWindowHeight, timerWindowHeight); customYCursor += panelGap; // Playback Devices @@ -225,6 +226,12 @@ ImVec2 menuBar(DrawData& drawData, ApplicationData& appData) ImGui::Text("display: %.1f ms", drawData.frameTimeDisplay); ImGui::EndMenu(); } + + if (ImGui::BeginMenu("Style")) + { + ImGui::ShowStyleEditor(); + ImGui::EndMenu(); + } if (appData.settings.docked) { @@ -335,12 +342,22 @@ void drawDayLineButton(ApplicationData& appData, ImDrawList* drawList, float lin } } -void formatTime(std::chrono::system_clock::time_point time, char* buffer, size_t bufferSize) +void SetTimerDuration(ApplicationData& appData, int timerEndHours, int timerEndMinutes, tm& timeInfo) { - const time_t tTime = std::chrono::system_clock::to_time_t(time); - tm timeInfo; - localtime_s(&timeInfo, &tTime); - std::strftime(buffer, bufferSize, "%H:%M", &timeInfo); + timeInfo.tm_hour = timerEndHours; + timeInfo.tm_min = timerEndMinutes; + std::chrono::time_point newEndTime = std::chrono::system_clock::from_time_t(mktime(&timeInfo)); + + if (newEndTime < std::chrono::system_clock::now()) + { + newEndTime += std::chrono::days(1); + } + else if (newEndTime > std::chrono::system_clock::now() + std::chrono::days(1)) + { + newEndTime -= std::chrono::days(1); + } + + appData.settings.timerDuration = std::chrono::duration_cast(newEndTime - std::chrono::system_clock::now()).count(); } ImVec2 timerWindow(DrawData& drawData, ApplicationData& appData) @@ -431,8 +448,12 @@ ImVec2 timerWindow(DrawData& drawData, ApplicationData& appData) } ImGui::SameLine(); - ImGui::PushItemWidth(45.f); - if (ImGui::InputFloat("##timer", &timerDisplayMinutes, 0, 0, "%.0fm")) + const char* durationFormatStr = "%.0fm"; + char durationCalcBuffer[32]; + snprintf(durationCalcBuffer, 32, durationFormatStr, timerDisplayMinutes); + + ImGui::PushItemWidth(ImGui::CalcTextSize(durationCalcBuffer).x + ImGui::GetStyle().FramePadding.x * 2.f); + if (ImGui::DragFloat("##timer", &timerDisplayMinutes, .1f, 0.f, 1000.f, durationFormatStr)) { appData.settings.timerDuration = timerDisplayMinutes * 60.f; } @@ -446,31 +467,54 @@ ImVec2 timerWindow(DrawData& drawData, ApplicationData& appData) ImGui::SameLine(); - char timeStr[32]; - std::string timerText; + std::chrono::time_point endTime; + const char* endTimeText; + if (timerData.isTimerActive) { if (timerData.timerHasNotified) { - formatTime(timerData.timerStartTimestamp + std::chrono::seconds((int)appData.settings.timerDuration), timeStr, sizeof(timeStr)); - timerText = std::format("Ended at {}", timeStr); + endTime = timerData.timerStartTimestamp + std::chrono::seconds((int)appData.settings.timerDuration); + endTimeText = "Ended"; } else { - formatTime(appData.timerData.timerStartTimestamp + std::chrono::seconds((int)appData.settings.timerDuration), timeStr, sizeof(timeStr)); - timerText = std::format("Ends at {}", timeStr); + endTime = appData.timerData.timerStartTimestamp + std::chrono::seconds((int)appData.settings.timerDuration); + endTimeText = "Ends"; } } else { - formatTime(std::chrono::system_clock::now() + std::chrono::seconds((int)appData.settings.timerDuration), timeStr, sizeof(timeStr)); - timerText = std::format("Ends at {}", timeStr); + endTime = std::chrono::system_clock::now() + std::chrono::seconds((int)appData.settings.timerDuration); + endTimeText = "Ends"; } - - float availWidth = ImGui::GetContentRegionMax().x - ImGui::GetCursorPosX(); - float textWidth = ImGui::CalcTextSize(timerText.c_str()).x; - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + availWidth - textWidth); - ImGui::Text(timerText.c_str()); + + const float timeDragWidth = 32.f; + float requiredWidth = ImGui::CalcTextSize(endTimeText).x + timeDragWidth * 2.f + ImGui::GetStyle().ItemSpacing.x * 4.f; + float spaceWidth = ImGui::GetContentRegionAvail().x - requiredWidth; + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + spaceWidth); + + const time_t tTime = std::chrono::system_clock::to_time_t(endTime); + tm timeInfo; + localtime_s(&timeInfo, &tTime); + int timerEndHours = timeInfo.tm_hour; + int timerEndMinutes = timeInfo.tm_min; + + ImGui::Text("%s", endTimeText); + ImGui::SameLine(); + ImGui::PushItemWidth(timeDragWidth); + if (ImGui::DragInt("##timerEndHours", &timerEndHours, .1f, 0, 23, "%d", ImGuiInputTextFlags_CharsDecimal)) + { + SetTimerDuration(appData, timerEndHours, timerEndMinutes, timeInfo); + } + ImGui::SameLine(); + ImGui::Text(":"); + ImGui::SameLine(); + if (ImGui::DragInt("##timerEndMinutes", &timerEndMinutes, .2f, 0, 59, "%02d", ImGuiInputTextFlags_CharsDecimal)) + { + SetTimerDuration(appData, timerEndHours, timerEndMinutes, timeInfo); + } + ImGui::PopItemWidth(); } if (ImGui::BeginPopup(SETTINGS_POPUP_NAME)) @@ -574,7 +618,7 @@ ImVec2 checklistWindow(ApplicationData& appData, const char* title) std::erase_if(taskDates, selectedDayMatcher); } } - ImGui::SameLine(); + ImGui::SameLine(0.f, 10.f); if (highlightButton) { @@ -741,7 +785,7 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector& dev ImGui::OpenPopup(SETTINGS_POPUP_NAME); } - if (ImGui::BeginTable("DeviceTable", 4, ImGuiTableFlags_Resizable | ImGuiTableFlags_Borders | ImGuiTableFlags_NoSavedSettings)) + if (ImGui::BeginTable("DeviceTable", 4, ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_NoSavedSettings)) { ImGui::TableSetupColumn("Devices", ImGuiTableColumnFlags_WidthStretch, 3.); ImGui::TableSetupColumn("Volume", ImGuiTableColumnFlags_WidthStretch, 1.); @@ -766,11 +810,14 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector& dev ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(.7, .7, .7, 1.)); } - // Device Name ImGui::TableNextRow(); ImGui::TableNextColumn(); + // Device Name + float yPosTemp = ImGui::GetCursorPosY(); + ImGui::SetCursorPosY(yPosTemp + 4.f); ImGui::Text(dev.name.c_str()); + ImGui::SetCursorPosY(yPosTemp); // Volume ImGui::TableNextColumn(); diff --git a/AsuroTool/Settings.cpp b/AsuroTool/Settings.cpp index 0908598..5d66ede 100644 --- a/AsuroTool/Settings.cpp +++ b/AsuroTool/Settings.cpp @@ -204,8 +204,8 @@ void loadUiStyle() colors[ImGuiCol_CheckMark] = ImVec4(0.98f, 0.61f, 0.26f, 1.00f); colors[ImGuiCol_SliderGrab] = ImVec4(0.88f, 0.38f, 0.24f, 1.00f); colors[ImGuiCol_SliderGrabActive] = ImVec4(0.98f, 0.41f, 0.26f, 1.00f); - colors[ImGuiCol_Button] = ImVec4(0.04f, 0.01f, 0.03f, 0.73f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.28f, 0.14f, 0.23f, 1.00f); + colors[ImGuiCol_Button] = ImVec4(0.21f, 0.11f, 0.17f, 1.00f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.30f, 0.15f, 0.25f, 1.00f); colors[ImGuiCol_ButtonActive] = ImVec4(0.47f, 0.23f, 0.39f, 1.00f); colors[ImGuiCol_Header] = ImVec4(0.46f, 0.19f, 0.12f, 0.67f); colors[ImGuiCol_HeaderHovered] = ImVec4(0.69f, 0.29f, 0.19f, 0.80f); @@ -225,7 +225,7 @@ void loadUiStyle() colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); - colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.25f, 0.10f, 0.10f, 1.00f); colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 1.00f); colors[ImGuiCol_TableBorderLight] = ImVec4(0.23f, 0.23f, 0.25f, 1.00f); colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);