summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorOlivier De Cannière <olivier.decanniere96@gmail.com>2022-07-16 01:33:39 +0200
committerTim Flynn <trflynn89@pm.me>2022-09-20 13:12:00 -0400
commit0eceed4fd72697a4e9bebf23c06b300637296361 (patch)
treed86a063a4af7e391fa3db61568d139d7df68e98c /Userland
parent9414525d7552434d2099aaeb17b861ba57e55d54 (diff)
downloadserenity-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.txt1
-rw-r--r--Userland/Applications/Calendar/main.cpp4
-rw-r--r--Userland/Applications/CalendarSettings/CMakeLists.txt17
-rw-r--r--Userland/Applications/CalendarSettings/CalendarSettingsWidget.cpp33
-rw-r--r--Userland/Applications/CalendarSettings/CalendarSettingsWidget.gml38
-rw-r--r--Userland/Applications/CalendarSettings/CalendarSettingsWidget.h23
-rw-r--r--Userland/Applications/CalendarSettings/main.cpp42
-rw-r--r--Userland/Libraries/LibGUI/Calendar.cpp10
-rw-r--r--Userland/Libraries/LibGUI/Calendar.h2
-rw-r--r--Userland/Services/Taskbar/TaskbarWindow.cpp3
-rw-r--r--Userland/Services/Taskbar/main.cpp2
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