mirror of
https://github.com/RGBCube/serenity
synced 2025-05-19 08:55:07 +00:00

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.
111 lines
5.1 KiB
C++
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);
|
|
}
|
|
}
|