Meter is improved but needs a few more things.
This commit is contained in:
parent
3d44b7ccc5
commit
1950f45f46
5 changed files with 141 additions and 22 deletions
100
demos/meters.cpp
Normal file
100
demos/meters.cpp
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
#include "guecs/sfml/backend.hpp"
|
||||||
|
#include "guecs/sfml/components.hpp"
|
||||||
|
#include "guecs/uistack.hpp"
|
||||||
|
#include "guecs/ui.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
#include <chrono>
|
||||||
|
#include <thread>
|
||||||
|
#include <flat_map>
|
||||||
|
#include <fmt/core.h>
|
||||||
|
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
|
struct TestMeters {
|
||||||
|
guecs::UI $gui{};
|
||||||
|
|
||||||
|
void init() {
|
||||||
|
$gui.position(0, 0, 1280, 720);
|
||||||
|
$gui.layout("[meter1][=meter2][meter3][meter4]");
|
||||||
|
|
||||||
|
for(auto& [name, cell] : $gui.cells()) {
|
||||||
|
auto gui_id = $gui.entity(name);
|
||||||
|
|
||||||
|
$gui.set<guecs::Rectangle>(gui_id, {4, {0, 255, 0, 255}});
|
||||||
|
$gui.set<guecs::Meter>(gui_id, {1.0f, {255, 0, 0, 255}, 4});
|
||||||
|
$gui.set<guecs::Effect>(gui_id, {});
|
||||||
|
$gui.set<guecs::Text>(gui_id, {guecs::to_wstring(name)});
|
||||||
|
$gui.set<guecs::Clickable>(gui_id, {
|
||||||
|
[&, gui_id, name](auto) {
|
||||||
|
auto& meter = $gui.get<guecs::Meter>(gui_id);
|
||||||
|
meter.percent = meter.percent - 0.1f;
|
||||||
|
if(meter.percent < 0.0f) {
|
||||||
|
meter.percent = 1.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$gui.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void render(sf::RenderTarget& target) {
|
||||||
|
$gui.render(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mouse(float x, float y, guecs::Modifiers mods) {
|
||||||
|
return $gui.mouse(x, y, mods);
|
||||||
|
}
|
||||||
|
|
||||||
|
void update() {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
try {
|
||||||
|
sfml::Backend backend;
|
||||||
|
guecs::init(&backend);
|
||||||
|
|
||||||
|
sf::RenderWindow window(sf::VideoMode({1280, 720}), "Meter Tester");
|
||||||
|
window.setVerticalSyncEnabled(true);
|
||||||
|
window.setFramerateLimit(60);
|
||||||
|
window.setPosition({0,0});
|
||||||
|
TestMeters gui;
|
||||||
|
gui.init();
|
||||||
|
|
||||||
|
while(window.isOpen()) {
|
||||||
|
while (const auto event = window.pollEvent()) {
|
||||||
|
if(event->is<sf::Event::Closed>()) {
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(const auto* mouse = event->getIf<sf::Event::MouseButtonPressed>()) {
|
||||||
|
if(mouse->button == sf::Mouse::Button::Left) {
|
||||||
|
sf::Vector2f pos = window.mapPixelToCoords(mouse->position);
|
||||||
|
gui.mouse(pos.x, pos.y, false);
|
||||||
|
}
|
||||||
|
} else if(const auto* key = event->getIf<sf::Event::KeyPressed>()) {
|
||||||
|
using KEY = sf::Keyboard::Scan;
|
||||||
|
|
||||||
|
switch(key->scancode) {
|
||||||
|
case KEY::Q:
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gui.update();
|
||||||
|
gui.render(window);
|
||||||
|
window.display();
|
||||||
|
|
||||||
|
std::this_thread::sleep_for(100ms);
|
||||||
|
}
|
||||||
|
} catch(const std::system_error& e) {
|
||||||
|
std::cout << "WARNING: On OSX you'll get this error on shutdown.\n";
|
||||||
|
std::cout << "Caught system_error with code "
|
||||||
|
"[" << e.code() << "] meaning "
|
||||||
|
"[" << e.what() << "]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -69,11 +69,16 @@ namespace guecs {
|
||||||
struct Meter {
|
struct Meter {
|
||||||
float percent = 1.0f;
|
float percent = 1.0f;
|
||||||
sf::Color color = THEME.BG_COLOR_DARK;
|
sf::Color color = THEME.BG_COLOR_DARK;
|
||||||
Rectangle bar;
|
int padding = THEME.PADDING;
|
||||||
|
Rectangle bar{padding, color};
|
||||||
|
// this is set automatically if a Rectangle is configured for the cell
|
||||||
|
Rectangle backing_rect{padding, color};
|
||||||
|
size_t $cell_w = 0;
|
||||||
|
size_t $cell_h = 0;
|
||||||
|
|
||||||
|
void init(lel::Cell& cell, guecs::Rectangle &bg);
|
||||||
void init(lel::Cell& cell);
|
void init(lel::Cell& cell);
|
||||||
void init(lel::Cell& cell, Rectangle& bg);
|
void render(sf::RenderTarget& window, sf::Shader *shader_ptr);
|
||||||
void render(lel::Cell& cell, sf::RenderTarget& window, sf::Shader *shader_ptr);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Effect {
|
struct Effect {
|
||||||
|
|
|
||||||
16
meson.build
16
meson.build
|
|
@ -11,8 +11,12 @@ project('lel-guecs', 'cpp',
|
||||||
|
|
||||||
# use this for common options only for our executables
|
# use this for common options only for our executables
|
||||||
cpp_args=[
|
cpp_args=[
|
||||||
'-Wno-deprecated-declarations',
|
|
||||||
'-I../subprojects/utf8cpp-4.0.9/source',
|
'-I../subprojects/utf8cpp-4.0.9/source',
|
||||||
|
'-Wno-unused-parameter',
|
||||||
|
'-Wno-unused-function',
|
||||||
|
'-Wno-unused-variable',
|
||||||
|
'-Wno-unused-but-set-variable',
|
||||||
|
'-Wno-deprecated-declarations',
|
||||||
]
|
]
|
||||||
link_args=[]
|
link_args=[]
|
||||||
# these are passed as override_defaults
|
# these are passed as override_defaults
|
||||||
|
|
@ -156,3 +160,13 @@ executable('multiscreen', [
|
||||||
include_directories: lel_guecs_inc,
|
include_directories: lel_guecs_inc,
|
||||||
link_with: [lel_guecs_lib, lel_guecs_sfml_lib],
|
link_with: [lel_guecs_lib, lel_guecs_sfml_lib],
|
||||||
dependencies: dependencies)
|
dependencies: dependencies)
|
||||||
|
|
||||||
|
executable('meters', [
|
||||||
|
'demos/meters.cpp',
|
||||||
|
],
|
||||||
|
cpp_args: cpp_args,
|
||||||
|
link_args: link_args,
|
||||||
|
override_options: exe_defaults,
|
||||||
|
include_directories: lel_guecs_inc,
|
||||||
|
link_with: [lel_guecs_lib, lel_guecs_sfml_lib],
|
||||||
|
dependencies: dependencies)
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,7 @@ namespace guecs {
|
||||||
using std::make_shared;
|
using std::make_shared;
|
||||||
|
|
||||||
// BUG: this seems to center things wrong in lel layouts
|
// BUG: this seems to center things wrong in lel layouts
|
||||||
template<typename T>
|
void sfml_center_helper(auto& obj, lel::Cell& cell, int padding) {
|
||||||
void sfml_center_helper(T& obj, lel::Cell& cell, int padding) {
|
|
||||||
sf::Vector2f position{float(cell.x + padding), float(cell.y + padding)};
|
sf::Vector2f position{float(cell.x + padding), float(cell.y + padding)};
|
||||||
|
|
||||||
if(cell.center) {
|
if(cell.center) {
|
||||||
|
|
@ -109,19 +108,20 @@ namespace guecs {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Meter::init(lel::Cell& cell, Rectangle& bg) {
|
void Meter::init(lel::Cell& cell, Rectangle& bg) {
|
||||||
bg.shape->setFillColor(color);
|
backing_rect = bg;
|
||||||
init(cell);
|
init(cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Meter::init(lel::Cell& cell) {
|
void Meter::init(lel::Cell& cell) {
|
||||||
|
$cell_w = cell.w;
|
||||||
|
$cell_h = cell.h;
|
||||||
bar.init(cell);
|
bar.init(cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Meter::render(lel::Cell& cell, sf::RenderTarget& window, sf::Shader *shader_ptr) {
|
void Meter::render(sf::RenderTarget& window, sf::Shader *shader_ptr) {
|
||||||
float level = std::clamp(percent, 0.0f, 1.0f) * float(cell.w);
|
float level = std::clamp(percent, 0.0f, 1.0f) * float($cell_w);
|
||||||
// ZED: this 6 is a border width, make it a thing
|
bar.shape->setSize({std::max(level, 0.0f) - padding * 2, float($cell_h) - padding * 2});
|
||||||
bar.shape->setSize({std::max(level, 0.0f), float(cell.h - 6)});
|
bar.render(window, shader_ptr);
|
||||||
window.draw(*bar.shape, shader_ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::play(bool hover) {
|
void Sound::play(bool hover) {
|
||||||
|
|
|
||||||
|
|
@ -135,9 +135,9 @@ namespace guecs {
|
||||||
rect.render(window, shader_ptr);
|
rect.render(window, shader_ptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
query<lel::Cell, Meter>([&](auto ent, auto& cell, auto &meter) {
|
query<Meter>([&](auto ent, auto &meter) {
|
||||||
auto shader_ptr = find_shader(ent, true);
|
auto shader_ptr = find_shader(ent, true);
|
||||||
meter.render(cell, window, shader_ptr);
|
meter.render(window, shader_ptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
query<Sprite>([&](auto ent, auto& sprite) {
|
query<Sprite>([&](auto ent, auto& sprite) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue