# Rewrite 5
- Move Libraries Source into pd directory and give them all their own CMakeLists.txt - Partial rewrite core (color, autogenerated vec), lithium (now uses UNIQUE PTR for Commands), UI7 - Use MenuV2 as new standart in UI7 - Implementz ViewPort Pre alpha to UI7 - Add Line Drawing to DrawList (not Working) - Implement a Complete new drievrs API (static Drivers) - NO SUPPORT FOR SHARED LIBRARY BUILDS IN VERSION 5 YET - Add Tools to Autogenerate Headers and Stuff
This commit is contained in:
@@ -1,64 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/button.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void Button::HandleInput() {
|
||||
/// Ensure to only check input once
|
||||
if (inp_done) {
|
||||
return;
|
||||
}
|
||||
/// Ensure it gets sed to false and stays if not pressed
|
||||
pressed = false;
|
||||
color = UI7Color_Button;
|
||||
// Assert(screen.get(), "Screen is not set up!");
|
||||
// if (screen->ScreenType() == Screen::Bottom) {
|
||||
if (io->InputHandler->DragObject(this->GetID(), vec4(FinalPos(), size))) {
|
||||
if (io->InputHandler->DragReleased) {
|
||||
color = UI7Color_ButtonActive;
|
||||
pressed = true;
|
||||
} else {
|
||||
color = UI7Color_ButtonHovered;
|
||||
}
|
||||
}
|
||||
//}
|
||||
inp_done = true;
|
||||
}
|
||||
PD_UI7_API void Button::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->AddRectangle(FinalPos(), size, io->Theme->Get(color));
|
||||
list->Layer++;
|
||||
list->AddText(FinalPos() + size * 0.5 - tdim * 0.5, label,
|
||||
io->Theme->Get(UI7Color_Text));
|
||||
list->Layer--;
|
||||
}
|
||||
|
||||
PD_UI7_API void Button::Update() {
|
||||
// Assert(io.get(), "Did you run Container::Init correctly?");
|
||||
this->SetSize(tdim + io->FramePadding);
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/checkbox.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void Checkbox::HandleInput() {
|
||||
/// Ensure to only check input once
|
||||
if (inp_done) {
|
||||
return;
|
||||
}
|
||||
color = UI7Color_FrameBackground;
|
||||
/// Ensure it gets sed to false and stays if not pressed
|
||||
// Assert(screen.get(), "Screen is not set up!");
|
||||
// if (screen->ScreenType() == Screen::Bottom) {
|
||||
if (io->InputHandler->DragObject(this->GetID(), vec4(FinalPos(), size))) {
|
||||
if (io->InputHandler->DragReleased) {
|
||||
color = UI7Color_FrameBackgroundHovered;
|
||||
usr_ref = !usr_ref;
|
||||
} else {
|
||||
color = UI7Color_FrameBackgroundHovered;
|
||||
}
|
||||
}
|
||||
//}
|
||||
inp_done = true;
|
||||
}
|
||||
PD_UI7_API void Checkbox::Draw() {
|
||||
// Assert(list.get() && io.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->AddRectangle(FinalPos(), cbs, io->Theme->Get(color));
|
||||
if (usr_ref) {
|
||||
list->AddRectangle(FinalPos() + 2, cbs - 4,
|
||||
io->Theme->Get(UI7Color_Checkmark));
|
||||
}
|
||||
list->AddText(
|
||||
FinalPos() + fvec2(cbs.x + io->ItemSpace.x, cbs.y * 0.5 - tdim.y * 0.5),
|
||||
label, io->Theme->Get(UI7Color_Text));
|
||||
}
|
||||
|
||||
PD_UI7_API void Checkbox::Update() {
|
||||
// Assert(io.get(), "Did you run Container::Init correctly?");
|
||||
this->SetSize(cbs + fvec2(tdim.x + io->ItemSpace.x, 0));
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/coloredit.hpp>
|
||||
#include <pd/ui7/container/label.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void ColorEdit::HandleInput() {
|
||||
/// Ensure to only check input once
|
||||
if (inp_done) {
|
||||
return;
|
||||
}
|
||||
// Assert(screen.get(), "Screen is not set up!");
|
||||
// if (screen->ScreenType() == Screen::Bottom) {
|
||||
if (io->InputHandler->DragObject(this->GetID(), vec4(FinalPos(), size))) {
|
||||
if (io->InputHandler->DragReleased) {
|
||||
is_shown = !is_shown;
|
||||
}
|
||||
}
|
||||
//}
|
||||
inp_done = true;
|
||||
}
|
||||
PD_UI7_API void ColorEdit::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->AddRectangle(FinalPos(), fvec2(20, 20), *color_ref);
|
||||
list->AddText(FinalPos() + fvec2(io->ItemSpace.x + 20, 0), label,
|
||||
io->Theme->Get(UI7Color_Text));
|
||||
if (is_shown) {
|
||||
if (!layout) {
|
||||
layout = Layout::New(GetID(), io);
|
||||
}
|
||||
layout->AddObject(PD::New<Label>("Hello World!", io));
|
||||
layout->Update();
|
||||
io->RegisterDrawList(GetID(), layout->GetDrawList());
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void ColorEdit::Update() {
|
||||
// Assert(io.get(), "Did you run Container::Init correctly?");
|
||||
this->SetSize(fvec2(tdim.x + io->ItemSpace.x + 20, 20));
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,44 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/container.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void Container::HandleScrolling(fvec2 scrolling, fvec4 viewport) {
|
||||
if (last_use != 0 && Sys::GetTime() - last_use > 5000) {
|
||||
rem = true;
|
||||
}
|
||||
last_use = Sys::GetTime();
|
||||
pos -= fvec2(0, scrolling.y);
|
||||
skippable = !LI::Renderer::InBox(
|
||||
pos, size,
|
||||
fvec4(viewport.x, viewport.y, viewport.x + viewport.z,
|
||||
viewport.y + viewport.w));
|
||||
}
|
||||
|
||||
PD_UI7_API void Container::HandleInternalInput() {
|
||||
/** Requires Handle Scrolling First */
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,115 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/dragdata.hpp>
|
||||
#include <pd/ui7/container/label.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
// Setup Supported Datatypes (Probably making this Object
|
||||
// header only to not care about datatype support)
|
||||
template class PD_UI7_API DragData<float>;
|
||||
template class PD_UI7_API DragData<int>;
|
||||
template class PD_UI7_API DragData<double>;
|
||||
template class PD_UI7_API DragData<u8>;
|
||||
template class PD_UI7_API DragData<u16>;
|
||||
template class PD_UI7_API DragData<u32>;
|
||||
template class PD_UI7_API DragData<u64>;
|
||||
template <typename T>
|
||||
PD_UI7_API void DragData<T>::HandleInput() {
|
||||
/// Ensure to only check input once
|
||||
if (inp_done) {
|
||||
return;
|
||||
}
|
||||
// Assert(screen.get(), "Screen is not set up!");
|
||||
// if (screen->ScreenType() == Screen::Bottom) {
|
||||
float off_x = 0;
|
||||
for (size_t i = 0; i < elm_count; i++) {
|
||||
std::string p;
|
||||
if constexpr (std::is_floating_point_v<T>) {
|
||||
p = std::format("{:.{}f}", data[i], precision);
|
||||
} else {
|
||||
p = std::format("{}", data[i]);
|
||||
}
|
||||
vec2 tdim = io->Font->GetTextBounds(p, io->FontScale);
|
||||
// Unsafe but is the fastest solution
|
||||
if (io->InputHandler->DragObject(
|
||||
this->GetID() + i + 1,
|
||||
fvec4(FinalPos() + fvec2(off_x, 0), tdim + io->FramePadding))) {
|
||||
data[i] = std::clamp(
|
||||
T(data[i] + (step * (io->InputHandler->DragPosition.x -
|
||||
io->InputHandler->DragLastPosition.x))),
|
||||
this->min, this->max);
|
||||
}
|
||||
off_x += tdim.x + io->ItemSpace.x + io->FramePadding.x;
|
||||
}
|
||||
//}
|
||||
inp_done = true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
PD_UI7_API void DragData<T>::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
float off_x = 0.f;
|
||||
for (size_t i = 0; i < elm_count; i++) {
|
||||
std::string p;
|
||||
if constexpr (std::is_floating_point_v<T>) {
|
||||
p = std::format("{:.{}f}", data[i], precision);
|
||||
} else {
|
||||
p = std::format("{}", data[i]);
|
||||
}
|
||||
vec2 td = io->Font->GetTextBounds(p, io->FontScale);
|
||||
list->AddRectangle(FinalPos() + fvec2(off_x, 0), td + io->FramePadding,
|
||||
io->Theme->Get(UI7Color_Button));
|
||||
list->Layer++;
|
||||
list->AddText(FinalPos() + fvec2(off_x, 0), p,
|
||||
io->Theme->Get(UI7Color_Text), LITextFlags_AlignMid,
|
||||
td + io->FramePadding);
|
||||
list->Layer--;
|
||||
off_x += td.x + io->ItemSpace.x + io->FramePadding.x;
|
||||
}
|
||||
list->AddText(FinalPos() + fvec2(off_x, io->FramePadding.y * 0.5), label,
|
||||
io->Theme->Get(UI7Color_Text));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
PD_UI7_API void DragData<T>::Update() {
|
||||
// Assert(io.get(), "Did you run Container::Init correctly?");
|
||||
// Probably need to find a faster solution (caching sizes calculated here)
|
||||
float off_x = 0;
|
||||
for (size_t i = 0; i < elm_count; i++) {
|
||||
std::string p;
|
||||
if constexpr (std::is_floating_point_v<T>) {
|
||||
p = std::format("{:.{}f}", data[i], precision);
|
||||
} else {
|
||||
p = std::format("{}", data[i]);
|
||||
}
|
||||
vec2 tdim = io->Font->GetTextBounds(p, io->FontScale);
|
||||
off_x += tdim.x + io->ItemSpace.x + io->FramePadding.x;
|
||||
}
|
||||
this->SetSize(vec2(tdim.x + off_x, tdim.y + io->FramePadding.y));
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 - 2025 tobid7
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/dynobj.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void DynObj::Draw() { pRenFun(io, list, this); }
|
||||
PD_UI7_API void DynObj::HandleInput() {}
|
||||
PD_UI7_API void DynObj::Update() {}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/image.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void Image::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// Assert(img.get(), "Image is nullptr!");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->Layer++;
|
||||
list->AddImage(FinalPos(), img, newsize, this->cuv);
|
||||
list->Layer--;
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/container/label.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void Label::Draw() {
|
||||
// Assert(io.get() && list.get(), "Did you run Container::Init correctly?");
|
||||
// io->Ren->OnScreen(screen);
|
||||
list->AddText(FinalPos(), label, io->Theme->Get(UI7Color_Text));
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,288 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/core/core.hpp>
|
||||
#include <pd/ui7/drawlist.hpp>
|
||||
#include <pd/ui7/io.hpp>
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void DrawList::PathArcToN(const fvec2& c, float radius, float a_min,
|
||||
float a_max, int segments) {
|
||||
// Path.push_back(c);
|
||||
PathReserve(segments + 1);
|
||||
for (int i = 0; i < segments; i++) {
|
||||
float a = a_min + ((float)i / (float)segments) * (a_max - a_min);
|
||||
PathNext(vec2(c.x + std::cos(a) * radius, c.y + std::sin(a) * radius));
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::PathRect(fvec2 a, fvec2 b, float rounding,
|
||||
UI7DrawFlags flags) {
|
||||
if (rounding == 0.f) {
|
||||
PathNext(a);
|
||||
PathNext(vec2(b.x, a.y));
|
||||
PathNext(b);
|
||||
PathNext(vec2(a.x, b.y));
|
||||
} else {
|
||||
PathArcToN(vec2(a.x + rounding, a.y + rounding), rounding, 4 * 6, 4 * 9,
|
||||
21);
|
||||
PathArcToN(vec2(b.x - rounding, a.y + rounding), rounding, 4 * 9, 4 * 12,
|
||||
21);
|
||||
PathArcToN(vec2(b.x - rounding, b.y - rounding), rounding, 4 * 0, 4 * 3,
|
||||
21);
|
||||
PathArcToN(vec2(a.x + rounding, b.y - rounding), rounding, 4 * 3, 4 * 6,
|
||||
21);
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddRect(const fvec2& pos, const fvec2& size,
|
||||
const UI7Color& clr, int thickness) {
|
||||
PathRect(pos, pos + size);
|
||||
PathStroke(clr, thickness, UI7DrawFlags_Close);
|
||||
}
|
||||
PD_UI7_API void DrawList::AddRectangle(fvec2 pos, fvec2 szs,
|
||||
const UI7Color& clr) {
|
||||
PathRect(pos, pos + szs);
|
||||
PathFill(clr);
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddTriangle(const fvec2& a, const fvec2& b,
|
||||
const fvec2& c, const UI7Color& clr,
|
||||
int thickness) {
|
||||
PathNext(a);
|
||||
PathNext(b);
|
||||
PathNext(c);
|
||||
PathStroke(clr, thickness, UI7DrawFlags_Close);
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddTriangleFilled(const fvec2& a, const fvec2& b,
|
||||
const fvec2& c,
|
||||
const UI7Color& clr) {
|
||||
PathNext(a);
|
||||
PathNext(b);
|
||||
PathNext(c);
|
||||
PathFill(clr);
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddCircle(const fvec2& pos, float rad, UI7Color col,
|
||||
int num_segments, int thickness) {
|
||||
if (num_segments <= 0) {
|
||||
// Auto Segment
|
||||
} else {
|
||||
float am = (M_PI * 2.0f) * ((float)num_segments) / (float)num_segments;
|
||||
PathArcToN(pos, rad, 0.f, am, num_segments);
|
||||
}
|
||||
PathStroke(col, thickness, UI7DrawFlags_Close);
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddCircleFilled(const fvec2& pos, float rad,
|
||||
UI7Color col, int num_segments) {
|
||||
if (num_segments <= 0) {
|
||||
// Auto Segment
|
||||
} else {
|
||||
float am = (M_PI * 2.0f) * ((float)num_segments) / (float)num_segments;
|
||||
PathArcToN(pos, rad, 0.f, am, num_segments);
|
||||
}
|
||||
PathFill(col);
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddText(fvec2 pos, const std::string& text,
|
||||
const UI7Color& clr, u32 flags, fvec2 box) {
|
||||
Vec<LI::Command::Ref> cmds;
|
||||
pIO->Font->CmdTextEx(cmds, pos, clr, pIO->FontScale, text, flags, box);
|
||||
for (size_t i = 0; i < cmds.Size(); i++) {
|
||||
ClipCmd(cmds[i]);
|
||||
cmds[i]->Layer = Layer;
|
||||
cmds[i]->Index = Commands.Size();
|
||||
Commands.Add(cmds[i]);
|
||||
}
|
||||
// if (!IO->Ren->Font()) {
|
||||
// return;
|
||||
// }
|
||||
// u32 id = Strings::FastHash(text);
|
||||
// LI::StaticText::Ref e;
|
||||
// auto f = static_text.find(id);
|
||||
// if (static_text.find(id) == static_text.end()) {
|
||||
// e = LI::StaticText::New();
|
||||
// static_text[id] = e;
|
||||
// } else {
|
||||
// e = f->second;
|
||||
// }
|
||||
// if (!e->IsSetup() || e->Font() != IO->Ren->Font()) {
|
||||
// int l = IO->Ren->Layer();
|
||||
// IO->Ren->Layer(layer);
|
||||
// e->Setup(ren.get(), pos, clr, text, flags, box);
|
||||
// e->Font(IO->Ren->Font());
|
||||
// IO->Ren->Layer(l);
|
||||
// }
|
||||
// e->SetPos(pos);
|
||||
// e->SetColor(clr);
|
||||
// e->SetLayer(layer);
|
||||
// if (!clip_rects.empty()) {
|
||||
// e->SetScissorMode(LI::ScissorMode_Normal);
|
||||
// e->ScissorRect(clip_rects.top());
|
||||
// }
|
||||
// for (auto it : e->GetRawObject()->List()) {
|
||||
// this->commands.push_back(std::make_pair(
|
||||
// IO->Ren->CurrentScreen()->ScreenType() == Screen::Bottom, it));
|
||||
// }
|
||||
// e->GetRawObject()->ReCopy();
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddImage(fvec2 pos, LI::Texture::Ref img, fvec2 size,
|
||||
LI::Rect uv) {
|
||||
size = size == 0.f ? fvec2(img->GetSize().x, img->GetSize().y) : size;
|
||||
uv = (uv.Top() == 0.0f && uv.Bot() == 0.0f) ? img->GetUV() : uv;
|
||||
LI::Command::Ref cmd = LI::Command::New();
|
||||
cmd->Layer = Layer;
|
||||
cmd->Index = Commands.Size();
|
||||
cmd->Tex = img;
|
||||
auto r = LI::Renderer::PrimRect(pos, size);
|
||||
LI::Renderer::CmdQuad(cmd, r, uv, 0xffffffff);
|
||||
// auto rect = IO->Ren->CreateRect(pos, size, 0.f);
|
||||
// auto cmd = LI::Command::New();
|
||||
// IO->Ren->UseTex(img);
|
||||
// IO->Ren->SetupCommand(cmd);
|
||||
// cmd->Layer(layer);
|
||||
// if (!clip_rects.empty()) {
|
||||
// cmd->SetScissorMode(LI::ScissorMode_Normal);
|
||||
// cmd->ScissorRect(clip_rects.top());
|
||||
// }
|
||||
// IO->Ren->QuadCommand(cmd, rect, uv, 0xffffffff);
|
||||
// commands.push_back(std::make_pair(
|
||||
// IO->Ren->CurrentScreen()->ScreenType() == Screen::Bottom, cmd));
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::AddLine(const fvec2& a, const fvec2& b,
|
||||
const UI7Color& clr, int t) {
|
||||
PathNext(a);
|
||||
PathNext(b);
|
||||
PathStroke(clr, t);
|
||||
}
|
||||
|
||||
// TODO: Don't render OOS
|
||||
PD_UI7_API void DrawList::AddPolyLine(const Vec<fvec2>& points,
|
||||
const UI7Color& clr, UI7DrawFlags flags,
|
||||
int thickness) {
|
||||
if (points.Size() < 2) {
|
||||
return;
|
||||
}
|
||||
auto cmd = LI::Command::New();
|
||||
cmd->Index = Commands.Size();
|
||||
cmd->Layer = Layer;
|
||||
cmd->Tex = pIO->Ren->WhitePixel;
|
||||
ClipCmd(cmd);
|
||||
bool close = (flags & UI7DrawFlags_Close);
|
||||
int num_points = close ? (int)points.Size() : (int)points.Size() - 1;
|
||||
if (flags & UI7DrawFlags_AALines) {
|
||||
// TODO: Find a way to draw less garbage looking lines
|
||||
} else {
|
||||
// Non antialiased lines look awful when rendering with thickness != 1
|
||||
for (int i = 0; i < num_points; i++) {
|
||||
int j = (i + 1) == (int)points.Size() ? 0 : (i + 1);
|
||||
auto line = LI::Renderer::PrimLine(points[i], points[j], thickness);
|
||||
LI::Renderer::CmdQuad(cmd, line, vec4(0.f, 1.f, 1.f, 0.f), clr);
|
||||
}
|
||||
}
|
||||
Commands.Add(cmd);
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::ClipCmd(LI::Command::Ref cmd) {
|
||||
if (!pClipRects.IsEmpty()) {
|
||||
cmd->ScissorEnabled = true;
|
||||
fvec4 sr = pClipRects.Top();
|
||||
cmd->ScissorRect = ivec4(sr.x, sr.y, sr.z, sr.w);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Don't render OOS (Probably make it with a define as it
|
||||
// would probably be faster to render out of screen than checking if
|
||||
// it could be skipped)
|
||||
PD_UI7_API void DrawList::AddConvexPolyFilled(const Vec<fvec2>& points,
|
||||
const UI7Color& clr) {
|
||||
if (points.Size() < 3) {
|
||||
return; // Need at least three points
|
||||
}
|
||||
auto cmd = LI::Command::New();
|
||||
cmd->Index = Commands.Size();
|
||||
cmd->Layer = Layer;
|
||||
auto tex = CurrentTex;
|
||||
if (!tex) {
|
||||
tex = pIO->Ren->WhitePixel;
|
||||
}
|
||||
cmd->Tex = tex;
|
||||
ClipCmd(cmd);
|
||||
for (int i = 2; i < (int)points.Size(); i++) {
|
||||
cmd->AppendIndex(0).AppendIndex(i).AppendIndex(i - 1);
|
||||
}
|
||||
for (int i = 0; i < (int)points.Size(); i++) {
|
||||
cmd->AppendVertex(LI::Vertex(points[i], fvec2(0, 0), clr));
|
||||
}
|
||||
Commands.Add(cmd);
|
||||
}
|
||||
|
||||
PD_UI7_API void DrawList::Clear() { Commands.Clear(); }
|
||||
|
||||
/** Process [Render] the Drawlist */
|
||||
PD_UI7_API void DrawList::Process(LI::DrawList::Ref d) {
|
||||
std::sort(Commands.Begin(), Commands.End(),
|
||||
[](LI::Command::Ref a, LI::Command::Ref b) {
|
||||
/** Advanced (for saving Drawcalls)
|
||||
* - Probably could handle this by creating diffrent layers
|
||||
* for texts and solid objectives
|
||||
* if(a->Tex == b->Tex) { return a->Layer < b->Layer; }
|
||||
* return a->Tex < b->Tex;
|
||||
*/
|
||||
/** Simple */
|
||||
return a->Layer < b->Layer;
|
||||
});
|
||||
NumVertices = 0;
|
||||
NumIndices = 0;
|
||||
for (auto command = Commands.Begin(); command != Commands.End(); command++) {
|
||||
// IO->Ren->OnScreen(IO->Ren->GetScreen(command.first));
|
||||
(*command)->Layer = (*command)->Layer + Base;
|
||||
d->AddCommand(*command);
|
||||
NumVertices += (*command)->VertexBuffer.Size();
|
||||
NumIndices += (*command)->IndexBuffer.Size();
|
||||
}
|
||||
Commands.Clear();
|
||||
Layer = 0;
|
||||
std::vector<u32> rem;
|
||||
// for (auto it : static_text) {
|
||||
// if (!it.second->Used()) {
|
||||
// rem.push_back(it.first);
|
||||
// }
|
||||
// it.second->SetUnused();
|
||||
// }
|
||||
// for (auto& it : rem) {
|
||||
// static_text.erase(it);
|
||||
// }
|
||||
pClipRects.Clear();
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/core/core.hpp>
|
||||
#include <pd/ui7/io.hpp>
|
||||
|
||||
namespace PD {
|
||||
PD_UI7_API void UI7::IO::Update() {
|
||||
u64 current = Sys::GetNanoTime();
|
||||
Delta = static_cast<float>(current - LastTime) / 1000000.f;
|
||||
LastTime = current;
|
||||
DeltaStats->Add(Delta * 1000);
|
||||
Time->Update();
|
||||
InputHandler->Update();
|
||||
Framerate = 1000.f / Delta;
|
||||
DrawListRegestry.Clear();
|
||||
DrawListRegestry.PushFront(Pair<UI7::ID, DrawList::Ref>("CtxBackList", Back));
|
||||
// RegisterDrawList("CtxBackList", Back);
|
||||
}
|
||||
} // namespace PD
|
||||
@@ -1,140 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/layout.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void Layout::CursorInit() { Cursor = fvec2(WorkRect.x, WorkRect.y); }
|
||||
|
||||
PD_UI7_API void Layout::SameLine() {
|
||||
BackupCursor = LastObjSize;
|
||||
Cursor = SamelineCursor;
|
||||
}
|
||||
|
||||
PD_UI7_API void Layout::CursorMove(const fvec2& size) {
|
||||
LastObjSize = size;
|
||||
SamelineCursor = Cursor + fvec2(size.x + IO->ItemSpace.x, 0);
|
||||
if (BeforeSameLine.y) {
|
||||
Cursor =
|
||||
fvec2(IO->MenuPadding.x, Cursor.y + BeforeSameLine.y + IO->ItemSpace.y);
|
||||
BeforeSameLine = 0.f;
|
||||
} else {
|
||||
Cursor = fvec2(IO->MenuPadding.x + InitialCursorOffset.x,
|
||||
Cursor.y + size.y + IO->ItemSpace.y);
|
||||
}
|
||||
// Logical Issue here as x should use a max check
|
||||
MaxPosition = fvec2(std::max(MaxPosition.x, SamelineCursor.x), Cursor.y);
|
||||
}
|
||||
|
||||
PD_UI7_API bool Layout::ObjectWorkPos(fvec2& movpos) {
|
||||
if (Scrolling[1]) {
|
||||
movpos.y -= ScrollOffset.y;
|
||||
if (!IO->Ren->InBox(movpos, LastObjSize,
|
||||
fvec4(WorkRect.x, WorkRect.y, WorkRect.x + WorkRect.z,
|
||||
WorkRect.y + WorkRect.w))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
PD_UI7_API void Layout::AddObject(Container::Ref obj) {
|
||||
obj->Init(IO, DrawList);
|
||||
obj->SetPos(AlignPosition(Cursor, obj->GetSize(), WorkRect, GetAlignment()));
|
||||
obj->Update();
|
||||
CursorMove(obj->GetSize());
|
||||
obj->HandleScrolling(ScrollOffset, WorkRect);
|
||||
Objects.PushBack(obj);
|
||||
}
|
||||
|
||||
PD_UI7_API void Layout::AddObjectEx(Container::Ref obj, u32 flags) {
|
||||
obj->Init(IO, DrawList);
|
||||
if (!(flags & 1)) {
|
||||
obj->SetPos(
|
||||
AlignPosition(Cursor, obj->GetSize(), WorkRect, GetAlignment()));
|
||||
}
|
||||
obj->Update();
|
||||
if (!(flags & 1)) {
|
||||
CursorMove(obj->GetSize());
|
||||
}
|
||||
if (!(flags & 2)) {
|
||||
obj->HandleScrolling(ScrollOffset, WorkRect);
|
||||
}
|
||||
if (!(flags & 4)) {
|
||||
Objects.PushFront(obj);
|
||||
} else {
|
||||
Objects.PushBack(obj);
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API Container::Ref Layout::FindObject(u32 id) {
|
||||
for (auto& it : IDObjects) {
|
||||
if (it->GetID() == id) {
|
||||
return it;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PD_UI7_API fvec2 Layout::AlignPosition(fvec2 pos, fvec2 size, fvec4 area,
|
||||
UI7Align alignment) {
|
||||
vec2 p = pos;
|
||||
if (alignment & UI7Align_Center) {
|
||||
p.x = (area.x + area.z) * 0.5 - (pos.x - area.x + size.x * 0.5);
|
||||
} else if (alignment & UI7Align_Right) {
|
||||
}
|
||||
if (alignment & UI7Align_Mid) {
|
||||
p.y = (area.y + area.w) * 0.5 - (pos.y - area.y + size.y * 0.5);
|
||||
} else if (alignment & UI7Align_Bottom) {
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
PD_UI7_API void Layout::Update() {
|
||||
for (auto& it : Objects) {
|
||||
if (it->GetID() != 0 && !FindObject(it->GetID())) {
|
||||
IDObjects.push_back(it);
|
||||
}
|
||||
if (!it->Skippable()) {
|
||||
it->SetPos(it->GetPos() + Pos);
|
||||
it->HandleInput();
|
||||
it->UnlockInput();
|
||||
it->Draw();
|
||||
}
|
||||
}
|
||||
std::vector<size_t> tbr;
|
||||
for (size_t i = 0; i < IDObjects.size(); i++) {
|
||||
if (IDObjects[i]->Removable()) {
|
||||
tbr.push_back(i);
|
||||
}
|
||||
}
|
||||
for (auto& it : tbr) {
|
||||
IDObjects.erase(IDObjects.begin() + it);
|
||||
}
|
||||
Objects.Clear();
|
||||
WorkRect = fvec4(fvec2(WorkRect.x, WorkRect.y), Size - IO->MenuPadding);
|
||||
CursorInit();
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,661 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/core/core.hpp>
|
||||
#include <pd/ui7/menu.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void UI7::Menu::Label(const std::string& label) {
|
||||
// Layout API
|
||||
auto r = PD::New<UI7::Label>(label, io);
|
||||
Layout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API bool UI7::Menu::Button(const std::string& label) {
|
||||
bool ret = false;
|
||||
u32 id = Strings::FastHash("btn" + label + std::to_string(count_btn++));
|
||||
Container::Ref r = Layout->FindObject(id);
|
||||
if (!r) {
|
||||
r = PD::New<UI7::Button>(label, io);
|
||||
r->SetID(id);
|
||||
}
|
||||
Layout->AddObject(r);
|
||||
if (!r->Skippable()) {
|
||||
ret = std::static_pointer_cast<UI7::Button>(r)->IsPressed();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::ColorEdit(const std::string& label, u32* color) {
|
||||
u32 id = Strings::FastHash("cle" + label + std::to_string(count_btn++));
|
||||
Container::Ref r = Layout->FindObject(id);
|
||||
if (!r) {
|
||||
r = PD::New<UI7::ColorEdit>(label, color, io);
|
||||
r->SetID(id);
|
||||
}
|
||||
Layout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::DragFloat(const std::string& label, float* data,
|
||||
size_t num_elms) {
|
||||
u32 id = Strings::FastHash("dfl" + label + std::to_string(count_btn++));
|
||||
Container::Ref r = Layout->FindObject(id);
|
||||
if (!r) {
|
||||
r = PD::New<UI7::DragData<float>>(label, data, num_elms, io);
|
||||
r->SetID(id);
|
||||
}
|
||||
Layout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::Checkbox(const std::string& label, bool& v) {
|
||||
u32 id = Strings::FastHash("cbx" + label + std::to_string(count_cbx++));
|
||||
Container::Ref r = Layout->FindObject(id);
|
||||
if (!r) {
|
||||
r = PD::New<UI7::Checkbox>(label, v, io);
|
||||
r->SetID(id);
|
||||
}
|
||||
Layout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::Image(LI::Texture::Ref img, fvec2 size,
|
||||
LI::Rect uv) {
|
||||
Container::Ref r = PD::New<UI7::Image>(img, size, uv);
|
||||
Layout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::DebugLabels(Menu::Ref m, Menu::Ref t) {
|
||||
/*if (!m) {
|
||||
return;
|
||||
}
|
||||
if (t == nullptr) {
|
||||
t = m;
|
||||
}
|
||||
std::stringstream s;
|
||||
s << "Name: " << m->name << " [";
|
||||
s << std::hex << std::setw(8) << std::setfill('0') << m->id;
|
||||
s << std::dec << "]";
|
||||
t->Label(s.str());
|
||||
t->Label(std::format("Max Size: {:.2f}, {:.2f}", m->Layout->MaxPosition.x(),
|
||||
m->Layout->MaxPosition.y()));
|
||||
t->Label(std::format("Pos: {:.2f}, {:.2f} Size: {:.2f}, {:.2f}",
|
||||
m->Layout->Pos.x(), m->Layout->Pos.y(),
|
||||
m->Layout->Size.x(), m->Layout->Size.y()));
|
||||
t->Label(std::format("Flags: {:#08x}", m->flags));
|
||||
t->Label(
|
||||
"Pre: " +
|
||||
Strings::FormatNanos(
|
||||
Sys::GetTraceRef("MPRE_" + m->name)->GetProtocol()->GetAverage()));
|
||||
t->Label(
|
||||
"Post: " +
|
||||
Strings::FormatNanos(
|
||||
Sys::GetTraceRef("MPOS_" + m->name)->GetProtocol()->GetAverage()));
|
||||
t->Label(
|
||||
"Update: " +
|
||||
Strings::FormatNanos(
|
||||
Sys::GetTraceRef("MUPT_" + m->name)->GetProtocol()->GetAverage()));
|
||||
t->Label(
|
||||
"MUser: " +
|
||||
Strings::FormatNanos(
|
||||
Sys::GetTraceRef("MUSR_" + m->name)->GetProtocol()->GetAverage()));*/
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::Update(float delta) {
|
||||
TT::Scope st("MUPT_" + name);
|
||||
MenuFocusHandler();
|
||||
if (!(flags & UI7MenuFlags_NoTitlebar)) {
|
||||
CollapseHandler();
|
||||
CloseButtonHandler();
|
||||
MoveHandler();
|
||||
}
|
||||
scroll_anim.Update(delta);
|
||||
if (!scroll_anim.IsFinished()) {
|
||||
Layout->ScrollOffset = scroll_anim;
|
||||
}
|
||||
if (!(flags & UI7MenuFlags_NoClipRect)) {
|
||||
Layout->DrawList->PushClipRect(
|
||||
fvec4(Layout->Pos.x + io->MenuPadding.x, Layout->Pos.y + tbh,
|
||||
Layout->Size.x - io->MenuPadding.x, Layout->Size.y - tbh));
|
||||
}
|
||||
Layout->DrawList->Layer = 10;
|
||||
Layout->Update();
|
||||
if (!(flags & UI7MenuFlags_NoClipRect)) {
|
||||
Layout->DrawList->PopClipRect();
|
||||
}
|
||||
PostScrollHandler();
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::PreHandler(UI7MenuFlags flags) {
|
||||
TT::Scope st("MPRE_" + name);
|
||||
// No touch means no Input System
|
||||
if (!has_touch) {
|
||||
header = UI7Color_Header;
|
||||
}
|
||||
if (io->InputHandler->FocusedMenu == id) {
|
||||
header = UI7Color_Header;
|
||||
}
|
||||
DrawList::Ref list = Layout->GetDrawList();
|
||||
// Resetup [updating] variables
|
||||
count_btn = 0;
|
||||
count_cbx = 0;
|
||||
tbh = 0.f;
|
||||
this->flags = flags;
|
||||
Layout->Scrolling[1] = flags & UI7MenuFlags_VtScrolling;
|
||||
has_touch = true; // io->Ren->CurrentScreen()->ScreenType() ==
|
||||
// Screen::Bottom;
|
||||
if (!(flags & UI7MenuFlags_NoTitlebar)) {
|
||||
// Title bar setup and Rendering
|
||||
tbh = io->FontScale * io->Font->DefaultPixelHeight;
|
||||
list->Layer = 20;
|
||||
list->AddRectangle(Layout->Pos, fvec2(Layout->Size.x, tbh),
|
||||
io->Theme->Get(header));
|
||||
fvec2 tpos(
|
||||
io->MenuPadding.x,
|
||||
tbh * 0.5 - io->Font->GetTextBounds(name, io->FontScale).y * 0.5);
|
||||
if (!(flags & UI7MenuFlags_NoCollapse)) {
|
||||
tpos.x += 18;
|
||||
}
|
||||
// LITextFlags tflags = LITextFlags_None;
|
||||
if (flags & UI7MenuFlags_CenterTitle) {
|
||||
tpos = 0;
|
||||
// tflags = LITextFlags_AlignMid;
|
||||
}
|
||||
list->Layer++;
|
||||
if (!(flags & UI7MenuFlags_NoClipRect)) {
|
||||
int extra = is_shown != nullptr && !(flags & UI7MenuFlags_NoClose)
|
||||
? (20 + io->ItemSpace.x)
|
||||
: 0;
|
||||
Layout->DrawList->PushClipRect(
|
||||
fvec4(Layout->Pos, fvec2(Layout->Size.x - extra, tbh)));
|
||||
}
|
||||
list->AddText(Layout->Pos + tpos, this->name, io->Theme->Get(UI7Color_Text),
|
||||
0, fvec2(Layout->Size.x, tbh));
|
||||
if (!(flags & UI7MenuFlags_NoClipRect)) {
|
||||
Layout->DrawList->PopClipRect();
|
||||
}
|
||||
|
||||
/// Close Button Rendering
|
||||
if (!(flags & UI7MenuFlags_NoClose) && is_shown) {
|
||||
fvec2 size = tbh - io->FramePadding.y * 2; // Fixed quad size
|
||||
// Need to clamp this way as the math lib lacks a less and greater
|
||||
// operator in vec2 (don't checked if it would make sense yet)
|
||||
size.x = std::clamp(size.x, 5.f, std::numeric_limits<float>::max());
|
||||
size.y = std::clamp(size.y, 5.f, std::numeric_limits<float>::max());
|
||||
// Probably should fix the minsize to be locked on y
|
||||
fvec2 cpos =
|
||||
fvec2(Layout->Pos.x + Layout->Size.x - size.x - io->FramePadding.x,
|
||||
Layout->Pos.y + io->FramePadding.y);
|
||||
Layout->DrawList->AddLine(cpos, cpos + size,
|
||||
io->Theme->Get(UI7Color_FrameBackground), 2);
|
||||
Layout->DrawList->AddLine(cpos + fvec2(0, size.y),
|
||||
cpos + fvec2(size.x, 0),
|
||||
io->Theme->Get(UI7Color_FrameBackground), 2);
|
||||
/*fvec2 cpos =
|
||||
fvec2(Layout->Pos.x + Layout->Size.x - 12 - io->FramePadding.x,
|
||||
Layout->Pos.y + io->FramePadding.y);
|
||||
Layout->GetDrawList()->AddLine(cpos, cpos + 12,
|
||||
io->Theme->Get(clr_close_btn), 2);
|
||||
Layout->GetDrawList()->AddLine(cpos + fvec2(0, 12), cpos + fvec2(12, 0),
|
||||
io->Theme->Get(clr_close_btn), 2);*/
|
||||
}
|
||||
/// Collapse Triangle Rendering
|
||||
if (!(flags & UI7MenuFlags_NoCollapse)) {
|
||||
Layout->DrawList->Layer = 21;
|
||||
/** Fixed Size */
|
||||
fvec2 size = tbh - io->FramePadding.y * 2;
|
||||
fvec2 cpos = Layout->Pos + io->FramePadding;
|
||||
/** Symbol (Position Swapping set by pIsOpen ? openpos : closepos;) */
|
||||
Layout->DrawList->AddTriangleFilled(
|
||||
cpos, cpos + fvec2(size.x, is_open ? 0 : size.y * 0.5),
|
||||
cpos + fvec2(is_open ? size.x * 0.5 : 0, size.y),
|
||||
io->Theme->Get(UI7Color_FrameBackground));
|
||||
Layout->DrawList->Layer = 20;
|
||||
/*fvec2 cpos = Layout->Pos + io->FramePadding;
|
||||
fvec2 positions[2] = {
|
||||
fvec2(12, 6),
|
||||
fvec2(0, 12),
|
||||
};
|
||||
if (is_open) {
|
||||
float t = positions[0].y;
|
||||
positions[0].y = positions[1].x;
|
||||
positions[1].x = t;
|
||||
}
|
||||
Layout->GetDrawList()->AddTriangleFilled(
|
||||
cpos, cpos + positions[0], cpos + positions[1],
|
||||
io->Theme->Get(clr_collapse_tri));*/
|
||||
}
|
||||
Layout->WorkRect.y = io->MenuPadding.y + tbh;
|
||||
Layout->CursorInit();
|
||||
}
|
||||
if (!(flags & UI7MenuFlags_NoBackground) && is_open) {
|
||||
list->Layer = 0;
|
||||
list->AddRectangle(Layout->Pos + fvec2(0, tbh),
|
||||
Layout->Size - fvec2(0, tbh),
|
||||
io->Theme->Get(UI7Color_Background));
|
||||
}
|
||||
if (io->ShowMenuBorder) {
|
||||
vec2 bsize = Layout->Size;
|
||||
if (!is_open) {
|
||||
bsize.y = tbh;
|
||||
}
|
||||
list->Layer = 20;
|
||||
list->AddRect(Layout->Pos, bsize, io->Theme->Get(UI7Color_Border));
|
||||
}
|
||||
// Add a clip Rect for Separators
|
||||
if (!(flags & UI7MenuFlags_NoClipRect)) {
|
||||
Layout->DrawList->PushClipRect(
|
||||
fvec4(Layout->Pos.x + io->MenuPadding.x, Layout->Pos.y + tbh,
|
||||
Layout->Size.x - io->MenuPadding.x, Layout->Size.y - tbh));
|
||||
}
|
||||
list->Layer = 10;
|
||||
TT::Beg("MUSR_" + name);
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::PostHandler() {
|
||||
TT::Scope st("MPOS_" + name);
|
||||
TT::End("MUSR_" + name);
|
||||
// Remove the Clip Rect
|
||||
if (!(flags & UI7MenuFlags_NoClipRect)) {
|
||||
Layout->DrawList->PopClipRect();
|
||||
}
|
||||
ResizeHandler();
|
||||
if (Layout->Scrolling[1]) {
|
||||
scroll_allowed[1] =
|
||||
(Layout->MaxPosition.y > Layout->Size.y - io->MenuPadding.y);
|
||||
if (Layout->MaxPosition.y < Layout->Size.y - io->MenuPadding.y) {
|
||||
Layout->ScrollOffset.y = 0.f;
|
||||
}
|
||||
scrollbar[1] = scroll_allowed[1];
|
||||
|
||||
if (scrollbar[1]) {
|
||||
/// Setup Some Variables hare [they are self described]
|
||||
int screen_w = Layout->Size.x;
|
||||
int tsp = io->MenuPadding.y + tbh;
|
||||
int slider_w = 4;
|
||||
int szs = Layout->Size.y - tsp - io->MenuPadding.y;
|
||||
/// Actually dont have a Horizontal bar yet
|
||||
if (scrollbar[0]) szs -= slider_w - 2;
|
||||
int lslider_h =
|
||||
io->MinSliderDragSize.y; // Dont go less heigt for the drag
|
||||
float slider_h = (szs - 4) * (float(szs - 4) / Layout->MaxPosition.y);
|
||||
/// Visual Slider Height (How it looks in the end)
|
||||
int vslider_h = std::clamp(slider_h, float(lslider_h), float(szs - 4));
|
||||
|
||||
/// Check if we overscroll to the bottom and Auto scroll back...
|
||||
/// Probably schould use Tween ENgine here
|
||||
if (Layout->ScrollOffset.y > Layout->MaxPosition.y - Layout->Size.y &&
|
||||
Layout->MaxPosition.y != 0.f &&
|
||||
Layout->MaxPosition.y >= Layout->Size.y - io->MenuPadding.y) {
|
||||
Layout->ScrollOffset.y -= io->OverScrollMod * io->Delta;
|
||||
if (Layout->ScrollOffset.y < Layout->MaxPosition.y - Layout->Size.y) {
|
||||
Layout->ScrollOffset.y = Layout->MaxPosition.y - Layout->Size.y;
|
||||
}
|
||||
}
|
||||
|
||||
/// Do the Same as above just for Overscroll back to the top
|
||||
if (Layout->ScrollOffset.y < 0) {
|
||||
Layout->ScrollOffset.y += io->OverScrollMod * io->Delta;
|
||||
if (Layout->ScrollOffset.y > 0) {
|
||||
Layout->ScrollOffset.y = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// Effect
|
||||
/*if (scroll_mod[1] != 0) {
|
||||
Layout->ScrollOffset[1] += scroll_mod[1];
|
||||
}
|
||||
if (scroll_mod[1] < 0.f) {
|
||||
scroll_mod[1] += 0.4f;
|
||||
if (scroll_mod[1] > 0.f) {
|
||||
scroll_mod[1] = 0;
|
||||
}
|
||||
}
|
||||
if (scroll_mod[1] > 0.f) {
|
||||
scroll_mod[1] -= 0.4f;
|
||||
if (scroll_mod[1] < 0.f) {
|
||||
scroll_mod[1] = 0;
|
||||
}
|
||||
}*/
|
||||
UI7Color sldr_drag = UI7Color_Button;
|
||||
/// Slider Dragging????
|
||||
/// Probably need a new API for this
|
||||
if (has_touch &&
|
||||
io->InputHandler->DragObject(name + "sldr",
|
||||
fvec4(Layout->Pos.x + screen_w - 12,
|
||||
Layout->Pos.y + tsp, 8, szs)) &&
|
||||
!io->InputHandler->DragReleasedAW) {
|
||||
sldr_drag = UI7Color_ButtonHovered;
|
||||
float drag_center = vslider_h / 2.0f;
|
||||
float drag_pos =
|
||||
std::clamp(static_cast<float>(
|
||||
((io->InputHandler->DragPosition.y - Layout->Pos.y) -
|
||||
tsp - drag_center) /
|
||||
(szs - vslider_h - 4)),
|
||||
0.0f, 1.0f);
|
||||
|
||||
Layout->ScrollOffset.y =
|
||||
drag_pos * (Layout->MaxPosition.y - Layout->Size.y);
|
||||
}
|
||||
int srpos =
|
||||
tsp + std::clamp(float(szs - vslider_h - 4) *
|
||||
(Layout->ScrollOffset.y /
|
||||
(Layout->MaxPosition.y - Layout->Size.y)),
|
||||
0.f, float(szs - vslider_h - 4));
|
||||
|
||||
/// Rendering Stage
|
||||
auto list = Layout->DrawList;
|
||||
list->Layer = 20;
|
||||
list->AddRectangle(Layout->Pos + fvec2(screen_w - 12, tsp),
|
||||
fvec2(slider_w * 2, szs),
|
||||
io->Theme->Get(UI7Color_FrameBackground));
|
||||
list->AddRectangle(Layout->Pos + fvec2(screen_w - 10, tsp + 2),
|
||||
fvec2(slider_w, szs - 4),
|
||||
io->Theme->Get(UI7Color_FrameBackgroundHovered));
|
||||
list->AddRectangle(Layout->Pos + fvec2(screen_w - 10, srpos + 2),
|
||||
fvec2(slider_w, vslider_h), io->Theme->Get(sldr_drag));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::Separator() {
|
||||
// Dynamic Objects are very simple...
|
||||
Container::Ref r = PD::New<UI7::DynObj>(
|
||||
[=, this](UI7::IO::Ref io, UI7::DrawList::Ref l, UI7::Container* self) {
|
||||
l->AddRect(self->FinalPos(), self->GetSize(),
|
||||
io->Theme->Get(UI7Color_TextDead));
|
||||
});
|
||||
// Set size before pushing (cause Cursor Move will require it)
|
||||
r->SetSize(fvec2(Layout->Size.x - 10, 1));
|
||||
Layout->AddObject(r);
|
||||
/*return;
|
||||
vec2 pos = Layout->Cursor;
|
||||
vec2 size = fvec2(Layout->Size.x - (scrollbar[1] ? 24 : 10), 1);
|
||||
Layout->CursorMove(size);
|
||||
if (Layout->ObjectWorkPos(pos)) {
|
||||
return;
|
||||
}
|
||||
Layout->GetDrawList()->AddRectangle(Layout->Pos + pos, size,
|
||||
io->Theme->Get(UI7Color_TextDead));*/
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::SeparatorText(const std::string& label) {
|
||||
// Also note to use [=, this] instead of [&] to not undefined access label
|
||||
Container::Ref r = PD::New<UI7::DynObj>(
|
||||
[=, this](UI7::IO::Ref io, UI7::DrawList::Ref l, UI7::Container* self) {
|
||||
fvec2 size = self->GetSize();
|
||||
fvec2 tdim = io->Font->GetTextBounds(label, io->FontScale);
|
||||
fvec2 pos = self->FinalPos();
|
||||
auto align = Layout->GetAlignment();
|
||||
vec2 rpos = Layout->AlignPosition(
|
||||
pos, tdim, fvec4(Layout->Pos, Layout->Size), align);
|
||||
if (!(align & UI7Align_Left)) {
|
||||
l->AddRectangle(fvec2(rpos.x + io->FramePadding.x, tdim.y * 0.5),
|
||||
fvec2(pos.x - rpos.x - io->MenuPadding.x, 1),
|
||||
io->Theme->Get(UI7Color_TextDead));
|
||||
}
|
||||
if (!(align & UI7Align_Right)) {
|
||||
l->AddRectangle(
|
||||
pos + fvec2(tdim.x + io->FramePadding.x, tdim.y * 0.5),
|
||||
fvec2(size.x - tdim.x - io->MenuPadding.x, 1),
|
||||
io->Theme->Get(UI7Color_TextDead));
|
||||
}
|
||||
l->AddText(rpos, label, io->Theme->Get(UI7Color_Text), 0,
|
||||
fvec2(Layout->Size.x, self->GetSize().y));
|
||||
});
|
||||
// Set size before pushing (cause Cursor Move will require it)
|
||||
r->SetSize(fvec2(Layout->Size.x - 10, io->Font->PixelHeight * io->FontScale));
|
||||
Layout->AddObject(r);
|
||||
return;
|
||||
fvec2 size = fvec2(Layout->Size.x - (scrollbar[1] ? 24 : 10), 1);
|
||||
fvec2 tdim = io->Font->GetTextBounds(label, io->FontScale);
|
||||
fvec2 pos = Layout->Cursor;
|
||||
Layout->CursorMove(fvec2(size.x, tdim.y));
|
||||
|
||||
if (Layout->ObjectWorkPos(pos)) {
|
||||
return;
|
||||
}
|
||||
auto alignment = Layout->GetAlignment();
|
||||
vec2 rpos = Layout->AlignPosition(Layout->Pos + pos, tdim,
|
||||
vec4(Layout->Pos, Layout->Size), alignment);
|
||||
|
||||
if (!(alignment & UI7Align_Left)) {
|
||||
Layout->GetDrawList()->AddRectangle(
|
||||
rpos +
|
||||
fvec2(-(rpos.x - Layout->Pos.x - io->MenuPadding.x), tdim.y * 0.5),
|
||||
fvec2(rpos.x - Layout->Pos.x - io->MenuPadding.x - io->FramePadding.x,
|
||||
size.y),
|
||||
io->Theme->Get(UI7Color_TextDead));
|
||||
}
|
||||
if (!(alignment & UI7Align_Right)) {
|
||||
Layout->GetDrawList()->AddRectangle(
|
||||
rpos + fvec2(tdim.x + io->FramePadding.x, tdim.y * 0.5),
|
||||
fvec2(size.x - (tdim.x + io->FramePadding.x), size.y),
|
||||
io->Theme->Get(UI7Color_TextDead));
|
||||
}
|
||||
Layout->GetDrawList()->AddText(rpos, label, io->Theme->Get(UI7Color_Text), 0,
|
||||
fvec2(Layout->Size.x, 20));
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::Join() {
|
||||
// Assert(Layout->Objects.size(), "Objects list is empty!");
|
||||
join.push_back(Layout->Objects.Back().get());
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::JoinAlign(UI7Align a) {
|
||||
if (a == 0) {
|
||||
a = UI7Align_Default;
|
||||
}
|
||||
this->Join();
|
||||
|
||||
fvec2 spos = join.front()->GetPos();
|
||||
fvec2 szs = join.back()->GetPos() + join.back()->GetSize() - spos;
|
||||
for (auto it : join) {
|
||||
szs.x = std::max(szs.x, it->GetPos().x + it->GetSize().x - spos.x);
|
||||
}
|
||||
fvec2 off;
|
||||
if (a & UI7Align_Center) {
|
||||
off.x = (Layout->Pos.x + Layout->Size.x * 0.5) - (spos.x + szs.x * 0.5);
|
||||
}
|
||||
if (a & UI7Align_Mid) {
|
||||
off.y = (Layout->Pos.y + Layout->Size.y * 0.5) - (spos.y + szs.y * 0.5);
|
||||
}
|
||||
for (auto it : join) {
|
||||
it->SetPos(it->GetPos() + off);
|
||||
}
|
||||
join.clear();
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::AfterAlign(UI7Align a) {
|
||||
Container* ref = Layout->Objects.Back().get();
|
||||
fvec2 p = ref->GetPos();
|
||||
fvec2 s = ref->GetSize();
|
||||
fvec2 np = p;
|
||||
if (a & UI7Align_Center) {
|
||||
np.x = (Layout->Pos.x + Layout->Size.x * 0.5) - (p.x + s.x * 0.5);
|
||||
}
|
||||
if (a & UI7Align_Mid) {
|
||||
np.y = (Layout->Pos.y + Layout->Size.y * 0.5) - (p.y + s.y * 0.5);
|
||||
}
|
||||
ref->SetPos(np);
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::CreateParent() {
|
||||
// Assert(!tmp_parent, "There is already an existing Parent container!");
|
||||
tmp_parent = Container::New();
|
||||
tmp_parent->SetPos(0);
|
||||
tmp_parent->SetSize(0);
|
||||
}
|
||||
|
||||
PD_UI7_API bool UI7::Menu::BeginTreeNode(const UI7::ID& id) {
|
||||
auto n = tree_nodes.find((u32)id);
|
||||
if (n == tree_nodes.end()) {
|
||||
tree_nodes[(u32)id] = false;
|
||||
n = tree_nodes.find((u32)id);
|
||||
}
|
||||
fvec2 pos = Layout->Cursor;
|
||||
fvec2 tdim = io->Font->GetTextBounds(id.GetName(), io->FontScale);
|
||||
fvec2 size = fvec2(tdim.x + 10 + io->ItemSpace.x, tdim.y);
|
||||
if (n->second) {
|
||||
Layout->InitialCursorOffset.x += 10.f;
|
||||
}
|
||||
Layout->CursorMove(size);
|
||||
if (Layout->ObjectWorkPos(pos)) {
|
||||
return n->second;
|
||||
}
|
||||
fvec2 ts = Layout->Pos + pos + fvec2(0, 3);
|
||||
fvec2 positions[2] = {
|
||||
fvec2(10, 5),
|
||||
fvec2(0, 10),
|
||||
};
|
||||
if (n->second) {
|
||||
float t = positions[0].y;
|
||||
positions[0].y = positions[1].x;
|
||||
positions[1].x = t;
|
||||
}
|
||||
Layout->GetDrawList()->AddTriangleFilled(
|
||||
ts, ts + positions[0], ts + positions[1],
|
||||
io->Theme->Get(UI7Color_FrameBackground));
|
||||
Layout->GetDrawList()->AddText(
|
||||
Layout->Pos + pos + fvec2(10 + io->ItemSpace.x, 0), id.GetName(),
|
||||
io->Theme->Get(UI7Color_Text));
|
||||
if (has_touch && io->InputHandler->DragObject(
|
||||
name + id.GetName(), vec4(Layout->Pos + pos, size))) {
|
||||
if (io->InputHandler->DragReleased) {
|
||||
n->second = !n->second;
|
||||
if (!n->second) {
|
||||
Layout->InitialCursorOffset.x -= 10;
|
||||
Layout->Cursor.x -= 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
return n->second;
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::EndTreeNode() {
|
||||
Layout->InitialCursorOffset.x -= 10.f;
|
||||
Layout->Cursor.x -= 10.f;
|
||||
if (Layout->InitialCursorOffset.x < 0.f) {
|
||||
Layout->InitialCursorOffset.x = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::CloseButtonHandler() {
|
||||
// Close Logic
|
||||
if (!(flags & UI7MenuFlags_NoClose) && is_shown != nullptr) {
|
||||
vec2 cpos = fvec2(Layout->Pos.x + Layout->Size.x - 12 - io->FramePadding.x,
|
||||
Layout->Pos.y + io->FramePadding.y);
|
||||
|
||||
clr_close_btn = UI7Color_FrameBackground;
|
||||
if (has_touch && io->InputHandler->DragObject(UI7::ID(name + "clse"),
|
||||
fvec4(cpos, fvec2(12)))) {
|
||||
if (io->InputHandler->DragReleased) {
|
||||
*is_shown = !(*is_shown);
|
||||
}
|
||||
clr_close_btn = UI7Color_FrameBackgroundHovered;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::ResizeHandler() {
|
||||
if (!(flags & UI7MenuFlags_NoResize)) {
|
||||
if (has_touch &&
|
||||
io->InputHandler->DragObject(
|
||||
name + "rszs", fvec4(Layout->Pos + Layout->Size - 20, 20))) {
|
||||
vec2 szs = Layout->Size + (io->InputHandler->DragPosition -
|
||||
io->InputHandler->DragLastPosition);
|
||||
if (szs.x < 30) szs.x = 30;
|
||||
if (szs.y < 30) szs.y = 30;
|
||||
Layout->Size = szs;
|
||||
}
|
||||
Layout->DrawList->Layer = 21;
|
||||
Layout->DrawList->AddTriangleFilled(
|
||||
Layout->Pos + Layout->Size, Layout->Pos + Layout->Size - fvec2(0, 15),
|
||||
Layout->Pos + Layout->Size - fvec2(15, 0),
|
||||
io->Theme->Get(UI7Color_FrameBackground));
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::MoveHandler() {
|
||||
// Menu Movement
|
||||
if (!(flags & UI7MenuFlags_NoMove)) {
|
||||
if (has_touch &&
|
||||
io->InputHandler->DragObject(
|
||||
name + "tmv", fvec4(Layout->Pos, fvec2(Layout->Size.x, tbh)))) {
|
||||
if (io->InputHandler->DragDoubleRelease) {
|
||||
is_open = !is_open;
|
||||
}
|
||||
Layout->Pos = Layout->Pos + (io->InputHandler->DragPosition -
|
||||
io->InputHandler->DragLastPosition);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::CollapseHandler() {
|
||||
// Collapse logic
|
||||
if (!(flags & UI7MenuFlags_NoCollapse)) {
|
||||
vec2 cpos = Layout->Pos + io->FramePadding;
|
||||
clr_collapse_tri = UI7Color_FrameBackground;
|
||||
if (has_touch &&
|
||||
io->InputHandler->DragObject(UI7::ID(name + "clbse"),
|
||||
fvec4(cpos, fvec2(18, tbh)))) {
|
||||
if (io->InputHandler->DragReleased) {
|
||||
is_open = !is_open;
|
||||
}
|
||||
clr_collapse_tri = UI7Color_FrameBackgroundHovered;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::PostScrollHandler() {
|
||||
if (has_touch &&
|
||||
io->InputHandler->DragObject(id, vec4(Layout->Pos, Layout->Size)) &&
|
||||
Layout->Scrolling[1] && flags & UI7MenuFlags_VtScrolling &&
|
||||
Layout->MaxPosition.y - Layout->Size.y + io->MenuPadding.y > 0) {
|
||||
if (io->InputHandler->DragReleased) {
|
||||
// scroll_mod = (io->DragPosition - io->DragLastPosition);
|
||||
} else {
|
||||
Layout->ScrollOffset.y = std::clamp(
|
||||
Layout->ScrollOffset.y - (io->InputHandler->DragPosition.y -
|
||||
io->InputHandler->DragLastPosition.y),
|
||||
-40.f, (Layout->MaxPosition.y - Layout->Size.y) + 40.f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Menu::MenuFocusHandler() {
|
||||
// Check if menu can be focused for Selective Menu Input API
|
||||
vec4 newarea = vec4(Layout->Pos, Layout->Size);
|
||||
if (!is_open) {
|
||||
newarea = fvec4(Layout->Pos, fvec2(Layout->Size.x, tbh));
|
||||
}
|
||||
if (has_touch && io->Inp->IsDown(io->Inp->Touch) &&
|
||||
io->Ren->InBox(io->Inp->TouchPos(), newarea) &&
|
||||
!io->Ren->InBox(io->Inp->TouchPos(), io->InputHandler->FocusedMenuRect)) {
|
||||
io->InputHandler->FocusedMenu = id;
|
||||
}
|
||||
if (io->InputHandler->FocusedMenu == id) {
|
||||
io->InputHandler->FocusedMenuRect = newarea;
|
||||
}
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,269 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 - 2025 tobid7
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/ui7/containers.hpp>
|
||||
#include <pd/ui7/remenu.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void UI7::ReMenu::Label(const std::string& label) {
|
||||
// Layout API
|
||||
auto r = PD::New<UI7::Label>(label, pIO);
|
||||
pLayout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API bool UI7::ReMenu::Button(const std::string& label) {
|
||||
bool ret = false;
|
||||
u32 id = Strings::FastHash("btn" + label +
|
||||
std::to_string(pLayout->Objects.Size()));
|
||||
Container::Ref r = pLayout->FindObject(id);
|
||||
if (!r) {
|
||||
r = PD::New<UI7::Button>(label, pIO);
|
||||
r->SetID(id);
|
||||
}
|
||||
pLayout->AddObject(r);
|
||||
if (!r->Skippable()) {
|
||||
ret = std::static_pointer_cast<UI7::Button>(r)->IsPressed();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*PD_UI7_API void UI7::ReMenu::DragFloat(const std::string& label, float* data,
|
||||
size_t num_elms) {
|
||||
u32 id = Strings::FastHash("dfl" + label + std::to_string(count_btn++));
|
||||
Container::Ref r = Layout->FindObject(id);
|
||||
if (!r) {
|
||||
r = PD::New<UI7::DragData<float>>(label, data, num_elms, io);
|
||||
r->SetID(id);
|
||||
}
|
||||
Layout->AddObject(r);
|
||||
}*/
|
||||
|
||||
PD_UI7_API void UI7::ReMenu::Checkbox(const std::string& label, bool& v) {
|
||||
u32 id = Strings::FastHash("cbx" + label +
|
||||
std::to_string(pLayout->Objects.Size()));
|
||||
Container::Ref r = pLayout->FindObject(id);
|
||||
if (!r) {
|
||||
r = PD::New<UI7::Checkbox>(label, v, pIO);
|
||||
r->SetID(id);
|
||||
}
|
||||
pLayout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::ReMenu::Image(LI::Texture::Ref img, fvec2 size,
|
||||
LI::Rect uv) {
|
||||
Container::Ref r = PD::New<UI7::Image>(img, size, uv);
|
||||
pLayout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API void ReMenu::Separator() {
|
||||
// Dynamic Objects are very simple...
|
||||
Container::Ref r = PD::New<UI7::DynObj>(
|
||||
[=, this](UI7::IO::Ref io, UI7::DrawList::Ref l, UI7::Container* self) {
|
||||
l->AddRect(self->FinalPos(), self->GetSize(),
|
||||
pIO->Theme->Get(UI7Color_TextDead));
|
||||
});
|
||||
// Set size before pushing (cause Cursor Move will require it)
|
||||
r->SetSize(fvec2(pLayout->Size.x - 10, 1));
|
||||
pLayout->AddObject(r);
|
||||
}
|
||||
|
||||
PD_UI7_API void ReMenu::SeparatorText(const std::string& label) {
|
||||
// Also note to use [=] instead of [&] to not undefined access label
|
||||
Container::Ref r = PD::New<UI7::DynObj>(
|
||||
[=, this](UI7::IO::Ref io, UI7::DrawList::Ref l, UI7::Container* self) {
|
||||
fvec2 size = self->GetSize();
|
||||
fvec2 tdim = io->Font->GetTextBounds(label, io->FontScale);
|
||||
fvec2 pos = self->FinalPos();
|
||||
auto align = pLayout->GetAlignment();
|
||||
vec2 rpos = pLayout->AlignPosition(
|
||||
pos, tdim, fvec4(pLayout->Pos, pLayout->Size), align);
|
||||
if (!(align & UI7Align_Left)) {
|
||||
l->AddRectangle(fvec2(rpos.x + io->FramePadding.x, tdim.y * 0.5),
|
||||
fvec2(pos.x - rpos.x - io->MenuPadding.x, 1),
|
||||
io->Theme->Get(UI7Color_TextDead));
|
||||
}
|
||||
if (!(align & UI7Align_Right)) {
|
||||
l->AddRectangle(
|
||||
pos + fvec2(tdim.x + io->FramePadding.x, tdim.y * 0.5),
|
||||
fvec2(size.x - tdim.x - io->MenuPadding.x, 1),
|
||||
io->Theme->Get(UI7Color_TextDead));
|
||||
}
|
||||
l->AddText(rpos, label, io->Theme->Get(UI7Color_Text), 0,
|
||||
fvec2(pLayout->Size.x, self->GetSize().y));
|
||||
});
|
||||
// Set size before pushing (cause Cursor Move will require it)
|
||||
r->SetSize(
|
||||
fvec2(pLayout->Size.x - 10, pIO->Font->PixelHeight * pIO->FontScale));
|
||||
pLayout->AddObject(r);
|
||||
}
|
||||
PD_UI7_API void ReMenu::HandleFocus() {
|
||||
// Check if menu can be focused for Selective Menu Input API
|
||||
vec4 newarea = fvec4(pLayout->Pos, pLayout->Size);
|
||||
if (!pIsOpen) {
|
||||
newarea = fvec4(pLayout->Pos, fvec2(pLayout->Size.x, TitleBarHeight));
|
||||
}
|
||||
if (pIO->Inp->IsDown(pIO->Inp->Touch) &&
|
||||
pIO->Ren->InBox(pIO->Inp->TouchPos(), newarea) &&
|
||||
!pIO->Ren->InBox(pIO->Inp->TouchPos(),
|
||||
pIO->InputHandler->FocusedMenuRect)) {
|
||||
pIO->InputHandler->FocusedMenu = pID;
|
||||
}
|
||||
if (pIO->InputHandler->FocusedMenu == pID) {
|
||||
pIO->InputHandler->FocusedMenuRect = newarea;
|
||||
}
|
||||
}
|
||||
PD_UI7_API void ReMenu::HandleScrolling() {}
|
||||
PD_UI7_API void ReMenu::HandleTitlebarActions() {
|
||||
// Collapse
|
||||
if (!(Flags & UI7MenuFlags_NoCollapse)) {
|
||||
vec2 cpos = pLayout->Pos + pIO->FramePadding;
|
||||
// clr_collapse_tri = UI7Color_FrameBackground;
|
||||
if (pIO->InputHandler->DragObject(UI7::ID(pID.GetName() + "clbse"),
|
||||
fvec4(cpos, fvec2(18, TitleBarHeight)))) {
|
||||
if (pIO->InputHandler->DragReleased) {
|
||||
pIsOpen = !pIsOpen;
|
||||
}
|
||||
// clr_collapse_tri = UI7Color_FrameBackgroundHovered;
|
||||
}
|
||||
}
|
||||
// Close Logic
|
||||
if (!(Flags & UI7MenuFlags_NoClose) && pIsShown != nullptr) {
|
||||
vec2 cpos =
|
||||
fvec2(pLayout->Pos.x + pLayout->Size.x - 12 - pIO->FramePadding.x,
|
||||
pLayout->Pos.y + pIO->FramePadding.y);
|
||||
|
||||
// clr_close_btn = UI7Color_FrameBackground;
|
||||
if (pIO->InputHandler->DragObject(UI7::ID(pID.GetName() + "clse"),
|
||||
fvec4(cpos, fvec2(12)))) {
|
||||
if (pIO->InputHandler->DragReleased) {
|
||||
*pIsShown = !(*pIsShown);
|
||||
}
|
||||
// clr_close_btn = UI7Color_FrameBackgroundHovered;
|
||||
}
|
||||
}
|
||||
// Menu Movement
|
||||
if (!(Flags & UI7MenuFlags_NoMove)) {
|
||||
if (pIO->InputHandler->DragObject(
|
||||
pID.GetName() + "tmv",
|
||||
fvec4(pLayout->Pos, fvec2(pLayout->Size.x, TitleBarHeight)))) {
|
||||
if (pIO->InputHandler->DragDoubleRelease) {
|
||||
pIsOpen = !pIsOpen;
|
||||
}
|
||||
pLayout->Pos = pLayout->Pos + (pIO->InputHandler->DragPosition -
|
||||
pIO->InputHandler->DragLastPosition);
|
||||
// Have no ViewPort Yet :(
|
||||
// pLayout->Pos = std::clamp(pLayout->Pos, fvec2(10), fvec2(1270, 710));
|
||||
}
|
||||
}
|
||||
}
|
||||
PD_UI7_API void ReMenu::DrawBaseLayout() {
|
||||
if (pIsOpen) {
|
||||
Container::Ref r = PD::New<UI7::DynObj>(
|
||||
[](UI7::IO::Ref io, UI7::DrawList::Ref l, UI7::Container* self) {
|
||||
l->Layer = 0;
|
||||
l->AddRectangle(self->FinalPos(), self->GetSize(),
|
||||
io->Theme->Get(UI7Color_Background));
|
||||
});
|
||||
// Set size before pushing (cause Cursor Move will require it)
|
||||
r->SetSize(
|
||||
fvec2(pLayout->GetSize().x, pLayout->GetSize().y - TitleBarHeight));
|
||||
r->SetPos(fvec2(0, TitleBarHeight));
|
||||
pLayout->AddObjectEx(r, UI7LytAdd_NoCursorUpdate |
|
||||
UI7LytAdd_NoScrollHandle | UI7LytAdd_Front);
|
||||
}
|
||||
if (!(Flags & UI7MenuFlags_NoTitlebar)) {
|
||||
Container::Ref r = PD::New<UI7::DynObj>(
|
||||
[=, this](UI7::IO::Ref io, UI7::DrawList::Ref l, UI7::Container* self) {
|
||||
l->Layer = 20;
|
||||
/** Header Bar */
|
||||
l->AddRectangle(self->FinalPos(), self->GetSize(),
|
||||
io->Theme->Get(UI7Color_Header));
|
||||
l->Layer = 21;
|
||||
/** Inline if statement to shift the Text if collapse sym is shown */
|
||||
/** What the hell is this code btw (didn't found a better way) */
|
||||
l->AddText(self->FinalPos() +
|
||||
fvec2(Flags & UI7MenuFlags_NoClose
|
||||
? 0
|
||||
: (TitleBarHeight - pIO->FramePadding.y * 2 +
|
||||
(io->FramePadding.x * 2)),
|
||||
0),
|
||||
pID.GetName(), io->Theme->Get(UI7Color_Text));
|
||||
});
|
||||
r->SetSize(fvec2(pLayout->GetSize().x, TitleBarHeight));
|
||||
r->SetPos(0);
|
||||
pLayout->AddObjectEx(r,
|
||||
UI7LytAdd_NoCursorUpdate | UI7LytAdd_NoScrollHandle);
|
||||
|
||||
/** Collapse Sym */
|
||||
if (!(Flags & UI7MenuFlags_NoCollapse)) {
|
||||
r = PD::New<UI7::DynObj>([=, this](UI7::IO::Ref io, UI7::DrawList::Ref l,
|
||||
UI7::Container* self) {
|
||||
/** This sym actually requires layer 21 (i dont know why) */
|
||||
l->Layer = 21;
|
||||
/**
|
||||
* Symbol (Position Swapping set by pIsOpen ? openpos : closepos;)
|
||||
*/
|
||||
l->AddTriangleFilled(
|
||||
self->FinalPos(),
|
||||
self->FinalPos() +
|
||||
fvec2(self->GetSize().x, pIsOpen ? 0 : self->GetSize().y * 0.5),
|
||||
self->FinalPos() +
|
||||
fvec2(pIsOpen ? self->GetSize().x * 0.5 : 0, self->GetSize().y),
|
||||
io->Theme->Get(UI7Color_FrameBackground));
|
||||
});
|
||||
r->SetSize(TitleBarHeight - pIO->FramePadding.y * 2);
|
||||
r->SetPos(pIO->FramePadding);
|
||||
pLayout->AddObjectEx(r,
|
||||
UI7LytAdd_NoCursorUpdate | UI7LytAdd_NoScrollHandle);
|
||||
}
|
||||
/** Close Sym (only shown if pIsShown is not nullptr) */
|
||||
if (!(Flags & UI7MenuFlags_NoClose) && pIsShown) {
|
||||
fvec2 size = TitleBarHeight - pIO->FramePadding.y * 2; // Fixed quad size
|
||||
// Need to clamp this way as the math lib lacks a less and greater
|
||||
// operator in vec2 (don't checked if it would make sense yet)
|
||||
size.x = std::clamp(size.x, 5.f, std::numeric_limits<float>::max());
|
||||
size.y = std::clamp(size.y, 5.f, std::numeric_limits<float>::max());
|
||||
// Probably should fix the minsize to be locked on y
|
||||
fvec2 cpos =
|
||||
fvec2(pLayout->Pos.x + pLayout->Size.x - size.x - pIO->FramePadding.x,
|
||||
pLayout->Pos.y + pIO->FramePadding.y);
|
||||
pLayout->DrawList->AddLine(cpos, cpos + size,
|
||||
pIO->Theme->Get(UI7Color_FrameBackground), 2);
|
||||
pLayout->DrawList->AddLine(cpos + fvec2(0, size.y),
|
||||
cpos + fvec2(size.x, 0),
|
||||
pIO->Theme->Get(UI7Color_FrameBackground), 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
PD_UI7_API void ReMenu::Update() {
|
||||
HandleFocus();
|
||||
if (!(Flags & UI7MenuFlags_NoTitlebar)) {
|
||||
HandleTitlebarActions();
|
||||
}
|
||||
DrawBaseLayout();
|
||||
pLayout->Update();
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,69 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/core/core.hpp>
|
||||
#include <pd/ui7/theme.hpp>
|
||||
|
||||
namespace PD {
|
||||
namespace UI7 {
|
||||
PD_UI7_API void Theme::Default(Theme& theme) {
|
||||
theme.Set(UI7Color_Text, Color("#FFFFFFFF"));
|
||||
theme.Set(UI7Color_TextDead, Color("#AAAAAAFF"));
|
||||
theme.Set(UI7Color_Background, Color("#222222ff"));
|
||||
theme.Set(UI7Color_Border, Color("#999999ff"));
|
||||
theme.Set(UI7Color_Button, Color("#111111FF"));
|
||||
theme.Set(UI7Color_ButtonDead, Color("#080808FF"));
|
||||
theme.Set(UI7Color_ButtonActive, Color("#2A2A2AFF"));
|
||||
theme.Set(UI7Color_ButtonHovered, Color("#222222FF"));
|
||||
theme.Set(UI7Color_Header, Color("#111111FF"));
|
||||
theme.Set(UI7Color_HeaderDead, Color("#080808FF"));
|
||||
theme.Set(UI7Color_Selector, Color("#222222FF"));
|
||||
theme.Set(UI7Color_Checkmark, Color("#2A2A2AFF"));
|
||||
theme.Set(UI7Color_FrameBackground, Color("#555555FF"));
|
||||
theme.Set(UI7Color_FrameBackgroundHovered, Color("#777777FF"));
|
||||
theme.Set(UI7Color_Progressbar, Color("#00FF00FF"));
|
||||
theme.Set(UI7Color_ListEven, Color("#CCCCCCFF"));
|
||||
theme.Set(UI7Color_ListOdd, Color("#BBBBBBFF"));
|
||||
}
|
||||
|
||||
PD_UI7_API void Theme::Flashbang(Theme& theme) {
|
||||
theme.Set(UI7Color_Text, Color("#000000FF"));
|
||||
theme.Set(UI7Color_TextDead, Color("#333333FF"));
|
||||
theme.Set(UI7Color_Background, Color("#eeeeeeFF"));
|
||||
theme.Set(UI7Color_Border, Color("#777777ff"));
|
||||
theme.Set(UI7Color_Button, Color("#ccccccFF"));
|
||||
theme.Set(UI7Color_ButtonDead, Color("#bbbbbbFF"));
|
||||
theme.Set(UI7Color_ButtonActive, Color("#ccccccFF"));
|
||||
theme.Set(UI7Color_ButtonHovered, Color("#acacacFF"));
|
||||
theme.Set(UI7Color_Header, Color("#ddddddFF"));
|
||||
theme.Set(UI7Color_HeaderDead, Color("#cdcdcdFF"));
|
||||
theme.Set(UI7Color_Selector, Color("#222222FF"));
|
||||
theme.Set(UI7Color_Checkmark, Color("#ccccccFF"));
|
||||
theme.Set(UI7Color_FrameBackground, Color("#aaaaaaFF"));
|
||||
theme.Set(UI7Color_FrameBackgroundHovered, Color("#909090FF"));
|
||||
theme.Set(UI7Color_Progressbar, Color("#00FF00FF"));
|
||||
theme.Set(UI7Color_ListEven, Color("#CCCCCCFF"));
|
||||
theme.Set(UI7Color_ListOdd, Color("#BBBBBBFF"));
|
||||
}
|
||||
} // namespace UI7
|
||||
} // namespace PD
|
||||
@@ -1,367 +0,0 @@
|
||||
/*
|
||||
MIT License
|
||||
Copyright (c) 2024 - 2025 René Amthor (tobid7)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <pd/core/core.hpp>
|
||||
#include <pd/ui7/ui7.hpp>
|
||||
|
||||
// Helpers
|
||||
|
||||
std::string _UI7DV4(PD::vec4<float> v) {
|
||||
return std::format("[{:.2f}, {:.2f}, {:.2f}, {:.2f}]", v.x, v.y, v.z, v.w);
|
||||
}
|
||||
|
||||
std::string _UI7DV2(PD::vec2<float> v) {
|
||||
return std::format("[{:.2f}, {:.2f}]", v.x, v.y);
|
||||
}
|
||||
|
||||
#define UI7DV4(x) #x ": " + _UI7DV4(x)
|
||||
#define UI7DV4N(x) _UI7DV4(x)
|
||||
#define UI7DV2(x) #x ": " + _UI7DV2(x)
|
||||
#define UI7DV2N(x) _UI7DV2(x)
|
||||
#define UI7DHX32(x) std::format("{}: {:#08x}", #x, x)
|
||||
#define UI7DTF(x) PD::Strings::FormatNanos(x)
|
||||
|
||||
namespace PD {
|
||||
PD_UI7_API std::string UI7::GetVersion(bool show_build) {
|
||||
std::stringstream s;
|
||||
s << ((UI7_VERSION >> 24) & 0xFF) << ".";
|
||||
s << ((UI7_VERSION >> 16) & 0xFF) << ".";
|
||||
s << ((UI7_VERSION >> 8) & 0xFF);
|
||||
if (show_build) s << "-" << ((UI7_VERSION) & 0xFF);
|
||||
return s.str();
|
||||
}
|
||||
|
||||
PD_UI7_API bool UI7::Context::BeginMenu(const ID& id, UI7MenuFlags flags,
|
||||
bool* show) {
|
||||
// Assert(!this->current, "You are already in another Menu!");
|
||||
// Assert(std::find(amenus.begin(), amenus.end(), (u32)id) == amenus.end(),
|
||||
// "Menu Name Already used or\nContext::Update not called!");
|
||||
if (show != nullptr) {
|
||||
if (!(*show)) {
|
||||
if (io->InputHandler->FocusedMenu == id) {
|
||||
io->InputHandler->FocusedMenu = 0;
|
||||
io->InputHandler->FocusedMenuRect = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
auto menu = this->menus.find(id);
|
||||
if (menu == this->menus.end()) {
|
||||
this->menus[id] = Menu::New(id, io);
|
||||
// this->menus[id]->Layout->SetSize(io->Ren->GetViewport().zw());
|
||||
menu = this->menus.find(id);
|
||||
}
|
||||
this->current = menu->second;
|
||||
this->current->is_shown = show;
|
||||
this->io->InputHandler->CurrentMenu = this->current->id;
|
||||
io->RegisterDrawList(id, this->current->Layout->GetDrawList());
|
||||
this->current->PreHandler(flags);
|
||||
amenus.push_back(this->current->GetID());
|
||||
if (!this->current->is_open) {
|
||||
this->current = nullptr;
|
||||
}
|
||||
return this->current != nullptr;
|
||||
}
|
||||
|
||||
PD_UI7_API UI7::Menu::Ref UI7::Context::GetCurrentMenu() {
|
||||
// Assert(current != nullptr, "Not in a Menu!");
|
||||
return current;
|
||||
}
|
||||
|
||||
PD_UI7_API UI7::Menu::Ref UI7::Context::FindMenu(const ID& id) {
|
||||
auto e = this->menus.find(id);
|
||||
if (e != this->menus.end()) {
|
||||
return e->second;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Context::EndMenu() {
|
||||
this->current->PostHandler();
|
||||
this->current = nullptr;
|
||||
this->io->InputHandler->CurrentMenu = 0;
|
||||
}
|
||||
|
||||
PD_UI7_API bool UI7::Context::DoMenuEx(
|
||||
const UI7::ID& id, UI7MenuFlags flags,
|
||||
std::function<void(UI7::ReMenu::Ref m)> f) {
|
||||
if (!Current) {
|
||||
Current = ReMenu::New(id, io);
|
||||
}
|
||||
// Current->pIsShown = show;
|
||||
io->InputHandler->CurrentMenu = Current->pID;
|
||||
io->RegisterDrawList(id, Current->pLayout->GetDrawList());
|
||||
if (Current->pIsOpen) {
|
||||
f(Current);
|
||||
}
|
||||
return Current != nullptr;
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Context::Update(float) {
|
||||
TT::Scope st("UI7_Update");
|
||||
// Assert(current == nullptr, "Still in a Menu!");
|
||||
if (!io->InputHandler->FocusedMenu && amenus.size() > 0) {
|
||||
io->InputHandler->FocusedMenu = amenus[amenus.size() - 1];
|
||||
}
|
||||
bool focused_exist = false;
|
||||
if (aml.size() == 0) {
|
||||
aml = amenus;
|
||||
} else {
|
||||
std::vector<size_t> tbr;
|
||||
for (size_t i = 0; i < aml.size(); i++) {
|
||||
if (std::find(amenus.begin(), amenus.end(), aml[i]) == amenus.end()) {
|
||||
tbr.push_back(i);
|
||||
}
|
||||
}
|
||||
for (auto& it : tbr) {
|
||||
aml.erase(aml.begin() + it);
|
||||
}
|
||||
}
|
||||
for (auto& it : amenus) {
|
||||
if (std::find(aml.begin(), aml.end(), it) == aml.end()) {
|
||||
aml.push_back(it);
|
||||
}
|
||||
}
|
||||
auto ptf = std::find(aml.begin(), aml.end(), io->InputHandler->FocusedMenu);
|
||||
if (ptf != aml.end() && ptf != aml.begin()) {
|
||||
std::rotate(aml.begin(), ptf, ptf + 1);
|
||||
}
|
||||
for (auto it : aml) {
|
||||
auto m = menus[it];
|
||||
io->InputHandler->CurrentMenu = m->id;
|
||||
m->Update(io->Delta);
|
||||
io->InputHandler->CurrentMenu = 0;
|
||||
if (it == io->InputHandler->FocusedMenu) {
|
||||
focused_exist = true;
|
||||
}
|
||||
}
|
||||
io->InputHandler->CurrentMenu = Current->pID;
|
||||
Current->Update();
|
||||
/*if (!focused_exist && io->CurrentMenu != Current->pID) {
|
||||
io->FocusedMenu = 0;
|
||||
io->FocusedMenuRect = 0;
|
||||
}*/
|
||||
int list = 0;
|
||||
u32 vtx_counter = 0;
|
||||
u32 idx_counter = 0;
|
||||
// Register Front List as last element
|
||||
io->RegisterDrawList("CtxFrontList", io->Front);
|
||||
// io->DrawListRegestry.Reverse();
|
||||
for (auto it : io->DrawListRegestry) {
|
||||
it.Second->Base = list * 30;
|
||||
it.Second->Process(io->pRDL);
|
||||
vtx_counter += it.Second->NumVertices;
|
||||
idx_counter += it.Second->NumIndices;
|
||||
list++;
|
||||
}
|
||||
io->Ren->RegisterDrawList(io->pRDL);
|
||||
io->NumIndices = idx_counter;
|
||||
io->NumVertices = vtx_counter;
|
||||
this->amenus.clear();
|
||||
this->io->Update();
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Context::AboutMenu(bool* show) {
|
||||
if (this->BeginMenu("About UI7", UI7MenuFlags_Scrolling, show)) {
|
||||
auto m = this->GetCurrentMenu();
|
||||
|
||||
m->Label("Palladium - UI7 " + GetVersion());
|
||||
m->Separator();
|
||||
m->Label("(c) 2023-2025 René Amthor");
|
||||
m->Label("UI7 is licensed under the MIT License.");
|
||||
m->Label("See LICENSE for more information.");
|
||||
static bool show_build;
|
||||
m->Checkbox("Show Build Info", show_build);
|
||||
if (show_build) {
|
||||
m->SeparatorText("Build Info");
|
||||
m->Label("Full Version -> " + GetVersion(true));
|
||||
m->Label("sizeof(size_t) -> " + std::to_string(sizeof(size_t)));
|
||||
m->Label("sizeof(LI::Vertex) -> " + std::to_string(sizeof(LI::Vertex)));
|
||||
m->Label("__cplusplus -> " + std::to_string(__cplusplus));
|
||||
m->Label("Compiler -> " + LibInfo::CompiledWith());
|
||||
}
|
||||
this->EndMenu();
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Context::MetricsMenu(bool* show) {
|
||||
if (this->BeginMenu("UI7 Metrics", UI7MenuFlags_Scrolling, show)) {
|
||||
auto m = this->GetCurrentMenu();
|
||||
|
||||
m->Label("Palladium - UI7 " + GetVersion());
|
||||
m->Separator();
|
||||
m->Label(
|
||||
std::format("Average {:.3f} ms/f ({:.1f} FPS)",
|
||||
((float)io->DeltaStats->GetAverage() / 1000.f),
|
||||
1000.f / ((float)io->DeltaStats->GetAverage() / 1000.f)));
|
||||
m->Label(std::format("NumVertices: {}", io->NumVertices));
|
||||
m->Label(std::format("NumIndices: {} -> {} Tris", io->NumIndices,
|
||||
io->NumIndices / 3));
|
||||
m->Label("Menus: " + std::to_string(menus.size()));
|
||||
/*if (m->BeginTreeNode("Font")) {
|
||||
for (u32 i = 0; i <= 0x00ff; i++) {
|
||||
auto& c = io->Ren->Font()->GetCodepoint(i);
|
||||
if (!c.invalid()) {
|
||||
m->Image(c.tex(), c.size(), c.uv());
|
||||
if ((i % 15) != 0 || i == 0) {
|
||||
m->SameLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}*/
|
||||
m->SeparatorText("TimeTrace");
|
||||
if (m->BeginTreeNode("Traces (" +
|
||||
std::to_string(Sys::GetTraceMap().size()) + ")")) {
|
||||
for (auto& it : Sys::GetTraceMap()) {
|
||||
if (m->BeginTreeNode(it.second->GetID())) {
|
||||
m->Label("Diff: " + UI7DTF(it.second->GetLastDiff()));
|
||||
m->Label("Protocol Len: " +
|
||||
std::to_string(it.second->GetProtocol()->GetLen()));
|
||||
m->Label("Average: " +
|
||||
UI7DTF(it.second->GetProtocol()->GetAverage()));
|
||||
m->Label("Min: " + UI7DTF(it.second->GetProtocol()->GetMin()));
|
||||
m->Label("Max: " + UI7DTF(it.second->GetProtocol()->GetMax()));
|
||||
m->EndTreeNode();
|
||||
}
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
m->SeparatorText("IO");
|
||||
if (m->BeginTreeNode("Menus (" + std::to_string(menus.size()) + ")")) {
|
||||
for (auto& it : menus) {
|
||||
if (m->BeginTreeNode(it.second->name)) {
|
||||
m->Label("Name: " + it.second->name);
|
||||
/*m->Label("Pos: " + UI7DV2N(it.second->Layout->GetPosition()));
|
||||
m->Label("Size: " + UI7DV2N(it.second->Layout->GetSize()));
|
||||
m->Label("Work Rect: " + UI7DV4N(it.second->Layout->WorkRect));
|
||||
m->Label("Cursor: " + UI7DV2N(it.second->Layout->Cursor));*/
|
||||
if (m->BeginTreeNode(
|
||||
"ID Objects (" +
|
||||
std::to_string(it.second->Layout->IDObjects.size()) + ")")) {
|
||||
for (auto& jt : it.second->Layout->IDObjects) {
|
||||
m->Label(UI7DHX32(jt->GetID()));
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
if (m->BeginTreeNode("Active Menus (" + std::to_string(aml.size()) + ")")) {
|
||||
for (auto& it : aml) {
|
||||
if (m->BeginTreeNode(menus[it]->name)) {
|
||||
m->Label("Name: " + menus[it]->name);
|
||||
/*m->Label("Pos: " + UI7DV2N(it.second->Layout->Pos));
|
||||
m->Label("Size: " + UI7DV2N(it.second->Layout->GetSize()));
|
||||
m->Label("Work Rect: " + UI7DV4N(it.second->Layout->WorkRect));
|
||||
m->Label("Cursor: " + UI7DV2N(it.second->Layout->Cursor));*/
|
||||
if (m->BeginTreeNode(
|
||||
"ID Objects (" +
|
||||
std::to_string(menus[it]->Layout->IDObjects.size()) + ")")) {
|
||||
for (auto& jt : menus[it]->Layout->IDObjects) {
|
||||
m->Label(UI7DHX32(jt->GetID()));
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
if (m->BeginTreeNode("DrawLists (" +
|
||||
std::to_string(io->DrawListRegestry.Size()) + ")")) {
|
||||
for (auto& it : io->DrawListRegestry) {
|
||||
if (m->BeginTreeNode(it.First.GetName())) {
|
||||
m->Label("Vertices: " + std::to_string(it.Second->NumVertices));
|
||||
m->Label("Indices: " + std::to_string(it.Second->NumIndices));
|
||||
m->Label("Base Layer: " + std::to_string(it.Second->Base));
|
||||
m->EndTreeNode();
|
||||
}
|
||||
}
|
||||
m->EndTreeNode();
|
||||
}
|
||||
m->Label("io->Time: " + Strings::FormatMillis(io->Time->Get()));
|
||||
m->Label(std::format("io->Delta: {:.3f}", io->Delta));
|
||||
m->Label(std::format("io->Framerate: {:.2f}", io->Framerate));
|
||||
m->Label(UI7DHX32(io->InputHandler->FocusedMenu));
|
||||
m->Label(UI7DHX32(io->InputHandler->DraggedObject));
|
||||
m->Label(std::format("io->DragTime: {:.2f}s",
|
||||
io->InputHandler->DragTime->GetSeconds()));
|
||||
m->Label(UI7DV4(io->InputHandler->DragDestination));
|
||||
m->Label(UI7DV2(io->InputHandler->DragSourcePos));
|
||||
m->Label(UI7DV2(io->InputHandler->DragPosition));
|
||||
m->Label(UI7DV2(io->InputHandler->DragLastPosition));
|
||||
this->EndMenu();
|
||||
}
|
||||
}
|
||||
|
||||
PD_UI7_API void UI7::Context::StyleEditor(bool* show) {
|
||||
if (this->BeginMenu("UI7 Style Editor", UI7MenuFlags_Scrolling, show)) {
|
||||
auto m = this->GetCurrentMenu();
|
||||
|
||||
m->Label("Palladium - UI7 " + GetVersion() + " Style Editor");
|
||||
m->Separator();
|
||||
m->DragData("MenuPadding", (float*)&io->MenuPadding, 2, 0.f, 100.f);
|
||||
m->DragData("FramePadding", (float*)&io->FramePadding, 2, 0.f, 100.f);
|
||||
m->DragData("ItemSpace", (float*)&io->ItemSpace, 2, 0.f, 100.f);
|
||||
m->DragData("MinSliderSize", (float*)&io->MinSliderDragSize, 2, 1.f, 100.f);
|
||||
m->DragData("OverScroll Modifier", &io->OverScrollMod, 1, 0.01f,
|
||||
std::numeric_limits<float>::max(), 0.01f, 2);
|
||||
m->Checkbox("Menu Border", io->ShowMenuBorder);
|
||||
m->Checkbox("Frame Border", io->ShowFrameBorder);
|
||||
m->SeparatorText("Theme");
|
||||
if (m->Button("Dark")) {
|
||||
UI7::Theme::Default(*io->Theme.get());
|
||||
}
|
||||
m->SameLine();
|
||||
if (m->Button("Flashbang")) {
|
||||
UI7::Theme::Flashbang(*io->Theme.get());
|
||||
}
|
||||
/// Small trick to print without prefix
|
||||
#define ts(x) m->ColorEdit(std::string(#x).substr(9), &io->Theme->GetRef(x));
|
||||
#define ts2(x) \
|
||||
m->DragData(std::string(#x).substr(9), (u8*)&io->Theme->GetRef(x), 4, (u8)0, \
|
||||
(u8)255);
|
||||
ts2(UI7Color_Background);
|
||||
ts2(UI7Color_Border);
|
||||
ts2(UI7Color_Button);
|
||||
ts2(UI7Color_ButtonDead);
|
||||
ts2(UI7Color_ButtonActive);
|
||||
ts2(UI7Color_ButtonHovered);
|
||||
ts2(UI7Color_Text);
|
||||
ts2(UI7Color_TextDead);
|
||||
ts2(UI7Color_Header);
|
||||
ts2(UI7Color_HeaderDead);
|
||||
ts2(UI7Color_Selector);
|
||||
ts2(UI7Color_Checkmark);
|
||||
ts2(UI7Color_FrameBackground);
|
||||
ts2(UI7Color_FrameBackgroundHovered);
|
||||
ts2(UI7Color_Progressbar);
|
||||
ts2(UI7Color_ListEven);
|
||||
ts2(UI7Color_ListOdd);
|
||||
this->EndMenu();
|
||||
}
|
||||
}
|
||||
} // namespace PD
|
||||
Reference in New Issue
Block a user