diff options
author | rhin123 <ryanrhin@gmail.com> | 2020-04-09 17:05:01 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-04-10 11:28:34 +0200 |
commit | 06604c3786eac03ccf4ca148efb4f05bc50f6bc2 (patch) | |
tree | 492f5a6c029171e0e27dbe8fc03a0618001871a0 | |
parent | 4f48fcdb94d52c619c4a31d70dd747a8846422c7 (diff) | |
download | serenity-06604c3786eac03ccf4ca148efb4f05bc50f6bc2.zip |
Calendar: Implement add event UI
-rw-r--r-- | Applications/Calendar/AddEventDialog.cpp | 106 | ||||
-rw-r--r-- | Applications/Calendar/AddEventDialog.h | 31 | ||||
-rw-r--r-- | Applications/Calendar/Calendar.cpp | 2 | ||||
-rw-r--r-- | Applications/Calendar/Calendar.h | 5 | ||||
-rw-r--r-- | Applications/Calendar/CalendarWidget.cpp | 17 | ||||
-rw-r--r-- | Applications/Calendar/CalendarWidget.h | 4 |
6 files changed, 145 insertions, 20 deletions
diff --git a/Applications/Calendar/AddEventDialog.cpp b/Applications/Calendar/AddEventDialog.cpp index 8e5fab9908..50f1080ed7 100644 --- a/Applications/Calendar/AddEventDialog.cpp +++ b/Applications/Calendar/AddEventDialog.cpp @@ -28,43 +28,78 @@ #include <LibCore/DateTime.h> #include <LibGUI/BoxLayout.h> #include <LibGUI/Button.h> +#include <LibGUI/ComboBox.h> #include <LibGUI/Label.h> #include <LibGUI/Layout.h> #include <LibGUI/Painter.h> +#include <LibGUI/SpinBox.h> +#include <LibGUI/TextBox.h> #include <LibGUI/Widget.h> #include <LibGUI/Window.h> #include <LibGfx/Color.h> #include <LibGfx/Font.h> -AddEventDialog::AddEventDialog(Calendar* calendar, Window* parent_window) +AddEventDialog::AddEventDialog(RefPtr<Calendar> calendar, Core::DateTime date_time, Window* parent_window) : Dialog(parent_window) , m_calendar(calendar) + , m_date_time(date_time) { - resize(230, 120); + resize(158, 100); set_title("Add Event"); set_resizable(false); auto& widget = set_main_widget<GUI::Widget>(); widget.set_fill_with_background_color(true); - widget.set_layout<GUI::HorizontalBoxLayout>(); + widget.set_layout<GUI::VerticalBoxLayout>(); - auto& main_container = widget.add<GUI::Widget>(); - main_container.set_layout<GUI::VerticalBoxLayout>(); - main_container.layout()->set_margins({ 4, 4, 4, 4 }); + auto& top_container = widget.add<GUI::Widget>(); + top_container.set_layout<GUI::VerticalBoxLayout>(); + top_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); + top_container.set_preferred_size(0, 45); + top_container.layout()->set_margins({ 4, 4, 4, 4 }); - auto make_label = [&](const StringView& text, bool bold = false) { - auto& label = main_container.add<GUI::Label>(text); + auto make_label = [&](const StringView& text, GUI::Widget& widget, bool bold = false) { + auto& label = widget.add<GUI::Label>(text); label.set_text_alignment(Gfx::TextAlignment::CenterLeft); label.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); label.set_preferred_size(0, 14); if (bold) label.set_font(Gfx::Font::default_bold_font()); }; - make_label("TODO: Implement add event dialog", true); + make_label("Add title & date:", top_container, true); - main_container.layout()->add_spacer(); + auto& event_title_textbox = top_container.add<GUI::TextBox>(); + event_title_textbox.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); + event_title_textbox.set_preferred_size(0, 20); - auto& button_container = main_container.add<GUI::Widget>(); + auto& middle_container = widget.add<GUI::Widget>(); + middle_container.set_layout<GUI::HorizontalBoxLayout>(); + middle_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); + middle_container.set_preferred_size(0, 25); + middle_container.layout()->set_margins({ 4, 4, 4, 4 }); + + auto& starting_month_combo = middle_container.add<GUI::ComboBox>(); + starting_month_combo.set_only_allow_values_from_model(true); + starting_month_combo.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); + starting_month_combo.set_preferred_size(50, 20); + starting_month_combo.set_model(MonthListModel::create()); + starting_month_combo.set_selected_index(m_date_time.month() - 1); + + auto& starting_day_combo = middle_container.add<GUI::SpinBox>(); + starting_day_combo.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); + starting_day_combo.set_preferred_size(40, 20); + starting_day_combo.set_value(m_date_time.day()); + starting_day_combo.set_min(1); + + auto& starting_year_combo = middle_container.add<GUI::SpinBox>(); + starting_year_combo.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); + starting_year_combo.set_preferred_size(55, 20); + starting_year_combo.set_range(0, 9999); + starting_year_combo.set_value(m_date_time.year()); + + widget.layout()->add_spacer(); + + auto& button_container = widget.add<GUI::Widget>(); button_container.set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fixed); button_container.set_preferred_size(0, 20); button_container.set_layout<GUI::HorizontalBoxLayout>(); @@ -73,10 +108,59 @@ AddEventDialog::AddEventDialog(Calendar* calendar, Window* parent_window) ok_button.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); ok_button.set_preferred_size(80, 20); ok_button.on_click = [this] { + dbg() << "TODO: Add event icon on specific tile"; done(Dialog::ExecOK); }; + + event_title_textbox.set_focus(true); } AddEventDialog::~AddEventDialog() { } + +AddEventDialog::MonthListModel::MonthListModel() +{ +} + +AddEventDialog::MonthListModel::~MonthListModel() +{ +} + +void AddEventDialog::MonthListModel::update() +{ +} + +int AddEventDialog::MonthListModel::row_count(const GUI::ModelIndex&) const +{ + return 12; +} + +String AddEventDialog::MonthListModel::column_name(int column) const +{ + switch (column) { + case Column::Month: + return "Month"; + default: + ASSERT_NOT_REACHED(); + } +} + +GUI::Model::ColumnMetadata AddEventDialog::MonthListModel::column_metadata([[maybe_unused]] int column) const +{ + return {}; +} + +GUI::Variant AddEventDialog::MonthListModel::data(const GUI::ModelIndex& index, Role role) const +{ + auto& month = Calendar::name_of_month(index.row() + 1); + if (role == Role::Display) { + switch (index.column()) { + case Column::Month: + return month; + default: + ASSERT_NOT_REACHED(); + } + } + return {}; +} diff --git a/Applications/Calendar/AddEventDialog.h b/Applications/Calendar/AddEventDialog.h index 27102284da..ff03044f7d 100644 --- a/Applications/Calendar/AddEventDialog.h +++ b/Applications/Calendar/AddEventDialog.h @@ -28,6 +28,7 @@ #include "Calendar.h" #include <LibGUI/Dialog.h> +#include <LibGUI/Model.h> #include <LibGUI/Window.h> class AddEventDialog final : public GUI::Dialog { @@ -35,14 +36,36 @@ class AddEventDialog final : public GUI::Dialog { public: virtual ~AddEventDialog() override; - static void show(Calendar* calendar, Window* parent_window = nullptr) + static void show(RefPtr<Calendar> calendar, Core::DateTime date_time, Window* parent_window = nullptr) { - auto dialog = AddEventDialog::construct(calendar, parent_window); + auto dialog = AddEventDialog::construct(calendar, date_time, parent_window); dialog->exec(); } private: - AddEventDialog(Calendar* calendar, Window* parent_window = nullptr); + AddEventDialog(RefPtr<Calendar> calendar, Core::DateTime date_time, Window* parent_window = nullptr); - Calendar* m_calendar; + class MonthListModel final : public GUI::Model { + public: + enum Column { + Month, + __Count, + }; + + static NonnullRefPtr<MonthListModel> create() { return adopt(*new MonthListModel); } + virtual ~MonthListModel() override; + + virtual int row_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override; + virtual int column_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override { return Column::__Count; } + virtual String column_name(int) const override; + virtual ColumnMetadata column_metadata(int) const override; + virtual GUI::Variant data(const GUI::ModelIndex&, Role = Role::Display) const override; + virtual void update() override; + + private: + MonthListModel(); + }; + + RefPtr<Calendar> m_calendar; + Core::DateTime m_date_time; }; diff --git a/Applications/Calendar/Calendar.cpp b/Applications/Calendar/Calendar.cpp index bf09ee117c..f921169b2f 100644 --- a/Applications/Calendar/Calendar.cpp +++ b/Applications/Calendar/Calendar.cpp @@ -26,7 +26,7 @@ #include "Calendar.h" -const String name_of_month(int month) +const String Calendar::name_of_month(int month) { static const String month_names[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; return month_names[month - 1]; diff --git a/Applications/Calendar/Calendar.h b/Applications/Calendar/Calendar.h index 3472d190fb..4ec979cb2d 100644 --- a/Applications/Calendar/Calendar.h +++ b/Applications/Calendar/Calendar.h @@ -31,8 +31,10 @@ const String name_of_month(int month); -class Calendar final { +class Calendar final : public RefCounted<Calendar> { public: + static const String name_of_month(int month); + Calendar(Core::DateTime date_time); ~Calendar(); @@ -41,6 +43,7 @@ public: int selected_year() const { return m_selected_year; } int selected_month() const { return m_selected_month; } bool is_today(Core::DateTime date_time) const; + void add_event(Core::DateTime date_time); private: Core::DateTime m_date_time; diff --git a/Applications/Calendar/CalendarWidget.cpp b/Applications/Calendar/CalendarWidget.cpp index 498f23ee57..79486fa8c9 100644 --- a/Applications/Calendar/CalendarWidget.cpp +++ b/Applications/Calendar/CalendarWidget.cpp @@ -101,7 +101,7 @@ CalendarWidget::CalendarWidget() m_add_event_button->set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); m_add_event_button->set_preferred_size(100, 25); m_add_event_button->on_click = [this] { - AddEventDialog::show(m_calendar, window()); + show_add_event_window(); }; update_calendar_tiles(m_calendar->selected_year(), m_calendar->selected_month()); @@ -110,6 +110,7 @@ CalendarWidget::CalendarWidget() CalendarWidget::~CalendarWidget() { } + void CalendarWidget::resize_event(GUI::ResizeEvent& event) { if (event.size().width() < 350) { @@ -193,6 +194,11 @@ void CalendarWidget::update_calendar_tiles(int target_year, int target_month) m_selected_date_label->set_text(m_calendar->selected_date_text()); } +void CalendarWidget::show_add_event_window() +{ + AddEventDialog::show(*move(m_calendar), Core::DateTime::now(), window()); +} + CalendarWidget::CalendarTile::CalendarTile(Calendar& calendar, int index, Core::DateTime date_time) : m_index(index) , m_date_time(date_time) @@ -213,13 +219,20 @@ void CalendarWidget::CalendarTile::update_values(Calendar& calendar, int index, m_weekday_name = m_day_names[index]; } - m_display_date = (m_date_time.day() == 1) ? String::format("%s %d", name_of_month(m_date_time.month()).characters(), m_date_time.day()) : String::number(m_date_time.day()); + m_display_date = (m_date_time.day() == 1) ? String::format("%s %d", Calendar::name_of_month(m_date_time.month()).characters(), m_date_time.day()) : String::number(m_date_time.day()); } CalendarWidget::CalendarTile::~CalendarTile() { } +void CalendarWidget::CalendarTile::doubleclick_event(GUI::MouseEvent& event) +{ + GUI::Widget::doubleclick_event(event); + //TOOD: Should be calling show_add_event_window. Would we just replace m_calender /w m_calender_widget? + AddEventDialog::show(&m_calendar, m_date_time, window()); +} + void CalendarWidget::CalendarTile::paint_event(GUI::PaintEvent& event) { GUI::Frame::paint_event(event); diff --git a/Applications/Calendar/CalendarWidget.h b/Applications/Calendar/CalendarWidget.h index 9a23846b19..41c0036c3a 100644 --- a/Applications/Calendar/CalendarWidget.h +++ b/Applications/Calendar/CalendarWidget.h @@ -38,11 +38,12 @@ public: CalendarWidget(); virtual ~CalendarWidget() override; + void show_add_event_window(); + private: virtual void resize_event(GUI::ResizeEvent&) override; void update_calendar_tiles(int target_year, int target_month); - void show_add_event_window(Calendar* calendar); OwnPtr<Calendar> m_calendar; RefPtr<GUI::Widget> m_top_container; @@ -60,6 +61,7 @@ private: virtual ~CalendarTile() override; private: + virtual void doubleclick_event(GUI::MouseEvent&) override; virtual void paint_event(GUI::PaintEvent&) override; int m_index { 0 }; |