111 lines
3.3 KiB
C++
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
|