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
|