From 362e167239133b014d3d187932d2a48a5aa5131d Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 2 Feb 2022 17:15:17 -0500 Subject: [PATCH] ClockSettings: Display a text bubble with extra time zone information --- .../Applications/ClockSettings/CMakeLists.txt | 3 +- .../ClockSettings/ClockSettingsWidget.cpp | 31 +++++++++++++++++++ .../ClockSettings/ClockSettingsWidget.h | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Userland/Applications/ClockSettings/CMakeLists.txt b/Userland/Applications/ClockSettings/CMakeLists.txt index 8979e0cb1de..94186a3efb6 100644 --- a/Userland/Applications/ClockSettings/CMakeLists.txt +++ b/Userland/Applications/ClockSettings/CMakeLists.txt @@ -14,4 +14,5 @@ set(SOURCES ) serenity_app(ClockSettings ICON app-analog-clock) # FIXME: Create a ClockSettings icon. -target_link_libraries(ClockSettings LibGUI LibMain) +target_link_libraries(ClockSettings LibGUI LibMain LibUnicode) +link_with_unicode_data(ClockSettings) diff --git a/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp b/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp index e65c5d08d70..98c86b18d84 100644 --- a/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp +++ b/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp @@ -5,6 +5,7 @@ */ #include "ClockSettingsWidget.h" +#include #include #include #include @@ -16,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -31,6 +34,11 @@ static constexpr auto TAU = M_PIf32 * 2.0f; static constexpr auto TIME_ZONE_MAP_NORTHERN_TRIM = 78; static constexpr auto TIME_ZONE_MAP_SOUTHERN_TRIM = 50; +static constexpr auto TIME_ZONE_TEXT_WIDTH = 210; +static constexpr auto TIME_ZONE_TEXT_HEIGHT = 40; +static constexpr auto TIME_ZONE_TEXT_PADDING = 5; +static constexpr auto TIME_ZONE_TEXT_COLOR = Gfx::Color::from_rgb(0xeaf688); + ClockSettingsWidget::ClockSettingsWidget() { load_from_gml(clock_settings_widget_gml); @@ -73,6 +81,21 @@ void ClockSettingsWidget::second_paint_event(GUI::PaintEvent& event) auto point = m_time_zone_location->to_type().translated(x, y); point.translate_by(-m_time_zone_marker->width() / 2, -m_time_zone_marker->height() / 2); painter.blit(point, *m_time_zone_marker, rect()); + + point = m_time_zone_location->to_type().translated(x, y); + point.translate_by(0, -TIME_ZONE_TEXT_HEIGHT / 2); + + if (point.x() <= (m_time_zone_map->width() / 2)) + point.translate_by(m_time_zone_marker->width() / 2 + TIME_ZONE_TEXT_PADDING, 0); + else + point.translate_by(-m_time_zone_marker->width() / 2 - TIME_ZONE_TEXT_PADDING - TIME_ZONE_TEXT_WIDTH, 0); + + auto text_area = Gfx::IntRect { point.x(), point.y(), TIME_ZONE_TEXT_WIDTH, TIME_ZONE_TEXT_HEIGHT }; + painter.draw_rect(text_area, palette().active_window_border1()); + + text_area.shrink(2, 2); + painter.fill_rect(text_area, TIME_ZONE_TEXT_COLOR); + painter.draw_text(text_area, m_time_zone_text, Gfx::TextAlignment::Center); } void ClockSettingsWidget::reset_default_values() @@ -97,6 +120,14 @@ void ClockSettingsWidget::apply_settings() void ClockSettingsWidget::set_time_zone_location() { m_time_zone_location = compute_time_zone_location(); + + auto locale = Unicode::default_locale(); + auto now = AK::Time::now_realtime(); + + auto name = Unicode::format_time_zone(locale, m_time_zone, Unicode::CalendarPatternStyle::Long, now); + auto offset = Unicode::format_time_zone(locale, m_time_zone, Unicode::CalendarPatternStyle::LongOffset, now); + + m_time_zone_text = String::formatted("{}\n({})", name, offset); } // https://en.wikipedia.org/wiki/Mercator_projection#Derivation diff --git a/Userland/Applications/ClockSettings/ClockSettingsWidget.h b/Userland/Applications/ClockSettings/ClockSettingsWidget.h index 0605a0dbf84..b2394a783aa 100644 --- a/Userland/Applications/ClockSettings/ClockSettingsWidget.h +++ b/Userland/Applications/ClockSettings/ClockSettingsWidget.h @@ -34,4 +34,5 @@ private: RefPtr m_time_zone_marker; Optional m_time_zone_location; + String m_time_zone_text; };