mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 01:17:34 +00:00
Calendar: Use new GML compiler
This commit is contained in:
parent
15a539a5b0
commit
14a99bb22d
10 changed files with 223 additions and 165 deletions
|
@ -179,7 +179,9 @@ static ErrorOr<Optional<String>> generate_enum_initializer_for(StringView proper
|
||||||
{ "button_style"sv, "Gfx::ButtonStyle"sv },
|
{ "button_style"sv, "Gfx::ButtonStyle"sv },
|
||||||
{ "opportunistic_resizee"sv, "GUI::Splitter::OpportunisticResizee"sv },
|
{ "opportunistic_resizee"sv, "GUI::Splitter::OpportunisticResizee"sv },
|
||||||
{ "checkbox_position"sv, "GUI::CheckBox::CheckBoxPosition"sv },
|
{ "checkbox_position"sv, "GUI::CheckBox::CheckBoxPosition"sv },
|
||||||
{ "button_style"sv, "Gfx::ButtonStyle"sv }
|
{ "button_style"sv, "Gfx::ButtonStyle"sv },
|
||||||
|
{ "mode"sv, "GUI::TextEditor::Mode"sv },
|
||||||
|
{ "font_weight"sv, "Gfx::FontWeight"sv },
|
||||||
};
|
};
|
||||||
|
|
||||||
auto const& enum_type_name = enum_properties.get(property_name);
|
auto const& enum_type_name = enum_properties.get(property_name);
|
||||||
|
@ -352,6 +354,8 @@ static ErrorOr<String> generate_cpp(NonnullRefPtr<GUI::GML::GMLFile> gml, Lexica
|
||||||
// For Gfx::ColorRole
|
// For Gfx::ColorRole
|
||||||
TRY(String::from_utf8("<LibGfx/SystemTheme.h>"sv)),
|
TRY(String::from_utf8("<LibGfx/SystemTheme.h>"sv)),
|
||||||
TRY(String::from_utf8("<LibGUI/Widget.h>"sv)),
|
TRY(String::from_utf8("<LibGUI/Widget.h>"sv)),
|
||||||
|
// For Gfx::FontWeight
|
||||||
|
TRY(String::from_utf8("<LibGfx/Font/FontDatabase.h>"sv)),
|
||||||
};
|
};
|
||||||
TRY(necessary_includes.try_set_from(always_necessary_includes));
|
TRY(necessary_includes.try_set_from(always_necessary_includes));
|
||||||
for (auto const& include : necessary_includes)
|
for (auto const& include : necessary_includes)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AddEventDialog.h"
|
#include "AddEventDialog.h"
|
||||||
#include <Applications/Calendar/AddEventDialogGML.h>
|
#include "AddEventWidget.h"
|
||||||
#include <LibCore/DateTime.h>
|
#include <LibCore/DateTime.h>
|
||||||
#include <LibGUI/BoxLayout.h>
|
#include <LibGUI/BoxLayout.h>
|
||||||
#include <LibGUI/Button.h>
|
#include <LibGUI/Button.h>
|
||||||
|
@ -25,12 +25,8 @@
|
||||||
|
|
||||||
namespace Calendar {
|
namespace Calendar {
|
||||||
|
|
||||||
static constexpr StringView DATE_FORMAT = "%Y-%m-%d"sv;
|
|
||||||
|
|
||||||
AddEventDialog::AddEventDialog(Core::DateTime date_time, EventManager& event_manager, Window* parent_window)
|
AddEventDialog::AddEventDialog(Core::DateTime date_time, EventManager& event_manager, Window* parent_window)
|
||||||
: Dialog(parent_window)
|
: Dialog(parent_window)
|
||||||
, m_start_date_time(Core::DateTime::create(date_time.year(), date_time.month(), date_time.day(), 12, 0))
|
|
||||||
, m_end_date_time(Core::DateTime::from_timestamp(m_start_date_time.timestamp() + (15 * 60)))
|
|
||||||
, m_event_manager(event_manager)
|
, m_event_manager(event_manager)
|
||||||
{
|
{
|
||||||
resize(360, 140);
|
resize(360, 140);
|
||||||
|
@ -38,113 +34,16 @@ AddEventDialog::AddEventDialog(Core::DateTime date_time, EventManager& event_man
|
||||||
set_resizable(false);
|
set_resizable(false);
|
||||||
set_icon(parent_window->icon());
|
set_icon(parent_window->icon());
|
||||||
|
|
||||||
dbgln("start time: {}", m_start_date_time.to_string().release_value_but_fixme_should_propagate_errors());
|
auto start_date_time = Core::DateTime::create(date_time.year(), date_time.month(), date_time.day(), 12, 0);
|
||||||
dbgln("end time: {}", m_end_date_time.to_string().release_value_but_fixme_should_propagate_errors());
|
auto main_widget = MUST(AddEventWidget::create(this,
|
||||||
|
start_date_time, Core::DateTime::from_timestamp(start_date_time.timestamp() + (15 * 60))));
|
||||||
|
|
||||||
auto widget = set_main_widget<GUI::Widget>();
|
set_main_widget(main_widget);
|
||||||
widget->load_from_gml(add_event_dialog_gml).release_value_but_fixme_should_propagate_errors();
|
|
||||||
|
|
||||||
auto& event_title_textbox = *widget->find_descendant_of_type_named<GUI::TextBox>("event_title_textbox");
|
|
||||||
event_title_textbox.set_focus(true);
|
|
||||||
|
|
||||||
m_start_date_box = *widget->find_descendant_of_type_named<GUI::TextBox>("start_date");
|
|
||||||
|
|
||||||
auto calendar_date_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/calendar-date.png"sv).release_value_but_fixme_should_propagate_errors();
|
|
||||||
|
|
||||||
auto& pick_start_date_button = *widget->find_descendant_of_type_named<GUI::Button>("pick_start_date");
|
|
||||||
pick_start_date_button.set_icon(calendar_date_icon);
|
|
||||||
pick_start_date_button.on_click = [&](auto) {
|
|
||||||
if (auto new_date = GUI::DatePicker::show(this, "Pick Start Date"_string, m_start_date_time); new_date.has_value()) {
|
|
||||||
m_start_date_time.set_date(new_date.value());
|
|
||||||
if (m_end_date_time < m_start_date_time) {
|
|
||||||
m_end_date_time.set_date(new_date.value());
|
|
||||||
update_end_date();
|
|
||||||
}
|
|
||||||
update_duration();
|
|
||||||
|
|
||||||
m_start_date_box->set_text(MUST(m_start_date_time.to_string(DATE_FORMAT)));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
m_start_hour_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("start_hour");
|
|
||||||
m_start_minute_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("start_minute");
|
|
||||||
|
|
||||||
m_end_date_box = *widget->find_descendant_of_type_named<GUI::TextBox>("end_date");
|
|
||||||
|
|
||||||
auto& pick_end_date_button = *widget->find_descendant_of_type_named<GUI::Button>("pick_end_date");
|
|
||||||
pick_end_date_button.set_icon(calendar_date_icon);
|
|
||||||
pick_end_date_button.on_click = [&](auto) {
|
|
||||||
if (auto new_date = GUI::DatePicker::show(this, "Pick End Date"_string, m_end_date_time); new_date.has_value()) {
|
|
||||||
m_end_date_time.set_date(new_date.value());
|
|
||||||
if (m_end_date_time < m_start_date_time) {
|
|
||||||
m_start_date_time.set_date(new_date.value());
|
|
||||||
update_start_date();
|
|
||||||
}
|
|
||||||
update_duration();
|
|
||||||
|
|
||||||
m_end_date_box->set_text(MUST(m_end_date_time.to_string(DATE_FORMAT)));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
m_end_hour_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("end_hour");
|
|
||||||
m_end_minute_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("end_minute");
|
|
||||||
|
|
||||||
m_duration_hour_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("duration_hour");
|
|
||||||
m_duration_minute_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("duration_minute");
|
|
||||||
|
|
||||||
auto& ok_button = *widget->find_descendant_of_type_named<GUI::Button>("ok_button");
|
|
||||||
ok_button.on_click = [&](auto) {
|
|
||||||
auto successful = add_event_to_calendar().release_value_but_fixme_should_propagate_errors();
|
|
||||||
if (!successful)
|
|
||||||
return;
|
|
||||||
done(ExecResult::OK);
|
|
||||||
};
|
|
||||||
|
|
||||||
auto& cancel_button = *widget->find_descendant_of_type_named<GUI::Button>("cancel_button");
|
|
||||||
cancel_button.on_click = [&](auto) { done(ExecResult::Cancel); };
|
|
||||||
|
|
||||||
auto update_starting_input_values = [&, this]() {
|
|
||||||
auto hour = m_start_hour_box->value();
|
|
||||||
auto minute = m_start_minute_box->value();
|
|
||||||
m_start_date_time.set_time_only(hour, minute);
|
|
||||||
if (m_end_date_time < m_start_date_time) {
|
|
||||||
m_end_date_time.set_time_only(hour, minute);
|
|
||||||
update_end_date();
|
|
||||||
}
|
|
||||||
update_duration();
|
|
||||||
};
|
|
||||||
auto update_ending_input_values = [&, this]() {
|
|
||||||
auto hour = m_end_hour_box->value();
|
|
||||||
auto minute = m_end_minute_box->value();
|
|
||||||
m_end_date_time.set_time_only(hour, minute);
|
|
||||||
if (m_end_date_time < m_start_date_time) {
|
|
||||||
m_start_date_time.set_time_only(hour, minute);
|
|
||||||
update_start_date();
|
|
||||||
}
|
|
||||||
update_duration();
|
|
||||||
};
|
|
||||||
auto update_duration_input_values = [&, this]() {
|
|
||||||
auto hour = m_duration_hour_box->value();
|
|
||||||
auto minute = m_duration_minute_box->value();
|
|
||||||
m_end_date_time = Core::DateTime::from_timestamp(m_start_date_time.timestamp() + (hour * 60 + minute) * 60);
|
|
||||||
update_end_date();
|
|
||||||
};
|
|
||||||
|
|
||||||
m_start_hour_box->on_change = [update_starting_input_values](auto) { update_starting_input_values(); };
|
|
||||||
m_start_minute_box->on_change = [update_starting_input_values](auto) { update_starting_input_values(); };
|
|
||||||
m_end_hour_box->on_change = [update_ending_input_values](auto) { update_ending_input_values(); };
|
|
||||||
m_end_minute_box->on_change = [update_ending_input_values](auto) { update_ending_input_values(); };
|
|
||||||
m_duration_hour_box->on_change = [update_duration_input_values](auto) { update_duration_input_values(); };
|
|
||||||
m_duration_minute_box->on_change = [update_duration_input_values](auto) { update_duration_input_values(); };
|
|
||||||
|
|
||||||
update_start_date();
|
|
||||||
update_end_date();
|
|
||||||
update_duration();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<bool> AddEventDialog::add_event_to_calendar()
|
ErrorOr<bool> AddEventDialog::add_event_to_calendar(Core::DateTime start_date_time, Core::DateTime end_date_time)
|
||||||
{
|
{
|
||||||
if (m_end_date_time < m_start_date_time) {
|
if (end_date_time < start_date_time) {
|
||||||
GUI::MessageBox::show_error(this, "The end date has to be after the start date."sv);
|
GUI::MessageBox::show_error(this, "The end date has to be after the start date."sv);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -152,35 +51,11 @@ ErrorOr<bool> AddEventDialog::add_event_to_calendar()
|
||||||
auto summary = find_descendant_of_type_named<GUI::TextBox>("event_title_textbox")->get_text();
|
auto summary = find_descendant_of_type_named<GUI::TextBox>("event_title_textbox")->get_text();
|
||||||
m_event_manager.add_event(Event {
|
m_event_manager.add_event(Event {
|
||||||
.summary = TRY(String::from_byte_string(summary)),
|
.summary = TRY(String::from_byte_string(summary)),
|
||||||
.start = m_start_date_time,
|
.start = start_date_time,
|
||||||
.end = m_end_date_time,
|
.end = end_date_time,
|
||||||
});
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddEventDialog::update_start_date()
|
|
||||||
{
|
|
||||||
m_start_date_box->set_text(MUST(m_start_date_time.to_string(DATE_FORMAT)));
|
|
||||||
m_start_hour_box->set_value(m_start_date_time.hour(), GUI::AllowCallback::No);
|
|
||||||
m_start_minute_box->set_value(m_start_date_time.minute(), GUI::AllowCallback::No);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddEventDialog::update_end_date()
|
|
||||||
{
|
|
||||||
m_end_date_box->set_text(MUST(m_end_date_time.to_string(DATE_FORMAT)));
|
|
||||||
m_end_hour_box->set_value(m_end_date_time.hour(), GUI::AllowCallback::No);
|
|
||||||
m_end_minute_box->set_value(m_end_date_time.minute(), GUI::AllowCallback::No);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddEventDialog::update_duration()
|
|
||||||
{
|
|
||||||
auto difference_in_seconds = m_end_date_time.timestamp() - m_start_date_time.timestamp();
|
|
||||||
auto hours = difference_in_seconds / (60 * 60);
|
|
||||||
auto minutes = (difference_in_seconds - hours * (60 * 60)) / 60;
|
|
||||||
|
|
||||||
m_duration_hour_box->set_value(hours, GUI::AllowCallback::No);
|
|
||||||
m_duration_minute_box->set_value(minutes, GUI::AllowCallback::No);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@GUI::Widget {
|
@Calendar::AddEventWidget {
|
||||||
fill_with_background_color: true
|
fill_with_background_color: true
|
||||||
layout: @GUI::VerticalBoxLayout {
|
layout: @GUI::VerticalBoxLayout {
|
||||||
margins: [4]
|
margins: [4]
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
#include "EventManager.h"
|
#include "EventManager.h"
|
||||||
#include <LibGUI/Calendar.h>
|
#include <LibGUI/Calendar.h>
|
||||||
#include <LibGUI/Dialog.h>
|
#include <LibGUI/Dialog.h>
|
||||||
#include <LibGUI/Model.h>
|
|
||||||
#include <LibGUI/Window.h>
|
#include <LibGUI/Window.h>
|
||||||
|
|
||||||
namespace Calendar {
|
namespace Calendar {
|
||||||
|
@ -27,27 +26,12 @@ public:
|
||||||
dialog->exec();
|
dialog->exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorOr<bool> add_event_to_calendar(Core::DateTime start_date_time, Core::DateTime end_date_time);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AddEventDialog(Core::DateTime date_time, EventManager& event_manager, Window* parent_window = nullptr);
|
AddEventDialog(Core::DateTime date_time, EventManager& event_manager, Window* parent_window = nullptr);
|
||||||
|
|
||||||
ErrorOr<bool> add_event_to_calendar();
|
|
||||||
|
|
||||||
void update_start_date();
|
|
||||||
void update_end_date();
|
|
||||||
void update_duration();
|
|
||||||
|
|
||||||
Core::DateTime m_start_date_time;
|
|
||||||
Core::DateTime m_end_date_time;
|
|
||||||
EventManager& m_event_manager;
|
EventManager& m_event_manager;
|
||||||
|
|
||||||
RefPtr<GUI::TextBox> m_start_date_box;
|
|
||||||
RefPtr<GUI::TextBox> m_end_date_box;
|
|
||||||
RefPtr<GUI::SpinBox> m_start_hour_box;
|
|
||||||
RefPtr<GUI::SpinBox> m_start_minute_box;
|
|
||||||
RefPtr<GUI::SpinBox> m_end_hour_box;
|
|
||||||
RefPtr<GUI::SpinBox> m_end_minute_box;
|
|
||||||
RefPtr<GUI::SpinBox> m_duration_hour_box;
|
|
||||||
RefPtr<GUI::SpinBox> m_duration_minute_box;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
148
Userland/Applications/Calendar/AddEventWidget.cpp
Normal file
148
Userland/Applications/Calendar/AddEventWidget.cpp
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, kleines Filmröllchen <filmroellchen@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "AddEventWidget.h"
|
||||||
|
#include <LibGUI/Button.h>
|
||||||
|
#include <LibGUI/DatePicker.h>
|
||||||
|
#include <LibGUI/Dialog.h>
|
||||||
|
#include <LibGUI/SpinBox.h>
|
||||||
|
#include <LibGUI/TextBox.h>
|
||||||
|
|
||||||
|
namespace Calendar {
|
||||||
|
|
||||||
|
static constexpr StringView DATE_FORMAT = "%Y-%m-%d"sv;
|
||||||
|
|
||||||
|
ErrorOr<NonnullRefPtr<AddEventWidget>> AddEventWidget::create(AddEventDialog* window, Core::DateTime start_time, Core::DateTime end_time)
|
||||||
|
{
|
||||||
|
auto widget = TRY(try_create());
|
||||||
|
widget->m_start_date_time = start_time;
|
||||||
|
widget->m_end_date_time = end_time;
|
||||||
|
|
||||||
|
auto& event_title_textbox = *widget->find_descendant_of_type_named<GUI::TextBox>("event_title_textbox");
|
||||||
|
event_title_textbox.set_focus(true);
|
||||||
|
|
||||||
|
widget->m_start_date_box = *widget->find_descendant_of_type_named<GUI::TextBox>("start_date");
|
||||||
|
|
||||||
|
auto calendar_date_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/calendar-date.png"sv).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
|
auto& pick_start_date_button = *widget->find_descendant_of_type_named<GUI::Button>("pick_start_date");
|
||||||
|
pick_start_date_button.set_icon(calendar_date_icon);
|
||||||
|
pick_start_date_button.on_click = [widget = widget, window = window](auto) {
|
||||||
|
if (auto new_date = GUI::DatePicker::show(window, "Pick Start Date"_string, widget->m_start_date_time); new_date.has_value()) {
|
||||||
|
widget->m_start_date_time.set_date(new_date.value());
|
||||||
|
if (widget->m_end_date_time < widget->m_start_date_time) {
|
||||||
|
widget->m_end_date_time.set_date(new_date.value());
|
||||||
|
widget->update_end_date();
|
||||||
|
}
|
||||||
|
widget->update_duration();
|
||||||
|
|
||||||
|
widget->m_start_date_box->set_text(MUST(widget->m_start_date_time.to_string(DATE_FORMAT)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
widget->m_start_hour_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("start_hour");
|
||||||
|
widget->m_start_minute_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("start_minute");
|
||||||
|
|
||||||
|
widget->m_end_date_box = *widget->find_descendant_of_type_named<GUI::TextBox>("end_date");
|
||||||
|
|
||||||
|
auto& pick_end_date_button = *widget->find_descendant_of_type_named<GUI::Button>("pick_end_date");
|
||||||
|
pick_end_date_button.set_icon(calendar_date_icon);
|
||||||
|
pick_end_date_button.on_click = [widget = widget, window = window](auto) {
|
||||||
|
if (auto new_date = GUI::DatePicker::show(window, "Pick End Date"_string, widget->m_end_date_time); new_date.has_value()) {
|
||||||
|
widget->m_end_date_time.set_date(new_date.value());
|
||||||
|
if (widget->m_end_date_time < widget->m_start_date_time) {
|
||||||
|
widget->m_start_date_time.set_date(new_date.value());
|
||||||
|
widget->update_start_date();
|
||||||
|
}
|
||||||
|
widget->update_duration();
|
||||||
|
|
||||||
|
widget->m_end_date_box->set_text(MUST(widget->m_end_date_time.to_string(DATE_FORMAT)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
widget->m_end_hour_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("end_hour");
|
||||||
|
widget->m_end_minute_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("end_minute");
|
||||||
|
|
||||||
|
widget->m_duration_hour_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("duration_hour");
|
||||||
|
widget->m_duration_minute_box = *widget->find_descendant_of_type_named<GUI::SpinBox>("duration_minute");
|
||||||
|
|
||||||
|
auto& ok_button = *widget->find_descendant_of_type_named<GUI::Button>("ok_button");
|
||||||
|
ok_button.on_click = [widget = widget, window = window](auto) {
|
||||||
|
auto successful = window->add_event_to_calendar(widget->m_start_date_time, widget->m_end_date_time).release_value_but_fixme_should_propagate_errors();
|
||||||
|
if (!successful)
|
||||||
|
return;
|
||||||
|
window->done(GUI::Dialog::ExecResult::OK);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto& cancel_button = *widget->find_descendant_of_type_named<GUI::Button>("cancel_button");
|
||||||
|
cancel_button.on_click = [window = window](auto) { window->done(GUI::Dialog::ExecResult::Cancel); };
|
||||||
|
|
||||||
|
auto update_starting_input_values = [widget = widget]() {
|
||||||
|
auto hour = widget->m_start_hour_box->value();
|
||||||
|
auto minute = widget->m_start_minute_box->value();
|
||||||
|
widget->m_start_date_time.set_time_only(hour, minute);
|
||||||
|
if (widget->m_end_date_time < widget->m_start_date_time) {
|
||||||
|
widget->m_end_date_time.set_time_only(hour, minute);
|
||||||
|
widget->update_end_date();
|
||||||
|
}
|
||||||
|
widget->update_duration();
|
||||||
|
};
|
||||||
|
auto update_ending_input_values = [widget = widget]() {
|
||||||
|
auto hour = widget->m_end_hour_box->value();
|
||||||
|
auto minute = widget->m_end_minute_box->value();
|
||||||
|
widget->m_end_date_time.set_time_only(hour, minute);
|
||||||
|
if (widget->m_end_date_time < widget->m_start_date_time) {
|
||||||
|
widget->m_start_date_time.set_time_only(hour, minute);
|
||||||
|
widget->update_start_date();
|
||||||
|
}
|
||||||
|
widget->update_duration();
|
||||||
|
};
|
||||||
|
auto update_duration_input_values = [widget]() {
|
||||||
|
auto hour = widget->m_duration_hour_box->value();
|
||||||
|
auto minute = widget->m_duration_minute_box->value();
|
||||||
|
widget->m_end_date_time = Core::DateTime::from_timestamp(widget->m_start_date_time.timestamp() + (hour * 60 + minute) * 60);
|
||||||
|
widget->update_end_date();
|
||||||
|
};
|
||||||
|
|
||||||
|
widget->m_start_hour_box->on_change = [update_starting_input_values](auto) { update_starting_input_values(); };
|
||||||
|
widget->m_start_minute_box->on_change = [update_starting_input_values](auto) { update_starting_input_values(); };
|
||||||
|
widget->m_end_hour_box->on_change = [update_ending_input_values](auto) { update_ending_input_values(); };
|
||||||
|
widget->m_end_minute_box->on_change = [update_ending_input_values](auto) { update_ending_input_values(); };
|
||||||
|
widget->m_duration_hour_box->on_change = [update_duration_input_values](auto) { update_duration_input_values(); };
|
||||||
|
widget->m_duration_minute_box->on_change = [update_duration_input_values](auto) { update_duration_input_values(); };
|
||||||
|
|
||||||
|
widget->update_start_date();
|
||||||
|
widget->update_end_date();
|
||||||
|
widget->update_duration();
|
||||||
|
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddEventWidget::update_start_date()
|
||||||
|
{
|
||||||
|
m_start_date_box->set_text(MUST(m_start_date_time.to_string(DATE_FORMAT)));
|
||||||
|
m_start_hour_box->set_value(m_start_date_time.hour(), GUI::AllowCallback::No);
|
||||||
|
m_start_minute_box->set_value(m_start_date_time.minute(), GUI::AllowCallback::No);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddEventWidget::update_end_date()
|
||||||
|
{
|
||||||
|
m_end_date_box->set_text(MUST(m_end_date_time.to_string(DATE_FORMAT)));
|
||||||
|
m_end_hour_box->set_value(m_end_date_time.hour(), GUI::AllowCallback::No);
|
||||||
|
m_end_minute_box->set_value(m_end_date_time.minute(), GUI::AllowCallback::No);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddEventWidget::update_duration()
|
||||||
|
{
|
||||||
|
auto difference_in_seconds = m_end_date_time.timestamp() - m_start_date_time.timestamp();
|
||||||
|
auto hours = difference_in_seconds / (60 * 60);
|
||||||
|
auto minutes = (difference_in_seconds - hours * (60 * 60)) / 60;
|
||||||
|
|
||||||
|
m_duration_hour_box->set_value(hours, GUI::AllowCallback::No);
|
||||||
|
m_duration_minute_box->set_value(minutes, GUI::AllowCallback::No);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
46
Userland/Applications/Calendar/AddEventWidget.h
Normal file
46
Userland/Applications/Calendar/AddEventWidget.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, kleines Filmröllchen <filmroellchen@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "AddEventDialog.h"
|
||||||
|
#include "EventManager.h"
|
||||||
|
#include <LibGUI/Calendar.h>
|
||||||
|
#include <LibGUI/Dialog.h>
|
||||||
|
#include <LibGUI/Model.h>
|
||||||
|
#include <LibGUI/Window.h>
|
||||||
|
|
||||||
|
namespace Calendar {
|
||||||
|
|
||||||
|
class AddEventWidget final : public GUI::Widget {
|
||||||
|
C_OBJECT(AddEventWidget);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static ErrorOr<NonnullRefPtr<AddEventWidget>> create(AddEventDialog*, Core::DateTime start_time, Core::DateTime end_time);
|
||||||
|
virtual ~AddEventWidget() override = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
AddEventWidget() = default;
|
||||||
|
static ErrorOr<NonnullRefPtr<AddEventWidget>> try_create();
|
||||||
|
|
||||||
|
void update_start_date();
|
||||||
|
void update_end_date();
|
||||||
|
void update_duration();
|
||||||
|
|
||||||
|
Core::DateTime m_start_date_time;
|
||||||
|
Core::DateTime m_end_date_time;
|
||||||
|
|
||||||
|
RefPtr<GUI::TextBox> m_start_date_box;
|
||||||
|
RefPtr<GUI::TextBox> m_end_date_box;
|
||||||
|
RefPtr<GUI::SpinBox> m_start_hour_box;
|
||||||
|
RefPtr<GUI::SpinBox> m_start_minute_box;
|
||||||
|
RefPtr<GUI::SpinBox> m_end_hour_box;
|
||||||
|
RefPtr<GUI::SpinBox> m_end_minute_box;
|
||||||
|
RefPtr<GUI::SpinBox> m_duration_hour_box;
|
||||||
|
RefPtr<GUI::SpinBox> m_duration_minute_box;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -3,20 +3,19 @@ serenity_component(
|
||||||
TARGETS Calendar
|
TARGETS Calendar
|
||||||
)
|
)
|
||||||
|
|
||||||
stringify_gml(CalendarWindow.gml CalendarWindowGML.h calendar_window_gml)
|
compile_gml(CalendarWidget.gml CalendarWidgetGML.cpp)
|
||||||
stringify_gml(AddEventDialog.gml AddEventDialogGML.h add_event_dialog_gml)
|
compile_gml(AddEventDialog.gml AddEventDialogGML.cpp)
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
AddEventDialog.cpp
|
AddEventDialog.cpp
|
||||||
|
AddEventDialogGML.cpp
|
||||||
|
AddEventWidget.cpp
|
||||||
CalendarWidget.cpp
|
CalendarWidget.cpp
|
||||||
|
CalendarWidgetGML.cpp
|
||||||
EventCalendar.cpp
|
EventCalendar.cpp
|
||||||
EventManager.cpp
|
EventManager.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(GENERATED_SOURCES
|
|
||||||
CalendarWindowGML.h AddEventDialogGML.h
|
|
||||||
)
|
|
||||||
|
|
||||||
serenity_app(Calendar ICON app-calendar)
|
serenity_app(Calendar ICON app-calendar)
|
||||||
target_link_libraries(Calendar PRIVATE LibConfig LibCore LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibMain LibDesktop)
|
target_link_libraries(Calendar PRIVATE LibConfig LibCore LibFileSystem LibFileSystemAccessClient LibGfx LibGUI LibMain LibDesktop)
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include "AddEventDialog.h"
|
#include "AddEventDialog.h"
|
||||||
#include <AK/JsonParser.h>
|
#include <AK/JsonParser.h>
|
||||||
#include <AK/LexicalPath.h>
|
#include <AK/LexicalPath.h>
|
||||||
#include <Applications/Calendar/CalendarWindowGML.h>
|
|
||||||
#include <LibConfig/Client.h>
|
#include <LibConfig/Client.h>
|
||||||
#include <LibCore/System.h>
|
#include <LibCore/System.h>
|
||||||
#include <LibDesktop/Launcher.h>
|
#include <LibDesktop/Launcher.h>
|
||||||
|
@ -31,8 +30,7 @@ namespace Calendar {
|
||||||
|
|
||||||
ErrorOr<NonnullRefPtr<CalendarWidget>> CalendarWidget::create(GUI::Window* parent_window)
|
ErrorOr<NonnullRefPtr<CalendarWidget>> CalendarWidget::create(GUI::Window* parent_window)
|
||||||
{
|
{
|
||||||
auto widget = TRY(AK::adopt_nonnull_ref_or_enomem(new (nothrow) CalendarWidget));
|
auto widget = TRY(CalendarWidget::try_create());
|
||||||
TRY(widget->load_from_gml(calendar_window_gml));
|
|
||||||
|
|
||||||
widget->m_event_calendar = widget->find_descendant_of_type_named<EventCalendar>("calendar");
|
widget->m_event_calendar = widget->find_descendant_of_type_named<EventCalendar>("calendar");
|
||||||
widget->create_on_events_change();
|
widget->create_on_events_change();
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@GUI::Widget {
|
@Calendar::CalendarWidget {
|
||||||
fill_with_background_color: true
|
fill_with_background_color: true
|
||||||
layout: @GUI::VerticalBoxLayout {}
|
layout: @GUI::VerticalBoxLayout {}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@::Calendar::EventCalendar {
|
@Calendar::EventCalendar {
|
||||||
name: "calendar"
|
name: "calendar"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
#include "EventCalendar.h"
|
#include "EventCalendar.h"
|
||||||
#include <AK/NonnullRefPtr.h>
|
#include <AK/NonnullRefPtr.h>
|
||||||
#include <LibFileSystemAccessClient/Client.h>
|
#include <LibFileSystemAccessClient/Client.h>
|
||||||
|
#include <LibGUI/ActionGroup.h>
|
||||||
#include <LibGUI/Calendar.h>
|
#include <LibGUI/Calendar.h>
|
||||||
#include <LibGUI/Widget.h>
|
#include <LibGUI/Widget.h>
|
||||||
|
|
||||||
|
@ -28,6 +29,9 @@ public:
|
||||||
bool request_close();
|
bool request_close();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
CalendarWidget() = default;
|
||||||
|
static ErrorOr<NonnullRefPtr<CalendarWidget>> try_create();
|
||||||
|
|
||||||
void create_on_tile_doubleclick();
|
void create_on_tile_doubleclick();
|
||||||
|
|
||||||
String const& current_filename() const { return m_event_calendar->event_manager().current_filename(); }
|
String const& current_filename() const { return m_event_calendar->event_manager().current_filename(); }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue