Files
2025-12-05 08:54:02 +01:00

377 lines
9.7 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef tools_sg_event
#define tools_sg_event
#include "../scast"
#include "../S_STRING"
#include "../typedefs"
namespace tools {
namespace sg {
class event {
public:
static cid id_class() {return 0;}
virtual void* cast(cid) const = 0;
virtual event* copy() const = 0;
public:
event(){
}
virtual ~event(){
}
public:
event(const event&){
}
event& operator=(const event&){return *this;}
};
class size_event : public event {
typedef event parent;
public:
static cid id_class() {return parent::id_class()+1;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<size_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new size_event(*this);}
public:
size_event(unsigned int a_ow,unsigned int a_oh,
unsigned int a_w,unsigned int a_h)
:m_ow(a_ow)
,m_oh(a_oh)
,m_w(a_w)
,m_h(a_h)
{}
virtual ~size_event(){}
public:
size_event(const size_event& a_from)
:event(a_from)
,m_ow(a_from.m_ow)
,m_oh(a_from.m_oh)
,m_w(a_from.m_w)
,m_h(a_from.m_h)
{}
size_event& operator=(const size_event& a_from){
event::operator=(a_from);
m_ow = a_from.m_ow;
m_oh = a_from.m_oh;
m_w = a_from.m_w;
m_h = a_from.m_h;
return *this;
}
public:
unsigned int old_width() const {return m_ow;}
unsigned int old_height() const {return m_oh;}
unsigned int width() const {return m_w;}
unsigned int height() const {return m_h;}
protected:
unsigned int m_ow;
unsigned int m_oh;
unsigned int m_w;
unsigned int m_h;
};
class position_modifiers {
public:
position_modifiers(int a_x,int a_y,bool a_shift_modifier,bool a_control_modifier)
:m_x(a_x)
,m_y(a_y)
,m_shift_modifier(a_shift_modifier)
,m_control_modifier(a_control_modifier)
{}
virtual ~position_modifiers(){}
public:
position_modifiers(const position_modifiers& a_from)
:m_x(a_from.m_x)
,m_y(a_from.m_y)
,m_shift_modifier(a_from.m_shift_modifier)
,m_control_modifier(a_from.m_control_modifier)
{}
position_modifiers& operator=(const position_modifiers& a_from){
m_x = a_from.m_x;
m_y = a_from.m_y;
m_shift_modifier = a_from.m_shift_modifier;
m_control_modifier = a_from.m_control_modifier;
return *this;
}
public:
int x() const {return m_x;}
int y() const {return m_y;}
bool shift_modifier() const {return m_shift_modifier;}
bool control_modifier() const {return m_control_modifier;}
protected:
int m_x;
int m_y;
bool m_shift_modifier;
bool m_control_modifier;
};
class mouse_down_event : public event, public position_modifiers {
typedef event parent;
typedef position_modifiers parent_pos_mod;
public:
static cid id_class() {return parent::id_class()+2;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<mouse_down_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new mouse_down_event(*this);}
public:
mouse_down_event(int a_x,int a_y,bool a_shift_modifier,bool a_control_modifier)
:parent_pos_mod(a_x,a_y,a_shift_modifier,a_control_modifier)
{}
virtual ~mouse_down_event(){}
public:
mouse_down_event(const mouse_down_event& a_from)
:parent(a_from)
,parent_pos_mod(a_from)
{}
mouse_down_event& operator=(const mouse_down_event& a_from){
parent::operator=(a_from);
parent_pos_mod::operator=(a_from);
return *this;
}
};
class mouse_up_event : public event, public position_modifiers {
typedef event parent;
typedef position_modifiers parent_pos_mod;
public:
static cid id_class() {return parent::id_class()+3;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<mouse_up_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new mouse_up_event(*this);}
public:
mouse_up_event(int a_x,int a_y,bool a_shift_modifier,bool a_control_modifier)
:parent_pos_mod(a_x,a_y,a_shift_modifier,a_control_modifier)
{}
virtual ~mouse_up_event(){}
public:
mouse_up_event(const mouse_up_event& a_from)
:parent(a_from)
,parent_pos_mod(a_from)
{}
mouse_up_event& operator=(const mouse_up_event& a_from){
parent::operator=(a_from);
parent_pos_mod::operator=(a_from);
return *this;
}
};
class mouse_move_event : public event, public position_modifiers {
typedef event parent;
typedef position_modifiers parent_pos_mod;
public:
static cid id_class() {return parent::id_class()+4;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<mouse_move_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new mouse_move_event(*this);}
public:
mouse_move_event(int a_x,int a_y,bool a_shift_modifier,bool a_control_modifier,
int a_ox,int a_oy,
bool a_touch) //for sliders.
:parent_pos_mod(a_x,a_y,a_shift_modifier,a_control_modifier)
,m_ox(a_ox)
,m_oy(a_oy)
,m_touch(a_touch)
{}
virtual ~mouse_move_event(){}
public:
mouse_move_event(const mouse_move_event& a_from)
:parent(a_from)
,parent_pos_mod(a_from)
,m_ox(a_from.m_ox)
,m_oy(a_from.m_oy)
,m_touch(a_from.m_touch)
{}
mouse_move_event& operator=(const mouse_move_event& a_from){
parent::operator=(a_from);
parent_pos_mod::operator=(a_from);
m_ox = a_from.m_ox;
m_oy = a_from.m_oy;
m_touch = a_from.m_touch;
return *this;
}
public:
int ox() const {return m_ox;}
int oy() const {return m_oy;}
bool is_touch() const {return m_touch;}
protected:
int m_ox;
int m_oy; //+ = up.
// etc :
bool m_touch;
};
class anim_event : public event {
typedef event parent;
public:
static cid id_class() {return parent::id_class()+5;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<anim_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new anim_event(*this);}
public:
typedef uint64 num_t;
anim_event(num_t a_secs,num_t a_micro_secs)
:m_secs(a_secs),m_micro_secs(a_micro_secs)
,m_some_found(false)
{}
virtual ~anim_event(){}
public:
anim_event(const anim_event& a_from)
:event(a_from)
,m_secs(a_from.m_secs)
,m_micro_secs(a_from.m_micro_secs)
,m_some_found(a_from.m_some_found)
{}
anim_event& operator=(const anim_event& a_from){
event::operator=(a_from);
m_secs = a_from.m_secs;
m_micro_secs = a_from.m_micro_secs;
m_some_found = a_from.m_some_found;
return *this;
}
public:
num_t seconds() const {return m_secs;}
num_t micro_seconds() const {return m_micro_secs;}
void set_some_found(bool a_v) {m_some_found = a_v;}
bool some_found() const {return m_some_found;}
protected:
num_t m_secs;
num_t m_micro_secs;
bool m_some_found;
};
class key_down_event : public event {
typedef event parent;
public:
static cid id_class() {return parent::id_class()+6;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<key_down_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new key_down_event(*this);}
public:
key_down_event(key_code a_key)
:m_key(a_key)
{}
virtual ~key_down_event(){}
public:
key_down_event(const key_down_event& a_from)
:event(a_from)
,m_key(a_from.m_key)
{}
key_down_event& operator=(const key_down_event& a_from){
event::operator=(a_from);
m_key = a_from.m_key;
return *this;
}
public:
key_code key() const {return m_key;}
protected:
key_code m_key;
};
class key_up_event : public event {
typedef event parent;
public:
static cid id_class() {return parent::id_class()+7;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<key_up_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new key_up_event(*this);}
public:
key_up_event(key_code a_key)
:m_key(a_key)
{}
virtual ~key_up_event(){}
public:
key_up_event(const key_up_event& a_from)
:event(a_from)
,m_key(a_from.m_key)
{}
key_up_event& operator=(const key_up_event& a_from){
event::operator=(a_from);
m_key = a_from.m_key;
return *this;
}
public:
key_code key() const {return m_key;}
protected:
key_code m_key;
};
class wheel_rotate_event : public event, public position_modifiers {
typedef event parent;
typedef position_modifiers parent_pos_mod;
public:
static cid id_class() {return parent::id_class()+8;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<wheel_rotate_event>(this,a_class)) return p;
return 0;
}
virtual event* copy() const {return new wheel_rotate_event(*this);}
public:
wheel_rotate_event(int a_angle,int a_x,int a_y,bool a_shift_modifier,bool a_control_modifier)
:parent_pos_mod(a_x,a_y,a_shift_modifier,a_control_modifier)
,m_angle(a_angle)
{}
virtual ~wheel_rotate_event(){}
public:
wheel_rotate_event(const wheel_rotate_event& a_from)
:parent(a_from)
,parent_pos_mod(a_from)
,m_angle(a_from.m_angle)
{}
wheel_rotate_event& operator=(const wheel_rotate_event& a_from){
parent::operator=(a_from);
parent_pos_mod::operator=(a_from);
m_angle = a_from.m_angle;
return *this;
}
public:
int angle() const {return m_angle;}
protected:
int m_angle;
};
template <class FROM,class TO> inline TO* event_cast(FROM& a_o) {return id_cast<FROM,TO>(a_o);}
template <class FROM,class TO> inline const TO* event_cast(const FROM& a_o) {return id_cast<FROM,TO>(a_o);}
inline bool get_event_xy(const sg::event& a_event,int& a_x,int& a_y) {
typedef sg::event evt_t;
typedef sg::mouse_up_event up_evt_t;
typedef sg::mouse_down_event dn_evt_t;
if(const dn_evt_t* devt = event_cast<evt_t,dn_evt_t>(a_event)) {
a_x = devt->x();
a_y = devt->y();
return true;
} else if(const up_evt_t* uevt = event_cast<evt_t,up_evt_t>(a_event)) {
a_x = uevt->x();
a_y = uevt->y();
return true;
}
a_x = 0;
a_y = 0;
return false;
}
}}
#endif