Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmake/properties.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
set(EKG_VERSION 2.3.1)
set(EKG_VERSION 2.5.0)
set(EKG_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")

if(CMAKE_TOOLCHAIN_FILE)
Expand Down
43 changes: 36 additions & 7 deletions include/ekg/core/pools.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,28 +44,32 @@
#include "ekg/ui/scrollbar/scrollbar.hpp"
#include "ekg/ui/scrollbar/widget.hpp"

#include "ekg/ui/slider/slider.hpp"
#include "ekg/ui/slider/widget.hpp"

namespace ekg::core {
void registry(ekg::property_t &property);
}

#define ekg_core_declare_widget_case_todo(descriptor_t, widget_descriptor_at, ekg_core_widget_todo) \
#define ekg_core_widget_call_impl(descriptor_t, widget_descriptor_at, todo) \
case descriptor_t::type: { \
descriptor_t &descriptor { \
ekg::query<descriptor_t>(widget_descriptor_at) \
}; \
if (descriptor == descriptor_t::not_found) { \
break; \
} \
ekg_core_widget_todo \
todo \
break; \
}

#define ekg_core_abstract_todo(widget_descriptor_type, widget_descriptor_at, ekg_core_widget_todo) \
#define ekg_core_widget_call(widget_descriptor_type, widget_descriptor_at, todo) \
switch (widget_descriptor_type) { \
ekg_core_declare_widget_case_todo(ekg::frame_t, widget_descriptor_at, ekg_core_widget_todo); \
ekg_core_declare_widget_case_todo(ekg::button_t, widget_descriptor_at, ekg_core_widget_todo); \
ekg_core_declare_widget_case_todo(ekg::label_t, widget_descriptor_at, ekg_core_widget_todo); \
ekg_core_declare_widget_case_todo(ekg::scrollbar_t, widget_descriptor_at, ekg_core_widget_todo); \
ekg_core_widget_call_impl(ekg::frame_t, widget_descriptor_at, todo); \
ekg_core_widget_call_impl(ekg::button_t, widget_descriptor_at, todo); \
ekg_core_widget_call_impl(ekg::label_t, widget_descriptor_at, todo); \
ekg_core_widget_call_impl(ekg::scrollbar_t, widget_descriptor_at, todo); \
ekg_core_widget_call_impl(ekg::slider_t, widget_descriptor_at, todo); \
}

#define ekg_registry_widget(widget_descriptor_t, register_widget_pool, register_property_pool, is_container, register_settings) \
Expand Down Expand Up @@ -130,6 +134,9 @@ namespace ekg {

ekg::pool<ekg::property_t> scrollbar_property {};
ekg::pool<ekg::scrollbar_t> scrollbar {};

ekg::pool<ekg::property_t> slider_property {};
ekg::pool<ekg::slider_t> slider {};
} pools;

template<typename t>
Expand Down Expand Up @@ -167,6 +174,10 @@ namespace ekg {
return ekg::io::any_static_cast<t>(
&ekg::pools.scrollbar_property.query(at)
);
case ekg::type::slider:
return ekg::io::any_static_cast<t>(
&ekg::pools.slider_property.query(at)
);
}
case ekg::type::button:
return ekg::io::any_static_cast<t>(
Expand All @@ -184,6 +195,10 @@ namespace ekg {
return ekg::io::any_static_cast<t>(
&ekg::pools.scrollbar.query(at)
);
case ekg::type::slider:
return ekg::io::any_static_cast<t>(
&ekg::pools.slider.query(at)
);
}

return t::not_found;
Expand Down Expand Up @@ -250,6 +265,20 @@ namespace ekg {
);
}

case ekg::type::slider: {
ekg_registry_widget(
ekg::slider_t,
ekg::pools.slider,
ekg::pools.slider_property,
false,
{
property.is_childnizate = false;
property.is_children_docknizable = false;
widget.color_scheme = global_theme.slider_color_scheme;
}
);
}

case ekg::type::stack: {
ekg::stack_t &stack {
ekg::pools.stack.push_back(
Expand Down
4 changes: 4 additions & 0 deletions include/ekg/draw/allocator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@
ekg_draw_allocator_pass(); \
};

namespace ekg {
constexpr bool always_parented {true};
}

namespace ekg::draw {
class allocator {
public:
Expand Down
2 changes: 2 additions & 0 deletions include/ekg/handler/theme.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "ekg/ui/frame/frame.hpp"
#include "ekg/ui/label/label.hpp"
#include "ekg/ui/scrollbar/scrollbar.hpp"
#include "ekg/ui/slider/slider.hpp"

namespace ekg {
struct theme_t {
Expand All @@ -42,6 +43,7 @@ namespace ekg {
ekg::frame_color_scheme_t frame_color_scheme {};
ekg::label_color_scheme_t label_color_scheme {};
ekg::scrollbar_color_scheme_t scrollbar_color_scheme {};
ekg::slider_color_scheme_t slider_color_scheme {};
};

ekg::theme_t &theme(std::string tag = "");
Expand Down
3 changes: 2 additions & 1 deletion include/ekg/io/descriptor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ namespace ekg {
button = 5,
scrollbar = 6,
frame = 7,
label = 8
slider = 8,
label = 9,
};
}

Expand Down
82 changes: 70 additions & 12 deletions include/ekg/io/memory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@ namespace ekg {
constexpr ekg::flags_t &put(ekg::flags_t &bits, t bit) {
return (bits |= bit);
}

constexpr void assert(bool state, const char *p_msg = "") {
if (state) return;
if (p_msg) std::cout << "[EKG] assert failed: " << p_msg;
std::abort();
}
}

/**
Expand Down Expand Up @@ -158,6 +164,21 @@ namespace ekg {
};
}

namespace ekg::io {
/**
* @TODO: add a complete docs here please.
**/
template<typename t>
constexpr t &any_static_cast(void *p_any) {
return *static_cast<t*>(p_any);
}

template<typename t>
constexpr t *any_static_cast_as_ptr(void *p_any) {
return static_cast<t*>(p_any);
}
}

/**
* Value system.
**/
Expand All @@ -169,6 +190,7 @@ namespace ekg {
t *p {nullptr};
t previous {};
bool changed {};
size_t type_info_hash {};
public:
value() {
this->ownership(nullptr);
Expand All @@ -178,29 +200,46 @@ namespace ekg {
this->ownership(p_address);
this->changed = true;
}

template<typename s>
value(s val) {
this->as<s>() = ekg::io::any_static_cast<s>(&val);
this->changed = true;
this->type_info_hash = typeid(s).hash_code();
}

value(t val) {
this->get() = val;
this->changed = true;
this->type_info_hash = typeid(t).hash_code();
}

value(const char *p_char) {
this->get() = p_char;
this->changed = true;
this->type_info_hash = typeid(t).hash_code();
}

bool set(const t &val) {
this->get() = val;
this->changed = true;
this->type_info_hash = typeid(t).hash_code();
return true;
}

t &get() {
return this->p ? *this->p : this->val;
}

template<typename s>
void ownership(s *p_address) {
ownership(ekg::io::any_static_cast_as_ptr<t>(p_address));
this->type_info_hash = typeid(s).hash_code();
}

void ownership(t *p_address) {
if (p_address == nullptr) {
this->p = &val;
return;
}

Expand All @@ -221,10 +260,39 @@ namespace ekg {

return false;
}

template<typename s>
bool was_changed_as() {
if (this->changed) {
this->changed = false;
return true;
}

s &get {ekg::io::any_static_cast<s>(this->get())};
s &previous {ekg::io::any_static_cast<s>(this->previous)};

if (previous != get) {
previous = get;
return true;
}

return false;
}

template<typename s>
s &as() {
this->type_info_hash = typeid(s).hash_code();
return ekg::io::any_static_cast<s>(this->get());
}

size_t &get_type_info_hash() {
return this->type_info_hash;
}
public:
template<typename s>
ekg::value<t> &operator = (const s &val) {
this->get() = val;
ekg::value<t> &operator = (s val) {
this->type_info_hash = typeid(s).hash_code();
this->get() = ekg::io::any_static_cast<t>(&val);
this->changed = true;
return *this;
}
Expand All @@ -246,14 +314,4 @@ namespace ekg {
void unmap(void *pv_address);
}

namespace ekg::io {
/**
* @TODO: add a complete docs here please.
**/
template<typename t>
constexpr t &any_static_cast(void *p_any) {
return *static_cast<t*>(p_any);
}
}

#endif
14 changes: 7 additions & 7 deletions include/ekg/ui/button/button.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,20 +48,20 @@ namespace ekg {

struct button_t {
public:
struct check_t {
struct widget_t {
public:
struct widget_t {
public:
ekg::rect_t<float> rect_text {};
ekg::rect_t<float> rect_box {};
};
ekg::rect_t<float> rect_text {};
ekg::rect_t<float> rect_box {};
};

struct check_t {
public:
ekg::value<std::string> text {};
ekg::value<bool> value {};
ekg::font font_size {ekg::font::medium};
ekg::flags_t box {ekg::dock::none};
ekg::flags_t dock {ekg::dock::left};
ekg::button_t::check_t::widget_t widget {};
ekg::button_t::widget_t widget {};
ekg::property_t::states_t states {};
ekg::at_array_t<ekg::layer, ekg::enum_layer_size> layers {};
ekg::at_array_t<ekg::action, ekg::enum_action_size> actions {};
Expand Down
Loading
Loading