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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 #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();