rsx/overlays: Implement checkbox and switch controls

This commit is contained in:
kd-11 2026-03-12 03:22:03 +03:00 committed by kd-11
parent 5d28ff5df1
commit cff9b5b65e
9 changed files with 236 additions and 0 deletions

View file

@ -502,6 +502,7 @@ target_sources(rpcs3_emu PRIVATE
RSX/Overlays/overlay_animated_icon.cpp
RSX/Overlays/overlay_animation.cpp
RSX/Overlays/overlay_audio.cpp
RSX/Overlays/overlay_checkbox.cpp
RSX/Overlays/overlay_compile_notification.cpp
RSX/Overlays/overlay_controls.cpp
RSX/Overlays/overlay_cursor.cpp
@ -518,6 +519,8 @@ target_sources(rpcs3_emu PRIVATE
RSX/Overlays/overlay_perf_metrics.cpp
RSX/Overlays/overlay_progress_bar.cpp
RSX/Overlays/overlay_save_dialog.cpp
RSX/Overlays/overlay_select.cpp
RSX/Overlays/overlay_slider.cpp
RSX/Overlays/overlay_tabs.cpp
RSX/Overlays/overlay_trophy_notification.cpp
RSX/Overlays/overlay_user_list_dialog.cpp

View file

@ -0,0 +1,151 @@
#include "stdafx.h"
#include "overlay_checkbox.h"
namespace rsx::overlays
{
checkbox::checkbox()
{
fore_color = color4f(1.f);
back_color = color4f(0.3f, 0.3f, 0.3f, 1.f);
}
void checkbox::set_checked(bool checked)
{
if (m_is_checked == checked)
{
return;
}
m_is_checked = checked;
refresh();
}
void checkbox::set_size(u16 w, u16 h)
{
const u16 dim = std::min(w, h);
box_layout::set_size(w, h);
clear_items();
refresh();
m_border_box = nullptr;
m_inner_box = nullptr;
if (dim < 3)
{
return;
}
auto border_widget = std::make_unique<overlay_element>();
auto inner_widget = std::make_unique<overlay_element>();
border_widget->set_size(dim, dim);
inner_widget->set_size(dim - 2, dim - 2);
inner_widget->set_pos(1, 1);
m_border_box = add_element(border_widget);
m_inner_box = add_element(inner_widget);
}
compiled_resource& checkbox::get_compiled()
{
if (is_compiled())
{
return compiled_resources;
}
compiled_resources.clear();
if (!m_border_box || !m_inner_box)
{
m_is_compiled = true;
return compiled_resources;
}
m_border_box->back_color = this->fore_color;
m_inner_box->back_color = this->back_color;
m_inner_box->set_visible(!m_is_checked);
m_border_box->refresh();
m_inner_box->refresh();
compiled_resources.add(m_border_box->get_compiled());
compiled_resources.add(m_inner_box->get_compiled());
m_is_compiled = true;
return compiled_resources;
}
switchbox::switchbox()
{
fore_color = color4f(0.5647f, 0.7922f, 0.9765f, 1.f);
back_color = color4f(0.75f, 0.75f, 0.75f, 1.f);
}
void switchbox::set_size(u16 w, u16 h)
{
const u16 dim = std::min(w, h);
box_layout::set_size(w, h);
clear_items();
refresh();
m_back_ellipse = nullptr;
m_front_circle = nullptr;
if (dim < 4)
{
return;
}
auto ellipse_part = std::make_unique<rounded_rect>();
auto circle_part = std::make_unique<rounded_rect>();
ellipse_part->set_size(dim * 2, dim / 2);
ellipse_part->set_pos(0, dim / 4);
ellipse_part->radius = dim / 4;
circle_part->set_size(dim, dim);
circle_part->set_pos(0, 0);
circle_part->radius = dim / 2;
m_back_ellipse = add_element(ellipse_part);
m_front_circle = add_element(circle_part);
}
compiled_resource& switchbox::get_compiled()
{
if (is_compiled())
{
return compiled_resources;
}
compiled_resources.clear();
if (!m_back_ellipse || !m_front_circle)
{
m_is_compiled = true;
return compiled_resources;
}
if (m_is_checked)
{
m_back_ellipse->back_color = this->fore_color * 0.5f;
m_front_circle->back_color = this->fore_color;
m_front_circle->set_pos(this->x + m_front_circle->w, this->y);
}
else
{
m_back_ellipse->back_color = this->back_color * 0.5f;
m_front_circle->back_color = this->back_color;
m_front_circle->set_pos(this->x, this->y);
}
m_back_ellipse->refresh();
m_front_circle->refresh();
compiled_resources.add(m_back_ellipse->get_compiled());
compiled_resources.add(m_front_circle->get_compiled());
return compiled_resources;
}
}

View file

@ -0,0 +1,36 @@
#pragma once
#include "overlay_controls.h"
namespace rsx::overlays
{
struct checkbox : public box_layout
{
checkbox();
void set_checked(bool checked);
bool is_checked() const { return m_is_checked; }
void set_size(u16 w, u16 h) override;
compiled_resource& get_compiled() override;
protected:
bool m_is_checked = false;
private:
overlay_element* m_border_box = nullptr;
overlay_element* m_inner_box = nullptr;
};
struct switchbox : public checkbox
{
switchbox();
void set_size(u16 w, u16 h) override;
compiled_resource& get_compiled() override;
private:
overlay_element* m_back_ellipse = nullptr;
overlay_element* m_front_circle = nullptr;
};
}

View file

@ -0,0 +1 @@
#include "stdafx.h"

View file

@ -0,0 +1,10 @@
#pragma once
#include "overlay_controls.h"
namespace rsx::overlays
{
struct select : public overlay_element
{
};
}

View file

@ -0,0 +1 @@
#include "stdafx.h"

View file

@ -0,0 +1,10 @@
#pragma once
#include "overlay_controls.h"
namespace rsx::overlays
{
struct slider : public overlay_element
{
};
}

View file

@ -147,6 +147,7 @@
<ClCompile Include="Emu\RSX\Overlays\Network\overlay_sendmessage_dialog.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_animated_icon.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_audio.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_checkbox.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_controls.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_cursor.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_debug_overlay.cpp" />
@ -154,6 +155,8 @@
<ClCompile Include="Emu\RSX\Overlays\overlay_media_list_dialog.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_osk_panel.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_compile_notification.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_select.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_slider.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_tabs.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_user_list_dialog.cpp" />
<ClCompile Include="Emu\RSX\Overlays\overlay_utils.cpp" />
@ -709,6 +712,7 @@
<ClInclude Include="Emu\RSX\Overlays\Network\overlay_sendmessage_dialog.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_animated_icon.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_audio.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_checkbox.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_cursor.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_debug_overlay.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_edit_text.hpp" />
@ -717,6 +721,8 @@
<ClInclude Include="Emu\RSX\Overlays\overlay_manager.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_media_list_dialog.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_progress_bar.hpp" />
<ClInclude Include="Emu\RSX\Overlays\overlay_select.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_slider.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_tabs.h" />
<ClInclude Include="Emu\RSX\Overlays\overlay_video.h" />
<ClInclude Include="Emu\RSX\Overlays\Trophies\overlay_trophy_list_dialog.h" />

View file

@ -1420,6 +1420,15 @@
<ClCompile Include="Emu\RSX\Overlays\HomeMenu\overlay_home_icons.cpp">
<Filter>Emu\GPU\RSX\Overlays\HomeMenu</Filter>
</ClCompile>
<ClCompile Include="Emu\RSX\Overlays\overlay_checkbox.cpp">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClCompile>
<ClCompile Include="Emu\RSX\Overlays\overlay_slider.cpp">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClCompile>
<ClCompile Include="Emu\RSX\Overlays\overlay_select.cpp">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Crypto\aes.h">
@ -2851,6 +2860,15 @@
<ClInclude Include="Emu\RSX\Overlays\HomeMenu\overlay_home_icons.h">
<Filter>Emu\GPU\RSX\Overlays\HomeMenu</Filter>
</ClInclude>
<ClInclude Include="Emu\RSX\Overlays\overlay_checkbox.h">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClInclude>
<ClInclude Include="Emu\RSX\Overlays\overlay_slider.h">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClInclude>
<ClInclude Include="Emu\RSX\Overlays\overlay_select.h">
<Filter>Emu\GPU\RSX\Overlays</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="Emu\RSX\Program\GLSLSnippets\GPUDeswizzle.glsl">