diff --git a/CMakeLists.txt b/CMakeLists.txt index 618e2cc..957f46d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,10 @@ add_subdirectory(external/evalyte-cpp-common) target_include_directories(lali PRIVATE "external/evalyte-cpp-common/include") target_link_libraries(lali PRIVATE evalyte-cpp-common) +add_subdirectory(external/selenite/cpp) +target_include_directories(lali PRIVATE "external/selenite/cpp/include") +target_link_libraries(lali PRIVATE selenite) + add_subdirectory(external/rei-json) target_include_directories(lali PRIVATE "external/rei-json/include") target_link_libraries(lali PRIVATE rei-json) diff --git a/external/selenite b/external/selenite index 3fb5f62..482980b 160000 --- a/external/selenite +++ b/external/selenite @@ -1 +1 @@ -Subproject commit 3fb5f620fdc3e422d468642263858ffce72cdbb9 +Subproject commit 482980b29aca92dd3282bd3c81e78c520f30a233 diff --git a/src/AppWindow.h b/src/AppWindow.h index 97b63af..01e9469 100644 --- a/src/AppWindow.h +++ b/src/AppWindow.h @@ -6,6 +6,8 @@ #include "evalyte-cpp-common/evalyte.h" #include "rei-json/Field.h" #include "rei-json/Object.h" +#include "selenite/palette.h" +#include "selenite/selenite.h" #include "ui.h" #include "rei-json/Array.h" #include "rei-json/json.h" @@ -31,6 +33,15 @@ public: listsSlint = std::make_shared>(); animesSlint = std::make_shared>(); + const auto palettePath = std::string(getenv("HOME")) + "/.config/evalyte/theme.json"; + const auto palette = selenite::parseJson(palettePath); + if (palette.has_value()) { + std::println(std::cerr, "Warning, no {} found", palettePath); + setSelenitePalette(ui->global(), palette.value()); + setSelenitePalette(addAnimeWindow->global(), palette.value()); + setSelenitePalette(editListWindow->global(), palette.value()); + } + for (int i = 0; i < THREAD_COUNT; ++i) { startThread(i); } @@ -105,6 +116,7 @@ public: void initModels() { + listsSlint->clear(); listsSlint = std::make_shared>(); ui->global().set_lists(listsSlint); @@ -146,6 +158,28 @@ public: removeAnimeFromList(currentListIndex, animeIndex); }); + ui->global().on_open_edit_list_window([&](int index) { + auto& listJson = json.getArray("lists").getObject(index); + editListWindow->set_index(index); + editListWindow->set_name(slint::SharedString(listJson["name"].asString())); + editListWindow->show(); + }); + + editListWindow->on_edit_list([&](int index, slint::SharedString name) { + auto& listJson = json.getArray("lists").getObject(index); + listJson["name"].asString() = std::string(name); + editListWindow->hide(); + initModels(); + save(); + }); + + editListWindow->on_delete_list([&](int index) { + json.getArray("lists").remove(index); + editListWindow->hide(); + initModels(); + save(); + }); + addAnimeWindow->on_import_anilist_anime([&] (slint::SharedString animeIdStr) { int animeId = stoi(std::string(animeIdStr)); int currentListIndex = ui->global().get_current_list().index; @@ -351,6 +385,7 @@ private: rei::json::JsonObject json; slint::ComponentHandle ui; slint::ComponentHandle addAnimeWindow = ui::AddAnimeWindow::create(); + slint::ComponentHandle editListWindow = ui::EditListWindow::create(); std::shared_ptr> animesSlint; std::shared_ptr> listsSlint; std::mutex animeListLock; diff --git a/src/AppWindow.slint b/src/AppWindow.slint index 8fc0c87..08e8feb 100644 --- a/src/AppWindow.slint +++ b/src/AppWindow.slint @@ -120,17 +120,24 @@ export component AppWindow inherits Window { HorizontalLayout { alignment: start; + spacing: 8px; if State.current-list.source == ListSource.Local : VButton { icon-svg: Svg.plus; text: "Add"; clicked => { State.open-add-anime-window() } } if State.current-list.source == ListSource.Anilist : VButton { + icon-svg: Svg.refresh; text: "Sync"; clicked => { State.sync-list() } } + VButton { + text: "Settings"; + icon-svg: Svg.cog; + clicked => { State.open-edit-list-window(State.current-list.index) } + } } - } + } animes-grid-background := Rectangle { //background: #111111; @@ -172,7 +179,7 @@ export component AppWindow inherits Window { popup := VPopupIconMenu { VActionButton { icon-svg: Svg.trash; - icon-colorize: Colors.red; + icon-colorize: Palette.red; icon-size: 1.5rem; border-radius: 0; clicked => { diff --git a/src/EditListWindow.slint b/src/EditListWindow.slint new file mode 100644 index 0000000..e941ab3 --- /dev/null +++ b/src/EditListWindow.slint @@ -0,0 +1,41 @@ +import { State } from "./state.slint"; +import { VText, VTextInput , VButton, ToggleButton, VActionButton, Svg, Palette } from "@selenite"; +import { ComboBox } from "std-widgets.slint"; + +export component EditListWindow inherits Window { + title: "Lali - Edit List"; + + in property index; + in-out property name; + + background: Palette.background; + default-font-size: 16px; + padding: 0px; + + width: 200px; + + callback edit-list(int, string); + callback delete-list(int); + + VerticalLayout { + alignment: start; + padding: 16px; + spacing: 16px; + + VTextInput { + label: "Name"; + text <=> name; + } + + VButton { + text: "Save"; + clicked => { edit-list(index, name) } + } + + VButton { + text: "Delete"; + background: Palette.red; + double-clicked => { delete-list(index) } + } + } +} diff --git a/src/state.slint b/src/state.slint index a9ece9a..30dbc94 100644 --- a/src/state.slint +++ b/src/state.slint @@ -46,5 +46,7 @@ export global State { callback open-add-anime-window(); callback remove-anime(int); + callback open-edit-list-window(int); + callback config-changed(); } diff --git a/src/ui.slint b/src/ui.slint index a5a3442..3099a6f 100644 --- a/src/ui.slint +++ b/src/ui.slint @@ -1,5 +1,7 @@ import { AppWindow } from "./AppWindow.slint"; import { AddAnimeWindow } from "./AddAnimeWindow.slint"; +import { EditListWindow } from "./EditListWindow.slint"; +import { Palette } from "@selenite"; import { State } from "./state.slint"; -export { State, AppWindow, AddAnimeWindow } +export { State, Palette, AppWindow, AddAnimeWindow, EditListWindow }