diff --git a/CMakeLists.txt b/CMakeLists.txt index f10b6a9..a73a08e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,10 @@ add_subdirectory(external/evalyte-cpp-common) add_executable(mirai src/main.cpp src/windows/AppWindow/AppWindow.cpp + src/windows/AddSourceWindow/AddSourceWindow.cpp src/windows/SettingsWindow/SettingsWindow.cpp + src/windows/EditSourceWindow/EditSourceWindow.cpp + src/windows/EditEventWindow/EditEventWindow.cpp src/SeleniteSetup.cpp src/shared/Utils.cpp ) diff --git a/external/selenite b/external/selenite index 810607c..acbd562 160000 --- a/external/selenite +++ b/external/selenite @@ -1 +1 @@ -Subproject commit 810607c01fa659f31bd11bd41a9ee5611e5db8ea +Subproject commit acbd56205d758bf74d7f121ce8085898acbacc9f diff --git a/src/modals/AddEventModal.slint b/src/modals/AddEventModal.slint deleted file mode 100644 index 4e6a00c..0000000 --- a/src/modals/AddEventModal.slint +++ /dev/null @@ -1,43 +0,0 @@ -import { Palette } from "@selenite"; -import { VTextInput } from "../../external/selenite/components/TextInput.slint"; -import { VButton, VText, VDatePicker } from "../../external/selenite/components/index.slint"; -import { AppWindowActions } from "../windows/AppWindow/Actions.slint"; -import { Modal } from "../../external/selenite/components/Modal.slint"; -import { VTimePicker } from "../../external/selenite/components/TimePicker.slint"; - -export component AddEventModal inherits Modal { - public function open() { - root.show(); - } - - VerticalLayout { - padding: 16px; - spacing: 8px; - titleInput := VTextInput { - label: "title"; - } - VText { text: "on"; vertical-alignment: bottom;} - dateInput := VDatePicker { - enabled: true; - } - HorizontalLayout { - spacing: 4px; - VText { text: "between"; vertical-alignment: bottom; } - startTimeInput := VTimePicker { } - VText { text: "and"; vertical-alignment: bottom; } - endTimeInput := VTimePicker { } - } - VButton { - text: "Create"; - clicked => { - AppWindowActions.create-event({ - title: titleInput.text, - date: dateInput.date, - startsAt: startTimeInput.time, - endsAt: endTimeInput.time - }); - root.close(); - } - } - } -} diff --git a/src/modals/AddSourceModal.slint b/src/modals/AddSourceModal.slint deleted file mode 100644 index e74e9c3..0000000 --- a/src/modals/AddSourceModal.slint +++ /dev/null @@ -1,36 +0,0 @@ -import { Palette } from "@selenite"; -import { VTextInput } from "../../external/selenite/components/TextInput.slint"; -import { VButton } from "../../external/selenite/components/index.slint"; -import { AppWindowModels } from "../windows/AppWindow/Models.slint"; -import { AppWindowActions } from "../windows/AppWindow/Actions.slint"; -import { Modal } from "../../external/selenite/components/Modal.slint"; - -export component AddSourceModal inherits Modal { - private property source-id-to-edit: -1; - private property name: ""; - private property path: ""; - - public function open() { - root.show(); - } - - VerticalLayout { - padding: 16px; - spacing: 8px; - nameInput := VTextInput { - label: "Name"; - text <=> root.name; - } - pathInput := VTextInput { - label: "Path"; - text <=> root.path; - } - VButton { - text: "Add"; - clicked => { - AppWindowActions.add-source(name, path); - root.close(); - } - } - } -} diff --git a/src/modals/EditSourceModal.slint b/src/modals/EditSourceModal.slint deleted file mode 100644 index f196afe..0000000 --- a/src/modals/EditSourceModal.slint +++ /dev/null @@ -1,46 +0,0 @@ -import { Palette } from "@selenite"; -import { VTextInput } from "../../external/selenite/components/TextInput.slint"; -import { VButton } from "../../external/selenite/components/index.slint"; -import { AppWindowModels } from "../windows/AppWindow/Models.slint"; -import { AppWindowActions } from "../windows/AppWindow/Actions.slint"; -import { Modal } from "../../external/selenite/components/Modal.slint"; - -export component EditSourceModal inherits Modal { - private property source-id-to-edit: -1; - private property name: ""; - private property path: ""; - - public function edit(source-id: int) { - source-id-to-edit = source-id; - root.name = AppWindowModels.get-source-name-from-id(source-id); - root.path = AppWindowModels.get-source-path-from-id(source-id); - root.show(); - } - - VerticalLayout { - padding: 16px; - spacing: 8px; - nameInput := VTextInput { - label: "Name"; - text <=> root.name; - } - pathInput := VTextInput { - label: "Path"; - text <=> root.path; - } - VButton { - text: "Save"; - clicked => { - AppWindowActions.edit-source(source-id-to-edit, name, path); - root.close(); - } - } - VButton { - text: "Delete"; - background-color: Palette.red; - double-clicked => { - //root.delete-source(root.id) - } - } - } -} diff --git a/src/ui.slint b/src/ui.slint index 2a72c3f..3e9ca63 100644 --- a/src/ui.slint +++ b/src/ui.slint @@ -2,7 +2,10 @@ import { AppWindowModels } from "windows/AppWindow/Models.slint"; import { AppWindowActions } from "windows/AppWindow/Actions.slint"; import { AppWindow } from "windows/AppWindow/AppWindow.slint"; import { SettingsWindow } from "windows/SettingsWindow/SettingsWindow.slint"; +import { AddSourceWindow } from "windows/AddSourceWindow//AddSourceWindow.slint"; +import { EditSourceWindow } from "windows/EditSourceWindow/EditSourceWindow.slint"; +import { EditEventWindow } from "windows/EditEventWindow/EditEventWindow.slint"; import { Utils } from "shared/Utils.slint"; import { Palette } from "@selenite"; -export { Utils, Palette, AppWindow, AppWindowModels, AppWindowActions, SettingsWindow } +export { Utils, Palette, AppWindow, AppWindowModels, AppWindowActions, SettingsWindow, AddSourceWindow, EditSourceWindow, EditEventWindow } diff --git a/src/windows/AddSourceWindow/AddSourceWindow.cpp b/src/windows/AddSourceWindow/AddSourceWindow.cpp new file mode 100644 index 0000000..ecb958b --- /dev/null +++ b/src/windows/AddSourceWindow/AddSourceWindow.cpp @@ -0,0 +1,59 @@ +/* + * 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 + */ + +#include "AddSourceWindow.h" +#include "../../SeleniteSetup.h" +#include "evalyte-cpp-common/evalyte.h" +#include "mirai-core/MarkdownDataProvider.h" +#include "mirai-core/Mirai.h" +#include "slint.h" +#include "slint_string.h" +#include "ui.h" +#include +#include +#include +#include +#include +#include +#include +#include + +AddSourceWindow::AddSourceWindow(mirai::Mirai *miraiInstance) : miraiInstance_(miraiInstance) +{ + window_->set_default_source_path(slint::SharedString(evalyte::dataDirectoryPath("mirai") + "/") + ); + + const auto palettePath = std::string(getenv("HOME")) + "/.config/evalyte/theme.json"; + const auto palette = selenite::parseJson(palettePath); + + if (palette.has_value()) { + setSelenitePalette(window_->global(), palette.value()); + } + + setupCallbacks(); +} + +void AddSourceWindow::setupCallbacks() +{ + window_->on_add_source([&](ui::AddSourceParam params) { + std::unique_ptr file = + std::make_unique(std::string(params.path)); + miraiInstance_->addSource( + std::string(params.name), std::string(params.type), std::move(file) + ); + window_->hide(); + }); +} + +void AddSourceWindow::open() +{ + window_->show(); +} + +void AddSourceWindow::close() +{ + window_->hide(); +} diff --git a/src/windows/AddSourceWindow/AddSourceWindow.h b/src/windows/AddSourceWindow/AddSourceWindow.h new file mode 100644 index 0000000..cfbcd4e --- /dev/null +++ b/src/windows/AddSourceWindow/AddSourceWindow.h @@ -0,0 +1,28 @@ +/* + * 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 "mirai-core/Mirai.h" +#include "slint.h" +#include "ui.h" + +class AddSourceWindow +{ + + public: + AddSourceWindow(mirai::Mirai *mirai); + + void open(); + void close(); + + private: + void setupCallbacks(); + + std::shared_ptr> sources_; + slint::ComponentHandle window_ = ui::AddSourceWindow::create(); + mirai::Mirai *miraiInstance_; +}; diff --git a/src/windows/AddSourceWindow/AddSourceWindow.slint b/src/windows/AddSourceWindow/AddSourceWindow.slint new file mode 100644 index 0000000..468a021 --- /dev/null +++ b/src/windows/AddSourceWindow/AddSourceWindow.slint @@ -0,0 +1,45 @@ +import { VerticalBox, CheckBox } from "std-widgets.slint"; +import { VButton, VText, VTextInput, Palette } from "@selenite"; + +export struct AddSourceParam { + name: string, + type: string, + path: string +} + +export component AddSourceWindow inherits Window { + + title: "Mirai - Add source"; + min-height: 100px; + max-height: 4000px; // needed, otherwise the window wants to fit the content (on Swaywm) + min-width: 400px; + background: Palette.background; + + in-out property default-source-path; + callback add-source(AddSourceParam); + + VerticalLayout { + padding: 16px; + spacing: 8px; + nameInput := VTextInput { + label: "Name"; + text: "todo"; + } + pathInput := VTextInput { + label: "Path"; + text: root.default-source-path + nameInput.text + ".md"; + } + VButton { + text: "Create"; + clicked => { + root.add-source({ + name: nameInput.text, + type: "FileSystemMarkdown", + path: pathInput.text + }) + } + } + } +} + +export { Palette } // Export to make it visible to the C++ backend diff --git a/src/windows/AppWindow/Actions.slint b/src/windows/AppWindow/Actions.slint index f74753d..cbcb399 100644 --- a/src/windows/AppWindow/Actions.slint +++ b/src/windows/AppWindow/Actions.slint @@ -50,8 +50,7 @@ export global AppWindowActions { callback source-clicked(int); callback open-settings-window(); callback open-add-source-window(); - callback add-source(name: string, path: string); - callback edit-source(sourceId: int, name: string, path: string); + callback open-edit-source-window(int); callback open-new-task-form(OpenNewTaskFormParams); callback open-edit-task-form(int, int); diff --git a/src/windows/AppWindow/AppWindow.cpp b/src/windows/AppWindow/AppWindow.cpp index 8a632d0..d2d91ec 100644 --- a/src/windows/AppWindow/AppWindow.cpp +++ b/src/windows/AppWindow/AppWindow.cpp @@ -33,7 +33,9 @@ #include AppWindow::AppWindow(mirai::Mirai *miraiInstance) - : miraiInstance_(miraiInstance), settingsWindow_(miraiInstance), view_(miraiInstance) + : miraiInstance_(miraiInstance), addSourceWindow_(miraiInstance), + editSourceWindow_(miraiInstance), settingsWindow_(miraiInstance), + editEventWindow_(miraiInstance), view_(miraiInstance) { sources_ = std::make_shared>(); days_ = std::make_shared>(); @@ -103,14 +105,6 @@ void AppWindow::setupCallbacks() return slint::SharedString(source->name()); }); - models().on_get_source_path_from_id([&](int sourceId) { - auto source = miraiInstance_->getSourceById(sourceId); - assert(source); - mirai::MarkdownDataProvider *sourceProvider = - dynamic_cast(source->dataProvider()); - return slint::SharedString(sourceProvider->path()); - }); - miraiInstance_->onSourceAdded([&](mirai::Source *source) { refreshModels(); }); @@ -124,15 +118,15 @@ void AppWindow::setupCallbacks() settingsWindow_.open(); }); actions().on_open_add_source_window([&]() { - // addSourceWindow_.open(); + addSourceWindow_.open(); + }); + actions().on_open_edit_source_window([&](int sourceId) { + auto source = miraiInstance_->getSourceById(sourceId); + assert(source); + editSourceWindow_.open(source); }); - /*actions().on_open_edit_source_window([&](int sourceId) {*/ - /*auto source = miraiInstance_->getSourceById(sourceId);*/ - /*assert(source);*/ - /*editSourceWindow_.open(source);*/ - /*});*/ actions().on_open_add_event_window([&]() { - // editEventWindow_.open(); + editEventWindow_.open(); }); actions().on_task_clicked([&](int sourceId, int taskId) { @@ -164,16 +158,6 @@ void AppWindow::setupCallbacks() reloadTasks(); }); - actions().on_add_source([&](slint::SharedString name, slint::SharedString path) { - std::unique_ptr file = - std::make_unique(std::string(path)); - miraiInstance_->addSource(std::string(name), "FileSystemMarkdown", std::move(file)); - }); - - actions().on_edit_source([&](int sourceId, slint::SharedString name, slint::SharedString path) { - miraiInstance_->editSource(sourceId, std::string(name), std::string(path)); - }); - actions().on_delete_task_clicked([&](int sourceId, int taskId) { auto source = miraiInstance_->getSourceById(sourceId); assert(source); diff --git a/src/windows/AppWindow/AppWindow.h b/src/windows/AppWindow/AppWindow.h index 0d25941..cf496e1 100644 --- a/src/windows/AppWindow/AppWindow.h +++ b/src/windows/AppWindow/AppWindow.h @@ -6,6 +6,9 @@ #pragma once +#include "../AddSourceWindow/AddSourceWindow.h" +#include "../EditEventWindow/EditEventWindow.h" +#include "../EditSourceWindow/EditSourceWindow.h" #include "../SettingsWindow/SettingsWindow.h" #include "mirai-core/Mirai.h" #include "mirai-core/View.h" @@ -36,6 +39,9 @@ class AppWindow slint::ComponentHandle mainWindow_ = ui::AppWindow::create(); SettingsWindow settingsWindow_; + AddSourceWindow addSourceWindow_; + EditSourceWindow editSourceWindow_; + EditEventWindow editEventWindow_; mirai::Mirai *miraiInstance_; mirai::View view_; diff --git a/src/windows/AppWindow/AppWindow.slint b/src/windows/AppWindow/AppWindow.slint index 625d51c..49f7eef 100644 --- a/src/windows/AppWindow/AppWindow.slint +++ b/src/windows/AppWindow/AppWindow.slint @@ -1,15 +1,15 @@ import { AppWindowModels } from "Models.slint"; import { Button, VerticalBox, CheckBox } from "std-widgets.slint"; +import { SideBar } from "views/SideBar.slint"; import { MainView } from "views/TasksView.slint"; import { SettingsWindow } from "../SettingsWindow/SettingsWindow.slint"; +import { AddSourceWindow } from "../AddSourceWindow//AddSourceWindow.slint"; +import { EditSourceWindow } from "../EditSourceWindow/EditSourceWindow.slint"; import { Palette } from "@selenite"; import { CalendarView } from "views/CalendarView.slint"; import { VButton } from "../../../external/selenite/components/Button.slint"; import { ToggleButton } from "../../../external/selenite/components/index.slint"; -import { VTextInput } from "../../../external/selenite/components/TextInput.slint"; -import { AppWindowActions } from "Actions.slint"; -import { SideBar } from "views/SideBar.slint"; - + export component AppWindow inherits Window { title: "Mirai"; @@ -43,7 +43,7 @@ export component AppWindow inherits Window { active: show-tasks; clicked => { show-tasks = true } } - } + } SideBar { min-width: 256px; } @@ -70,4 +70,4 @@ export component AppWindow inherits Window { } } -export { AppWindowModels, Palette, SettingsWindow } // Export to make it visible to the C++ backend +export { AppWindowModels, Palette, SettingsWindow, AddSourceWindow, EditSourceWindow } // Export to make it visible to the C++ backend diff --git a/src/windows/AppWindow/Models.slint b/src/windows/AppWindow/Models.slint index 75c1212..4c1008a 100644 --- a/src/windows/AppWindow/Models.slint +++ b/src/windows/AppWindow/Models.slint @@ -48,5 +48,4 @@ export global AppWindowModels { callback get-source-id-from-name(string) -> int; pure callback get-source-name-from-id(int) -> string; - pure callback get-source-path-from-id(int) -> string; } diff --git a/src/windows/AppWindow/views/CalendarView.slint b/src/windows/AppWindow/views/CalendarView.slint index 507590d..9ab3574 100644 --- a/src/windows/AppWindow/views/CalendarView.slint +++ b/src/windows/AppWindow/views/CalendarView.slint @@ -4,11 +4,10 @@ import { Button, VerticalBox, CheckBox, ScrollView, ComboBox } from "std-widgets import { TaskLine } from "../../../components/TaskLine.slint"; import { EventGroup } from "../../../components/EventGroup.slint"; import { Calendar } from "../../../components/Calendar.slint"; -import { VDatePicker, VTimePicker, VCheckBox, VButton, VTag, VText, VTextInput, Svg, Palette } from "@selenite"; +import { VPopupIconMenu, VDatePicker, VTimePicker, VCheckBox, VButton, VTag, VText, VTextInput, Svg, Palette } from "@selenite"; import { CreateTaskOrEvent } from "../../../components/CreateTaskOrEvent.slint"; import { Utils } from "../../../shared/Utils.slint"; import { VActionButton } from "../../../../external/selenite/components/index.slint"; -import { AddEventModal } from "../../../modals/AddEventModal.slint"; export component CalendarView inherits Rectangle { @@ -16,7 +15,53 @@ export component CalendarView inherits Rectangle { private property icon-not-visible: Svg.not-visible; private property completed-tasks-visible: false; - createEventPopup := AddEventModal {} + createEventPopup := PopupWindow { + x: parent.width / 2 - 200px; + y: parent.height / 2 - 300px; + close-policy: close-on-click-outside; + background := Rectangle { + height: 100%; + width: 100%; + background: Palette.background1; + border-color: Palette.popup-border; + border-width: 1px; + border-radius: 4px; + } + VerticalLayout { + padding: 16px; + spacing: 8px; + titleInput := VTextInput { + label: "title"; + } + VText { text: "on"; vertical-alignment: bottom;} + dateInput := VDatePicker { + enabled: true; + } + HorizontalLayout { + spacing: 4px; + VText { text: "between"; vertical-alignment: bottom; } + startTimeInput := VTimePicker { } + VText { text: "and"; vertical-alignment: bottom; } + endTimeInput := VTimePicker { } + } + VButton { + text: "Create"; + clicked => { + debug("clicked OK"); + debug(createEventPopup.width); + debug(createEventPopup.height); + AppWindowActions.create-event({ + title: titleInput.text, + date: dateInput.date, + startsAt: startTimeInput.time, + endsAt: endTimeInput.time + }); + debug("Event sent"); + createEventPopup.close(); + } + } + } + } VerticalLayout { padding: 16px; diff --git a/src/windows/AppWindow/views/SideBar.slint b/src/windows/AppWindow/views/SideBar.slint index 680d00b..5565853 100644 --- a/src/windows/AppWindow/views/SideBar.slint +++ b/src/windows/AppWindow/views/SideBar.slint @@ -1,18 +1,9 @@ import { AppWindowModels, TaskData } from "../Models.slint"; import { AppWindowActions } from "../Actions.slint"; import { VButton, ToggleButton, VActionButton, VText, Svg, Palette } from "@selenite"; -import { EditSourceModal } from "../../../modals/EditSourceModal.slint"; -import { AddSourceModal } from "../../../modals/AddSourceModal.slint"; export component SideBar inherits Rectangle { - function open-edit-source-window(source-id: int) { - editSourcePopup.edit(source-id) - } - - addSourcePopup := AddSourceModal{} - editSourcePopup := EditSourceModal {} - VerticalLayout { height: parent.height; padding: 16px; @@ -34,7 +25,7 @@ export component SideBar inherits Rectangle { icon-svg: Svg.plus; icon-colorize: Palette.green; background: transparent; - clicked => { addSourcePopup.open() } + clicked => { AppWindowActions.open-add-source-window() } } } VerticalLayout { @@ -60,7 +51,7 @@ export component SideBar inherits Rectangle { visible: parent.active; icon-svg: Svg.cog; background: transparent; - clicked => { editSourcePopup.edit(item.id) } + clicked => { AppWindowActions.open-edit-source-window(item.id) } } } } diff --git a/src/windows/EditEventWindow/EditEventWindow.cpp b/src/windows/EditEventWindow/EditEventWindow.cpp new file mode 100644 index 0000000..276ad05 --- /dev/null +++ b/src/windows/EditEventWindow/EditEventWindow.cpp @@ -0,0 +1,50 @@ +/* + * 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 + */ + +#include "EditEventWindow.h" +#include "../../SeleniteSetup.h" +#include "evalyte-cpp-common/evalyte.h" +#include "mirai-core/DataProvider.h" +#include "mirai-core/MarkdownDataProvider.h" +#include "mirai-core/Mirai.h" +#include "slint.h" +#include "slint_string.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +EditEventWindow::EditEventWindow(mirai::Mirai *miraiInstance) : miraiInstance_(miraiInstance) +{ + + const auto palettePath = std::string(getenv("HOME")) + "/.config/evalyte/theme.json"; + const auto palette = selenite::parseJson(palettePath); + + if (palette.has_value()) { + setSelenitePalette(window_->global(), palette.value()); + } + + setupCallbacks(); +} + +void EditEventWindow::setupCallbacks() +{ +} + +void EditEventWindow::open() +{ + window_->show(); +} + +void EditEventWindow::close() +{ + window_->hide(); +} diff --git a/src/windows/EditEventWindow/EditEventWindow.h b/src/windows/EditEventWindow/EditEventWindow.h new file mode 100644 index 0000000..4914c01 --- /dev/null +++ b/src/windows/EditEventWindow/EditEventWindow.h @@ -0,0 +1,33 @@ +/* + * 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 "mirai-core/Mirai.h" +#include "slint.h" +#include "ui.h" + +class EditEventWindow +{ + + public: + EditEventWindow(mirai::Mirai *mirai); + + void open(); + void close(); + + auto getHandle() + { + return this->window_; + } + + private: + void setupCallbacks(); + + std::shared_ptr> sources_; + slint::ComponentHandle window_ = ui::EditEventWindow::create(); + mirai::Mirai *miraiInstance_; +}; diff --git a/src/windows/EditEventWindow/EditEventWindow.slint b/src/windows/EditEventWindow/EditEventWindow.slint new file mode 100644 index 0000000..8f1297d --- /dev/null +++ b/src/windows/EditEventWindow/EditEventWindow.slint @@ -0,0 +1,68 @@ +import { AppWindowModels } from "../AppWindow/Models.slint"; +import { Button, VerticalBox, CheckBox } from "std-widgets.slint"; +import { VText, VTextInput, Palette } from "@selenite"; +import { VButton } from "../../../external/selenite/components/index.slint"; +import { Date, Time, Button, VerticalBox, CheckBox, ScrollView, ComboBox } from "std-widgets.slint"; +import { VDatePicker } from "../../../external/selenite/components/DatePicker.slint"; +import { VTimePicker } from "../../../external/selenite/components/TimePicker.slint"; + +export struct CreateEventParams { + title: string, + date: Date, + startsAt: Time, + endsAt: Time +} + +export component EditEventWindow inherits Window { + + title: "Mirai - Event"; + min-height: 100px; + max-height: 500px; // needed, otherwise the window wants to fit the content (on Swaywm) + max-width: 500px; // needed, otherwise the window wants to fit the content (on Swaywm) + background: Palette.background; + in-out property sourceId; + + callback create-event(CreateEventParams); + callback delete-event(int); + + VerticalLayout { + padding: 16px; + spacing: 8px; + titleInput := VTextInput { + label: "title"; + } + VText { text: "on"; vertical-alignment: bottom;} + dateInput := VDatePicker { + enabled: true; + } + HorizontalLayout { + spacing: 4px; + VText { text: "between"; vertical-alignment: bottom; } + startTimeInput := VTimePicker { } + VText { text: "and"; vertical-alignment: bottom; } + endTimeInput := VTimePicker { } + } + VButton { + text: "Create"; + clicked => { + debug("clicked"); + root.create-event({ + title: titleInput.text, + date: dateInput.date, + startsAt: startTimeInput.time, + endsAt: endTimeInput.time + }) + } + } + VButton { + text: "Delete"; + background-color: Palette.red; + double-clicked => { + //root.delete-event(root.id) + } + } + } + +} + +export { AppWindowModels, Palette } // Export to make it visible to the C++ backend diff --git a/src/windows/EditSourceWindow/EditSourceWindow.cpp b/src/windows/EditSourceWindow/EditSourceWindow.cpp new file mode 100644 index 0000000..8408429 --- /dev/null +++ b/src/windows/EditSourceWindow/EditSourceWindow.cpp @@ -0,0 +1,61 @@ +/* + * 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 + */ + +#include "EditSourceWindow.h" +#include "../../SeleniteSetup.h" +#include "mirai-core/MarkdownDataProvider.h" +#include "mirai-core/Mirai.h" +#include "slint.h" +#include "slint_string.h" +#include "ui.h" +#include +#include +#include +#include +#include +#include +#include +#include + +EditSourceWindow::EditSourceWindow(mirai::Mirai *miraiInstance) : miraiInstance_(miraiInstance) +{ + + const auto palettePath = std::string(getenv("HOME")) + "/.config/evalyte/theme.json"; + const auto palette = selenite::parseJson(palettePath); + + if (palette.has_value()) { + setSelenitePalette(window_->global(), palette.value()); + } + + setupCallbacks(); +} + +void EditSourceWindow::setupCallbacks() +{ + window_->on_modify_source([&](ui::ModifySourceParam params) { + miraiInstance_->editSource(params.id, std::string(params.name), std::string(params.path)); + close(); + }); + window_->on_delete_source([&](int sourceId) { + miraiInstance_->deleteSource(sourceId); + close(); + }); +} + +void EditSourceWindow::open(mirai::Source *source) +{ + assert(source != nullptr); + auto markdownSource = dynamic_cast(source->dataProvider()); + window_->set_id(source->id); + window_->set_name(slint::SharedString(source->name())); + window_->set_path(slint::SharedString(markdownSource->path())); + window_->show(); +} + +void EditSourceWindow::close() +{ + window_->hide(); +} diff --git a/src/windows/EditSourceWindow/EditSourceWindow.h b/src/windows/EditSourceWindow/EditSourceWindow.h new file mode 100644 index 0000000..59e5164 --- /dev/null +++ b/src/windows/EditSourceWindow/EditSourceWindow.h @@ -0,0 +1,29 @@ +/* + * 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 "mirai-core/Mirai.h" +#include "mirai-core/Source.h" +#include "slint.h" +#include "ui.h" + +class EditSourceWindow +{ + + public: + EditSourceWindow(mirai::Mirai *mirai); + + void open(mirai::Source *source); + void close(); + + private: + void setupCallbacks(); + + std::shared_ptr> sources_; + slint::ComponentHandle window_ = ui::EditSourceWindow::create(); + mirai::Mirai *miraiInstance_; +}; diff --git a/src/windows/EditSourceWindow/EditSourceWindow.slint b/src/windows/EditSourceWindow/EditSourceWindow.slint new file mode 100644 index 0000000..9ddab3f --- /dev/null +++ b/src/windows/EditSourceWindow/EditSourceWindow.slint @@ -0,0 +1,53 @@ +import { VerticalBox, CheckBox } from "std-widgets.slint"; +import { VButton, VText, VTextInput, Palette } from "@selenite"; + +export struct ModifySourceParam { + id: int, + name: string, + path: string +} + +export component EditSourceWindow inherits Window { + in-out property id; + in-out property name <=> nameInput.text; + in-out property path <=> pathInput.text; + + title: "Mirai - Edit source"; + min-height: 100px; + max-height: 4000px; // needed, otherwise the window wants to fit the content (on Swaywm) + min-width: 400px; + background: Palette.background; + + callback modify-source(ModifySourceParam); + callback delete-source(int); + + VerticalLayout { + padding: 16px; + spacing: 8px; + nameInput := VTextInput { + label: "Name"; + } + pathInput := VTextInput { + label: "Path"; + } + VButton { + text: "Save"; + clicked => { + root.modify-source({ + id: root.id, + name: nameInput.text, + path: pathInput.text + }) + } + } + VButton { + text: "Delete"; + background-color: Palette.red; + double-clicked => { + root.delete-source(root.id) + } + } + } +} + +export { Palette } // Export to make it visible to the C++ backend