# Stage 2.2

- Move Timer to core
- Use Timer for app_time
- Fix Deltatime Bug in App
- Add HwInfo to lib3ds (stolen from hbloader 2 pd-rewrite port)
- Add GetSystemLanguage to lib3ds
- Add Net Header for pd-net (still need to find a way to make this working)
- Add base Decoder and Player Headers for pd-sound
- Add Mp3 Decoder (useless and untested yet)
- Add GetDataDirectory to App
- Add InitFLag to App for HwInfo
- Actually write the Timer class
- Rework the UI7 Theme API to use SmartCtor
- UI7::Menu::JoinAlign: Use a loop to determinate max width for centering a group
- Add some Doctumentation around UI7::Menu
This commit is contained in:
tobid7 2025-02-28 19:49:24 +01:00
parent f9a1d8aefb
commit debedf59c6
27 changed files with 840 additions and 98 deletions

View File

@ -36,13 +36,13 @@ endif()
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_SHORT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Set Project
project(palladium LANGUAGES C CXX VERSION 0.2.1)
project(palladium LANGUAGES C CXX VERSION 0.2.2)
option(PD_BUILD_TESTS "Sets if TestApp and TestBench get build" OFF)
@ -62,6 +62,7 @@ source/core/common.cpp
source/core/io.cpp
source/core/strings.cpp
source/core/sys.cpp
source/core/timer.cpp
source/core/timetrace.cpp)
add_pd_lib(pd-core SRC_FILES ${CORE_SRC})
@ -85,7 +86,9 @@ add_pd_lib(pd-drivers SRC_FILES ${DRVS_SRC} DEPENDS pd-maths)
set(L3DS_SRC
source/lib3ds/gamepad_icons.cpp
source/lib3ds/result_decoder.cpp
source/lib3ds/drv_hid.cpp)
source/lib3ds/drv_hid.cpp
source/lib3ds/hwinfo.cpp
source/lib3ds/os.cpp)
add_pd_lib(pd-lib3ds SRC_FILES ${L3DS_SRC} DEPENDS pd-drivers)
@ -99,6 +102,11 @@ source/lithium/renderer.cpp)
add_pd_lib(pd-lithium SRC_FILES ${LI_SRC} DEPENDS pd-maths pd-external citro3d)
set(SOUND_SRC
source/sound/mp3.cpp)
add_pd_lib(pd-sound SRC_FILES ${SOUND_SRC} DEPENDS pd-core mpg123)
set(OVL_SRC
source/overlays/keyboard.cpp
source/overlays/message_mgr.cpp
@ -130,27 +138,24 @@ add_pd_lib(pd-ui7 SRC_FILES ${UI7_SRC} DEPENDS pd-drivers pd-lithium)
add_library(palladium INTERFACE)
target_link_libraries(palladium INTERFACE
pd-core
pd-maths
pd-external
pd-drivers
pd-lib3ds
pd-lithium
pd-overlays
pd-app
pd-ui7
pd-core pd-maths pd-external pd-drivers pd-lib3ds
pd-lithium pd-overlays pd-app pd-ui7
)
add_dependencies(palladium
pd-core
pd-maths
pd-external
pd-drivers
pd-lib3ds
pd-lithium
pd-overlays
pd-app
pd-ui7
pd-core pd-maths pd-external pd-drivers
pd-lib3ds pd-lithium pd-overlays pd-app pd-ui7
)
add_library(palladium-lite INTERFACE)
target_link_libraries(palladium-lite INTERFACE
pd-core pd-maths pd-external pd-drivers pd-lib3ds
pd-lithium
)
add_dependencies(palladium-lite
pd-core pd-maths pd-external pd-drivers
pd-lib3ds pd-lithium
)
if(PD_BUILD_TESTS)

View File

@ -2,14 +2,6 @@
**Framework / Engine to create Homebrew Apps / Games**
## Build types
```bash
PD_EXTENDED_DEBUG=0 # Include things like ResultDecoder and Check for Memory usage
PD_DEBUG=0 # not yet
PD_NO_SAFE_CODE=0 # Remove All not important safetey checks
```
## Building
Install Dependencies:
@ -23,8 +15,6 @@ Building:
If you want to have the lib in a projects `libs` dir or so you can simply add `-DCMAKE_INSTALL_PREFIX=./res` to the cmake command and copy the dirs from res to you libs folder
For Debug build the Cmake Script generates a `libpalladiumd.a`
```bash
mkdir -p build
cd build
@ -33,6 +23,22 @@ make
make install
```
## Libraries
| Name | Last Updated | Platform | Depends |
|---|---|---|---|
| pd-core | 0.2.2 | multi | none |
| pd-maths | 0.2.0 | multi | pd-core |
| pd-external | 0.1.0 | multi | none |
| pd-drivers | 0.2.1 | multi | pd-core, pd-maths |
| pd-lib3ds | 0.2.2 | 3ds | pd-core, pd-maths, pd-drivers |
| pd-net | 0.2.2 | 3ds | pd-core, pd-lib3ds |
| pd-lithium | 0.2.1 | 3ds | pd-core, pd-maths pd-lib3ds, citro3d |
| pd-sound | 0.2.2 | 3ds | pd-core, mpg123 |
| pd-overlays | 0.2.1 | 3ds | pd-core, pd-maths, pd-lib3ds, pd-lithium, pd-ui7 |
| pd-ui7 | 0.2.2 | 3ds | pd-core, pd-maths, pd-lib3ds, pd-lithium |
| pd-app | 0.2.2 | 3ds | pd-core, pd-maths, pd-lib3ds, pd-lithium |
## Credits
| Icon | Username | Description |
|---|---|---|

View File

@ -29,6 +29,7 @@ SOFTWARE.
#include <pd/core/io.hpp>
#include <pd/core/strings.hpp>
#include <pd/core/sys.hpp>
#include <pd/core/timer.hpp>
#include <pd/core/timetrace.hpp>
// Graphics
#include <pd/lithium/renderer.hpp>
@ -49,12 +50,15 @@ SOFTWARE.
#include <pd/overlays/settings.hpp>
// UI7
#include <pd/ui7/ui7.hpp>
// Lib3ds
#include <pd/lib3ds/hwinfo.hpp>
#include <pd/lib3ds/memory.hpp>
#include <pd/lib3ds/os.hpp>
#include <pd/lib3ds/result_decoder.hpp>
// App
#include <pd/app/app.hpp>
#include <pd/app/error.hpp>
#include <pd/app/lang.hpp>
#include <pd/app/timer.hpp>
/// Setup these as non Namespaced access by default
#ifndef PD_MATH_NAMESPACED

View File

@ -24,6 +24,7 @@ SOFTWARE.
*/
#include <pd/core/common.hpp>
#include <pd/core/timer.hpp>
#include <pd/core/timetrace.hpp>
#include <pd/lib3ds/drv_hid.hpp>
#include <pd/lithium/renderer.hpp>
@ -46,15 +47,16 @@ class App {
};
using AppInitFlags = u32;
enum AppInitFlags_ {
AppInitFlags_None = 0,
AppInitFlags_MountRomfs = 1 << 0,
AppInitFlags_InitGraphics = 1 << 1,
AppInitFlags_New3dsMode = 1 << 2,
AppInitFlags_InitGraphicsNoC3D = 1 << 3,
AppInitFlags_InitLithium = 1 << 4,
AppInitFlags_None = 0, /// Do nothing (probably a useles ability)
AppInitFlags_MountRomfs = 1 << 0, /// Mount Romfs on PreInit
AppInitFlags_InitGraphics = 1 << 1, /// Default Init Graphics for GPU use
AppInitFlags_New3dsMode = 1 << 2, /// Enable New3DS Speedup
AppInitFlags_InitGraphicsNoC3D = 1 << 3, /// Init GFX for Buf Modification
AppInitFlags_InitLithium = 1 << 4, /// Init 2D Rendering Engine
/// I dont have a name for this one yet
/// It Inits Internal Directory structure
AppInitFlags_UnnamedOption1 = 1 << 5,
AppInitFlags_InitHwInfo = 1 << 6, /// Init HwInfo from lib3ds
AppInitFlags_Default = AppInitFlags_MountRomfs | AppInitFlags_InitGraphics |
AppInitFlags_New3dsMode | AppInitFlags_InitLithium,
};
@ -95,6 +97,8 @@ class App {
void FeatureDisable(AppFlags flags) { runtimeflags &= ~flags; }
AppFlags& GetFeatureSet() { return runtimeflags; }
std::string GetDataDirectory();
protected:
Screen::Ref Top;
Screen::Ref Bottom;
@ -110,8 +114,8 @@ class App {
MessageMgr::Ref msg_mgr;
OverlayMgr::Ref overlay_mgr;
Hid::Ref input_mgr;
Timer::Ref app_time;
u64 last_time;
float app_time;
float fps;
std::string name;

View File

@ -27,18 +27,21 @@ SOFTWARE.
#include <pd/core/sys.hpp>
namespace PD {
class Timer {
class Timer : public SmartCtor<Timer> {
public:
Timer() {}
Timer(bool auto_start = true);
~Timer() {}
void Start() {}
void Pause() {}
void Update() {}
void Reset() { start_ = Sys::GetTime(); }
u64 Get() {}
void Rseume();
void Pause();
void Update();
void Reset();
bool IsRunning() const;
u64 Get();
double GetSeconds();
private:
u64 start_;
u64 now_;
u64 start;
u64 now;
bool is_running = false;
};
} // namespace PD

View File

@ -0,0 +1,36 @@
#pragma once
/*
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/common.hpp>
namespace PD {
namespace HwInfo {
void Init();
void Deinit();
bool IsCharging();
int GetBatteryPercentage();
int GetWifiLevel();
} // namespace HwInfo
} // namespace PD

32
include/pd/lib3ds/os.hpp Normal file
View File

@ -0,0 +1,32 @@
#pragma once
/*
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/common.hpp>
namespace PD {
namespace Ctr {
std::string GetSystemLanguage();
} // namespace Ctr
} // namespace PD

72
include/pd/net/net.hpp Normal file
View File

@ -0,0 +1,72 @@
#pragma once
/*
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/common.hpp>
#include <pd/external/json.hpp>
namespace PD {
class DownloadManager : public SmartCtor<DownloadManager> {
public:
using Error = u64;
enum Error_ {
Error_None, // Function Executed Successfully
Error_Memory, // Memory Allocation Error
Error_Write, // Unable to Write File
Error_StatusCode, // Error with Status Code
Error_Git, // Git Error
Error_CtrStatus, // 3ds Result Code
Error_Curl, // Curl Error
Error_Busy, // Another Download Taskl is already running
Error_Invalid, // Invalid Json struct
Error_NoWifi, // Console not connected to wifi
};
DownloadManager() {}
~DownloadManager() {}
static Error_ GetErrorCode(Error err) {
return (Error_)u32(err & 0xffffffff);
}
static int GetStatusCode(Error err) {
Error_ c = GetErrorCode(err);
if (c != Error_StatusCode && c != Error_CtrStatus && c != Error_Curl) {
return 0;
}
return u32(err >> 32);
}
Error Get(const std::string& url, std::string& res);
Error GetFile(const std::string& url, const std::string& res_path);
Error GetGitRelease(const std::string& url, const std::string& asset,
const std::string& path, bool pre);
Error GetAsJson(const std::string& url, nlohmann::json& res);
u64 ProgressCurrent() const { return current; }
u64 ProgressTotal() const { return total; }
private:
u64 current;
u64 total;
};
} // namespace PD

View File

@ -0,0 +1,44 @@
#pragma once
/*
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/common.hpp>
namespace PD {
namespace Music {
class Decoder : public SmartCtor<Decoder> {
public:
Decoder() {}
virtual ~Decoder() {}
virtual int Init(const std::string& path) = 0;
virtual void Deinit() = 0;
virtual u32 GetSampleRate() = 0;
virtual u8 GetChannels() = 0;
virtual size_t GetBufSize() = 0;
virtual u64 Decode(u16* buf_address) = 0;
virtual size_t GetFileSamples() = 0;
};
} // namespace Music
} // namespace PD

View File

@ -0,0 +1,62 @@
#pragma once
/*
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/common.hpp>
namespace PD {
namespace Music {
class MetaData {
public:
MetaData() {}
~MetaData() {}
std::string Name() const { return name; }
std::string Album() const { return album; }
std::string Year() const { return year; }
std::string Title() const { return title; }
std::string Artist() const { return artist; }
std::string Mdt() const { return mdt; }
std::string Path() const { return path; }
void Name(const std::string &v) { name = v; }
void Album(const std::string &v) { album = v; }
void Year(const std::string &v) { year = v; }
void Title(const std::string &v) { title = v; }
void Artist(const std::string &v) { artist = v; }
void Mdt(const std::string &v) { mdt = v; }
void Path(const std::string &v) { path = v; }
private:
const std::string unk = "Unknown";
std::string title = unk;
std::string album = unk;
std::string year = unk;
std::string name = unk;
std::string path = unk;
std::string artist = unk;
std::string mdt = unk;
};
} // namespace Music
} // namespace PD

52
include/pd/sound/mp3.hpp Normal file
View File

@ -0,0 +1,52 @@
#pragma once
/*
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 <mpg123.h>
#include <pd/sound/decoder.hpp>
namespace PD {
namespace Music {
class Mp3Decoder : public Decoder {
public:
Mp3Decoder() {}
~Mp3Decoder() {}
int Init(const std::string& path) override;
void Deinit() override;
u32 GetSampleRate() override;
u8 GetChannels() override;
size_t GetBufSize() override;
u64 Decode(u16* buf_address) override;
size_t GetFileSamples() override;
private:
mpg123_handle* handle = nullptr;
size_t buf_size = 0;
u32 rate = 0;
u8 channels = 0;
};
} // namespace Music
} // namespace PD

View File

@ -0,0 +1,52 @@
#pragma once
/*
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/lib3ds/memory.hpp>
#include <pd/sound/decoder.hpp>
#include <pd/sound/metadata.hpp>
namespace PD {
namespace Music {
class Player : public SmartCtor<Player> {
public:
Player() {}
~Player() {}
private:
MetaData meta;
size_t samples_total = 0;
size_t samples_played = 0;
size_t samples_per_sec = 0;
std::string file;
std::vector<signed short, LinearAllocator<signed short>> buffers[2];
ndspWaveBuf wave_buf[2] = {0};
bool last_buf = false;
int ret = -1;
bool done = false;
bool playing = false;
bool stop = false;
};
} // namespace Music
} // namespace PD

View File

@ -38,9 +38,9 @@ class Container : public SmartCtor<Container> {
Container(const vec4& box) : pos(box.xy()), size(box.zw()) {}
~Container() {}
void Init(LI::Renderer::Ref r, UI7::DrawList::Ref l, UI7::Theme* lt) {
void Init(LI::Renderer::Ref r, UI7::DrawList::Ref l, UI7::Theme::Ref lt) {
list = l;
linked_theme = lt;
theme = lt;
ren = r;
}
@ -50,6 +50,9 @@ class Container : public SmartCtor<Container> {
vec2 GetPos() { return pos; }
vec2 GetSize() { return size; }
void SetParent(Container::Ref v) { parent = v; }
Container::Ref GetParent() { return parent; }
bool Skippable() const { return skippable; }
bool Removable() const { return rem; }
@ -72,8 +75,9 @@ class Container : public SmartCtor<Container> {
vec2 pos;
vec2 size;
UI7::DrawList::Ref list;
UI7::Theme* linked_theme;
UI7::Theme::Ref theme;
LI::Renderer::Ref ren;
Container::Ref parent;
u32 id = 0;
};
} // namespace UI7

View File

@ -34,8 +34,8 @@ namespace PD {
namespace UI7 {
class Menu : public SmartCtor<Menu> {
public:
Menu(ID id, Theme* tl, Hid::Ref h) {
linked_theme = tl;
Menu(ID id, Theme::Ref tl, Hid::Ref h) {
theme = tl;
this->inp = h;
this->id = id;
this->name = id.GetName();
@ -48,37 +48,97 @@ class Menu : public SmartCtor<Menu> {
};
~Menu() {}
/// Objects
/// Objects ///
/// @brief Render a Simple Label
/// @param label The text to draw
void Label(const std::string& label);
/// @brief Render a Button
/// @param label The buttons text
/// @return if the button was pressed
bool Button(const std::string& label);
/// @brief Render a Checkbox
/// @param label Label of the Checkbox
/// @param v A value to update
void Checkbox(const std::string& label, bool& v);
/// @brief Render an Image
/// @param img Texture reference of the image
/// @param size a Custom Size if needed
void Image(Texture::Ref img, vec2 size = 0.f);
/// Basic API
/// Basic API ///
/// @brief Add the Next object to the same line
void SameLine();
/// @brief Add a Separator Line
void Separator();
/// @brief Render a Separator Line with a Text
/// @todo determinate text position by current alignment
/// @param label The Text to show
void SeparatorText(const std::string& label);
/// @brief Put the last Added Object into the Joinlist
void Join();
/// @brief Add the Last element to the join list
/// and perform an alignment operation
/// @param a Alignment Oeration(s)
void JoinAlign(UI7Align a);
/// @brief Align the Last Object
/// @param a Alignment Operation
void AfterAlign(UI7Align a);
/// @brief Set a Temp alignment op for the next Object
/// @param a Alignment Operation
void NextAlign(UI7Align a) { tmpalign = a; }
/// @brief Align Every Single Object by this operationset
/// @param a Alignment
void PushAlignment(UI7Align a) { alignment = a; }
/// @brief Use default alignment
void PopAlignment() { alignment = UI7Align_Default; }
/// @brief Get a New Position depending on the Alignment
/// @param pos Current Position
/// @param size Object size
/// @param view Viewport [position and size]
/// @param a Alignment Operations
/// @return new position based on the alignment
static vec2 AlignPos(vec2 pos, vec2 size, vec4 view, UI7Align a);
/// @brief Returns a Reference to the theme
/// @return Reference to the base Theme of the context
Theme::Ref GetTheme() { return theme; }
/// @brief Directly return a Color by using the
/// m->ThemeColor(UI7Color_Text) for example
/// @param clr The Input UI7 Color
/// @return The 32bit color value
u32 ThemeColor(UI7Color clr) const { return theme->Get(clr); }
/// API for Custom Objects
/// @brief Handles the Position of Objects in Scrolling Menu
/// @note As Containers have their own FUnc to handle this, this
/// function is only useful to Render Live Objects whicch cannot be aligned
/// by the internal Alignment Api
/// @param pos position reference to write the new position to
/// @param size size of the Object
/// @return if the object can be skipped in rendering
bool HandleScrolling(vec2& pos, const vec2& size);
/// @brief Get the Cursor Position
/// @return Cursor Pos
vec2 Cursor() const { return cursor; }
/// @brief Set the Cursor position
/// @note The old Position can be restored with RestoreCursor
/// @param v New Position
void Cursor(const vec2& v) {
bcursor = cursor;
cursor = v;
}
/// @brief Restore to the last cursor Position
void RestoreCursor() {
cursor = bcursor;
bcursor = vec2();
}
/// @brief Return if a Vertical Scrollbar exists
bool HasVerticalScrollbar() { return scrollbar[1]; }
/// @brief Return if a Horizontal Scrollbar exists
bool HasHorizontalScrollbar() { return scrollbar[0]; }
/// @brief Get the Titlebar height
float TitleBarHeight() { return tbh; }
/// @brief Set a Custom Titlebar heigt
/// @note Could destroy some basic functionality
@ -86,39 +146,72 @@ class Menu : public SmartCtor<Menu> {
/// @brief Init the Cursor
/// @note Useful when using with a Custom TitlebarHeight
void CursorInit() { Cursor(vec2(5, tbh + 5)); }
/// @brief Move the Cursor for new Object
/// @param szs Size of the current Object
void CursorMove(const vec2& szs);
/// @brief Get the ViewArea of the Menu
vec4 ViewArea() const { return view_area; }
/// @brief Get the Main Area of the Menu
/// (only relevant for input)
vec4 MainArea() const { return main_area; }
/// @brief Set a MainArea for input
/// @param v Area where Objects can receive inputs
void MainArea(const vec4& v) { main_area = v; }
/// @brief Get The Scrolling offset
vec2 ScrollOffset() const { return scrolling_off; }
/// @brief Set a Scrolling offset
/// @param v Custom Scrolling offset
void ScrollOffset(const vec2& v) { scrolling_off = v; }
/// @brief Get the Current Scrollmodification value
vec2 ScrollMod() const { return scroll_mod; }
/// @brief Animated Scroll to Position
/// @param pos Destination Position
void ScrollTo(vec2 pos) {
scroll_anim.From(scrolling_off)
.To(pos)
.In(1.f)
.As(scroll_anim.EaseInOutSine);
}
/// @brief Check if Still in ScrollAnimation
bool IsAnimatedScroll() { return !scroll_anim.IsFinished(); }
/// Objects API
/// Objects API ///
/// @brief Push an object to the current ListHandler
/// @param obj Object reference to use
/// @return Reference to the Object (from a time
/// where ObjectPush(Container::New()) was used)
Container::Ref ObjectPush(Container::Ref obj);
/// @brief Search for an Object by an id
/// @param id 32 Bit hash/id
/// @return the found Object or nullptr
Container::Ref FindIDObj(u32 id);
/// Draw Lists
/// Draw Lists ///
/// @brief Background Layer Drawlist
DrawList::Ref BackList() { return back; }
/// @brief Setter for Background Layer Drawlist
void BackList(DrawList::Ref v) { back = v; }
/// @brief Main Layer Drawlist
DrawList::Ref MainList() { return main; }
/// @brief Setter for Main Layer Drawlist
void MainList(DrawList::Ref v) { main = v; }
/// @brief Foreground Layer Drawlist
DrawList::Ref FrontList() { return front; }
/// @brief Setter for Foreground Layer Drawlist
void FrontList(DrawList::Ref v) { front = v; }
/// Advanced
/// Advanced ///
/// @brief Display Debug Labels of the Menu
void DebugLabels();
/// Uneditable Stuff
/// Uneditable Stuff ///
/// @brief Menu Name
std::string GetName() const { return name; }
/// @brief Menu ID [Hash of the Name]
u32 GetID() const { return id; }
private:
@ -166,7 +259,7 @@ class Menu : public SmartCtor<Menu> {
bool scroll_allowed[2];
bool has_touch;
Menu::Ref submenu;
Container::Ref tmp_parent;
/// Objects API
std::vector<Container::Ref> objects;
@ -186,7 +279,7 @@ class Menu : public SmartCtor<Menu> {
vec2 last_size;
// Theme
Theme* linked_theme;
Theme::Ref theme;
// Input Reference
Hid::Ref inp;

View File

@ -48,7 +48,7 @@ enum UI7Color_ {
namespace PD {
namespace UI7 {
/// @brief Theme Class
class Theme {
class Theme : public SmartCtor<Theme> {
public:
public:
Theme() { Default(*this); }

View File

@ -37,7 +37,7 @@ class Context : public SmartCtor<Context> {
Context(LI::Renderer::Ref ren, Hid::Ref hid) {
this->ren = ren;
this->inp = hid;
Theme::Default(theme);
theme = Theme::New();
back = DrawList::New(ren);
front = DrawList::New(ren);
}
@ -48,8 +48,14 @@ class Context : public SmartCtor<Context> {
Menu::Ref FindMenu(const ID& id);
void EndMenu();
/// Theme Management
Theme& GetTheme() { return theme; }
/// @brief Get Theme reference
/// @return Reference to the base Theme of the context
Theme::Ref GetTheme() { return theme; }
/// @brief Directly return a Color by using the
/// ctx->ThemeColor(UI7Color_Text) for example
/// @param clr The Input UI7 Color
/// @return The 32bit color value
u32 ThemeColor(UI7Color clr) const { return theme->Get(clr); }
/// @brief Update Context (Render menus)
/// @param delta deltatime
@ -85,7 +91,7 @@ class Context : public SmartCtor<Context> {
DrawList::Ref front;
DrawList::Ref back;
// Theme
Theme theme;
Theme::Ref theme;
// Promt Handler
};
} // namespace UI7

View File

@ -26,6 +26,7 @@ SOFTWARE.
#include <pd/app/app.hpp>
#include <pd/core/sys.hpp>
#include <pd/lib3ds/hwinfo.hpp>
namespace PD {
int App::too;
@ -33,17 +34,17 @@ int App::too;
void App::Run() {
this->PreInit();
this->Init();
last_time = Sys::GetTime();
last_time = Sys::GetNanoTime();
while (aptMainLoop()) {
input_mgr->Update();
u64 current = Sys::GetNanoTime();
float dt = static_cast<float>(current - last_time) / 1000000.f;
app_time += dt / 1000.f;
app_time->Update();
last_time = current;
fps = 1000.f / dt;
if (runtimeflags & AppFLags_UserLoop) {
PD::TT::Beg("App_MainLoop");
if (!this->MainLoop(dt, app_time)) {
if (!this->MainLoop(dt, app_time->GetSeconds())) {
break;
}
PD::TT::End("App_MainLoop");
@ -73,6 +74,12 @@ void App::Run() {
this->PostDeinit();
}
std::string App::GetDataDirectory() {
Assert(SafeInitFlags & AppInitFlags_UnnamedOption1,
"Data Dir is not enabled!");
return "sdmc:/palladium/apps/" + name;
}
void App::PreInit() {
/// Create a Copy that won't get edit
SafeInitFlags = InitFlags;
@ -87,6 +94,9 @@ void App::PreInit() {
if (InitFlags & AppInitFlags_MountRomfs) {
romfsInit();
}
if (InitFlags & AppInitFlags_InitHwInfo) {
PD::HwInfo::Init();
}
if (InitFlags & AppInitFlags_UnnamedOption1) {
std::filesystem::create_directories("sdmc:/palladium/apps/" + name);
}
@ -103,6 +113,7 @@ void App::PreInit() {
msg_mgr = MessageMgr::New(renderer);
overlay_mgr = OverlayMgr::New(renderer, input_mgr);
}
app_time = Timer::New();
}
void App::PostDeinit() {
@ -116,6 +127,9 @@ void App::PostDeinit() {
}
gfxExit();
}
if (SafeInitFlags & AppInitFlags_InitHwInfo) {
PD::HwInfo::Deinit();
}
cfguExit();
if (SafeInitFlags & AppInitFlags_MountRomfs) {
romfsExit();

49
source/core/timer.cpp Normal file
View File

@ -0,0 +1,49 @@
/*
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/core/timer.hpp>
namespace PD {
Timer::Timer(bool autostart) {
is_running = autostart;
Reset();
}
void Timer::Reset() {
start = Sys::GetTime();
now = start;
}
void Timer::Update() {
if (is_running) {
now = Sys::GetTime();
}
}
void Timer::Pause() { is_running = false; }
void Timer::Rseume() { is_running = true; }
bool Timer::IsRunning() const { return is_running; }
u64 Timer::Get() { return now - start; }
double Timer::GetSeconds() { return double(Get()) / 1000.0; }
} // namespace PD

50
source/lib3ds/hwinfo.cpp Normal file
View File

@ -0,0 +1,50 @@
/*
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 <3ds.h>
#include <pd/lib3ds/hwinfo.hpp>
namespace PD {
namespace HwInfo {
void Init() {
mcuHwcInit();
ptmuInit();
}
void Deinit() {
mcuHwcExit();
ptmuExit();
}
bool IsCharging() {
u8 v = 0;
PTMU_GetBatteryChargeState(&v);
return v == 1;
}
int GetBatteryPercentage() {
u8 lvl = 0;
MCUHWC_GetBatteryLevel(&lvl);
return lvl;
}
int GetWifiLevel() { return osGetWifiStrength(); }
} // namespace HwInfo
} // namespace PD

79
source/lib3ds/os.cpp Normal file
View File

@ -0,0 +1,79 @@
/*
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 <3ds.h>
#include <pd/lib3ds/os.hpp>
namespace PD {
namespace Ctr {
std::string GetSystemLanguage() {
u8 language = 0;
Result res = CFGU_GetSystemLanguage(&language);
if (R_FAILED(res)) {
return "en";
}
switch (language) {
case 0:
return "jp"; // Japanese
break;
case 1:
return "en"; // English
break;
case 2:
return "fr"; // French
break;
case 3:
return "de"; // German
break;
case 4:
return "it"; // Italian
break;
case 5:
return "es"; // Spanish
break;
case 6:
return "zh-CN"; // Chinese (Simplified)
break;
case 7:
return "ko"; // Korean
break;
case 8:
return "nl"; // Dutch
break;
case 9:
return "pt"; // Portuguese
break;
case 10:
return "ru"; // Russian
break;
case 11:
return "zh-TW"; // Chinese (Traditional)
break;
default:
return "en"; // Fall back to English if missing
break;
}
}
} // namespace Ctr
} // namespace PD

72
source/sound/mp3.cpp Normal file
View File

@ -0,0 +1,72 @@
/*
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/sound/mp3.hpp>
namespace PD {
namespace Music {
int Mp3Decoder::Init(const std::string& path) {
int ret = 0;
int encoding = 0;
if ((ret = mpg123_init() != MPG123_OK)) {
return ret;
}
if ((handle = mpg123_new(nullptr, &ret)) == nullptr) {
return ret;
}
int cnls = 0;
long _rate = 0;
if (mpg123_open(handle, path.c_str()) != MPG123_OK ||
mpg123_getformat(handle, &_rate, &cnls, &encoding)) {
return ret;
}
rate = _rate;
channels = cnls;
mpg123_format_none(handle);
mpg123_format(handle, rate, channels, encoding);
buf_size = mpg123_outblock(handle) * 16;
return ret;
}
void Mp3Decoder::Deinit() {
mpg123_close(handle);
mpg123_delete(handle);
mpg123_exit();
}
u32 Mp3Decoder::GetSampleRate() { return rate; }
u8 Mp3Decoder::GetChannels() { return channels; }
u64 Mp3Decoder::Decode(u16* buf_address) {
size_t done = 0;
mpg123_read(handle, buf_address, buf_size, &done);
return done / sizeof(u16);
}
size_t Mp3Decoder::GetFileSamples() {
off_t len = mpg123_length(handle);
if (len != MPG123_ERR) {
return len * size_t(channels);
}
return -1; // NotExist
}
} // namespace Music
} // namespace PD

View File

@ -48,12 +48,12 @@ void Button::HandleInput(Hid::Ref inp) {
inp_done = true;
}
void Button::Draw() {
Assert(ren.get() && list.get() && linked_theme,
Assert(ren.get() && list.get() && theme,
"Did you run Container::Init correctly?");
ren->OnScreen(screen);
list->AddRectangle(pos, size, linked_theme->Get(color));
list->AddRectangle(pos, size, theme->Get(color));
list->AddText(pos + size * 0.5 - tdim * 0.5, label,
linked_theme->Get(UI7Color_Text));
theme->Get(UI7Color_Text));
}
} // namespace UI7
} // namespace PD

View File

@ -47,15 +47,15 @@ void Checkbox::HandleInput(Hid::Ref inp) {
inp_done = true;
}
void Checkbox::Draw() {
Assert(ren.get() && list.get() && linked_theme,
Assert(ren.get() && list.get() && theme,
"Did you run Container::Init correctly?");
ren->OnScreen(screen);
list->AddRectangle(pos, cbs, linked_theme->Get(color));
list->AddRectangle(pos, cbs, theme->Get(color));
if (usr_ref) {
list->AddRectangle(pos + 2, cbs - 4, linked_theme->Get(UI7Color_Checkmark));
list->AddRectangle(pos + 2, cbs - 4, theme->Get(UI7Color_Checkmark));
}
list->AddText(pos + vec2(cbs.x() + 5, cbs.y() * 0.5 - tdim.y() * 0.5), label,
linked_theme->Get(UI7Color_Text));
theme->Get(UI7Color_Text));
}
} // namespace UI7
} // namespace PD

View File

@ -26,8 +26,7 @@ SOFTWARE.
namespace PD {
namespace UI7 {
void Image::Draw() {
Assert(ren.get() && list.get() && linked_theme,
"Did you run Container::Init correctly?");
Assert(ren.get() && list.get(), "Did you run Container::Init correctly?");
Assert(img.get(), "Image is nullptr!");
ren->OnScreen(screen);
list->AddImage(pos, img);

View File

@ -26,10 +26,10 @@ SOFTWARE.
namespace PD {
namespace UI7 {
void Label::Draw() {
Assert(ren.get() && list.get() && linked_theme,
Assert(ren.get() && list.get() && theme,
"Did you run Container::Init correctly?");
ren->OnScreen(screen);
list->AddText(pos, label, linked_theme->Get(UI7Color_Text));
list->AddText(pos, label, theme->Get(UI7Color_Text));
}
} // namespace UI7
} // namespace PD

View File

@ -32,7 +32,7 @@ void UI7::Menu::Label(const std::string& label) {
ObjectPush(PD::New<UI7::Label>(label, Cursor(), this->back->ren));
r->SetPos(AlignPos(r->GetPos(), r->GetSize(), view_area, GetAlignment()));
CursorMove(r->GetSize());
r->Init(main->ren, main, linked_theme);
r->Init(main->ren, main, theme);
r->HandleScrolling(scrolling_off, view_area);
}
@ -43,7 +43,7 @@ bool UI7::Menu::Button(const std::string& label) {
if (!r) {
r = PD::New<UI7::Button>(label, Cursor(), this->back->ren);
r->SetID(id);
r->Init(main->ren, main, linked_theme);
r->Init(main->ren, main, theme);
}
ObjectPush(r);
r->SetPos(AlignPos(Cursor(), r->GetSize(), view_area, GetAlignment()));
@ -61,7 +61,7 @@ void UI7::Menu::Checkbox(const std::string& label, bool& v) {
if (!r) {
r = PD::New<UI7::Checkbox>(label, Cursor(), v, this->back->ren);
r->SetID(id);
r->Init(main->ren, main, linked_theme);
r->Init(main->ren, main, theme);
}
ObjectPush(r);
r->SetPos(AlignPos(Cursor(), r->GetSize(), view_area, GetAlignment()));
@ -74,7 +74,7 @@ void UI7::Menu::Image(Texture::Ref img, vec2 size) {
ObjectPush(PD::New<UI7::Image>(img, Cursor(), this->back->ren, size));
r->SetPos(AlignPos(r->GetPos(), r->GetSize(), view_area, GetAlignment()));
CursorMove(r->GetSize());
r->Init(main->ren, main, linked_theme);
r->Init(main->ren, main, theme);
r->HandleScrolling(scrolling_off, view_area);
}
@ -163,20 +163,19 @@ void UI7::Menu::PreHandler(UI7MenuFlags flags) {
has_touch =
main->GetRenderer()->CurrentScreen()->ScreenType() == Screen::Bottom;
if (!(flags & UI7MenuFlags_NoBackground)) {
back->AddRectangle(0, view_area.zw(),
linked_theme->Get(UI7Color_Background));
back->AddRectangle(0, view_area.zw(), theme->Get(UI7Color_Background));
}
if (!(flags & UI7MenuFlags_NoTitlebar)) {
tbh = front->GetRenderer()->TextScale() * 30.f;
front->AddRectangle(0, vec2(view_area.z(), tbh),
linked_theme->Get(UI7Color_Header));
theme->Get(UI7Color_Header));
vec2 tpos(5, tbh * 0.5 - front->ren->GetTextDimensions(name).y() * 0.5);
LITextFlags tflags = LITextFlags_None;
if (flags & UI7MenuFlags_CenterTitle) {
tpos = 0;
tflags = LITextFlags_AlignMid;
}
front->AddText(tpos, this->name, linked_theme->Get(UI7Color_Text), tflags,
front->AddText(tpos, this->name, theme->Get(UI7Color_Text), tflags,
vec2(view_area.z(), tbh));
main_area[1] = tbh;
CursorInit();
@ -287,12 +286,12 @@ void UI7::Menu::PostHandler() {
/// Rendering Stage
front->AddRectangle(vec2(screen_w - 12, tsp), vec2(slider_w * 2, szs),
linked_theme->Get(UI7Color_FrameBackground));
theme->Get(UI7Color_FrameBackground));
front->AddRectangle(vec2(screen_w - 10, tsp + 2), vec2(slider_w, szs - 4),
linked_theme->Get(UI7Color_FrameBackgroundHovered));
theme->Get(UI7Color_FrameBackgroundHovered));
front->AddRectangle(vec2(screen_w - 10, srpos + 2),
vec2(slider_w, vslider_h),
linked_theme->Get(UI7Color_Button));
theme->Get(UI7Color_Button));
}
}
TT::End("MUSR_" + name);
@ -310,7 +309,7 @@ void UI7::Menu::Separator() {
if (HandleScrolling(pos, size)) {
return;
}
main->AddRectangle(pos, size, linked_theme->Get(UI7Color_TextDead));
main->AddRectangle(pos, size, theme->Get(UI7Color_TextDead));
}
void UI7::Menu::SeparatorText(const std::string& label) {
@ -326,11 +325,11 @@ void UI7::Menu::SeparatorText(const std::string& label) {
vec2 lpos = pos + vec2((view_area.z() - 10) * 0.5 - tdim.x() * 0.5, 0);
main->AddRectangle(pos + vec2(0, tdim.y() * 0.5),
vec2(lpos.x() - pos.x() - 5, size.y()),
linked_theme->Get(UI7Color_TextDead));
theme->Get(UI7Color_TextDead));
main->AddRectangle(pos + vec2(lpos.x() + tdim.x(), tdim.y() * 0.5),
vec2(size.x() - (lpos.x() + tdim.x()), size.y()),
linked_theme->Get(UI7Color_TextDead));
main->AddText(lpos, label, linked_theme->Get(UI7Color_Text), 0,
theme->Get(UI7Color_TextDead));
main->AddText(lpos, label, theme->Get(UI7Color_Text), 0,
vec2(view_area.z(), 20));
}
@ -346,6 +345,7 @@ bool UI7::Menu::HandleScrolling(vec2& pos, const vec2& size) {
Container::Ref UI7::Menu::ObjectPush(Container::Ref obj) {
this->objects.push_back(obj);
obj->SetParent(this->tmp_parent);
return obj;
}
@ -371,6 +371,10 @@ void UI7::Menu::JoinAlign(UI7Align a) {
vec2 spos = join.front()->GetPos();
vec2 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());
}
vec2 off;
if (a & UI7Align_Center) {
off[0] = (view_area[0] + view_area[2] * 0.5) - (spos[0] + szs[0] * 0.5);

View File

@ -31,7 +31,7 @@ bool UI7::Context::BeginMenu(const ID& id, UI7MenuFlags flags) {
"Menu Name Already used or\nContext::Update not called!");
auto menu = this->menus.find(id);
if (menu == this->menus.end()) {
this->menus[id] = Menu::New(id, &theme, inp);
this->menus[id] = Menu::New(id, theme, inp);
menu = this->menus.find(id);
}
this->current = menu->second;