2023-09-03 14:13:58 +03:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2023, Bastiaan van der Plaat <bastiaan.v.d.plaat@gmail.com>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
*/
|
|
|
|
|
2023-09-16 22:14:21 +03:00
|
|
|
#include "SearchPanel.h"
|
2023-09-06 23:17:46 +03:00
|
|
|
#include "UsersMapWidget.h"
|
2023-09-03 14:13:58 +03:00
|
|
|
#include <LibConfig/Client.h>
|
2023-09-05 15:08:33 +03:00
|
|
|
#include <LibCore/System.h>
|
2023-09-03 14:13:58 +03:00
|
|
|
#include <LibGUI/Action.h>
|
|
|
|
#include <LibGUI/Application.h>
|
2023-09-03 20:57:29 +03:00
|
|
|
#include <LibGUI/BoxLayout.h>
|
2023-09-03 14:13:58 +03:00
|
|
|
#include <LibGUI/Icon.h>
|
|
|
|
#include <LibGUI/Menu.h>
|
2023-09-16 22:10:23 +03:00
|
|
|
#include <LibGUI/Process.h>
|
2023-09-16 22:14:21 +03:00
|
|
|
#include <LibGUI/Splitter.h>
|
2023-09-03 20:57:29 +03:00
|
|
|
#include <LibGUI/ToolbarContainer.h>
|
2023-09-03 14:13:58 +03:00
|
|
|
#include <LibGUI/Window.h>
|
|
|
|
|
2023-09-03 20:57:29 +03:00
|
|
|
static int constexpr MAP_ZOOM_DEFAULT = 3;
|
|
|
|
|
2023-09-03 14:13:58 +03:00
|
|
|
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
|
|
|
{
|
2023-09-16 22:10:23 +03:00
|
|
|
TRY(Core::System::pledge("stdio recvfd sendfd rpath unix proc exec"));
|
2023-09-05 15:08:33 +03:00
|
|
|
|
2023-09-03 14:13:58 +03:00
|
|
|
auto app = TRY(GUI::Application::create(arguments));
|
2023-09-05 15:08:33 +03:00
|
|
|
|
2023-09-16 22:10:23 +03:00
|
|
|
TRY(Core::System::unveil("/bin/MapsSettings", "x"));
|
2023-09-05 15:08:33 +03:00
|
|
|
TRY(Core::System::unveil("/res", "r"));
|
|
|
|
TRY(Core::System::unveil("/tmp/session/%sid/portal/config", "rw"));
|
2023-09-14 00:10:04 +03:00
|
|
|
TRY(Core::System::unveil("/tmp/session/%sid/portal/launch", "rw"));
|
2023-09-05 15:08:33 +03:00
|
|
|
TRY(Core::System::unveil("/tmp/session/%sid/portal/request", "rw"));
|
|
|
|
TRY(Core::System::unveil(nullptr, nullptr));
|
|
|
|
|
2023-09-16 22:10:23 +03:00
|
|
|
Config::monitor_domain("Maps");
|
|
|
|
|
2023-09-16 22:14:21 +03:00
|
|
|
// Window
|
2023-09-05 01:56:50 +03:00
|
|
|
auto app_icon = TRY(GUI::Icon::try_create_default_icon("app-maps"sv));
|
2023-09-16 14:51:33 +03:00
|
|
|
auto window = GUI::Window::construct();
|
2023-09-03 14:13:58 +03:00
|
|
|
window->set_title("Maps");
|
|
|
|
window->set_icon(app_icon.bitmap_for_size(16));
|
2023-09-03 20:52:31 +03:00
|
|
|
window->restore_size_and_position("Maps"sv, "Window"sv, { { 640, 480 } });
|
|
|
|
window->save_size_and_position_on_close("Maps"sv, "Window"sv);
|
2023-09-03 14:13:58 +03:00
|
|
|
|
2023-09-03 20:57:29 +03:00
|
|
|
// Root widget
|
2023-09-19 03:13:48 +03:00
|
|
|
auto root_widget = window->set_main_widget<GUI::Widget>();
|
2023-09-03 20:57:29 +03:00
|
|
|
root_widget->set_fill_with_background_color(true);
|
|
|
|
root_widget->set_layout<GUI::VerticalBoxLayout>(GUI::Margins {}, 2);
|
|
|
|
|
|
|
|
// Toolbar
|
2023-09-23 00:28:59 +03:00
|
|
|
auto& toolbar_container = root_widget->add<GUI::ToolbarContainer>();
|
|
|
|
auto& toolbar = toolbar_container.add<GUI::Toolbar>();
|
2023-09-03 20:57:29 +03:00
|
|
|
|
2023-09-16 22:14:21 +03:00
|
|
|
// Main Widget
|
2023-09-23 00:28:59 +03:00
|
|
|
auto& main_widget = root_widget->add<GUI::HorizontalSplitter>();
|
2023-09-16 22:14:21 +03:00
|
|
|
|
2023-09-03 14:13:58 +03:00
|
|
|
// Map widget
|
2023-09-16 22:14:21 +03:00
|
|
|
Maps::UsersMapWidget::Options options {};
|
2023-09-03 14:13:58 +03:00
|
|
|
options.center.latitude = Config::read_string("Maps"sv, "MapView"sv, "CenterLatitude"sv, "30"sv).to_double().value_or(30.0);
|
|
|
|
options.center.longitude = Config::read_string("Maps"sv, "MapView"sv, "CenterLongitude"sv, "0"sv).to_double().value_or(0.0);
|
2023-09-03 20:57:29 +03:00
|
|
|
options.zoom = Config::read_i32("Maps"sv, "MapView"sv, "Zoom"sv, MAP_ZOOM_DEFAULT);
|
2023-09-23 00:28:59 +03:00
|
|
|
auto& map_widget = main_widget.add<Maps::UsersMapWidget>(options);
|
|
|
|
map_widget.set_frame_style(Gfx::FrameStyle::SunkenContainer);
|
|
|
|
map_widget.set_show_users(Config::read_bool("Maps"sv, "MapView"sv, "ShowUsers"sv, false));
|
2023-09-16 22:14:21 +03:00
|
|
|
|
|
|
|
// Search panel
|
|
|
|
auto search_panel = TRY(Maps::SearchPanel::create());
|
2023-09-23 00:28:59 +03:00
|
|
|
search_panel->on_places_change = [&map_widget](auto) { map_widget.remove_markers_with_name("search"sv); };
|
|
|
|
search_panel->on_selected_place_change = [&map_widget](auto const& place) {
|
2023-09-16 22:14:21 +03:00
|
|
|
// Remove old search markers
|
2023-09-23 00:28:59 +03:00
|
|
|
map_widget.remove_markers_with_name("search"sv);
|
2023-09-16 22:14:21 +03:00
|
|
|
|
|
|
|
// Add new marker and zoom into it
|
2023-09-23 00:28:59 +03:00
|
|
|
map_widget.add_marker({ place.latlng, place.name, {}, "search"_string });
|
|
|
|
map_widget.set_center(place.latlng);
|
|
|
|
map_widget.set_zoom(place.zoom);
|
2023-09-16 22:14:21 +03:00
|
|
|
};
|
|
|
|
if (Config::read_bool("Maps"sv, "SearchPanel"sv, "Show"sv, false))
|
2023-09-23 00:28:59 +03:00
|
|
|
main_widget.insert_child_before(search_panel, map_widget);
|
2023-09-03 14:13:58 +03:00
|
|
|
|
2023-09-03 20:57:29 +03:00
|
|
|
// Main menu actions
|
2023-09-03 14:13:58 +03:00
|
|
|
auto file_menu = window->add_menu("&File"_string);
|
2023-09-16 22:10:23 +03:00
|
|
|
auto open_settings_action = GUI::Action::create("Maps &Settings", { Mod_Ctrl, Key_Comma }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/app-settings.png"sv)), [window](GUI::Action const&) {
|
|
|
|
GUI::Process::spawn_or_show_error(window, "/bin/MapsSettings"sv);
|
|
|
|
});
|
|
|
|
file_menu->add_action(open_settings_action);
|
|
|
|
file_menu->add_separator();
|
2023-09-03 14:13:58 +03:00
|
|
|
file_menu->add_action(GUI::CommonActions::make_quit_action([](auto&) { GUI::Application::the()->quit(); }));
|
|
|
|
|
|
|
|
auto view_menu = window->add_menu("&View"_string);
|
2023-09-16 22:14:21 +03:00
|
|
|
auto show_search_panel_action = GUI::Action::create_checkable(
|
2023-09-23 00:28:59 +03:00
|
|
|
"Show search panel", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/find.png"sv)), [&main_widget, search_panel, &map_widget](auto& action) {
|
2023-09-16 22:14:21 +03:00
|
|
|
if (action.is_checked()) {
|
2023-09-23 00:28:59 +03:00
|
|
|
main_widget.insert_child_before(search_panel, map_widget);
|
2023-09-16 22:14:21 +03:00
|
|
|
} else {
|
2023-09-23 00:28:59 +03:00
|
|
|
map_widget.remove_markers_with_name("search"sv);
|
2023-09-16 22:14:21 +03:00
|
|
|
search_panel->reset();
|
2023-09-23 00:28:59 +03:00
|
|
|
main_widget.remove_child(search_panel);
|
2023-09-16 22:14:21 +03:00
|
|
|
}
|
|
|
|
},
|
|
|
|
window);
|
|
|
|
show_search_panel_action->set_checked(Config::read_bool("Maps"sv, "SearchPanel"sv, "Show"sv, false));
|
2023-09-06 23:17:46 +03:00
|
|
|
auto show_users_action = GUI::Action::create_checkable(
|
2023-09-23 00:28:59 +03:00
|
|
|
"Show SerenityOS users", TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/ladyball.png"sv)), [&map_widget](auto& action) { map_widget.set_show_users(action.is_checked()); }, window);
|
|
|
|
show_users_action->set_checked(map_widget.show_users());
|
|
|
|
auto zoom_in_action = GUI::CommonActions::make_zoom_in_action([&map_widget](auto&) { map_widget.set_zoom(map_widget.zoom() + 1); }, window);
|
|
|
|
auto zoom_out_action = GUI::CommonActions::make_zoom_out_action([&map_widget](auto&) { map_widget.set_zoom(map_widget.zoom() - 1); }, window);
|
|
|
|
auto reset_zoom_action = GUI::CommonActions::make_reset_zoom_action([&map_widget](auto&) { map_widget.set_zoom(MAP_ZOOM_DEFAULT); }, window);
|
|
|
|
auto fullscreen_action = GUI::CommonActions::make_fullscreen_action([window, &toolbar_container, &map_widget](auto&) {
|
2023-09-03 20:57:29 +03:00
|
|
|
window->set_fullscreen(!window->is_fullscreen());
|
2023-09-23 00:28:59 +03:00
|
|
|
toolbar_container.set_visible(!window->is_fullscreen());
|
|
|
|
map_widget.set_frame_style(window->is_fullscreen() ? Gfx::FrameStyle::NoFrame : Gfx::FrameStyle::SunkenContainer);
|
2023-09-03 20:57:29 +03:00
|
|
|
},
|
|
|
|
window);
|
2023-09-16 22:14:21 +03:00
|
|
|
view_menu->add_action(show_search_panel_action);
|
|
|
|
view_menu->add_separator();
|
2023-09-06 23:17:46 +03:00
|
|
|
view_menu->add_action(show_users_action);
|
|
|
|
view_menu->add_separator();
|
2023-09-03 20:57:29 +03:00
|
|
|
view_menu->add_action(zoom_in_action);
|
|
|
|
view_menu->add_action(zoom_out_action);
|
|
|
|
view_menu->add_action(reset_zoom_action);
|
2023-09-03 14:13:58 +03:00
|
|
|
view_menu->add_separator();
|
2023-09-03 20:57:29 +03:00
|
|
|
view_menu->add_action(fullscreen_action);
|
2023-09-03 14:13:58 +03:00
|
|
|
|
|
|
|
auto help_menu = window->add_menu("&Help"_string);
|
|
|
|
help_menu->add_action(GUI::CommonActions::make_command_palette_action(window));
|
2023-09-13 22:34:46 +03:00
|
|
|
help_menu->add_action(GUI::CommonActions::make_about_action("Maps"_string, app_icon, window));
|
2023-09-03 14:13:58 +03:00
|
|
|
|
2023-09-03 20:57:29 +03:00
|
|
|
// Main toolbar actions
|
2023-09-23 00:28:59 +03:00
|
|
|
toolbar.add_action(show_search_panel_action);
|
|
|
|
toolbar.add_separator();
|
|
|
|
toolbar.add_action(show_users_action);
|
|
|
|
toolbar.add_separator();
|
|
|
|
toolbar.add_action(zoom_in_action);
|
|
|
|
toolbar.add_action(zoom_out_action);
|
|
|
|
toolbar.add_action(reset_zoom_action);
|
|
|
|
toolbar.add_separator();
|
|
|
|
toolbar.add_action(open_settings_action);
|
2023-09-03 20:57:29 +03:00
|
|
|
|
2023-09-03 14:13:58 +03:00
|
|
|
window->show();
|
|
|
|
|
2023-09-16 22:14:21 +03:00
|
|
|
// Remember last window state
|
2023-09-03 14:13:58 +03:00
|
|
|
int exec = app->exec();
|
2023-09-16 22:14:21 +03:00
|
|
|
Config::write_bool("Maps"sv, "SearchPanel"sv, "Show"sv, show_search_panel_action->is_checked());
|
2023-09-23 00:28:59 +03:00
|
|
|
Config::write_string("Maps"sv, "MapView"sv, "CenterLatitude"sv, TRY(String::number(map_widget.center().latitude)));
|
|
|
|
Config::write_string("Maps"sv, "MapView"sv, "CenterLongitude"sv, TRY(String::number(map_widget.center().longitude)));
|
|
|
|
Config::write_i32("Maps"sv, "MapView"sv, "Zoom"sv, map_widget.zoom());
|
|
|
|
Config::write_bool("Maps"sv, "MapView"sv, "ShowUsers"sv, map_widget.show_users());
|
2023-09-03 14:13:58 +03:00
|
|
|
return exec;
|
|
|
|
}
|