From 4d2ea773dbcd6f18fac3f91c624c0581d0051fc8 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 2 Feb 2022 14:38:43 -0500 Subject: [PATCH] ClockSettings: Display a map to show the current time zone's location --- Base/res/graphics/map.png | Bin 0 -> 34391 bytes .../ClockSettings/ClockSettingsWidget.cpp | 81 ++++++++++++++++++ .../ClockSettings/ClockSettingsWidget.gml | 6 +- .../ClockSettings/ClockSettingsWidget.h | 10 +++ Userland/Applications/ClockSettings/main.cpp | 1 + 5 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 Base/res/graphics/map.png diff --git a/Base/res/graphics/map.png b/Base/res/graphics/map.png new file mode 100644 index 0000000000000000000000000000000000000000..38fd18952c2b75c23c0f9fd4fec434cb68ae3ce2 GIT binary patch literal 34391 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 z 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 literal 0 HcmV?d00001 diff --git a/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp b/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp index b34512ac2c..e65c5d08d7 100644 --- a/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp +++ b/Userland/Applications/ClockSettings/ClockSettingsWidget.cpp @@ -7,14 +7,30 @@ #include "ClockSettingsWidget.h" #include #include +#include +#include #include #include +#include +#include +#include +#include #include +#include #include #include using StringViewListModel = GUI::ItemListModel>; +static constexpr auto PI_OVER_180 = M_PIf32 / 180.0f; +static constexpr auto PI_OVER_4 = M_PIf32 / 4.0f; +static constexpr auto TAU = M_PIf32 * 2.0f; + +// The map as stored on disk is a valid Mercadian projected map. But it has quite a bit of dead space that +// we can remove. This makes the map non-Mercadian, so we need to adjust our math based on what we removed. +static constexpr auto TIME_ZONE_MAP_NORTHERN_TRIM = 78; +static constexpr auto TIME_ZONE_MAP_SOUTHERN_TRIM = 50; + ClockSettingsWidget::ClockSettingsWidget() { load_from_gml(clock_settings_widget_gml); @@ -26,19 +42,84 @@ ClockSettingsWidget::ClockSettingsWidget() m_time_zone_combo_box->set_only_allow_values_from_model(true); m_time_zone_combo_box->set_model(*StringViewListModel::create(time_zones)); m_time_zone_combo_box->set_text(m_time_zone); + + auto time_zone_map_bitmap = Gfx::Bitmap::try_load_from_file("/res/graphics/map.png"sv).release_value_but_fixme_should_propagate_errors(); + auto time_zone_rect = time_zone_map_bitmap->rect().shrunken(TIME_ZONE_MAP_NORTHERN_TRIM, 0, TIME_ZONE_MAP_SOUTHERN_TRIM, 0); + time_zone_map_bitmap = time_zone_map_bitmap->cropped(time_zone_rect).release_value_but_fixme_should_propagate_errors(); + + m_time_zone_map = *find_descendant_of_type_named("time_zone_map"); + m_time_zone_map->set_bitmap(time_zone_map_bitmap); + + auto time_zone_marker = Gfx::Bitmap::try_load_from_file("/res/icons/32x32/ladyball.png").release_value_but_fixme_should_propagate_errors(); + m_time_zone_marker = time_zone_marker->scaled(0.75f, 0.75f).release_value_but_fixme_should_propagate_errors(); + + set_time_zone_location(); +} + +void ClockSettingsWidget::second_paint_event(GUI::PaintEvent& event) +{ + GUI::Widget::second_paint_event(event); + + if (!m_time_zone_location.has_value()) + return; + + GUI::Painter painter(*this); + painter.add_clip_rect(event.rect()); + painter.add_clip_rect(m_time_zone_map->relative_rect()); + + auto x = m_time_zone_map->x() + m_time_zone_map->parent_widget()->layout()->margins().left(); + auto y = m_time_zone_map->y() + m_time_zone_map->parent_widget()->layout()->margins().top(); + + 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()); } void ClockSettingsWidget::reset_default_values() { m_time_zone = "UTC"sv; m_time_zone_combo_box->set_text(m_time_zone); + m_time_zone_location.clear(); + set_time_zone(); + update(); } void ClockSettingsWidget::apply_settings() { m_time_zone = m_time_zone_combo_box->text(); + + set_time_zone_location(); set_time_zone(); + update(); +} + +void ClockSettingsWidget::set_time_zone_location() +{ + m_time_zone_location = compute_time_zone_location(); +} + +// https://en.wikipedia.org/wiki/Mercator_projection#Derivation +Optional ClockSettingsWidget::compute_time_zone_location() const +{ + auto location = TimeZone::get_time_zone_location(m_time_zone); + if (!location.has_value()) + return {}; + + auto latitude = location->latitude.decimal_coordinate(); + auto longitude = location->longitude.decimal_coordinate(); + + auto rect = m_time_zone_map->bitmap()->rect().to_type(); + + latitude = logf(tanf(PI_OVER_4 + (latitude * PI_OVER_180 / 2.0f))); + + auto mercadian_x = (longitude + 180.0f) * (rect.width() / 360.0f); + auto mercadian_y = (rect.height() / 2.0f) - (rect.width() * latitude / TAU); + + mercadian_y -= TIME_ZONE_MAP_NORTHERN_TRIM / 2; + mercadian_y += TIME_ZONE_MAP_SOUTHERN_TRIM / 2; + + return Gfx::FloatPoint { mercadian_x, mercadian_y }; } void ClockSettingsWidget::set_time_zone() const diff --git a/Userland/Applications/ClockSettings/ClockSettingsWidget.gml b/Userland/Applications/ClockSettings/ClockSettingsWidget.gml index 3772d49899..1c4c5aa790 100644 --- a/Userland/Applications/ClockSettings/ClockSettingsWidget.gml +++ b/Userland/Applications/ClockSettings/ClockSettingsWidget.gml @@ -8,7 +8,6 @@ @GUI::GroupBox { title: "Time Zone Settings" - fixed_height: 120 layout: @GUI::VerticalBoxLayout { margins: [16, 8, 8] @@ -36,5 +35,10 @@ name: "time_zone_input" } } + + @GUI::ImageWidget { + name: "time_zone_map" + auto_resize: true + } } } diff --git a/Userland/Applications/ClockSettings/ClockSettingsWidget.h b/Userland/Applications/ClockSettings/ClockSettingsWidget.h index 623890e1b7..0605a0dbf8 100644 --- a/Userland/Applications/ClockSettings/ClockSettingsWidget.h +++ b/Userland/Applications/ClockSettings/ClockSettingsWidget.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -18,10 +19,19 @@ class ClockSettingsWidget final : public GUI::SettingsWindow::Tab { private: ClockSettingsWidget(); + virtual void second_paint_event(GUI::PaintEvent&) override; + virtual void apply_settings() override; virtual void reset_default_values() override; + + void set_time_zone_location(); + Optional compute_time_zone_location() const; void set_time_zone() const; String m_time_zone; RefPtr m_time_zone_combo_box; + RefPtr m_time_zone_map; + RefPtr m_time_zone_marker; + + Optional m_time_zone_location; }; diff --git a/Userland/Applications/ClockSettings/main.cpp b/Userland/Applications/ClockSettings/main.cpp index 2620ca3740..7463e3547c 100644 --- a/Userland/Applications/ClockSettings/main.cpp +++ b/Userland/Applications/ClockSettings/main.cpp @@ -28,6 +28,7 @@ ErrorOr serenity_main(Main::Arguments arguments) auto window = TRY(GUI::SettingsWindow::create("Clock Settings", GUI::SettingsWindow::ShowDefaultsButton::Yes)); (void)TRY(window->add_tab("Clock")); window->set_icon(app_icon.bitmap_for_size(16)); + window->resize(540, 570); window->show(); return app->exec();