diff options
author | Olivier De Cannière <olivier.decanniere96@gmail.com> | 2022-07-16 01:33:39 +0200 |
---|---|---|
committer | Tim Flynn <trflynn89@pm.me> | 2022-09-20 13:12:00 -0400 |
commit | 0eceed4fd72697a4e9bebf23c06b300637296361 (patch) | |
tree | d86a063a4af7e391fa3db61568d139d7df68e98c /Userland | |
parent | 9414525d7552434d2099aaeb17b861ba57e55d54 (diff) | |
download | serenity-0eceed4fd72697a4e9bebf23c06b300637296361.zip |
Calendar: Add a Calendar settings dialog for the first day of the week
This commit adds a new settings dialog for the Calendar application and
applet. It allows the user to specify their preferred first day of the
week.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Applications/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Applications/Calendar/main.cpp | 4 | ||||
-rw-r--r-- | Userland/Applications/CalendarSettings/CMakeLists.txt | 17 | ||||
-rw-r--r-- | Userland/Applications/CalendarSettings/CalendarSettingsWidget.cpp | 33 | ||||
-rw-r--r-- | Userland/Applications/CalendarSettings/CalendarSettingsWidget.gml | 38 | ||||
-rw-r--r-- | Userland/Applications/CalendarSettings/CalendarSettingsWidget.h | 23 | ||||
-rw-r--r-- | Userland/Applications/CalendarSettings/main.cpp | 42 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/Calendar.cpp | 10 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/Calendar.h | 2 | ||||
-rw-r--r-- | Userland/Services/Taskbar/TaskbarWindow.cpp | 3 | ||||
-rw-r--r-- | Userland/Services/Taskbar/main.cpp | 2 |
11 files changed, 173 insertions, 2 deletions
diff --git a/Userland/Applications/CMakeLists.txt b/Userland/Applications/CMakeLists.txt index 3842e2e6ac..936366cc3f 100644 --- a/Userland/Applications/CMakeLists.txt +++ b/Userland/Applications/CMakeLists.txt @@ -6,6 +6,7 @@ add_subdirectory(Browser) add_subdirectory(BrowserSettings) add_subdirectory(Calculator) add_subdirectory(Calendar) +add_subdirectory(CalendarSettings) add_subdirectory(CharacterMap) add_subdirectory(ClockSettings) add_subdirectory(CrashReporter) diff --git a/Userland/Applications/Calendar/main.cpp b/Userland/Applications/Calendar/main.cpp index 67a5d50935..b1c7d7223b 100644 --- a/Userland/Applications/Calendar/main.cpp +++ b/Userland/Applications/Calendar/main.cpp @@ -6,12 +6,12 @@ #include "AddEventDialog.h" #include <Applications/Calendar/CalendarWindowGML.h> +#include <LibConfig/Client.h> #include <LibCore/System.h> #include <LibGUI/Action.h> #include <LibGUI/ActionGroup.h> #include <LibGUI/Application.h> #include <LibGUI/BoxLayout.h> -#include <LibGUI/Button.h> #include <LibGUI/Calendar.h> #include <LibGUI/Icon.h> #include <LibGUI/Menu.h> @@ -26,6 +26,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) auto app = TRY(GUI::Application::try_create(arguments)); + Config::pledge_domain("Calendar"); + TRY(Core::System::pledge("stdio recvfd sendfd rpath")); TRY(Core::System::unveil("/etc/timezone", "r")); TRY(Core::System::unveil("/res", "r")); diff --git a/Userland/Applications/CalendarSettings/CMakeLists.txt b/Userland/Applications/CalendarSettings/CMakeLists.txt new file mode 100644 index 0000000000..986dfef173 --- /dev/null +++ b/Userland/Applications/CalendarSettings/CMakeLists.txt @@ -0,0 +1,17 @@ +serenity_component( + CalendarSettings + RECOMMENDED + TARGETS CalendarSettings +) + +compile_gml(CalendarSettingsWidget.gml CalendarSettingsWidgetGML.h calendar_settings_widget_gml) + +set(SOURCES + main.cpp + CalendarSettingsWidget.cpp + CalendarSettingsWidget.h + CalendarSettingsWidgetGML.h +) + +serenity_app(CalendarSettings ICON app-calendar) +target_link_libraries(CalendarSettings LibConfig LibGUI LibMain) diff --git a/Userland/Applications/CalendarSettings/CalendarSettingsWidget.cpp b/Userland/Applications/CalendarSettings/CalendarSettingsWidget.cpp new file mode 100644 index 0000000000..72d4976f86 --- /dev/null +++ b/Userland/Applications/CalendarSettings/CalendarSettingsWidget.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022-2022, Olivier De Cannière <olivier.decanniere96@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "CalendarSettingsWidget.h" +#include <AK/DateConstants.h> +#include <Applications/CalendarSettings/CalendarSettingsWidgetGML.h> +#include <LibConfig/Client.h> +#include <LibGUI/ItemListModel.h> + +void CalendarSettingsWidget::apply_settings() +{ + Config::write_string("Calendar"sv, "View"sv, "FirstDayOfWeek"sv, m_first_day_of_week_combobox->text()); +} + +void CalendarSettingsWidget::reset_default_values() +{ + m_first_day_of_week_combobox->set_text("Sunday"); +} + +CalendarSettingsWidget::CalendarSettingsWidget() +{ + load_from_gml(calendar_settings_widget_gml); + m_first_day_of_week_combobox = *find_descendant_of_type_named<GUI::ComboBox>("first_day_of_week"); + m_first_day_of_week_combobox->set_text(Config::read_string("Calendar"sv, "View"sv, "FirstDayOfWeek"sv, "Sunday"sv)); + m_first_day_of_week_combobox->set_only_allow_values_from_model(true); + m_first_day_of_week_combobox->set_model(*GUI::ItemListModel<StringView, Array<StringView, 7>>::create(AK::long_day_names)); + m_first_day_of_week_combobox->on_change = [&](auto, auto) { + set_modified(true); + }; +} diff --git a/Userland/Applications/CalendarSettings/CalendarSettingsWidget.gml b/Userland/Applications/CalendarSettings/CalendarSettingsWidget.gml new file mode 100644 index 0000000000..8403a640e5 --- /dev/null +++ b/Userland/Applications/CalendarSettings/CalendarSettingsWidget.gml @@ -0,0 +1,38 @@ +@GUI::Frame { + fill_with_background_color: true + layout: @GUI::VerticalBoxLayout { + margins: [8] + spacing: 5 + } + + @GUI::GroupBox { + title: "Preferred first day of week" + fixed_height: 72 + layout: @GUI::VerticalBoxLayout { + margins: [6] + spacing: 2 + } + + @GUI::Label { + text: "Determines which day a week starts with in the calendar view." + word_wrap: true + text_alignment: "CenterLeft" + } + + @GUI::Widget { + layout: @GUI::HorizontalBoxLayout { + spacing: 16 + } + + @GUI::Label { + text: "First day:" + text_alignment: "CenterLeft" + fixed_width: 70 + } + + @GUI::ComboBox { + name: "first_day_of_week" + } + } + } +} diff --git a/Userland/Applications/CalendarSettings/CalendarSettingsWidget.h b/Userland/Applications/CalendarSettings/CalendarSettingsWidget.h new file mode 100644 index 0000000000..b033537472 --- /dev/null +++ b/Userland/Applications/CalendarSettings/CalendarSettingsWidget.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022-2022, Olivier De Cannière <olivier.decanniere96@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibGUI/ComboBox.h> +#include <LibGUI/SettingsWindow.h> + +class CalendarSettingsWidget final : public GUI::SettingsWindow::Tab { + C_OBJECT(CalendarSettingsWidget) + +public: + virtual void apply_settings() override; + virtual void reset_default_values() override; + +private: + CalendarSettingsWidget(); + + RefPtr<GUI::ComboBox> m_first_day_of_week_combobox; +}; diff --git a/Userland/Applications/CalendarSettings/main.cpp b/Userland/Applications/CalendarSettings/main.cpp new file mode 100644 index 0000000000..1ff2cf5fec --- /dev/null +++ b/Userland/Applications/CalendarSettings/main.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022-2022, Olivier De Cannière <olivier.decanniere96@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "CalendarSettingsWidget.h" +#include <LibConfig/Client.h> +#include <LibCore/ArgsParser.h> +#include <LibCore/System.h> +#include <LibGUI/Application.h> +#include <LibGUI/Icon.h> +#include <LibGUI/SettingsWindow.h> +#include <LibMain/Main.h> + +ErrorOr<int> serenity_main(Main::Arguments arguments) +{ + TRY(Core::System::pledge("stdio rpath recvfd sendfd unix")); + + auto app = TRY(GUI::Application::try_create(arguments)); + + Config::pledge_domain("Calendar"); + + StringView selected_tab; + Core::ArgsParser args_parser; + args_parser.add_option(selected_tab, "Tab, only option is 'calendar'", "open-tab", 't', "tab"); + args_parser.parse(arguments); + + TRY(Core::System::pledge("stdio rpath recvfd sendfd")); + TRY(Core::System::unveil("/res", "r")); + TRY(Core::System::unveil(nullptr, nullptr)); + + auto app_icon = GUI::Icon::default_icon("app-calendar"sv); + + auto window = TRY(GUI::SettingsWindow::create("Calendar Settings", GUI::SettingsWindow::ShowDefaultsButton::Yes)); + (void)TRY(window->add_tab<CalendarSettingsWidget>("Calendar"sv, "Calendar"sv)); + window->set_icon(app_icon.bitmap_for_size(16)); + window->set_active_tab(selected_tab); + + window->show(); + return app->exec(); +} diff --git a/Userland/Libraries/LibGUI/Calendar.cpp b/Userland/Libraries/LibGUI/Calendar.cpp index 1ce01c89be..2de848fa4b 100644 --- a/Userland/Libraries/LibGUI/Calendar.cpp +++ b/Userland/Libraries/LibGUI/Calendar.cpp @@ -6,6 +6,7 @@ */ #include <AK/DateConstants.h> +#include <LibConfig/Client.h> #include <LibCore/DateTime.h> #include <LibGUI/Calendar.h> #include <LibGUI/Painter.h> @@ -26,6 +27,9 @@ Calendar::Calendar(Core::DateTime date_time, Mode mode) : m_selected_date(date_time) , m_mode(mode) { + auto first_day_of_week = Config::read_string("Calendar"sv, "View"sv, "FirstDayOfWeek"sv, "Sunday"sv); + m_first_day_of_week = static_cast<DayOfWeek>(day_of_week_index(first_day_of_week)); + set_fill_with_background_color(true); for (int i = 0; i < 7; i++) { @@ -736,4 +740,10 @@ void Calendar::doubleclick_event(GUI::MouseEvent& event) } } } + +size_t Calendar::day_of_week_index(String const& day_name) +{ + auto const& day_names = AK::long_day_names; + return AK::find_index(day_names.begin(), day_names.end(), day_name); +} } diff --git a/Userland/Libraries/LibGUI/Calendar.h b/Userland/Libraries/LibGUI/Calendar.h index 9ca630cf44..79c105d913 100644 --- a/Userland/Libraries/LibGUI/Calendar.h +++ b/Userland/Libraries/LibGUI/Calendar.h @@ -75,6 +75,8 @@ private: Calendar(Core::DateTime date_time = Core::DateTime::now(), Mode mode = Month); virtual ~Calendar() override = default; + static size_t day_of_week_index(String const&); + virtual void resize_event(GUI::ResizeEvent&) override; virtual void paint_event(GUI::PaintEvent&) override; virtual void mousemove_event(GUI::MouseEvent&) override; diff --git a/Userland/Services/Taskbar/TaskbarWindow.cpp b/Userland/Services/Taskbar/TaskbarWindow.cpp index f79c8e2892..0cc4a5f191 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.cpp +++ b/Userland/Services/Taskbar/TaskbarWindow.cpp @@ -101,6 +101,9 @@ TaskbarWindow::TaskbarWindow(NonnullRefPtr<GUI::Menu> start_menu) void TaskbarWindow::config_string_did_change(String const& domain, String const& group, String const& key, String const& value) { + if (domain == "Calendar"sv) + return; + VERIFY(domain == "Taskbar"); if (group == "Clock" && key == "TimeFormat") { m_clock_widget->update_format(value); diff --git a/Userland/Services/Taskbar/main.cpp b/Userland/Services/Taskbar/main.cpp index 2459297fc8..25b817ccff 100644 --- a/Userland/Services/Taskbar/main.cpp +++ b/Userland/Services/Taskbar/main.cpp @@ -48,7 +48,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio recvfd sendfd proc exec rpath unix sigaction")); auto app = TRY(GUI::Application::try_create(arguments)); - Config::pledge_domain("Taskbar"); + Config::pledge_domains({ "Taskbar", "Calendar" }); Config::monitor_domain("Taskbar"); app->event_loop().register_signal(SIGCHLD, [](int) { // Wait all available children |