CMCore/inc/hgl/io/event/MouseEvent.h

119 lines
3.3 KiB
C
Raw Normal View History

2025-06-11 01:03:53 +08:00
#pragma once
2022-01-24 18:56:05 +08:00
#include<hgl/io/event/InputEvent.h>
2025-06-11 01:03:53 +08:00
#include<hgl/math/Vector.h>
namespace hgl::io
2022-01-24 18:56:05 +08:00
{
2025-06-11 01:03:53 +08:00
/**
*
*/
enum class MouseButton
2022-01-24 18:56:05 +08:00
{
2025-06-11 01:03:53 +08:00
None=0,
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
Left,
Mid,
Right,
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
X1,X2,
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
ENUM_CLASS_RANGE(None,X2)
};
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
enum class MouseEventID
{
Move =0,
Pressed,
Released,
DblClicked,
Wheel
};
union MouseEventData
{
uint64 data;
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
struct
2022-01-24 18:56:05 +08:00
{
2025-06-11 01:03:53 +08:00
int16 x,y;
uint8 button;
2022-01-24 18:56:05 +08:00
};
2025-06-11 01:03:53 +08:00
};
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
constexpr size_t MouseEventDataBytes=sizeof(MouseEventData);
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
class MouseEvent:public InputEvent
{
MouseEventData *med;
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
Vector2i position;
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
bool pressed_statues[size_t(MouseButton::RANGE_SIZE)];
2022-01-24 19:29:19 +08:00
2025-06-11 01:03:53 +08:00
public:
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
MouseEvent():InputEvent(InputEventSource::Mouse)
{
med=nullptr;
position.x=0;
position.y=0;;
hgl_zero(pressed_statues);
}
virtual ~MouseEvent()=default;
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
EventProcResult OnEvent(const EventHeader &header,const uint64 data) override
{
if(header.type==InputEventSource::Mouse)
2022-01-24 18:56:05 +08:00
{
2025-06-11 01:03:53 +08:00
med=(MouseEventData *)&data;
if(MouseEventID(header.id)==MouseEventID::Wheel)
{
if(OnWheel (med->x,med->y) )return EventProcResult::Break;
}
else
2022-01-24 18:56:05 +08:00
{
2025-06-11 01:03:53 +08:00
position.x=med->x;
position.y=med->y;
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
switch(MouseEventID(header.id))
2022-01-24 18:56:05 +08:00
{
2025-06-11 01:03:53 +08:00
case MouseEventID::Move: if(OnMove (med->x,med->y) )return EventProcResult::Break;break;
case MouseEventID::Pressed: pressed_statues[med->button]=true;
if(OnPressed (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break;
case MouseEventID::Released: pressed_statues[med->button]=false;
if(OnReleased (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break;
case MouseEventID::DblClicked: if(OnDblClicked (med->x,med->y,MouseButton(med->button)))return EventProcResult::Break;break;
2022-01-24 18:56:05 +08:00
}
}
2025-06-11 01:03:53 +08:00
}
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
if(InputEvent::OnEvent(header,data)==EventProcResult::Break)
return EventProcResult::Break;
2025-06-10 01:31:18 +08:00
2025-06-11 01:03:53 +08:00
return EventProcResult::Continue;
}
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
virtual bool OnMove (int,int){return false;}
virtual bool OnWheel (int,int){return false;}
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
virtual bool OnPressed (int,int,MouseButton){return false;}
virtual bool OnReleased (int,int,MouseButton){return false;}
virtual bool OnDblClicked(int,int,MouseButton){return false;}
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
/**
*
*/
const bool HasPressed(const MouseButton &mb)const
{
if(!RangeCheck(mb))return(false);
2022-01-24 19:29:19 +08:00
2025-06-11 01:03:53 +08:00
return pressed_statues[size_t(mb)];
}
2022-01-24 19:29:19 +08:00
2025-06-11 01:03:53 +08:00
public:
2022-01-24 18:56:05 +08:00
2025-06-11 01:03:53 +08:00
const Vector2i &GetMouseCoord()const{return position;}
};//class MouseEvent
}//namespace hgl::io