psemek/libs/ui_legacy/include/psemek/ui/rich_image_view.hpp

63 lines
1.7 KiB
C++

#pragma once
#include <psemek/ui/element.hpp>
#include <psemek/ui/box_shape.hpp>
#include <psemek/gfx/texture.hpp>
namespace psemek::ui
{
struct rich_image_view
: element
{
std::shared_ptr<gfx::texture_2d> image() const { return image_; }
void set_image(std::shared_ptr<gfx::texture_2d> image);
// Zoom is defined as (size of painted pixels)/(size of texture pixels)
math::interval<float> zoom_range() const { return zoom_range_; }
void set_zoom_range(math::interval<float> range);
math::point<float, 2> center() const { return center_; }
float zoom() const { return zoom_; }
void set_center(math::point<float, 2> const & center);
void set_zoom(float zoom);
math::box<float, 2> region() const;
bool allow_overflow() const { return allow_overflow_; }
void set_allow_overflow(bool value);
bool on_event(mouse_move const & e) override;
bool on_event(mouse_click const & e) override;
bool on_event(mouse_wheel const & e) override;
bool on_event(key_press const & e) override;
struct shape const & shape() const override { return shape_; }
void reshape(math::box<float, 2> const & bbox) override;
void update(float dt) override;
void draw(painter & p) const override;
protected:
virtual void on_region_changed() {}
private:
std::shared_ptr<gfx::texture_2d> image_;
math::interval<float> zoom_range_ = {0.f, std::numeric_limits<float>::infinity()};
float zoom_ = 1.f;
float zoom_tgt_ = 1.f;
math::point<float, 2> center_{0.f, 0.f};
bool allow_overflow_ = false;
gfx::color_rgba color_{0, 0, 0, 0};
box_shape shape_;
bool mouseover_ = false;
std::optional<math::point<int, 2>> mouse_;
std::optional<math::point<int, 2>> drag_;
void post_region_changed();
};
}