bwidgets/numeric_input.hpp

111 lines
3.3 KiB
C++

#ifndef NUMERIC_INPUT_HPP
#define NUMERIC_INPUT_HPP
#include <type_traits>
#include "button.hpp"
#include "input.hpp"
template<typename T>
concept Numeric = std::is_arithmetic_v<T>;
template<typename T>
requires Numeric<T>
class Numeric_Input : public Input<T>
{
private:
Button _increment_button;
SDL_Rect _increment_button_area;
Button _decrement_button;
SDL_Rect _decrement_button_area;
void handle_event(const SDL_Event& ev)
{
Widget::handle_event(ev);
_increment_button.handle_event(ev);
_decrement_button.handle_event(ev);
}
void _update_drawing_areas()
{
int widest_button = _increment_button.width() > _decrement_button.width() ?
_increment_button.width() : _decrement_button.width();
int heighest_button = _increment_button.height() > _decrement_button.height() ?
_increment_button.height() : _decrement_button.height();
int field_width = Widget::_viewport.w - 2 * 1.25 * widest_button;
int field_height = heighest_button;
Input<T>::_input_field_area = {
(int)(1.25 * widest_button),
Widget::center(Widget::_viewport.h, field_height),
field_width,
field_height
};
_increment_button_area = {
Widget::center(1.25 * widest_button, _increment_button.width()),
Widget::center(Widget::_viewport.h, _increment_button.height()),
_increment_button.width(),
_increment_button.height()
};
_decrement_button_area = {
Widget::_viewport.w - (Widget::center(1.25 * widest_button, _decrement_button.width()) + _decrement_button.width()),
Widget::center(Widget::_viewport.h, _decrement_button.height()),
_decrement_button.width(),
_decrement_button.height()
};
Widget::_widget_area = {
Widget::_viewport.x + Widget::center(1.25 * widest_button, widest_button),
Widget::_viewport.y + Widget::center(Widget::_viewport.h, heighest_button),
(int)(1.25 * widest_button / 2) + Widget::_viewport.w - widest_button - Widget::_viewport.x,
heighest_button
};
Input<T>::_update_drawing_areas();
}
public:
Numeric_Input(SDL_Renderer* r)
: Input<T>(r),
_increment_button(r),
_decrement_button(r)
{
_increment_button.text("+");
_decrement_button.text("-");
}
void font(TTF_Font* f)
{
_decrement_button.font(f);
_increment_button.font(f);
_update_drawing_areas();
}
void render()
{
Input<T>::render();
_increment_button.render();
_decrement_button.render();
}
void viewport(SDL_Rect vp)
{
Input<T>::viewport(vp);
_update_drawing_areas();
_increment_button.viewport({
Widget::_viewport.x + _increment_button_area.x,
Widget::_viewport.y + _increment_button_area.y,
_increment_button_area.w,
_increment_button_area.h
});
_decrement_button.viewport({
Widget::_viewport.x + _decrement_button_area.x,
Widget::_viewport.y + _decrement_button_area.y,
_decrement_button_area.w,
_decrement_button_area.h
});
}
};
#endif