openclonk/src/gui/C4MouseControl.h

172 lines
5.3 KiB
C++

/*
* OpenClonk, http://www.openclonk.org
*
* Copyright (c) 1998-2000, Matthes Bender
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
* Copyright (c) 2009-2016, The OpenClonk Team and contributors
*
* Distributed under the terms of the ISC license; see accompanying file
* "COPYING" for details.
*
* "Clonk" is a registered trademark of Matthes Bender, used with permission.
* See accompanying file "TRADEMARK" for details.
*
* To redistribute this file separately, substitute the full license texts
* for the above references.
*/
/* Mouse input */
#ifndef INC_C4MouseControl
#define INC_C4MouseControl
#include "graphics/C4Facet.h"
#include "lib/C4Rect.h"
#include "object/C4ObjectList.h"
struct ZoomData; // #include "graphics/C4Draw.h"
const int32_t C4MC_Button_None = 0,
C4MC_Button_LeftDown = 1,
C4MC_Button_LeftUp = 2,
C4MC_Button_RightDown = 3,
C4MC_Button_RightUp = 4,
C4MC_Button_LeftDouble = 5,
C4MC_Button_RightDouble = 6,
C4MC_Button_Wheel = 7,
C4MC_Button_MiddleDown = 8,
C4MC_Button_MiddleUp = 9,
C4MC_Button_MiddleDouble= 10,
C4MC_Button_X1Down = 11,
C4MC_Button_X1Up = 12,
C4MC_Button_X1Double = 13,
C4MC_Button_X2Down = 14,
C4MC_Button_X2Up = 15,
C4MC_Button_X2Double = 16;
const int32_t C4MC_DragSensitivity = 5;
const int32_t C4MC_MD_DragSource = 1,
C4MC_MD_DropTarget = 2,
C4MC_MD_NoClick = 4;
const int32_t C4MC_Cursor_Select = 0, // click cursor to select/click stuff in the GUI
C4MC_Cursor_Crosshair = 1, // standard ingame cursor
C4MC_Cursor_DragDrop = 2, // cursor when drag&dropping
C4MC_Cursor_Up = 3, // cursors for scrolling the viewport ...
C4MC_Cursor_Down = 4, // ...
C4MC_Cursor_Left = 5,
C4MC_Cursor_Right = 6,
C4MC_Cursor_UpLeft = 7,
C4MC_Cursor_UpRight = 8,
C4MC_Cursor_DownLeft = 9,
C4MC_Cursor_DownRight = 10,
C4MC_Cursor_Passive = 11, // passive cursor in records and and fog of war and outside viewport
C4MC_Cursor_DropInto = 12; // drop into contents
class C4MouseControl
{
friend class C4Viewport;
public:
C4MouseControl();
~C4MouseControl();
protected:
bool Active;
bool fMouseOwned;
int32_t Player;
C4Player *pPlayer; // valid during Move()
C4Viewport *Viewport; // valid during Move()
int32_t Cursor;
int32_t VpX,VpY; // Pixel coordinates of mouse pos
float ViewX,ViewY; // Game coordinate scrolling offset of viewport
float GameX,GameY; // Game coordinates of mouse pos
float GuiX,GuiY; // GUI coorindates of mouse pos
C4Facet fctViewport, fctViewportGame, fctViewportGUI;
float DownX,DownY; // Game coordinates of mouse-down-pos while dragging
int32_t ScrollSpeed;
int32_t Drag;
bool LeftButtonDown,RightButtonDown,LeftDoubleIgnoreUp;
bool ButtonDownOnSelection;
bool ControlDown;
bool ShiftDown;
bool AltDown;
bool Scrolling;
bool InitCentered;
bool FogOfWar;
bool Visible;
C4ObjectList Selection; //obsolete!
C4Object *DragObject;
C4ID DragID;
C4Def* DragImageDef;
C4Object* DragImageObject;
// Tooltip management
// currently shown caption
StdCopyStrBuf Caption;
// tooltip text that will be shown when the mouse is kept in the tooltip rectangle for some time
StdCopyStrBuf TooltipText;
int32_t CaptionBottomY;
int32_t KeepCaption;
int32_t TimeInTooltipRectangle;
C4Rect ToolTipRectangle;
// Target object
C4Object *TargetObject; // valid during Move()
C4Object *DownTarget;
public:
void Default();
void Clear();
bool Init(int32_t iPlayer);
void Execute();
void HideCursor();
void ShowCursor();
void Draw(C4TargetFacet &cgo, const ZoomData &GameZoom);
void Move(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyFlags, bool fCenter = false);
void DoMoveInput();
bool IsViewport(C4Viewport *pViewport);
void ClearPointers(C4Object *pObj);
void UpdateClip(); // update clipping region for mouse cursor
void SetOwnedMouse(bool fToVal) { fMouseOwned = fToVal; }
bool IsMouseOwned() { return fMouseOwned; }
bool IsActive() { return !!Active; }
bool GetLastCursorPos(int32_t *x_out_gui, int32_t *y_out_gui, int32_t *x_out_game, int32_t *y_out_game) const;
const char *GetCaption();
void SetTooltipText(const StdStrBuf &text);
void SetTooltipRectangle(const C4Rect &rectangle);
protected:
void UpdateFogOfWar();
void RightUpDragNone();
void ButtonUpDragScript();
void LeftUpDragNone();
void DragScript();
void Wheel(DWORD dwFlags);
void RightUp();
void RightDown();
void LeftDouble();
void DragNone();
void LeftUp();
void LeftDown();
void UpdateScrolling();
void UpdateCursorTarget();
int32_t UpdateSingleSelection();
C4Object *GetTargetObject(); // get MouseSelection object at position
bool IsPassive(); // return whether mouse is only used to look around
void ScrollView(float iX, float iY, float ViewWdt, float ViewHgt); // in landscape coordinates
public:
bool IsDragging();
bool IsLeftDown() { return LeftButtonDown; }
int32_t GetPlayer() { return Player; }
};
extern C4MouseControl MouseControl;
#endif