mirror of
https://codeberg.org/vyn/mirai.git
synced 2025-07-01 17:03:19 +00:00
Compare commits
4 commits
129b30b9e7
...
2e1e5db5ea
Author | SHA1 | Date | |
---|---|---|---|
2e1e5db5ea | |||
c804ce1c7b | |||
fcdeec19ed | |||
854152b395 |
22 changed files with 176 additions and 507 deletions
|
@ -31,10 +31,7 @@ add_subdirectory(external/evalyte-cpp-common)
|
||||||
add_executable(mirai
|
add_executable(mirai
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
src/windows/AppWindow/AppWindow.cpp
|
src/windows/AppWindow/AppWindow.cpp
|
||||||
src/windows/AddSourceWindow/AddSourceWindow.cpp
|
|
||||||
src/windows/SettingsWindow/SettingsWindow.cpp
|
src/windows/SettingsWindow/SettingsWindow.cpp
|
||||||
src/windows/EditSourceWindow/EditSourceWindow.cpp
|
|
||||||
src/windows/EditEventWindow/EditEventWindow.cpp
|
|
||||||
src/SeleniteSetup.cpp
|
src/SeleniteSetup.cpp
|
||||||
src/shared/Utils.cpp
|
src/shared/Utils.cpp
|
||||||
)
|
)
|
||||||
|
|
2
external/selenite
vendored
2
external/selenite
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit acbd56205d758bf74d7f121ce8085898acbacc9f
|
Subproject commit 810607c01fa659f31bd11bd41a9ee5611e5db8ea
|
43
src/modals/AddEventModal.slint
Normal file
43
src/modals/AddEventModal.slint
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
src/modals/AddSourceModal.slint
Normal file
36
src/modals/AddSourceModal.slint
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
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 <int> source-id-to-edit: -1;
|
||||||
|
private property <string> name: "";
|
||||||
|
private property <string> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
src/modals/EditSourceModal.slint
Normal file
46
src/modals/EditSourceModal.slint
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
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 <int> source-id-to-edit: -1;
|
||||||
|
private property <string> name: "";
|
||||||
|
private property <string> 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,10 +2,7 @@ import { AppWindowModels } from "windows/AppWindow/Models.slint";
|
||||||
import { AppWindowActions } from "windows/AppWindow/Actions.slint";
|
import { AppWindowActions } from "windows/AppWindow/Actions.slint";
|
||||||
import { AppWindow } from "windows/AppWindow/AppWindow.slint";
|
import { AppWindow } from "windows/AppWindow/AppWindow.slint";
|
||||||
import { SettingsWindow } from "windows/SettingsWindow/SettingsWindow.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 { Utils } from "shared/Utils.slint";
|
||||||
import { Palette } from "@selenite";
|
import { Palette } from "@selenite";
|
||||||
|
|
||||||
export { Utils, Palette, AppWindow, AppWindowModels, AppWindowActions, SettingsWindow, AddSourceWindow, EditSourceWindow, EditEventWindow }
|
export { Utils, Palette, AppWindow, AppWindowModels, AppWindowActions, SettingsWindow }
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <bits/chrono.h>
|
|
||||||
#include <cassert>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <ctime>
|
|
||||||
#include <optional>
|
|
||||||
#include <print>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
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<ui::Palette>(), palette.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
setupCallbacks();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddSourceWindow::setupCallbacks()
|
|
||||||
{
|
|
||||||
window_->on_add_source([&](ui::AddSourceParam params) {
|
|
||||||
std::unique_ptr<mirai::DataProvider> file =
|
|
||||||
std::make_unique<mirai::MarkdownDataProvider>(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();
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
/*
|
|
||||||
* 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<slint::VectorModel<ui::Source>> sources_;
|
|
||||||
slint::ComponentHandle<ui::AddSourceWindow> window_ = ui::AddSourceWindow::create();
|
|
||||||
mirai::Mirai *miraiInstance_;
|
|
||||||
};
|
|
|
@ -1,45 +0,0 @@
|
||||||
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 <string> 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
|
|
|
@ -50,7 +50,8 @@ export global AppWindowActions {
|
||||||
callback source-clicked(int);
|
callback source-clicked(int);
|
||||||
callback open-settings-window();
|
callback open-settings-window();
|
||||||
callback open-add-source-window();
|
callback open-add-source-window();
|
||||||
callback open-edit-source-window(int);
|
callback add-source(name: string, path: string);
|
||||||
|
callback edit-source(sourceId: int, name: string, path: string);
|
||||||
|
|
||||||
callback open-new-task-form(OpenNewTaskFormParams);
|
callback open-new-task-form(OpenNewTaskFormParams);
|
||||||
callback open-edit-task-form(int, int);
|
callback open-edit-task-form(int, int);
|
||||||
|
|
|
@ -33,9 +33,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
AppWindow::AppWindow(mirai::Mirai *miraiInstance)
|
AppWindow::AppWindow(mirai::Mirai *miraiInstance)
|
||||||
: miraiInstance_(miraiInstance), addSourceWindow_(miraiInstance),
|
: miraiInstance_(miraiInstance), settingsWindow_(miraiInstance), view_(miraiInstance)
|
||||||
editSourceWindow_(miraiInstance), settingsWindow_(miraiInstance),
|
|
||||||
editEventWindow_(miraiInstance), view_(miraiInstance)
|
|
||||||
{
|
{
|
||||||
sources_ = std::make_shared<slint::VectorModel<ui::Source>>();
|
sources_ = std::make_shared<slint::VectorModel<ui::Source>>();
|
||||||
days_ = std::make_shared<slint::VectorModel<ui::Day>>();
|
days_ = std::make_shared<slint::VectorModel<ui::Day>>();
|
||||||
|
@ -105,6 +103,14 @@ void AppWindow::setupCallbacks()
|
||||||
return slint::SharedString(source->name());
|
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<mirai::MarkdownDataProvider *>(source->dataProvider());
|
||||||
|
return slint::SharedString(sourceProvider->path());
|
||||||
|
});
|
||||||
|
|
||||||
miraiInstance_->onSourceAdded([&](mirai::Source *source) {
|
miraiInstance_->onSourceAdded([&](mirai::Source *source) {
|
||||||
refreshModels();
|
refreshModels();
|
||||||
});
|
});
|
||||||
|
@ -118,15 +124,15 @@ void AppWindow::setupCallbacks()
|
||||||
settingsWindow_.open();
|
settingsWindow_.open();
|
||||||
});
|
});
|
||||||
actions().on_open_add_source_window([&]() {
|
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([&]() {
|
actions().on_open_add_event_window([&]() {
|
||||||
editEventWindow_.open();
|
// editEventWindow_.open();
|
||||||
});
|
});
|
||||||
|
|
||||||
actions().on_task_clicked([&](int sourceId, int taskId) {
|
actions().on_task_clicked([&](int sourceId, int taskId) {
|
||||||
|
@ -158,6 +164,16 @@ void AppWindow::setupCallbacks()
|
||||||
reloadTasks();
|
reloadTasks();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
actions().on_add_source([&](slint::SharedString name, slint::SharedString path) {
|
||||||
|
std::unique_ptr<mirai::DataProvider> file =
|
||||||
|
std::make_unique<mirai::MarkdownDataProvider>(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) {
|
actions().on_delete_task_clicked([&](int sourceId, int taskId) {
|
||||||
auto source = miraiInstance_->getSourceById(sourceId);
|
auto source = miraiInstance_->getSourceById(sourceId);
|
||||||
assert(source);
|
assert(source);
|
||||||
|
|
|
@ -6,9 +6,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../AddSourceWindow/AddSourceWindow.h"
|
|
||||||
#include "../EditEventWindow/EditEventWindow.h"
|
|
||||||
#include "../EditSourceWindow/EditSourceWindow.h"
|
|
||||||
#include "../SettingsWindow/SettingsWindow.h"
|
#include "../SettingsWindow/SettingsWindow.h"
|
||||||
#include "mirai-core/Mirai.h"
|
#include "mirai-core/Mirai.h"
|
||||||
#include "mirai-core/View.h"
|
#include "mirai-core/View.h"
|
||||||
|
@ -39,9 +36,6 @@ class AppWindow
|
||||||
|
|
||||||
slint::ComponentHandle<ui::AppWindow> mainWindow_ = ui::AppWindow::create();
|
slint::ComponentHandle<ui::AppWindow> mainWindow_ = ui::AppWindow::create();
|
||||||
SettingsWindow settingsWindow_;
|
SettingsWindow settingsWindow_;
|
||||||
AddSourceWindow addSourceWindow_;
|
|
||||||
EditSourceWindow editSourceWindow_;
|
|
||||||
EditEventWindow editEventWindow_;
|
|
||||||
|
|
||||||
mirai::Mirai *miraiInstance_;
|
mirai::Mirai *miraiInstance_;
|
||||||
mirai::View view_;
|
mirai::View view_;
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import { AppWindowModels } from "Models.slint";
|
import { AppWindowModels } from "Models.slint";
|
||||||
import { Button, VerticalBox, CheckBox } from "std-widgets.slint";
|
import { Button, VerticalBox, CheckBox } from "std-widgets.slint";
|
||||||
import { SideBar } from "views/SideBar.slint";
|
|
||||||
import { MainView } from "views/TasksView.slint";
|
import { MainView } from "views/TasksView.slint";
|
||||||
import { SettingsWindow } from "../SettingsWindow/SettingsWindow.slint";
|
import { SettingsWindow } from "../SettingsWindow/SettingsWindow.slint";
|
||||||
import { AddSourceWindow } from "../AddSourceWindow//AddSourceWindow.slint";
|
|
||||||
import { EditSourceWindow } from "../EditSourceWindow/EditSourceWindow.slint";
|
|
||||||
import { Palette } from "@selenite";
|
import { Palette } from "@selenite";
|
||||||
import { CalendarView } from "views/CalendarView.slint";
|
import { CalendarView } from "views/CalendarView.slint";
|
||||||
import { VButton } from "../../../external/selenite/components/Button.slint";
|
import { VButton } from "../../../external/selenite/components/Button.slint";
|
||||||
import { ToggleButton } from "../../../external/selenite/components/index.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 {
|
export component AppWindow inherits Window {
|
||||||
|
|
||||||
title: "Mirai";
|
title: "Mirai";
|
||||||
|
@ -43,7 +43,7 @@ export component AppWindow inherits Window {
|
||||||
active: show-tasks;
|
active: show-tasks;
|
||||||
clicked => { show-tasks = true }
|
clicked => { show-tasks = true }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SideBar {
|
SideBar {
|
||||||
min-width: 256px;
|
min-width: 256px;
|
||||||
}
|
}
|
||||||
|
@ -70,4 +70,4 @@ export component AppWindow inherits Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { AppWindowModels, Palette, SettingsWindow, AddSourceWindow, EditSourceWindow } // Export to make it visible to the C++ backend
|
export { AppWindowModels, Palette, SettingsWindow } // Export to make it visible to the C++ backend
|
||||||
|
|
|
@ -48,4 +48,5 @@ export global AppWindowModels {
|
||||||
|
|
||||||
callback get-source-id-from-name(string) -> int;
|
callback get-source-id-from-name(string) -> int;
|
||||||
pure callback get-source-name-from-id(int) -> string;
|
pure callback get-source-name-from-id(int) -> string;
|
||||||
|
pure callback get-source-path-from-id(int) -> string;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,11 @@ import { Button, VerticalBox, CheckBox, ScrollView, ComboBox } from "std-widgets
|
||||||
import { TaskLine } from "../../../components/TaskLine.slint";
|
import { TaskLine } from "../../../components/TaskLine.slint";
|
||||||
import { EventGroup } from "../../../components/EventGroup.slint";
|
import { EventGroup } from "../../../components/EventGroup.slint";
|
||||||
import { Calendar } from "../../../components/Calendar.slint";
|
import { Calendar } from "../../../components/Calendar.slint";
|
||||||
import { VPopupIconMenu, VDatePicker, VTimePicker, VCheckBox, VButton, VTag, VText, VTextInput, Svg, Palette } from "@selenite";
|
import { VDatePicker, VTimePicker, VCheckBox, VButton, VTag, VText, VTextInput, Svg, Palette } from "@selenite";
|
||||||
import { CreateTaskOrEvent } from "../../../components/CreateTaskOrEvent.slint";
|
import { CreateTaskOrEvent } from "../../../components/CreateTaskOrEvent.slint";
|
||||||
import { Utils } from "../../../shared/Utils.slint";
|
import { Utils } from "../../../shared/Utils.slint";
|
||||||
import { VActionButton } from "../../../../external/selenite/components/index.slint";
|
import { VActionButton } from "../../../../external/selenite/components/index.slint";
|
||||||
|
import { AddEventModal } from "../../../modals/AddEventModal.slint";
|
||||||
|
|
||||||
export component CalendarView inherits Rectangle {
|
export component CalendarView inherits Rectangle {
|
||||||
|
|
||||||
|
@ -15,53 +16,7 @@ export component CalendarView inherits Rectangle {
|
||||||
private property<string> icon-not-visible: Svg.not-visible;
|
private property<string> icon-not-visible: Svg.not-visible;
|
||||||
private property<bool> completed-tasks-visible: false;
|
private property<bool> completed-tasks-visible: false;
|
||||||
|
|
||||||
createEventPopup := PopupWindow {
|
createEventPopup := AddEventModal {}
|
||||||
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 {
|
VerticalLayout {
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
|
|
@ -1,9 +1,18 @@
|
||||||
import { AppWindowModels, TaskData } from "../Models.slint";
|
import { AppWindowModels, TaskData } from "../Models.slint";
|
||||||
import { AppWindowActions } from "../Actions.slint";
|
import { AppWindowActions } from "../Actions.slint";
|
||||||
import { VButton, ToggleButton, VActionButton, VText, Svg, Palette } from "@selenite";
|
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 {
|
export component SideBar inherits Rectangle {
|
||||||
|
|
||||||
|
function open-edit-source-window(source-id: int) {
|
||||||
|
editSourcePopup.edit(source-id)
|
||||||
|
}
|
||||||
|
|
||||||
|
addSourcePopup := AddSourceModal{}
|
||||||
|
editSourcePopup := EditSourceModal {}
|
||||||
|
|
||||||
VerticalLayout {
|
VerticalLayout {
|
||||||
height: parent.height;
|
height: parent.height;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
@ -25,7 +34,7 @@ export component SideBar inherits Rectangle {
|
||||||
icon-svg: Svg.plus;
|
icon-svg: Svg.plus;
|
||||||
icon-colorize: Palette.green;
|
icon-colorize: Palette.green;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
clicked => { AppWindowActions.open-add-source-window() }
|
clicked => { addSourcePopup.open() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VerticalLayout {
|
VerticalLayout {
|
||||||
|
@ -51,7 +60,7 @@ export component SideBar inherits Rectangle {
|
||||||
visible: parent.active;
|
visible: parent.active;
|
||||||
icon-svg: Svg.cog;
|
icon-svg: Svg.cog;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
clicked => { AppWindowActions.open-edit-source-window(item.id) }
|
clicked => { editSourcePopup.edit(item.id) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <bits/chrono.h>
|
|
||||||
#include <cassert>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <ctime>
|
|
||||||
#include <memory>
|
|
||||||
#include <optional>
|
|
||||||
#include <print>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
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<ui::Palette>(), palette.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
setupCallbacks();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditEventWindow::setupCallbacks()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditEventWindow::open()
|
|
||||||
{
|
|
||||||
window_->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditEventWindow::close()
|
|
||||||
{
|
|
||||||
window_->hide();
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* 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<slint::VectorModel<ui::Source>> sources_;
|
|
||||||
slint::ComponentHandle<ui::EditEventWindow> window_ = ui::EditEventWindow::create();
|
|
||||||
mirai::Mirai *miraiInstance_;
|
|
||||||
};
|
|
|
@ -1,68 +0,0 @@
|
||||||
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 <int> 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
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 <bits/chrono.h>
|
|
||||||
#include <cassert>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <ctime>
|
|
||||||
#include <optional>
|
|
||||||
#include <print>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
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<ui::Palette>(), 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<mirai::MarkdownDataProvider *>(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();
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* 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<slint::VectorModel<ui::Source>> sources_;
|
|
||||||
slint::ComponentHandle<ui::EditSourceWindow> window_ = ui::EditSourceWindow::create();
|
|
||||||
mirai::Mirai *miraiInstance_;
|
|
||||||
};
|
|
|
@ -1,53 +0,0 @@
|
||||||
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 <int> 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
|
|
Loading…
Add table
Add a link
Reference in a new issue