Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import elements.BaseGuiElement;
|
||||
|
||||
export GuiDraggable;
|
||||
|
||||
class GuiDraggable : BaseGuiElement {
|
||||
bool Dragging;
|
||||
bool allowPassthrough;
|
||||
bool btnDown = false;
|
||||
vec2i dragPos;
|
||||
vec2i dragOffset;
|
||||
|
||||
GuiDraggable(IGuiElement@ ParentElement, const recti& Rectangle) {
|
||||
Dragging = false;
|
||||
allowPassthrough = true;
|
||||
super(ParentElement, Rectangle);
|
||||
updateAbsolutePosition();
|
||||
}
|
||||
|
||||
void emitChange() {
|
||||
GuiEvent evt;
|
||||
evt.type = GUI_Changed;
|
||||
@evt.caller = this;
|
||||
onGuiEvent(evt);
|
||||
}
|
||||
|
||||
bool onMouseEvent(const MouseEvent& event, IGuiElement@ source) {
|
||||
if(source is this || allowPassthrough) {
|
||||
switch(event.type) {
|
||||
case MET_Button_Down:
|
||||
if(event.button == 0) {
|
||||
btnDown = true;
|
||||
dragPos = Position.topLeft;
|
||||
dragOffset = mousePos;
|
||||
bringToFront();
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case MET_Moved:
|
||||
if(Dragging) {
|
||||
position = mousePos - dragOffset + dragPos;
|
||||
return true;
|
||||
}
|
||||
else if(btnDown) {
|
||||
if((mousePos - dragOffset).length > 2)
|
||||
Dragging = true;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case MET_Button_Up:
|
||||
if(event.button == 0) {
|
||||
btnDown = false;
|
||||
if(Dragging) {
|
||||
if(Position.topLeft != dragPos)
|
||||
emitChange();
|
||||
Dragging = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return BaseGuiElement::onMouseEvent(event, source);
|
||||
}
|
||||
|
||||
bool onGuiEvent(const GuiEvent& event) {
|
||||
if(event.caller is this) {
|
||||
switch(event.type) {
|
||||
case GUI_Mouse_Left:
|
||||
case GUI_Focus_Lost:
|
||||
if(Dragging)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return BaseGuiElement::onGuiEvent(event);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user