Serenity Operating System
1/*
2 * Copyright (c) 2022, MacDue <macdue@dueutil.tech>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include "HighlightWidget.h"
8
9#include <Applications/MouseSettings/HighlightWidgetGML.h>
10#include <LibGUI/ConnectionToWindowServer.h>
11
12HighlightWidget::HighlightWidget()
13{
14 load_from_gml(highlight_widget_gml).release_value_but_fixme_should_propagate_errors();
15
16 m_highlight_preview = find_descendant_of_type_named<GUI::Frame>("preview_frame")->add<MouseSettings::HighlightPreviewWidget>(palette());
17
18 auto current_highlight_color = GUI::ConnectionToWindowServer::the().get_cursor_highlight_color();
19 auto current_highlight_color_no_alpha = current_highlight_color;
20 current_highlight_color_no_alpha.set_alpha(255);
21 m_highlight_color_input = *find_descendant_of_type_named<GUI::ColorInput>("highlight_color_input");
22 m_highlight_color_input->set_color(current_highlight_color_no_alpha);
23 m_highlight_color_input->on_change = [&]() {
24 m_highlight_preview->set_color(highlight_color());
25 set_modified(true);
26 };
27
28 m_highlight_opacity_slider = *find_descendant_of_type_named<GUI::Slider>("highlight_opacity_slider");
29 m_highlight_opacity_slider->set_value(current_highlight_color.alpha());
30 m_highlight_opacity_slider->on_change = [&](int) {
31 m_highlight_preview->set_color(highlight_color());
32 set_modified(true);
33 };
34
35 m_highlight_radius_slider = *find_descendant_of_type_named<GUI::Slider>("highlight_radius_slider");
36 m_highlight_radius_slider->set_value(GUI::ConnectionToWindowServer::the().get_cursor_highlight_radius());
37 m_highlight_radius_slider->on_change = [&](int) {
38 m_highlight_preview->set_radius(highlight_radius());
39 set_modified(true);
40 };
41
42 m_highlight_preview->set_color(highlight_color());
43 m_highlight_preview->set_radius(highlight_radius());
44}
45
46Gfx::Color HighlightWidget::highlight_color()
47{
48 auto color = m_highlight_color_input->color();
49 color.set_alpha(m_highlight_opacity_slider->value());
50 return color;
51}
52
53int HighlightWidget::highlight_radius()
54{
55 return m_highlight_radius_slider->value();
56}
57
58void HighlightWidget::apply_settings()
59{
60 GUI::ConnectionToWindowServer::the().async_set_cursor_highlight_radius(highlight_radius());
61 GUI::ConnectionToWindowServer::the().async_set_cursor_highlight_color(highlight_color());
62}
63
64void HighlightWidget::reset_default_values()
65{
66 constexpr auto default_highlight_color = Gfx::Color::NamedColor::Red;
67 constexpr auto default_highlight_opacity = 110; // (in range of 0-255)
68 // Disable the highlighting by default.
69 // The range of radii you can configure the highlight to is 20 to 60px,
70 // anything less than that is treated as 'no highlighting'.
71 constexpr auto default_highlight_radius_length = 25;
72 m_highlight_opacity_slider->set_value(default_highlight_opacity);
73 m_highlight_color_input->set_color(default_highlight_color);
74 m_highlight_radius_slider->set_value(default_highlight_radius_length);
75 deferred_invoke([&] {
76 // Avoid artifact due to setting both color and opacity sliders:
77 m_highlight_preview->update();
78 });
79}