1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-19 08:55:07 +00:00
serenity/Userland/Applications/MouseSettings/MouseWidget.cpp
thankyouverycool 4c9933bfb7 LibGUI: Remove Label icons and replace instances with ImageWidget
These icons are a relic of GLabel and were never implemented to
accomodate both image and text. This convenience can always be added
in the future, but no current instance assumes or needs it, so let's
replace them all with ImageWidget to show clearer intent.
2023-04-30 05:48:14 +02:00

111 lines
5.1 KiB
C++

/*
* Copyright (c) 2021-2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "MouseWidget.h"
#include <Applications/MouseSettings/MouseWidgetGML.h>
#include <LibGUI/ConnectionToWindowServer.h>
#include <LibGUI/ImageWidget.h>
#include <LibGUI/Label.h>
#include <LibGUI/Slider.h>
#include <LibGUI/SpinBox.h>
#include <WindowServer/Screen.h>
#include <WindowServer/WindowManager.h>
constexpr double speed_slider_scale = 100.0;
constexpr int default_scroll_length = 4;
constexpr int double_click_speed_default = 250;
MouseWidget::MouseWidget()
{
load_from_gml(mouse_widget_gml).release_value_but_fixme_should_propagate_errors();
m_speed_label = *find_descendant_of_type_named<GUI::Label>("speed_label");
m_speed_slider = *find_descendant_of_type_named<GUI::HorizontalSlider>("speed_slider");
m_speed_slider->set_range(WindowServer::mouse_accel_min * speed_slider_scale, WindowServer::mouse_accel_max * speed_slider_scale);
int const slider_value = float { speed_slider_scale } * GUI::ConnectionToWindowServer::the().get_mouse_acceleration();
m_speed_slider->set_value(slider_value, GUI::AllowCallback::No);
m_speed_slider->on_change = [&](int) {
update_speed_label();
set_modified(true);
};
m_scroll_length_spinbox = *find_descendant_of_type_named<GUI::SpinBox>("scroll_length_spinbox");
m_scroll_length_spinbox->set_min(WindowServer::scroll_step_size_min);
m_scroll_length_spinbox->set_value(GUI::ConnectionToWindowServer::the().get_scroll_step_size(), GUI::AllowCallback::No);
m_scroll_length_spinbox->on_change = [&](auto) {
set_modified(true);
};
m_double_click_arrow_widget = *find_descendant_of_type_named<MouseSettings::DoubleClickArrowWidget>("double_click_arrow_widget");
m_double_click_speed_label = *find_descendant_of_type_named<GUI::Label>("double_click_speed_label");
m_double_click_speed_slider = *find_descendant_of_type_named<GUI::HorizontalSlider>("double_click_speed_slider");
m_double_click_speed_slider->set_min(WindowServer::double_click_speed_min);
m_double_click_speed_slider->set_max(WindowServer::double_click_speed_max);
m_double_click_speed_slider->set_value(GUI::ConnectionToWindowServer::the().get_double_click_speed(), GUI::AllowCallback::No);
m_double_click_speed_slider->on_change = [&](int speed) {
m_double_click_arrow_widget->set_double_click_speed(speed);
update_double_click_speed_label();
set_modified(true);
};
m_switch_buttons_image = *find_descendant_of_type_named<GUI::ImageWidget>("switch_buttons_image");
m_switch_buttons_checkbox = *find_descendant_of_type_named<GUI::CheckBox>("switch_buttons_checkbox");
m_switch_buttons_checkbox->set_checked(GUI::ConnectionToWindowServer::the().are_mouse_buttons_switched(), GUI::AllowCallback::No);
m_switch_buttons_checkbox->on_checked = [&](auto) {
update_switch_buttons_image_label();
set_modified(true);
};
m_natural_scroll_checkbox = *find_descendant_of_type_named<GUI::CheckBox>("natural_scroll_checkbox");
m_natural_scroll_checkbox->set_checked(GUI::ConnectionToWindowServer::the().is_natural_scroll(), GUI::AllowCallback::No);
m_natural_scroll_checkbox->on_checked = [&](auto) {
set_modified(true);
};
update_speed_label();
update_double_click_speed_label();
update_switch_buttons_image_label();
m_double_click_arrow_widget->set_double_click_speed(m_double_click_speed_slider->value());
}
void MouseWidget::apply_settings()
{
float const factor = m_speed_slider->value() / speed_slider_scale;
GUI::ConnectionToWindowServer::the().async_set_mouse_acceleration(factor);
GUI::ConnectionToWindowServer::the().async_set_scroll_step_size(m_scroll_length_spinbox->value());
GUI::ConnectionToWindowServer::the().async_set_double_click_speed(m_double_click_speed_slider->value());
GUI::ConnectionToWindowServer::the().async_set_mouse_buttons_switched(m_switch_buttons_checkbox->is_checked());
GUI::ConnectionToWindowServer::the().async_set_natural_scroll(m_natural_scroll_checkbox->is_checked());
}
void MouseWidget::reset_default_values()
{
m_speed_slider->set_value(speed_slider_scale);
m_scroll_length_spinbox->set_value(default_scroll_length);
m_double_click_speed_slider->set_value(double_click_speed_default);
m_switch_buttons_checkbox->set_checked(false);
m_natural_scroll_checkbox->set_checked(false);
}
void MouseWidget::update_speed_label()
{
m_speed_label->set_text(String::formatted("{} %", m_speed_slider->value()).release_value_but_fixme_should_propagate_errors());
}
void MouseWidget::update_double_click_speed_label()
{
m_double_click_speed_label->set_text(String::formatted("{} ms", m_double_click_speed_slider->value()).release_value_but_fixme_should_propagate_errors());
}
void MouseWidget::update_switch_buttons_image_label()
{
if (m_switch_buttons_checkbox->is_checked()) {
m_switch_buttons_image->load_from_file("/res/graphics/mouse-button-right.png"sv);
} else {
m_switch_buttons_image->load_from_file("/res/graphics/mouse-button-left.png"sv);
}
}