checklist stuff
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <mmdeviceapi.h>
|
#include "AudioNotificationListener.h"
|
||||||
|
|
||||||
#include <endpointvolume.h>
|
#include <endpointvolume.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "AudioNotificationListener.h"
|
#include <unordered_map>
|
||||||
|
|
||||||
class AudioDevice {
|
class AudioDevice {
|
||||||
public:
|
public:
|
||||||
@@ -44,13 +46,16 @@ public:
|
|||||||
bool autostart = false;
|
bool autostart = false;
|
||||||
bool docked = false;
|
bool docked = false;
|
||||||
bool showDisabledDevices = false;
|
bool showDisabledDevices = false;
|
||||||
|
std::vector<std::string> taskNames = {};
|
||||||
|
std::unordered_map<std::string, std::vector<time_t>> tasks = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
class ApplicationData {
|
class ApplicationData {
|
||||||
public:
|
public:
|
||||||
ApplicationSettings settings = {};
|
ApplicationSettings settings = {};
|
||||||
|
size_t checklistLength = 0;
|
||||||
std::shared_ptr<AudioData> audioData = std::make_shared<AudioData>();
|
std::shared_ptr<AudioData> audioData = std::make_shared<AudioData>();
|
||||||
|
|
||||||
ApplicationData(const ApplicationData&) = delete;
|
//ApplicationData(const ApplicationData&) = delete;
|
||||||
ApplicationData& operator=(const ApplicationData&) = delete;
|
//ApplicationData& operator=(const ApplicationData&) = delete;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -19,8 +19,10 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <format>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
const size_t MAX_FONT_PATH_LENGTH = 2048;
|
#define MAX_FONT_PATH_LENGTH 2048
|
||||||
|
|
||||||
// Globals for use in callbacks
|
// Globals for use in callbacks
|
||||||
DrawData* gDrawData;
|
DrawData* gDrawData;
|
||||||
@@ -44,7 +46,7 @@ int main()
|
|||||||
callbacks.drawFunc = std::bind(draw, std::placeholders::_1, std::ref(applicationData));
|
callbacks.drawFunc = std::bind(draw, std::placeholders::_1, std::ref(applicationData));
|
||||||
callbacks.cleanupFunc = std::bind(cleanup, std::placeholders::_1, std::ref(applicationData));
|
callbacks.cleanupFunc = std::bind(cleanup, std::placeholders::_1, std::ref(applicationData));
|
||||||
|
|
||||||
startImgui(callbacks, "Audio Thingy", 600, 400);
|
startImgui(callbacks, "Audio Thingy", 700, 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init(DrawData& drawData, ApplicationData& appData)
|
void init(DrawData& drawData, ApplicationData& appData)
|
||||||
@@ -70,6 +72,7 @@ void init(DrawData& drawData, ApplicationData& appData)
|
|||||||
ImFontConfig icons_config;
|
ImFontConfig icons_config;
|
||||||
icons_config.MergeMode = true;
|
icons_config.MergeMode = true;
|
||||||
icons_config.PixelSnapH = true;
|
icons_config.PixelSnapH = true;
|
||||||
|
icons_config.GlyphOffset = { 0., 2. };
|
||||||
std::string iconFontPath = std::string(appPathStr);
|
std::string iconFontPath = std::string(appPathStr);
|
||||||
iconFontPath.append("\\remixicon.ttf");
|
iconFontPath.append("\\remixicon.ttf");
|
||||||
io.Fonts->AddFontFromFileTTF(iconFontPath.c_str(), 14.0f, &icons_config, icons_ranges);
|
io.Fonts->AddFontFromFileTTF(iconFontPath.c_str(), 14.0f, &icons_config, icons_ranges);
|
||||||
@@ -96,17 +99,24 @@ void draw(DrawData& drawData, ApplicationData& appData)
|
|||||||
// Menu Bar
|
// Menu Bar
|
||||||
customYCursor += menuBar(drawData, appData).y;
|
customYCursor += menuBar(drawData, appData).y;
|
||||||
|
|
||||||
|
// Checklist
|
||||||
|
ImGui::SetNextWindowPos(ImVec2(0, customYCursor));
|
||||||
|
ImGui::SetNextWindowSize(ImVec2(viewportSize.x, 0));
|
||||||
|
customYCursor += checklistWindow(appData, std::format(" {} Checklist", ICON_CHECK_FILL).c_str()).y;
|
||||||
|
|
||||||
|
customYCursor += 5.;
|
||||||
|
|
||||||
// Playback Devices
|
// Playback Devices
|
||||||
ImGui::SetNextWindowPos(ImVec2(0, customYCursor));
|
ImGui::SetNextWindowPos(ImVec2(0, customYCursor));
|
||||||
ImGui::SetNextWindowSize(ImVec2(viewportSize.x, 0));
|
ImGui::SetNextWindowSize(ImVec2(viewportSize.x, 0));
|
||||||
customYCursor += audioDeviceWindow(appData, appData.audioData->playbackDevices, " \xEE\xB8\x84 Playback").y;
|
customYCursor += audioDeviceWindow(appData, appData.audioData->playbackDevices, std::format(" {} Playback", ICON_HEADPHONE_FILL).c_str()).y;
|
||||||
|
|
||||||
customYCursor += 5.;
|
customYCursor += 5.;
|
||||||
|
|
||||||
// Recording devices
|
// Recording devices
|
||||||
ImGui::SetNextWindowPos(ImVec2(0, customYCursor));
|
ImGui::SetNextWindowPos(ImVec2(0, customYCursor));
|
||||||
ImGui::SetNextWindowSize(ImVec2(viewportSize.x, 0));
|
ImGui::SetNextWindowSize(ImVec2(viewportSize.x, 0));
|
||||||
customYCursor += audioDeviceWindow(appData, appData.audioData->recordingDevices, " \xEE\xBD\x8F Recording").y;
|
customYCursor += audioDeviceWindow(appData, appData.audioData->recordingDevices, std::format(" {} Recording", ICON_MIC_FILL).c_str()).y;
|
||||||
|
|
||||||
// Resize viewport
|
// Resize viewport
|
||||||
drawData.window_size.y = customYCursor;
|
drawData.window_size.y = customYCursor;
|
||||||
@@ -162,13 +172,13 @@ ImVec2 menuBar(DrawData& drawData, ApplicationData& appData)
|
|||||||
{
|
{
|
||||||
ImVec2 availableSpace = ImGui::GetContentRegionAvail();
|
ImVec2 availableSpace = ImGui::GetContentRegionAvail();
|
||||||
ImVec2 cursorPos = ImGui::GetCursorPos();
|
ImVec2 cursorPos = ImGui::GetCursorPos();
|
||||||
ImGui::SetCursorPosX(cursorPos.x + availableSpace.x - 33.);
|
ImGui::SetCursorPosX(cursorPos.x + availableSpace.x - 47.);
|
||||||
|
|
||||||
if (ImGui::SmallButton("-"))
|
if (ImGui::SmallButton(ICON_SUBTRACT_FILL))
|
||||||
{
|
{
|
||||||
glfwIconifyWindow(drawData.window);
|
glfwIconifyWindow(drawData.window);
|
||||||
}
|
}
|
||||||
if (ImGui::SmallButton("x"))
|
if (ImGui::SmallButton(ICON_CLOSE_FILL))
|
||||||
{
|
{
|
||||||
glfwSetWindowShouldClose(drawData.window, GLFW_TRUE);
|
glfwSetWindowShouldClose(drawData.window, GLFW_TRUE);
|
||||||
}
|
}
|
||||||
@@ -206,6 +216,91 @@ bool customButton(const char* id_start, const char* id_end, const char* title, b
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawCheclistDayLines(ApplicationData& appData, ImDrawList* drawList, float lineHeight, time_t day)
|
||||||
|
{
|
||||||
|
auto& tasks = appData.settings.tasks;
|
||||||
|
size_t totalTasks = appData.settings.taskNames.size();
|
||||||
|
size_t count = std::count_if(tasks.begin(), tasks.end(), [&](std::pair<std::string, std::vector<time_t>> t) { return std::any_of(t.second.begin(), t.second.end(), [&](time_t tt) { return tt == day; }); });
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
ImVec2 cursorPos = ImGui::GetCursorScreenPos();
|
||||||
|
drawList->AddLine({ cursorPos.x, cursorPos.y }, { cursorPos.x, cursorPos.y + lineHeight }, ImColor(.4f, .9f, .3f), 3.f);
|
||||||
|
ImGui::SetCursorScreenPos({ cursorPos.x + 5.f, cursorPos.y });
|
||||||
|
}
|
||||||
|
for (int i = 0; i < max(0, totalTasks - count); i++)
|
||||||
|
{
|
||||||
|
ImVec2 cursorPos = ImGui::GetCursorScreenPos();
|
||||||
|
drawList->AddLine({ cursorPos.x, cursorPos.y }, { cursorPos.x, cursorPos.y + lineHeight }, ImColor(.1f, .3f, .05f), 3.f);
|
||||||
|
ImGui::SetCursorScreenPos({ cursorPos.x + 5.f, cursorPos.y });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t getDayStartOf(time_t time)
|
||||||
|
{
|
||||||
|
tm localTime;
|
||||||
|
localtime_s(&localTime, &time);
|
||||||
|
localTime.tm_hour = 0;
|
||||||
|
localTime.tm_min = 0;
|
||||||
|
localTime.tm_sec = 0;
|
||||||
|
return mktime(&localTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImVec2 checklistWindow(ApplicationData& appData, const char* title)
|
||||||
|
{
|
||||||
|
if (ImGui::Begin(title, 0, ImGuiWindowFlags_NoResize))
|
||||||
|
{
|
||||||
|
time_t today = getDayStartOf(std::time(nullptr));
|
||||||
|
ImDrawList* drawList = ImGui::GetWindowDrawList();
|
||||||
|
float lineHeight = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2;
|
||||||
|
|
||||||
|
for (int pastDay = 3; pastDay >= 1; pastDay--)
|
||||||
|
{
|
||||||
|
time_t date = today - (60 * 60 * 24 * pastDay);
|
||||||
|
drawCheclistDayLines(appData, drawList, lineHeight, date);
|
||||||
|
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImVec2 cursorPos = ImGui::GetCursorScreenPos();
|
||||||
|
drawList->AddLine({ cursorPos.x, cursorPos.y - 2.f }, { cursorPos.x, cursorPos.y + lineHeight + 2.f }, IM_COL32_WHITE, 1.f);
|
||||||
|
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 10.f);
|
||||||
|
drawCheclistDayLines(appData, drawList, lineHeight, today);
|
||||||
|
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 10.f);
|
||||||
|
|
||||||
|
auto todayMatcher = [&](time_t t) { return getDayStartOf(t) == today; };
|
||||||
|
|
||||||
|
for (std::string& taskName : appData.settings.taskNames)
|
||||||
|
{
|
||||||
|
if (!appData.settings.tasks.contains(taskName))
|
||||||
|
{
|
||||||
|
appData.settings.tasks.insert({ taskName, std::vector<time_t>{} });
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<time_t>& taskDates = appData.settings.tasks[taskName];
|
||||||
|
bool taskDoneToday = std::any_of(taskDates.begin(), taskDates.end(), todayMatcher);
|
||||||
|
|
||||||
|
if (ImGui::Checkbox(taskName.c_str(), &taskDoneToday))
|
||||||
|
{
|
||||||
|
if (taskDoneToday)
|
||||||
|
{
|
||||||
|
taskDates.push_back(today);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::erase_if(taskDates, todayMatcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImVec2 size = ImGui::GetWindowSize();
|
||||||
|
ImGui::End();
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& deviceList, const char* title)
|
ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& deviceList, const char* title)
|
||||||
{
|
{
|
||||||
if (ImGui::Begin(title, 0, ImGuiWindowFlags_NoResize))
|
if (ImGui::Begin(title, 0, ImGuiWindowFlags_NoResize))
|
||||||
@@ -215,7 +310,6 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& dev
|
|||||||
ImGui::TableSetupColumn("Devices", ImGuiTableColumnFlags_WidthStretch, 3.);
|
ImGui::TableSetupColumn("Devices", ImGuiTableColumnFlags_WidthStretch, 3.);
|
||||||
ImGui::TableSetupColumn("Volume", ImGuiTableColumnFlags_WidthStretch, 1.);
|
ImGui::TableSetupColumn("Volume", ImGuiTableColumnFlags_WidthStretch, 1.);
|
||||||
ImGui::TableSetupColumn("Defaults", ImGuiTableColumnFlags_WidthFixed, 55.);
|
ImGui::TableSetupColumn("Defaults", ImGuiTableColumnFlags_WidthFixed, 55.);
|
||||||
//ImGui::TableSetupColumn("Proc", ImGuiTableColumnFlags_WidthFixed, 30.);
|
|
||||||
ImGui::TableHeadersRow();
|
ImGui::TableHeadersRow();
|
||||||
|
|
||||||
for (auto& dev : deviceList)
|
for (auto& dev : deviceList)
|
||||||
@@ -250,7 +344,7 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& dev
|
|||||||
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
|
||||||
|
|
||||||
bool isDeviceMuted = isMuted(dev.volumeInterface);
|
bool isDeviceMuted = isMuted(dev.volumeInterface);
|
||||||
if (ImGui::Button(isDeviceMuted ? "\xEF\x8A\x9D" : "\xEF\x8A\xA1"))
|
if (ImGui::Button(isDeviceMuted ? ICON_VOLUME_MUTE_FILL : ICON_VOLUME_UP_FILL))
|
||||||
{
|
{
|
||||||
setMuted(dev.volumeInterface, !isDeviceMuted);
|
setMuted(dev.volumeInterface, !isDeviceMuted);
|
||||||
}
|
}
|
||||||
@@ -310,7 +404,7 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& dev
|
|||||||
{
|
{
|
||||||
drawCircle(5, IM_COL32(50, 50, 222, 255));
|
drawCircle(5, IM_COL32(50, 50, 222, 255));
|
||||||
}
|
}
|
||||||
if (customButton("bn_d_", deviceIdUtf8.c_str(), "\xEE\xBE\x82", !dev.isDefaultConsole))
|
if (customButton("bn_d_", deviceIdUtf8.c_str(), ICON_MUSIC_2_FILL, !dev.isDefaultConsole))
|
||||||
{
|
{
|
||||||
setDefaultAudioDevice(*appData.audioData, dev.id.c_str(), ERole::eConsole);
|
setDefaultAudioDevice(*appData.audioData, dev.id.c_str(), ERole::eConsole);
|
||||||
}
|
}
|
||||||
@@ -320,27 +414,12 @@ ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& dev
|
|||||||
{
|
{
|
||||||
drawCircle(5, IM_COL32(222, 50, 50, 255));
|
drawCircle(5, IM_COL32(222, 50, 50, 255));
|
||||||
}
|
}
|
||||||
if (customButton("bn_c_", deviceIdUtf8.c_str(), "\xEE\xBF\xA9", !dev.isDefaultCommunication))
|
if (customButton("bn_c_", deviceIdUtf8.c_str(), ICON_PHONE_FILL, !dev.isDefaultCommunication))
|
||||||
{
|
{
|
||||||
setDefaultAudioDevice(*appData.audioData, dev.id.c_str(), ERole::eCommunications);
|
setDefaultAudioDevice(*appData.audioData, dev.id.c_str(), ERole::eCommunications);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Advanced
|
|
||||||
/*ImGui::TableNextColumn();
|
|
||||||
|
|
||||||
AudioProcessingState procState = getAudioProcessing(dev);
|
|
||||||
bool procChecked = procState == AudioProcessingState::Enabled;
|
|
||||||
|
|
||||||
std::string procCbId("cb_proc_");
|
|
||||||
procCbId.append(deviceIdUtf8.c_str());
|
|
||||||
ImGui::PushID(procCbId.c_str());
|
|
||||||
if (ImGui::Checkbox("", &procChecked))
|
|
||||||
{
|
|
||||||
setAudioProcessing(dev, procChecked);
|
|
||||||
}
|
|
||||||
ImGui::PopID();*/
|
|
||||||
|
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "ImguiBase.h"
|
#include "ImguiBase.h"
|
||||||
#include "ApplicationData.h"
|
#include "ApplicationData.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
void init(DrawData& drawData, ApplicationData& customData);
|
void init(DrawData& drawData, ApplicationData& customData);
|
||||||
void draw(DrawData& drawData, ApplicationData& customData);
|
void draw(DrawData& drawData, ApplicationData& customData);
|
||||||
void cleanup(DrawData& drawData, ApplicationData& appData);
|
void cleanup(DrawData& drawData, ApplicationData& appData);
|
||||||
|
|
||||||
ImVec2 menuBar(DrawData& drawData, ApplicationData& appData);
|
ImVec2 menuBar(DrawData& drawData, ApplicationData& appData);
|
||||||
|
ImVec2 checklistWindow(ApplicationData& appData, const char* title);
|
||||||
ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& deviceList, const char* title);
|
ImVec2 audioDeviceWindow(ApplicationData& appData, std::vector<AudioDevice>& deviceList, const char* title);
|
||||||
void drawCircle(float radius, ImU32 color);
|
void drawCircle(float radius, ImU32 color);
|
||||||
|
|||||||
@@ -93,7 +93,7 @@
|
|||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@@ -131,7 +131,7 @@
|
|||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4305; 4244</DisableSpecificWarnings>
|
||||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
extern bool justDocked;
|
extern bool justDocked;
|
||||||
extern DrawData* gDrawData;
|
extern DrawData* gDrawData;
|
||||||
extern ApplicationData* gAppData;
|
extern ApplicationData* gAppData;
|
||||||
@@ -10,8 +12,8 @@ extern ApplicationData* gAppData;
|
|||||||
void initSettings(DrawData& drawData, ApplicationData& appData)
|
void initSettings(DrawData& drawData, ApplicationData& appData)
|
||||||
{
|
{
|
||||||
ImGuiSettingsHandler ini_handler;
|
ImGuiSettingsHandler ini_handler;
|
||||||
ini_handler.TypeName = "ApplicationSettings";
|
ini_handler.TypeName = APPLICATION_SETTINGS_GROUP;
|
||||||
ini_handler.TypeHash = ImHashStr("ApplicationSettings");
|
ini_handler.TypeHash = ImHashStr(APPLICATION_SETTINGS_GROUP);
|
||||||
ini_handler.ReadOpenFn = settingsReadOpen;
|
ini_handler.ReadOpenFn = settingsReadOpen;
|
||||||
ini_handler.ReadLineFn = settingsReadLine;
|
ini_handler.ReadLineFn = settingsReadLine;
|
||||||
ini_handler.WriteAllFn = settingsWriteAll;
|
ini_handler.WriteAllFn = settingsWriteAll;
|
||||||
@@ -29,6 +31,8 @@ void* settingsReadOpen(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const c
|
|||||||
|
|
||||||
void settingsReadLine(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line)
|
void settingsReadLine(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line)
|
||||||
{
|
{
|
||||||
|
if (strlen(line) == 0) return;
|
||||||
|
|
||||||
ApplicationSettings* settings = (ApplicationSettings*)entry;
|
ApplicationSettings* settings = (ApplicationSettings*)entry;
|
||||||
|
|
||||||
int docked;
|
int docked;
|
||||||
@@ -36,19 +40,54 @@ void settingsReadLine(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* en
|
|||||||
{
|
{
|
||||||
settings->docked = (bool)docked;
|
settings->docked = (bool)docked;
|
||||||
}
|
}
|
||||||
|
|
||||||
int autostart;
|
int autostart;
|
||||||
if (sscanf_s(line, "autostart=%i", &autostart))
|
if (sscanf_s(line, "autostart=%i", &autostart))
|
||||||
{
|
{
|
||||||
settings->autostart = (bool)autostart;
|
settings->autostart = (bool)autostart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string taskName{};
|
||||||
|
taskName.resize(MAX_TASK_NAME_LENGTH);
|
||||||
|
if (sscanf_s(line, "taskname=%s", &taskName[0], MAX_TASK_NAME_LENGTH))
|
||||||
|
{
|
||||||
|
settings->taskNames.push_back(taskName);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string task{};
|
||||||
|
task.resize(MAX_TASK_NAME_LENGTH);
|
||||||
|
time_t dayTimestamp;
|
||||||
|
if (sscanf_s(line, "task=%lld %s", &dayTimestamp, &task[0], MAX_TASK_NAME_LENGTH))
|
||||||
|
{
|
||||||
|
if (settings->tasks.contains(task))
|
||||||
|
{
|
||||||
|
settings->tasks[task].push_back(dayTimestamp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
settings->tasks.insert({ task, std::vector{ dayTimestamp } });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void settingsWriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* outBuf)
|
void settingsWriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* outBuf)
|
||||||
{
|
{
|
||||||
outBuf->appendf("[%s][%s]\n", "ApplicationSettings", "ApplicationSettings");
|
outBuf->appendf("[%s][%s]\n", APPLICATION_SETTINGS_GROUP, APPLICATION_SETTINGS_GROUP);
|
||||||
outBuf->appendf("docked=%i\n", (int)gAppData->settings.docked);
|
outBuf->appendf("docked=%i\n", (int)gAppData->settings.docked);
|
||||||
outBuf->appendf("autostart=%i\n", (int)gAppData->settings.autostart);
|
outBuf->appendf("autostart=%i\n", (int)gAppData->settings.autostart);
|
||||||
outBuf->append("\n");
|
|
||||||
|
for (std::string& taskName : gAppData->settings.taskNames)
|
||||||
|
{
|
||||||
|
outBuf->appendf("taskname=%s\n", taskName.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& task : gAppData->settings.tasks)
|
||||||
|
{
|
||||||
|
for (auto& date : task.second)
|
||||||
|
{
|
||||||
|
outBuf->appendf("task=%lld %s\n", date, task.first.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void applySettings(DrawData& drawData, ApplicationData& appData)
|
void applySettings(DrawData& drawData, ApplicationData& appData)
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
#include <imgui_internal.h>
|
#include <imgui_internal.h>
|
||||||
|
|
||||||
|
#define APPLICATION_SETTINGS_GROUP "ApplicationSettings"
|
||||||
|
#define MAX_TASK_NAME_LENGTH 1024
|
||||||
|
|
||||||
void initSettings(DrawData& drawData, ApplicationData& appData);
|
void initSettings(DrawData& drawData, ApplicationData& appData);
|
||||||
|
|
||||||
void* settingsReadOpen(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name);
|
void* settingsReadOpen(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name);
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
|
#include "remixicon.h"
|
||||||
|
|
||||||
class DrawData {
|
class DrawData {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -202,6 +202,7 @@
|
|||||||
<ClInclude Include="imgui\headers\imstb_rectpack.h" />
|
<ClInclude Include="imgui\headers\imstb_rectpack.h" />
|
||||||
<ClInclude Include="imgui\headers\imstb_textedit.h" />
|
<ClInclude Include="imgui\headers\imstb_textedit.h" />
|
||||||
<ClInclude Include="imgui\headers\imstb_truetype.h" />
|
<ClInclude Include="imgui\headers\imstb_truetype.h" />
|
||||||
|
<ClInclude Include="remixicon.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Font Include="Montserrat-Regular.ttf" />
|
<Font Include="Montserrat-Regular.ttf" />
|
||||||
|
|||||||
@@ -74,6 +74,9 @@
|
|||||||
<ClInclude Include="ImguiBase.h">
|
<ClInclude Include="ImguiBase.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="remixicon.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Font Include="Montserrat-Regular.ttf">
|
<Font Include="Montserrat-Regular.ttf">
|
||||||
|
|||||||
2273
ImguiBase/remixicon.h
Normal file
2273
ImguiBase/remixicon.h
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user