diff --git a/.gitmodules b/.gitmodules index 5fbd823..7fdb1b0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "external/selenite"] path = external/selenite url = https://codeberg.org/vyn/selenite.git +[submodule "external/evalyte-cpp-common"] + path = external/evalyte-cpp-common + url = https://codeberg.org/vyn/evalyte-cpp-common.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 4474499..a5fbf1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,6 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_COMPILE_WARNING_AS_ERROR ON) set(CMAKE_BUILD_RPATH_USE_ORIGIN ON) -add_subdirectory(external/slint) # -- Slint setup #find_package(Slint QUIET) #if (NOT Slint_FOUND) @@ -24,28 +23,32 @@ add_subdirectory(external/slint) #endif (NOT Slint_FOUND) # -- End of Slint setup +add_subdirectory(external/slint) +add_subdirectory(external/selenite/cpp) add_subdirectory(external/mirai-core) add_executable(mirai src/main.cpp - src/UiState.cpp + src/AppWindowBackend.cpp src/Utils.cpp ) - target_include_directories(mirai PRIVATE "external/mirai-core/include") +target_include_directories(mirai PRIVATE "external/selenite/cpp/include") +target_include_directories(mirai PRIVATE "external/evalyte-cpp-common/include") set_property(TARGET mirai PROPERTY SLINT_EMBED_RESOURCES embed-files) target_link_libraries(mirai PRIVATE Slint::Slint) +target_link_libraries(mirai PRIVATE selenite) target_include_directories(mirai PRIVATE "external") target_link_libraries(mirai PRIVATE mirai-core) slint_target_sources( - mirai ui/appwindow.slint + mirai ui/AppWindow.slint NAMESPACE ui - LIBRARY_PATHS selenite=${CMAKE_CURRENT_SOURCE_DIR}/external/selenite/index.slint + LIBRARY_PATHS selenite=${CMAKE_CURRENT_SOURCE_DIR}/external/selenite/components/index.slint ) # On Windows, copy the Slint DLL next to the application binary so that it's found. diff --git a/external/evalyte-cpp-common b/external/evalyte-cpp-common new file mode 160000 index 0000000..b154a33 --- /dev/null +++ b/external/evalyte-cpp-common @@ -0,0 +1 @@ +Subproject commit b154a3351b89a5962a2bed2feae683b3a8009857 diff --git a/external/selenite b/external/selenite index 65e2a75..cbab9da 160000 --- a/external/selenite +++ b/external/selenite @@ -1 +1 @@ -Subproject commit 65e2a75a09df205a86a09d9dd4f1ca916bb115a3 +Subproject commit cbab9dabe784bd3c799d23ead5d2b4d942ec4081 diff --git a/src/UiState.cpp b/src/AppWindowBackend.cpp similarity index 93% rename from src/UiState.cpp rename to src/AppWindowBackend.cpp index 594e7e9..ee1cf05 100644 --- a/src/UiState.cpp +++ b/src/AppWindowBackend.cpp @@ -4,35 +4,33 @@ * The license can be found in the LICENSE file or at https://www.gnu.org/licenses/gpl-3.0.txt */ -#include "UiState.h" +#include "AppWindowBackend.h" +#include "SeleniteSetup.h" #include "Utils.h" #include "appwindow.h" -#include "mirai-core/DataProvider.h" #include "mirai-core/Day.h" #include "mirai-core/Mirai.h" #include "slint.h" -#include "slint_sharedvector.h" #include "slint_string.h" -#include #include #include #include #include +#include +#include #include #include -#include #include -#include #include #include #include #include -#include #include #include #include -UiState::UiState(mirai::Mirai *miraiInstance) : miraiInstance_(miraiInstance), view_(miraiInstance) +AppWindowBackend::AppWindowBackend(mirai::Mirai *miraiInstance) + : miraiInstance_(miraiInstance), view_(miraiInstance) { sources_ = std::make_shared>(); days_ = std::make_shared>(); @@ -45,6 +43,13 @@ UiState::UiState(mirai::Mirai *miraiInstance) : miraiInstance_(miraiInstance), v } ); + const auto palette = + selenite::parseJson(std::string(getenv("HOME")) + "/.config/evalyte/theme.json"); + if (palette.has_value()) { + std::cerr << "Warning, no evalyte/theme.json found" << std::endl; + setSelenitePalette(mainWindow_, palette.value()); + } + mainWindow_->global().set_sources(sourcesNames); view_.setAllSources(); @@ -77,7 +82,7 @@ std::optional stringToDate(const std::string &dateStr) return ui::Date{.year = year, .month = month, .day = day}; } -void UiState::setupUtilsCallbacks() +void AppWindowBackend::setupUtilsCallbacks() { mainWindow_->global().on_format_date([&](const ui::Date &date) { std::chrono::year_month_day chronoDate{ @@ -89,7 +94,7 @@ void UiState::setupUtilsCallbacks() }); } -void UiState::setupCallbacks() +void AppWindowBackend::setupCallbacks() { mainWindow_->global().on_task_clicked([&](int sourceId, int taskId) { auto source = miraiInstance_->getSourceById(sourceId); @@ -243,7 +248,7 @@ stdToSlintStringVector(const std::vector &stdVector) return slintVector; } -void UiState::reloadTasks() +void AppWindowBackend::reloadTasks() { days_->clear(); if (miraiInstance_->getSources().size() == 0) { @@ -323,7 +328,7 @@ void UiState::reloadTasks() mainWindow_->global().set_unscheduled_tasks(unscheduledTasks_); } -void UiState::reloadSources() +void AppWindowBackend::reloadSources() { sources_->clear(); bool noSourceSelected = miraiInstance_->getSources().size() == view_.activeSourceCount(); @@ -337,7 +342,7 @@ void UiState::reloadSources() mainWindow_->global().set_no_source_selected(noSourceSelected); } -void UiState::run() +void AppWindowBackend::run() { mainWindow_->run(); } diff --git a/src/UiState.h b/src/AppWindowBackend.h similarity index 93% rename from src/UiState.h rename to src/AppWindowBackend.h index c439af6..b9c89bf 100644 --- a/src/UiState.h +++ b/src/AppWindowBackend.h @@ -11,11 +11,11 @@ #include "mirai-core/View.h" #include "slint.h" -class UiState +class AppWindowBackend { public: - UiState(mirai::Mirai *mirai); + AppWindowBackend(mirai::Mirai *mirai); void run(); diff --git a/src/SeleniteSetup.h b/src/SeleniteSetup.h new file mode 100644 index 0000000..4eade98 --- /dev/null +++ b/src/SeleniteSetup.h @@ -0,0 +1,30 @@ +/* + * Mirai. Copyright (C) 2024 Vyn + * This file is licensed under version 3 of the GNU General Public License (GPL-3.0-only) + * The license can be found in the LICENSE file or at https://www.gnu.org/licenses/gpl-3.0.txt + */ + +#pragma once + +#include "appwindow.h" +#include "selenite/palette.h" +#include "slint_color.h" + +slint::Color seleniteColorToSlint(const selenite::Color &color) +{ + return slint::Color::from_rgb_uint8(color.r, color.g, color.b); +} + +void setSelenitePalette(slint::ComponentHandle ui, const selenite::Palette &palette) +{ + auto &uiPalette = ui->global(); + + uiPalette.set_background(seleniteColorToSlint(palette.background)); + uiPalette.set_pane(seleniteColorToSlint(palette.pane)); + uiPalette.set_foreground(seleniteColorToSlint(palette.foreground)); + uiPalette.set_foreground_hint(seleniteColorToSlint(palette.foregroundHint)); + uiPalette.set_control_background(seleniteColorToSlint(palette.background3)); + uiPalette.set_control_foreground(seleniteColorToSlint(palette.foreground)); + uiPalette.set_card_background(seleniteColorToSlint(palette.background2)); + uiPalette.set_accent(seleniteColorToSlint(palette.primary)); +} diff --git a/src/main.cpp b/src/main.cpp index 96d0fd0..909b6a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,30 +4,30 @@ * The license can be found in the LICENSE file or at https://www.gnu.org/licenses/gpl-3.0.txt */ -#include "UiState.h" +#include "AppWindowBackend.h" +#include "evalyte-cpp-common/config.h" #include "mirai-core/Config.h" #include "mirai-core/DataProvider.h" #include "mirai-core/MarkdownDataProvider.h" #include "mirai-core/Mirai.h" -#include #include #include #include int main(int argc, char **argv) { - mirai::Config config(std::string(getenv("HOME")) + "/.config/mirai/config.json"); - mirai::Mirai mirai; + const auto configFilePath = evalyte::createConfigDirectoryPath("mirai") + "/config.json"; + mirai::Config config(configFilePath); for (const auto &sourceFilePath : config.sources()) { std::unique_ptr file = std::make_unique(sourceFilePath); mirai.loadSource(std::move(file)); } - UiState uiState{&mirai}; - uiState.run(); + AppWindowBackend appWindow{&mirai}; + appWindow.run(); return 0; } diff --git a/ui/appwindow.slint b/ui/AppWindow.slint similarity index 71% rename from ui/appwindow.slint rename to ui/AppWindow.slint index bfaa45a..72de94d 100644 --- a/ui/appwindow.slint +++ b/ui/AppWindow.slint @@ -1,7 +1,8 @@ import { Backend } from "Backend.slint"; -import { Button, VerticalBox, CheckBox, Palette } from "std-widgets.slint"; +import { Button, VerticalBox, CheckBox } from "std-widgets.slint"; import { SideBar } from "./components/SideBar.slint"; import { MainView } from "MainView.slint"; +import { Palette } from "@selenite"; export component AppWindow inherits Window { @@ -21,4 +22,4 @@ export component AppWindow inherits Window { } -export { Backend } // Export to make it visible to the C++ backend +export { Backend, Palette } // Export to make it visible to the C++ backend