diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 5405571fb0..e115585db9 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -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 diff --git a/rpcs3/Emu/RSX/Overlays/overlay_checkbox.cpp b/rpcs3/Emu/RSX/Overlays/overlay_checkbox.cpp new file mode 100644 index 0000000000..9771a1a4b9 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_checkbox.cpp @@ -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(); + auto inner_widget = std::make_unique(); + + 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(); + auto circle_part = std::make_unique(); + + 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; + } +} diff --git a/rpcs3/Emu/RSX/Overlays/overlay_checkbox.h b/rpcs3/Emu/RSX/Overlays/overlay_checkbox.h new file mode 100644 index 0000000000..4a6dd59edd --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_checkbox.h @@ -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; + }; +} diff --git a/rpcs3/Emu/RSX/Overlays/overlay_select.cpp b/rpcs3/Emu/RSX/Overlays/overlay_select.cpp new file mode 100644 index 0000000000..a27b824da7 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_select.cpp @@ -0,0 +1 @@ +#include "stdafx.h" diff --git a/rpcs3/Emu/RSX/Overlays/overlay_select.h b/rpcs3/Emu/RSX/Overlays/overlay_select.h new file mode 100644 index 0000000000..c5c892bda0 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_select.h @@ -0,0 +1,10 @@ +#pragma once + +#include "overlay_controls.h" + +namespace rsx::overlays +{ + struct select : public overlay_element + { + }; +} diff --git a/rpcs3/Emu/RSX/Overlays/overlay_slider.cpp b/rpcs3/Emu/RSX/Overlays/overlay_slider.cpp new file mode 100644 index 0000000000..a27b824da7 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_slider.cpp @@ -0,0 +1 @@ +#include "stdafx.h" diff --git a/rpcs3/Emu/RSX/Overlays/overlay_slider.h b/rpcs3/Emu/RSX/Overlays/overlay_slider.h new file mode 100644 index 0000000000..6f06ed9e85 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/overlay_slider.h @@ -0,0 +1,10 @@ +#pragma once + +#include "overlay_controls.h" + +namespace rsx::overlays +{ + struct slider : public overlay_element + { + }; +} diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 64df75078b..5834917530 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -147,6 +147,7 @@ + @@ -154,6 +155,8 @@ + + @@ -709,6 +712,7 @@ + @@ -717,6 +721,8 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 4669778e16..952607794f 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1420,6 +1420,15 @@ Emu\GPU\RSX\Overlays\HomeMenu + + Emu\GPU\RSX\Overlays + + + Emu\GPU\RSX\Overlays + + + Emu\GPU\RSX\Overlays + @@ -2851,6 +2860,15 @@ Emu\GPU\RSX\Overlays\HomeMenu + + Emu\GPU\RSX\Overlays + + + Emu\GPU\RSX\Overlays + + + Emu\GPU\RSX\Overlays +