OpenClonk
C4MouseControl Class Reference

#include <C4MouseControl.h>

Collaboration diagram for C4MouseControl:
[legend]

Public Member Functions

 C4MouseControl ()
 
 ~C4MouseControl ()
 
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 ()
 
void SetOwnedMouse (bool fToVal)
 
bool IsMouseOwned ()
 
bool IsActive ()
 
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)
 
bool IsDragging ()
 
bool IsLeftDown ()
 
int32_t GetPlayer ()
 

Protected Member Functions

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 ()
 
C4ObjectGetTargetObject ()
 
bool IsPassive ()
 
void ScrollView (float iX, float iY, float ViewWdt, float ViewHgt)
 

Protected Attributes

bool Active
 
bool fMouseOwned
 
int32_t Player
 
C4PlayerpPlayer
 
C4ViewportViewport
 
int32_t Cursor
 
int32_t VpX
 
int32_t VpY
 
float ViewX
 
float ViewY
 
float GameX
 
float GameY
 
float GuiX
 
float GuiY
 
C4Facet fctViewport
 
C4Facet fctViewportGame
 
C4Facet fctViewportGUI
 
float DownX
 
float DownY
 
int32_t ScrollSpeed
 
int32_t Drag
 
bool LeftButtonDown
 
bool RightButtonDown
 
bool LeftDoubleIgnoreUp
 
bool ButtonDownOnSelection
 
bool ControlDown
 
bool ShiftDown
 
bool AltDown
 
bool Scrolling
 
bool InitCentered
 
bool FogOfWar
 
bool Visible
 
C4ObjectList Selection
 
C4ObjectDragObject
 
C4ID DragID
 
C4DefDragImageDef
 
C4ObjectDragImageObject
 
StdCopyStrBuf Caption
 
StdCopyStrBuf TooltipText
 
int32_t CaptionBottomY
 
int32_t KeepCaption
 
int32_t TimeInTooltipRectangle
 
C4Rect ToolTipRectangle
 
C4ObjectTargetObject
 
C4ObjectDownTarget
 

Friends

class C4Viewport
 

Detailed Description

Definition at line 66 of file C4MouseControl.h.

Constructor & Destructor Documentation

◆ C4MouseControl()

C4MouseControl::C4MouseControl ( )

Definition at line 45 of file C4MouseControl.cpp.

46 {
47  Default();
48 }

References Default().

Here is the call graph for this function:

◆ ~C4MouseControl()

C4MouseControl::~C4MouseControl ( )

Definition at line 50 of file C4MouseControl.cpp.

51 {
52  Clear();
53 }

References Clear().

Here is the call graph for this function:

Member Function Documentation

◆ ButtonUpDragScript()

void C4MouseControl::ButtonUpDragScript ( )
protected

Definition at line 753 of file C4MouseControl.cpp.

754 {
755  // Determine drag+drop targets
757  // Finish drag
760  DragImageObject = nullptr;
761  DragImageDef = nullptr;
762  C4Object *DragObject = this->DragObject;
763  this->DragObject = nullptr;
764  C4Object *DropObject = TargetObject;
765  // drag object must exist; drop object is optional
766  if (!DragObject) return;
767  if (DropObject && (~DropObject->GetPropertyInt(P_MouseDrag) & C4MC_MD_DropTarget))
768  DropObject = nullptr;
769  // no commands if player is eliminated or doesn't exist any more
770  C4Player *pPlr = ::Players.Get(Player);
771  if (!pPlr || pPlr->Eliminated) return;
772  // todo: Perform drag/drop validity check
773  // now drag/drop is handled by script
775 }
C4Game Game
Definition: C4Globals.cpp:52
const int32_t C4MC_Drag_None
const int32_t C4MC_MD_DropTarget
@ CID_PlrMouseMove
Definition: C4PacketBase.h:167
C4PlayerList Players
@ P_MouseDrag
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
Definition: C4Control.h:82
static C4ControlPlayerMouse * DragDrop(const C4Player *player, const C4Object *target, const C4Object *drag)
Definition: C4Control.cpp:459
C4Control & Input
Definition: C4Game.h:82
static const C4ID None
Definition: C4Id.h:39
C4Object * TargetObject
C4Def * DragImageDef
C4Object * DragObject
C4Object * DragImageObject
int32_t Eliminated
Definition: C4Player.h:83
C4Player * Get(int iPlayer) const
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:855

References C4Control::Add(), C4MC_Drag_None, C4MC_MD_DropTarget, CID_PlrMouseMove, Drag, C4ControlPlayerMouse::DragDrop(), DragID, DragImageDef, DragImageObject, DragObject, C4Player::Eliminated, Game, C4PlayerList::Get(), C4PropList::GetPropertyInt(), C4Game::Input, C4ID::None, P_MouseDrag, Player, Players, TargetObject, and UpdateCursorTarget().

Referenced by LeftUp(), and RightUp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Clear()

void C4MouseControl::Clear ( )

Definition at line 91 of file C4MouseControl.cpp.

92 {
93  Active = false;
94  Selection.Clear();
95  UpdateClip(); // reset mouse clipping!
96 }
C4ObjectList Selection
virtual void Clear()

References Active, C4ObjectList::Clear(), Selection, and UpdateClip().

Referenced by C4Game::Clear(), Init(), and ~C4MouseControl().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ClearPointers()

void C4MouseControl::ClearPointers ( C4Object pObj)

Definition at line 125 of file C4MouseControl.cpp.

126 {
127  if (TargetObject==pObj) TargetObject=nullptr;
128  if (DownTarget==pObj) DownTarget=nullptr;
129  if (DragObject==pObj)
130  {
131  DragObject=nullptr;
133  DragImageDef=nullptr;
134  DragImageObject=nullptr;
135  }
136  Selection.ClearPointers(pObj);
137 }
C4Object * DownTarget
int ClearPointers(C4Object *obj)

References C4MC_Drag_None, C4ObjectList::ClearPointers(), DownTarget, Drag, DragImageDef, DragImageObject, DragObject, Selection, and TargetObject.

Referenced by C4Game::ClearPointers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Default()

void C4MouseControl::Default ( )

Definition at line 55 of file C4MouseControl.cpp.

56 {
57  Active=false;
59  pPlayer=nullptr;
60  Viewport=nullptr;
61  Cursor=0;
62  Caption.Clear();
64  VpX=VpY=0;
65  DownX=DownY=0;
66  ViewX=ViewY=0;
67  GuiX=GuiY=GameX=GameY=0;
69  LeftDoubleIgnoreUp=false;
71  Visible=true;
72  InitCentered=false;
73  FogOfWar=false;
75  DragObject=nullptr;
76  KeepCaption=0;
79  TargetObject=DownTarget=nullptr;
80  ControlDown=false;
81  ShiftDown=false;
82  AltDown=false;
83  Scrolling=false;
84  ScrollSpeed=10;
85  DragImageDef=nullptr;
86  DragImageObject=nullptr;
87  fMouseOwned = true; // default mouse owned
89 }
const int NO_OWNER
Definition: C4Constants.h:137
void Default()
Definition: C4Facet.cpp:31
C4Viewport * Viewport
C4Facet fctViewport
StdCopyStrBuf Caption
int32_t ScrollSpeed
bool ButtonDownOnSelection
int32_t CaptionBottomY
C4Player * pPlayer
virtual void Default()
void Clear()
Definition: StdBuf.h:466

References Active, AltDown, ButtonDownOnSelection, C4MC_Drag_None, Caption, CaptionBottomY, StdStrBuf::Clear(), ControlDown, Cursor, C4Facet::Default(), C4ObjectList::Default(), DownTarget, DownX, DownY, Drag, DragID, DragImageDef, DragImageObject, DragObject, fctViewport, fMouseOwned, FogOfWar, GameX, GameY, GuiX, GuiY, InitCentered, KeepCaption, LeftButtonDown, LeftDoubleIgnoreUp, NO_OWNER, C4ID::None, Player, pPlayer, RightButtonDown, Scrolling, ScrollSpeed, Selection, ShiftDown, TargetObject, Viewport, ViewX, ViewY, Visible, VpX, and VpY.

Referenced by C4MouseControl(), C4Game::Default(), and Init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoMoveInput()

void C4MouseControl::DoMoveInput ( )

Definition at line 320 of file C4MouseControl.cpp.

321 {
322  // current mouse move to input queue
323  // do sanity checks
324  if (!Active || !fMouseOwned) return;
325  if (!(pPlayer=::Players.Get(Player))) return;
326  if (!pPlayer->ControlSet) return;
328  pPlayer->Control.DoMouseInput(0 /* only 1 mouse supported so far */, C4MC_Button_None, GameX, GameY, GuiX, GuiY, (ControlDown && MK_CONTROL) | (ShiftDown && MK_SHIFT) | (AltDown && MK_ALT));
329 }
const int32_t C4MC_Button_None
bool IsMouseControlAssigned(int32_t mouseevent) const
bool DoMouseInput(uint8_t mouse_id, int32_t mouseevent, float game_x, float game_y, float gui_x, float gui_y, DWORD flags)
C4PlayerControl Control
Definition: C4Player.h:129
class C4PlayerControlAssignmentSet * ControlSet
Definition: C4Player.h:90

References Active, AltDown, C4MC_Button_None, C4Player::Control, ControlDown, C4Player::ControlSet, C4PlayerControl::DoMouseInput(), fMouseOwned, GameX, GameY, C4PlayerList::Get(), GuiX, GuiY, C4PlayerControlAssignmentSet::IsMouseControlAssigned(), Player, Players, pPlayer, and ShiftDown.

Referenced by C4GameControl::PrepareInput().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DragNone()

void C4MouseControl::DragNone ( )
protected

Definition at line 638 of file C4MouseControl.cpp.

639 {
640  // Cursor movement
642  // Update selection
644 
645  // Button down: begin drag
648  {
649  bool fAllowDrag = true;
650  // check if target object allows scripted dragging
651  if (fAllowDrag && DownTarget && (!FogOfWar || (DownTarget->Category & C4D_IgnoreFoW)))
652  {
653  C4Object *drag_image_obj; C4Def * drag_image_def;
654 
655  // Drag only if MD_SOURCE is set and drag image is present
657  DownTarget->GetDragImage(&drag_image_obj, &drag_image_def))
658  {
660 
661  if(drag_image_obj) DragImageObject = drag_image_obj;
662  else DragImageDef = drag_image_def;
663 
665  }
666  }
667 
668  // dragging somewhere unhandled - mark drag process so moving over a draggable object won't start a drag
669  if (Drag == C4MC_Drag_None)
670  {
672  }
673  }
674 }
const int32_t C4D_IgnoreFoW
Definition: C4Def.h:55
const int32_t C4MC_Drag_Unhandled
const int32_t C4MC_Drag_Script
const int32_t C4MC_DragSensitivity
const int32_t C4MC_MD_DragSource
T Abs(T val)
Definition: Standard.h:42
Definition: C4Def.h:99
int32_t UpdateSingleSelection()
int32_t Category
Definition: C4Object.h:111
bool GetDragImage(C4Object **drag_object, C4Def **drag_id) const

References Abs(), C4D_IgnoreFoW, C4MC_Drag_None, C4MC_Drag_Script, C4MC_Drag_Unhandled, C4MC_DragSensitivity, C4MC_MD_DragSource, C4Object::Category, DownTarget, DownX, DownY, Drag, DragImageDef, DragImageObject, DragObject, FogOfWar, GameX, GameY, C4Object::GetDragImage(), C4PropList::GetPropertyInt(), LeftButtonDown, P_MouseDrag, RightButtonDown, UpdateCursorTarget(), and UpdateSingleSelection().

Referenced by Move().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DragScript()

void C4MouseControl::DragScript ( )
protected

Definition at line 723 of file C4MouseControl.cpp.

724 {
725  // script drag should update target and selection so selection highlight on drop target is visible
726  // Cursor movement
728  // Update selection
731 }
const int32_t C4MC_Cursor_DragDrop

References C4MC_Cursor_DragDrop, Cursor, UpdateCursorTarget(), and UpdateSingleSelection().

Referenced by Move().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Draw()

void C4MouseControl::Draw ( C4TargetFacet cgo,
const ZoomData GameZoom 
)

Definition at line 331 of file C4MouseControl.cpp.

332 {
333  int32_t iOffsetX,iOffsetY;
334  float wdt = GfxR->fctMouseCursor.Wdt, hgt = GfxR->fctMouseCursor.Hgt;
335  // Cursor size relative to height - does not matter with current square graphics.
336  float zoom = Config.Graphics.MouseCursorSize / hgt;
337  hgt *= zoom;
338  wdt *= zoom;
339 
340  ZoomData GuiZoom;
341  pDraw->GetZoom(&GuiZoom);
342 
343  // Hidden
344  if (!Visible || !fMouseOwned) return;
345 
346  // Draw selection
347  if (!IsPassive())
348  {
350  }
351 
352  // Draw control
353  switch (Drag)
354  {
355  //------------------------------------------------------------------------------------------
357  // Hotspot offset: Usually, hotspot is in center
358  iOffsetX = wdt/2;
359  iOffsetY = hgt/2;
360  // calculate the hotspot for the scrolling cursors
361  switch (Cursor)
362  {
363  case C4MC_Cursor_Up: iOffsetY += -hgt/2; break;
364  case C4MC_Cursor_Down:iOffsetY += +hgt/2; break;
365  case C4MC_Cursor_Left: iOffsetX += -wdt/2; break;
366  case C4MC_Cursor_Right: iOffsetX += +wdt/2; break;
367  case C4MC_Cursor_UpLeft: iOffsetX += -wdt/2; iOffsetY += -hgt/2; break;
368  case C4MC_Cursor_UpRight: iOffsetX += +wdt/2; iOffsetY += -hgt/2; break;
369  case C4MC_Cursor_DownLeft: iOffsetX += -wdt/2; iOffsetY += +hgt/2; break;
370  case C4MC_Cursor_DownRight: iOffsetX += +wdt/2; iOffsetY += +hgt/2; break;
371  }
372  // Drag image
374  {
375  C4DefGraphics* pGfx;
376  if(DragImageObject)
377  pGfx = DragImageObject->GetGraphics();
378  else
379  pGfx = &DragImageDef->Graphics;
380 
381  // Determine image boundaries
382  float ImageWdt;
383  float ImageHgt;
384  if (pGfx->Type == C4DefGraphics::TYPE_Bitmap)
385  {
387  ImageWdt = Def->PictureRect.Wdt;
388  ImageHgt = Def->PictureRect.Hgt;
389  }
390  else if (pGfx->Type == C4DefGraphics::TYPE_Mesh)
391  {
392  // Note bounding box is in OGRE coordinate system
393  ImageWdt = pGfx->Mesh->GetBoundingBox().y2 - pGfx->Mesh->GetBoundingBox().y1;
394  ImageHgt = pGfx->Mesh->GetBoundingBox().z2 - pGfx->Mesh->GetBoundingBox().z1;
395  }
396  else
397  {
398  ImageWdt = ImageHgt = 1.0f;
399  }
400 
401  // zoom mode: Drag in GUI or Game depending on source object
402  bool fIsGameZoom = true;
404  fIsGameZoom = false;
405  // drag image in game zoom
406  float XDraw, YDraw, ZoomDraw;
407  if (fIsGameZoom)
408  {
409  pDraw->SetZoom(GameZoom);
410  XDraw = GameX; YDraw = GameY;
411  ZoomDraw = 1.0f;
412  }
413  else
414  {
415  ZoomDraw = std::min(64.0f / ImageWdt, 64.0f / ImageHgt);
416  XDraw = GuiX; YDraw = GuiY;
417  }
418 
419  iOffsetX=int(ZoomDraw*ImageWdt/2);
420  iOffsetY=int(ZoomDraw*ImageHgt/2);
421 
422  C4TargetFacet ccgo;
423  ccgo.Set(cgo.Surface, XDraw + cgo.X - iOffsetX, YDraw + cgo.Y - iOffsetY, float(ImageWdt)*ZoomDraw, float(ImageHgt)*ZoomDraw);
424 
425  if (DragImageObject)
426  {
427  uint32_t ColorMod = DragImageObject->ColorMod;
428  uint32_t BlitMode = DragImageObject->BlitMode;
429  DragImageObject->ColorMod = (Drag == C4MC_Drag_Script) ? 0x7fffffff : (/*DragImagePhase*/false ? 0x8f7f0000 : 0x1f007f00);
431 
432  DragImageObject->DrawPicture(ccgo, false, nullptr);
433 
434  DragImageObject->ColorMod = ColorMod;
435  DragImageObject->BlitMode = BlitMode;
436  }
437  else
438  {
439  // draw in special modulation mode
441  // draw DragImage in red or green, according to the phase to be used
442  pDraw->ActivateBlitModulation((Drag == C4MC_Drag_Script) ? 0x7fffffff : (/*DragImagePhase*/false ? 0x8f7f0000 : 0x1f007f00));
443 
444  DragImageDef->Draw(ccgo, false, pPlayer ? pPlayer->ColorDw : 0xff0000ff, nullptr, 0, 0, nullptr);
445 
446  // reset color
448  pDraw->SetBlitMode(0);
449  }
450 
451  if (fIsGameZoom) pDraw->SetZoom(GuiZoom);
452  // reset cursor hotspot offset for script drawing
453  iOffsetX = wdt/2;
454  iOffsetY = hgt/2;
455  }
456  // Cursor
458  {
459  GfxR->fctMouseCursor.DrawX(cgo.Surface, cgo.X+GuiX-iOffsetX, cgo.Y+GuiY-iOffsetY, wdt, hgt, Cursor);
460  }
461  break;
462  //------------------------------------------------------------------------------------------
463  }
464 
465  // Draw caption
466  if (Caption && ::pGUI)
467  {
468  C4TargetFacet cgoTip;
469  cgoTip = static_cast<const C4Facet &>(cgo);
470  C4GUI::Screen::DrawToolTip(Caption.getData(), cgoTip, cgo.X+GuiX, cgo.Y+GuiY);
471  }
472 
473 }
C4Config Config
Definition: C4Config.cpp:930
const int32_t C4D_Foreground
Definition: C4Def.h:53
C4Draw * pDraw
Definition: C4Draw.cpp:42
#define GfxR
C4GUIScreen * pGUI
Definition: C4Gui.cpp:1191
const int32_t C4MC_Cursor_Left
const int32_t C4MC_Cursor_Up
const int32_t C4MC_Cursor_DownRight
const int32_t C4MC_Cursor_DownLeft
const int32_t C4MC_Cursor_Down
const int32_t C4MC_Cursor_UpRight
const int32_t C4MC_Cursor_Right
const int32_t C4MC_Cursor_UpLeft
#define C4GFXBLIT_MOD2
Definition: C4Surface.h:27
int32_t MouseCursorSize
Definition: C4Config.h:118
C4ConfigGraphics Graphics
Definition: C4Config.h:257
GraphicsType Type
Definition: C4DefGraphics.h:48
C4DefGraphics Graphics
Definition: C4Def.h:191
C4Rect PictureRect
Definition: C4Def.h:107
void Draw(C4Facet &cgo, bool fSelected=false, DWORD iColor=0, C4Object *pObj=nullptr, int32_t iPhaseX=0, int32_t iPhaseY=0, C4DrawTransform *trans=nullptr, const char *graphicsName=nullptr)
Definition: C4Def.cpp:607
void GetZoom(ZoomData *r)
Definition: C4Draw.h:197
void SetBlitMode(DWORD dwBlitMode)
Definition: C4Draw.h:191
void DeactivateBlitModulation()
Definition: C4Draw.h:189
void SetZoom(float X, float Y, float Zoom)
Definition: C4Draw.cpp:773
void ActivateBlitModulation(DWORD dwWithClr)
Definition: C4Draw.h:188
C4Surface * Surface
Definition: C4Facet.h:117
float Y
Definition: C4Facet.h:118
float X
Definition: C4Facet.h:118
static void DrawToolTip(const char *szTip, C4TargetFacet &cgo, float guix, float guiy)
Definition: C4Gui.cpp:1009
void DrawPicture(C4Facet &cgo, bool fSelected=false, C4DrawTransform *transform=nullptr)
uint32_t BlitMode
Definition: C4Object.h:161
uint32_t ColorMod
Definition: C4Object.h:160
C4Def * Def
Definition: C4Object.h:141
C4DefGraphics * GetGraphics() const
Definition: C4Object.h:339
void DrawSelectMark(C4TargetFacet &cgo) const
uint32_t ColorDw
Definition: C4Player.h:89
int32_t Hgt
Definition: C4Rect.h:30
int32_t Wdt
Definition: C4Rect.h:30
void Set(const C4Facet &cpy)
Definition: C4Facet.h:182
const char * getData() const
Definition: StdBuf.h:442

References C4Draw::ActivateBlitModulation(), C4Object::BlitMode, C4D_Foreground, C4GFXBLIT_MOD2, C4MC_Cursor_Down, C4MC_Cursor_DownLeft, C4MC_Cursor_DownRight, C4MC_Cursor_Left, C4MC_Cursor_Right, C4MC_Cursor_Up, C4MC_Cursor_UpLeft, C4MC_Cursor_UpRight, C4MC_Drag_None, C4MC_Drag_Script, C4MC_Drag_Unhandled, Caption, C4Object::Category, C4Player::ColorDw, C4Object::ColorMod, Config, Cursor, C4Draw::DeactivateBlitModulation(), C4Object::Def, Drag, DragImageDef, DragImageObject, DragObject, C4Def::Draw(), C4Object::DrawPicture(), C4ObjectList::DrawSelectMark(), C4GUI::Screen::DrawToolTip(), fMouseOwned, GameX, GameY, StdStrBuf::getData(), C4Object::GetGraphics(), C4Draw::GetZoom(), GfxR, C4Config::Graphics, C4Def::Graphics, GuiX, GuiY, C4Rect::Hgt, IsPassive(), C4ConfigGraphics::MouseCursorSize, pDraw, pGUI, C4Def::PictureRect, pPlayer, Selection, C4TargetFacet::Set(), C4Draw::SetBlitMode(), C4Draw::SetZoom(), C4Facet::Surface, C4DefGraphics::Type, C4DefGraphics::TYPE_Bitmap, C4DefGraphics::TYPE_Mesh, Visible, C4Rect::Wdt, C4Facet::X, and C4Facet::Y.

Referenced by C4Viewport::DrawOverlay().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Execute()

void C4MouseControl::Execute ( )

Definition at line 98 of file C4MouseControl.cpp.

99 {
100 
101  if (!Active || !fMouseOwned) return;
102 
103  // Scrolling/continuous update
104  if (Scrolling || !::Game.iTick5)
105  {
106  WORD wKeyState=0;
107  if (ControlDown) wKeyState|=MK_CONTROL;
108  if (ShiftDown) wKeyState|=MK_SHIFT;
109  if (AltDown) wKeyState|=MK_ALT;
110  Move(C4MC_Button_None, VpX, VpY, wKeyState);
111  }
112 }
uint16_t WORD
int32_t iTick5
Definition: C4Game.h:130
void Move(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyFlags, bool fCenter=false)

References Active, AltDown, C4MC_Button_None, ControlDown, fMouseOwned, Game, C4Game::iTick5, Move(), Scrolling, ShiftDown, VpX, and VpY.

Referenced by C4Game::Execute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetCaption()

const char * C4MouseControl::GetCaption ( )

Definition at line 819 of file C4MouseControl.cpp.

820 {
821  return Caption.getData();
822 }

References Caption, and StdStrBuf::getData().

Referenced by C4EditCursor::UpdateStatusBar().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetLastCursorPos()

bool C4MouseControl::GetLastCursorPos ( int32_t *  x_out_gui,
int32_t *  y_out_gui,
int32_t *  x_out_game,
int32_t *  y_out_game 
) const

Definition at line 870 of file C4MouseControl.cpp.

871 {
872  // safety
873  if (!Active || !fMouseOwned) return false;
874  // OK; assign last known pos
875  *x_out_gui = GuiX; *y_out_gui = GuiY;
876  *x_out_game = GameX; *y_out_game = GameY;
877  return true;
878 }

References Active, fMouseOwned, GameX, GameY, GuiX, and GuiY.

◆ GetPlayer()

int32_t C4MouseControl::GetPlayer ( )
inline

Definition at line 167 of file C4MouseControl.h.

167 { return Player; }

References Player.

Referenced by C4ObjectMenu::IsReadOnly(), C4ScriptGuiWindow::MouseEnter(), C4MenuItem::MouseEnter(), C4MenuItem::MouseInput(), C4ScriptGuiWindow::MouseInput(), C4ScriptGuiWindow::MouseLeave(), C4ObjectMenu::OnUserClose(), and C4ScriptGuiWindow::ProcessMouseInput().

Here is the caller graph for this function:

◆ GetTargetObject()

C4Object * C4MouseControl::GetTargetObject ( )
protected

Definition at line 838 of file C4MouseControl.cpp.

839 {
840  // find object
841  // gui object position currently wrong...will fall apart once GUIZoom is activated
843  if (!pObj) return nullptr;
844  return pObj;
845 }
const int32_t C4D_MouseSelect
Definition: C4Def.h:52
C4Object * FindVisObject(float x, float y, int32_t player_nr, const C4Facet &viewport_game, const C4Facet &viewport_gui, float game_x, float game_y, DWORD category, float gui_x, float gui_y)
Definition: C4Game.cpp:1536
C4Facet fctViewportGame
C4Facet fctViewportGUI

References C4D_MouseSelect, fctViewportGame, fctViewportGUI, C4Game::FindVisObject(), Game, GameX, GameY, GuiX, GuiY, Player, ViewX, ViewY, C4Facet::X, and C4Facet::Y.

Referenced by UpdateCursorTarget().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HideCursor()

void C4MouseControl::HideCursor ( )

Definition at line 814 of file C4MouseControl.cpp.

815 {
816  Visible=false;
817 }

References Visible.

Referenced by C4EditCursor::SetMode().

Here is the caller graph for this function:

◆ Init()

bool C4MouseControl::Init ( int32_t  iPlayer)

Definition at line 114 of file C4MouseControl.cpp.

115 {
116  Clear();
117  Default();
118  Active = true;
119  Player = iPlayer;
120  InitCentered = false;
121  UpdateClip();
122  return true;
123 }

References Active, Clear(), Default(), InitCentered, Player, and UpdateClip().

Referenced by C4FullScreen::ViewportCheck().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsActive()

bool C4MouseControl::IsActive ( )
inline

Definition at line 138 of file C4MouseControl.h.

138 { return !!Active; }

References Active.

Referenced by C4GUI::Screen::MouseMove().

Here is the caller graph for this function:

◆ IsDragging()

bool C4MouseControl::IsDragging ( )

Definition at line 865 of file C4MouseControl.cpp.

866 {
867  return Active && Drag == C4MC_Drag_Script;
868 }

References Active, C4MC_Drag_Script, and Drag.

Referenced by C4Viewport::DrawMenu(), and C4GUI::Screen::MouseMove().

Here is the caller graph for this function:

◆ IsLeftDown()

bool C4MouseControl::IsLeftDown ( )
inline

Definition at line 166 of file C4MouseControl.h.

166 { return LeftButtonDown; }

References LeftButtonDown.

Referenced by C4ScriptGuiWindow::ProcessMouseInput().

Here is the caller graph for this function:

◆ IsMouseOwned()

bool C4MouseControl::IsMouseOwned ( )
inline

Definition at line 137 of file C4MouseControl.h.

137 { return fMouseOwned; }

References fMouseOwned.

Referenced by C4GUI::Screen::SetMouseInGUI().

Here is the caller graph for this function:

◆ IsPassive()

bool C4MouseControl::IsPassive ( )
protected

Definition at line 847 of file C4MouseControl.cpp.

848 {
850 }
C4GameControl Control
bool isReplay() const
Definition: C4GameControl.h:98

References Control, C4GameControl::isReplay(), NO_OWNER, and Player.

Referenced by Draw(), LeftUpDragNone(), Move(), RightUpDragNone(), and UpdateCursorTarget().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsViewport()

bool C4MouseControl::IsViewport ( C4Viewport pViewport)

Definition at line 139 of file C4MouseControl.cpp.

140 {
141  return (Viewport==pViewport);
142 }

References Viewport.

Referenced by C4Viewport::DrawMenu(), C4Viewport::DrawOverlay(), and C4ViewportList::MouseMoveToViewport().

Here is the caller graph for this function:

◆ LeftDouble()

void C4MouseControl::LeftDouble ( )
protected

Definition at line 676 of file C4MouseControl.cpp.

677 {
678  // Update status flag
679  LeftButtonDown=false;
680  // Set ignore flag for next left up
681  LeftDoubleIgnoreUp=true;
682  // Evaluate left double by drag status (can only be C4MC_Drag_None really)
683  switch (Drag)
684  {
685  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
686  case C4MC_Drag_None:
687  // Double left click (might be on a target)
688  break;
689  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
690  }
691 }

References C4MC_Drag_None, Drag, LeftButtonDown, and LeftDoubleIgnoreUp.

Referenced by Move().

Here is the caller graph for this function:

◆ LeftDown()

void C4MouseControl::LeftDown ( )
protected

Definition at line 604 of file C4MouseControl.cpp.

605 {
606  // Set flag
607  LeftButtonDown=true;
608  // Store down values (same MoveRightDown -> use StoreDown)
611 }

References DownTarget, DownX, DownY, GameX, GameY, LeftButtonDown, and TargetObject.

Referenced by Move().

Here is the caller graph for this function:

◆ LeftUp()

void C4MouseControl::LeftUp ( )
protected

Definition at line 613 of file C4MouseControl.cpp.

614 {
615  // Ignore left up after double click
616  if (LeftDoubleIgnoreUp)
617  {
618  LeftDoubleIgnoreUp=false;
619  }
620  else
621  {
622  // Evaluate by drag status
623  switch (Drag)
624  {
625  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
626  case C4MC_Drag_Unhandled: // nobreak
627  case C4MC_Drag_None: LeftUpDragNone(); break;
628  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
629  case C4MC_Drag_Script: ButtonUpDragScript(); break;
630  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
631  }
632  }
633  // Update status flag
634  LeftButtonDown=false;
635  if(!RightButtonDown) DownTarget = nullptr;
636 }

References ButtonUpDragScript(), C4MC_Drag_None, C4MC_Drag_Script, C4MC_Drag_Unhandled, DownTarget, Drag, LeftButtonDown, LeftDoubleIgnoreUp, LeftUpDragNone(), and RightButtonDown.

Referenced by Move().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ LeftUpDragNone()

void C4MouseControl::LeftUpDragNone ( )
protected

Definition at line 733 of file C4MouseControl.cpp.

734 {
735  // might be in Drag_Unknown
737  // Single left click (might be on a target)
738  switch (Cursor)
739  {
740  case C4MC_Cursor_Select:
741  // Object selection to control queue
742  if (!IsPassive() && Selection.GetObject() == DownTarget)
744  break;
745  default:
746  // done in script
747  break;
748  }
749  // Clear selection
750  Selection.Clear();
751 }
const int32_t C4MC_Cursor_Select
@ CID_PlrSelect
Definition: C4PacketBase.h:162
C4Object * GetObject(int index=0) const

References C4Control::Add(), C4MC_Cursor_Select, C4MC_Drag_None, CID_PlrSelect, C4ObjectList::Clear(), Cursor, DownTarget, Drag, Game, C4ObjectList::GetObject(), C4Game::Input, IsPassive(), Player, and Selection.

Referenced by LeftUp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Move()

void C4MouseControl::Move ( int32_t  iButton,
int32_t  iX,
int32_t  iY,
DWORD  dwKeyFlags,
bool  fCenter = false 
)

Definition at line 175 of file C4MouseControl.cpp.

176 {
177  // Control state
178  ControlDown=false; if (dwKeyFlags & MK_CONTROL) ControlDown=true;
179  ShiftDown=false; if (dwKeyFlags & MK_SHIFT) ShiftDown=true;
180  AltDown=false; if(dwKeyFlags & MK_ALT) AltDown=true;
181  // Active
182  if (!Active || !fMouseOwned) return;
183  // Execute caption
184  if (KeepCaption) KeepCaption--; else { Caption.Clear(); CaptionBottomY=0; }
185  // Check player
186  if (Player>NO_OWNER)
187  {
189  if (!pPlayer) { Active=false; return; }
190  }
191  else
192  pPlayer = nullptr;
193  // Check viewport
194  if (!(Viewport=::Viewports.GetViewport(Player))) return;
195  // get view position
196  C4Rect rcViewport = Viewport->GetOutputRect();
197  fctViewport.Set(nullptr, rcViewport.x, rcViewport.y, rcViewport.Wdt, rcViewport.Hgt);
201  // First time viewport attachment: center mouse
202 #ifdef USE_WIN32_WINDOWS
203  if (!InitCentered || fCenter)
204  {
205  iX = Viewport->ViewWdt/2;
206  iY = Viewport->ViewHgt/2;
207  if (!Application.isEditor)
208  {
209  int32_t iMidX = Viewport->OutX + iX;
210  int32_t iMidY = Viewport->OutY + iY;
211  RECT rtWindow;
212  if (GetWindowRect(Application.pWindow->hWindow, &rtWindow))
213  {
214  iMidX += rtWindow.left; iMidY += rtWindow.top;
215  }
216  SetCursorPos(iMidX, iMidY);
217  }
218  InitCentered = true;
219  }
220 #else
221  if (!InitCentered || fCenter)
222  {
223  iX = Viewport->ViewWdt/2;
224  iY = Viewport->ViewHgt/2;
225  InitCentered = true;
226  }
227 #endif
228  // passive mode: scrolling and player buttons only
229  if (IsPassive())
230  {
231  if (iButton != C4MC_Button_Wheel)
232  {
233  VpX=iX; VpY=iY;
235  GuiX=float(VpX)/Viewport->GetGUIZoom(); GuiY=float(VpY)/Viewport->GetGUIZoom();
236  }
237  UpdateScrolling();
238  if (iButton == C4MC_Button_LeftDown) LeftDown();
239  else if (iButton == C4MC_Button_LeftUp) LeftUp();
240  else UpdateCursorTarget();
241  return;
242  }
243 
244  if (iButton != C4MC_Button_Wheel)
245  {
246  // Position
247  VpX=iX; VpY=iY;
249  GuiX=float(VpX)/Viewport->GetGUIZoom(); GuiY=float(VpY)/Viewport->GetGUIZoom();
250  // Scrolling
251  UpdateScrolling();
252  // Fog of war
253  UpdateFogOfWar();
254 
255  // Blocked by fog of war: evaluate button up, dragging and region controls only
256  if (FogOfWar && Drag == C4MC_Drag_None)
257  {
258  // Left button up
259  if (iButton==C4MC_Button_LeftUp)
260  {
261  LeftButtonDown=false;
262  // End any drag
264  }
265  // Right button up
266  if (iButton==C4MC_Button_RightUp)
267  {
268  RightButtonDown=false;
269  }
270  }
271  }
272 
273  // Move execution by button/drag status
274  switch (iButton)
275  {
276  //------------------------------------------------------------------------------------------
277  case C4MC_Button_None:
278  switch (Drag)
279  {
280  case C4MC_Drag_Unhandled: break; // nothing to do
281  case C4MC_Drag_None: DragNone(); break;
282  case C4MC_Drag_Script: DragScript(); break;
283  }
284  break;
285  //------------------------------------------------------------------------------------------
286  case C4MC_Button_LeftDown: LeftDown(); break;
287  //------------------------------------------------------------------------------------------
288  case C4MC_Button_LeftUp: LeftUp(); break;
289  //------------------------------------------------------------------------------------------
290  case C4MC_Button_LeftDouble: LeftDouble(); break;
291  //------------------------------------------------------------------------------------------
292  case C4MC_Button_RightDown: RightDown(); break;
293  //------------------------------------------------------------------------------------------
294  case C4MC_Button_RightUp: RightUp(); break;
295  //------------------------------------------------------------------------------------------
296  case C4MC_Button_Wheel: Wheel(dwKeyFlags); break;
297  }
298 
299  // are custom menus active?
300  bool menuProcessed = false;
301  if (pPlayer)
302  // adjust by viewport X/Y because the GUI windows calculate their positions (and thus check input) based on that
303  menuProcessed = ::Game.ScriptGuiRoot->MouseInput(iButton, iX, iY, dwKeyFlags);
304 
305  if (menuProcessed)
307 
308  // if not caught by a menu
309  if (!menuProcessed)
310  // script handling of mouse control for everything but regular movement (which is sent at control frame intervals only)
311  if (iButton != C4MC_Button_None)
312  // not if blocked by selection object
313  if (!TargetObject)
314  // safety (can't really happen in !IsPassive, but w/e
315  if (pPlayer && pPlayer->ControlSet)
316  if (!menuProcessed && pPlayer->ControlSet->IsMouseControlAssigned(iButton))
317  pPlayer->Control.DoMouseInput(0 /* only 1 mouse supported so far */, iButton, GameX, GameY, GuiX, GuiY, dwKeyFlags);
318 }
C4Application Application
Definition: C4Globals.cpp:44
const int32_t C4MC_Button_RightDown
const int32_t C4MC_Button_RightUp
const int32_t C4MC_Button_LeftUp
const int32_t C4MC_Button_LeftDown
const int32_t C4MC_Button_LeftDouble
const int32_t C4MC_Button_Wheel
C4ViewportList Viewports
C4Window * pWindow
Definition: C4App.h:80
void Set(C4Surface &rSfc)
Definition: C4Facet.cpp:459
std::unique_ptr< C4ScriptGuiWindow > ScriptGuiRoot
Definition: C4Game.h:234
void Wheel(DWORD dwFlags)
Definition: C4Rect.h:28
int32_t y
Definition: C4Rect.h:30
int32_t x
Definition: C4Rect.h:30
float Zoom
Definition: C4Viewport.h:104
C4Rect GetOutputRect()
Definition: C4Viewport.h:67
C4TargetFacet last_gui_draw_cgo
Definition: C4Viewport.h:44
int32_t ViewWdt
Definition: C4Viewport.h:36
float GetViewY()
Definition: C4Viewport.h:78
int32_t OutY
Definition: C4Viewport.h:110
int32_t OutX
Definition: C4Viewport.h:110
int32_t ViewHgt
Definition: C4Viewport.h:37
C4TargetFacet last_game_draw_cgo
Definition: C4Viewport.h:43
float GetGUIZoom() const
Definition: C4Viewport.h:50
float GetViewX()
Definition: C4Viewport.h:76
C4Viewport * GetViewport(int32_t player_nr, C4Viewport *prev=nullptr)

References Active, AltDown, Application, C4MC_Button_LeftDouble, C4MC_Button_LeftDown, C4MC_Button_LeftUp, C4MC_Button_None, C4MC_Button_RightDown, C4MC_Button_RightUp, C4MC_Button_Wheel, C4MC_Cursor_Select, C4MC_Drag_None, C4MC_Drag_Script, C4MC_Drag_Unhandled, Caption, CaptionBottomY, StdStrBuf::Clear(), C4Player::Control, ControlDown, C4Player::ControlSet, Cursor, C4PlayerControl::DoMouseInput(), Drag, DragNone(), DragScript(), fctViewport, fctViewportGame, fctViewportGUI, fMouseOwned, FogOfWar, Game, GameX, GameY, C4PlayerList::Get(), C4Viewport::GetGUIZoom(), C4Viewport::GetOutputRect(), C4ViewportList::GetViewport(), C4Viewport::GetViewX(), C4Viewport::GetViewY(), GuiX, GuiY, C4Rect::Hgt, InitCentered, C4Application::isEditor, C4PlayerControlAssignmentSet::IsMouseControlAssigned(), IsPassive(), KeepCaption, C4Viewport::last_game_draw_cgo, C4Viewport::last_gui_draw_cgo, LeftButtonDown, LeftDouble(), LeftDown(), LeftUp(), NO_OWNER, C4Viewport::OutX, C4Viewport::OutY, Player, Players, pPlayer, C4AbstractApp::pWindow, RightButtonDown, RightDown(), RightUp(), C4Game::ScriptGuiRoot, C4Facet::Set(), ShiftDown, TargetObject, UpdateCursorTarget(), UpdateFogOfWar(), UpdateScrolling(), C4Viewport::ViewHgt, Viewport, Viewports, C4Viewport::ViewWdt, ViewX, ViewY, VpX, VpY, C4Rect::Wdt, Wheel(), C4Rect::x, C4Rect::y, and C4Viewport::Zoom.

Referenced by Execute(), and C4ViewportList::MouseMoveToViewport().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RightDown()

void C4MouseControl::RightDown ( )
protected

Definition at line 693 of file C4MouseControl.cpp.

694 {
695  // Update status flag
696  RightButtonDown=true;
697  // Store down values (same MoveLeftDown -> use StoreDown)
700 }

References DownTarget, DownX, DownY, GameX, GameY, RightButtonDown, and TargetObject.

Referenced by Move().

Here is the caller graph for this function:

◆ RightUp()

void C4MouseControl::RightUp ( )
protected

Definition at line 702 of file C4MouseControl.cpp.

703 {
704  // Evaluate by drag status
705  switch (Drag)
706  {
707  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
708  case C4MC_Drag_Unhandled: // nobreak
709  case C4MC_Drag_None: RightUpDragNone(); break;
710  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
711  case C4MC_Drag_Script: ButtonUpDragScript(); break;
712  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
713  }
714  // Update status flag
715  RightButtonDown=false;
716  if(!LeftButtonDown) DownTarget = nullptr;
717 }

References ButtonUpDragScript(), C4MC_Drag_None, C4MC_Drag_Script, C4MC_Drag_Unhandled, DownTarget, Drag, LeftButtonDown, RightButtonDown, and RightUpDragNone().

Referenced by Move().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RightUpDragNone()

void C4MouseControl::RightUpDragNone ( )
protected

Definition at line 777 of file C4MouseControl.cpp.

778 {
779 
780  // might be in Drag_Unknown
782 
783  // Alternative object selection
786 
787  // TODO: Evaluate right click
788 
789 }

References C4Control::Add(), C4MC_Cursor_Select, C4MC_Drag_None, CID_PlrSelect, Cursor, DownTarget, Drag, Game, C4ObjectList::GetObject(), C4Game::Input, IsPassive(), Player, and Selection.

Referenced by RightUp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ScrollView()

void C4MouseControl::ScrollView ( float  iX,
float  iY,
float  ViewWdt,
float  ViewHgt 
)
protected

Definition at line 852 of file C4MouseControl.cpp.

853 {
854  // player assigned: scroll player view
855  if (pPlayer)
856  pPlayer->ScrollView(iX, iY, ViewWdt, ViewHgt);
857  else if (Viewport)
858  {
859  // no player: Scroll fullscreen viewport
860  Viewport->ScrollView(iX, iY);
861  }
862 
863 }
void ScrollView(float iX, float iY, float ViewWdt, float ViewHgt)
Definition: C4Player.cpp:1364
void ScrollView(float by_x, float by_y)
Definition: C4Viewport.cpp:882

References pPlayer, C4Viewport::ScrollView(), C4Player::ScrollView(), and Viewport.

Referenced by UpdateScrolling().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetOwnedMouse()

void C4MouseControl::SetOwnedMouse ( bool  fToVal)
inline

Definition at line 136 of file C4MouseControl.h.

136 { fMouseOwned = fToVal; }

References fMouseOwned.

Referenced by C4GUI::Screen::SetMouseInGUI().

Here is the caller graph for this function:

◆ SetTooltipRectangle()

void C4MouseControl::SetTooltipRectangle ( const C4Rect rectangle)

Definition at line 824 of file C4MouseControl.cpp.

825 {
826  // Set the tooltip rectangle slightly larger than originally requested.
827  // The tooltip will be removed when the cursor leaves the rectangle, so make sure that the tooltip is not already disabled when the cursor moves to the border-pixel of the GUI item
828  // in case the GUI item uses a different check for bounds (< vs <=) than the tooltip rectangle.
829  ToolTipRectangle = C4Rect(rectangle.x - 2, rectangle.y - 2, rectangle.Wdt + 4, rectangle.Hgt + 4);
831 }
C4Rect ToolTipRectangle
int32_t TimeInTooltipRectangle

References C4Rect::Hgt, TimeInTooltipRectangle, ToolTipRectangle, C4Rect::Wdt, C4Rect::x, and C4Rect::y.

Referenced by C4ScriptGuiWindow::OnMouseIn(), and UpdateCursorTarget().

Here is the caller graph for this function:

◆ SetTooltipText()

void C4MouseControl::SetTooltipText ( const StdStrBuf text)

Definition at line 833 of file C4MouseControl.cpp.

834 {
835  TooltipText = text;
836 }
StdCopyStrBuf TooltipText

References C4ScriptGuiWindowPropertyName::text, and TooltipText.

Referenced by C4ScriptGuiWindow::OnMouseIn(), and UpdateCursorTarget().

Here is the caller graph for this function:

◆ ShowCursor()

void C4MouseControl::ShowCursor ( )

Definition at line 809 of file C4MouseControl.cpp.

810 {
811  Visible=true;
812 }

References Visible.

Referenced by C4EditCursor::SetMode().

Here is the caller graph for this function:

◆ UpdateClip()

void C4MouseControl::UpdateClip ( )

Definition at line 144 of file C4MouseControl.cpp.

145 {
146 #ifdef _DEBUG
147  // never in debug
148  return;
149 #endif
150 #ifdef USE_WIN32_WINDOWS
151  // fullscreen only
152  if (Application.isEditor) return;
153  // application or mouse control not active? remove any clips
154  if (!Active || !Application.Active || ::pGUI->HasMouseFocus()) { ClipCursor(nullptr); return; }
155  // get controlled viewport
157  if (!pVP) { ClipCursor(nullptr); return; }
158  // adjust size by viewport size
159  RECT vpRct;
160  vpRct.left=pVP->OutX; vpRct.top=pVP->OutY; vpRct.right=pVP->OutX+pVP->ViewWdt; vpRct.bottom=pVP->OutY+pVP->ViewHgt;
161  // adjust by window pos
162  RECT rtWindow;
163  if (GetWindowRect(FullScreen.hWindow, &rtWindow))
164  {
165  vpRct.left += rtWindow.left; vpRct.top += rtWindow.top;
166  vpRct.right += rtWindow.left; vpRct.bottom+= rtWindow.top;
167  }
168  ClipCursor(&vpRct);
169  // and inform GUI
170  ::pGUI->SetPreferredDlgRect(C4Rect(pVP->OutX, pVP->OutY, pVP->ViewWdt, pVP->ViewHgt));
171 #endif
172  //StdWindow manages this.
173 }
C4FullScreen FullScreen
Definition: C4Globals.cpp:46
bool Active
Definition: C4App.h:63
void SetPreferredDlgRect(const C4Rect &rtNewPref)
Definition: C4Gui.h:2651
bool HasMouseFocus()
Definition: C4Gui.h:2678

References Active, C4AbstractApp::Active, Application, FullScreen, C4ViewportList::GetViewport(), C4GUI::Screen::HasMouseFocus(), C4Application::isEditor, C4Viewport::OutX, C4Viewport::OutY, pGUI, Player, C4GUI::Screen::SetPreferredDlgRect(), C4Viewport::ViewHgt, Viewports, and C4Viewport::ViewWdt.

Referenced by Clear(), Init(), C4Viewport::SetOutputSize(), and C4GUI::Screen::UpdateMouseFocus().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateCursorTarget()

void C4MouseControl::UpdateCursorTarget ( )
protected

Definition at line 475 of file C4MouseControl.cpp.

476 {
477  C4Object* OldTargetObject = TargetObject;
478 
479  if (Scrolling)
480  {
481  // Scrolling: no other target
482  TargetObject=nullptr;
483  }
484  else
485  {
486  // Target object
489 
490  // Movement
492 
493  // Target action
494  if (TargetObject && !IsPassive())
495  {
496  // default cursor for object; also set if not in FoW
498 
499  // select custom region. Can select an object if it does not have the MD_NoClick
500  // flag set. If we are currently dragging then selection depends on it being a drop target.
501  bool CanSelect;
502  if(Drag == C4MC_Drag_Script)
504  else
506 
507  if ( (TargetObject->Category & C4D_MouseSelect) && CanSelect)
509  else
510  TargetObject = nullptr;
511  }
512 
513  // passive cursor
514  if (IsPassive())
516 
517  // update tooltip information
518  if (OldTargetObject != TargetObject)
519  {
520  C4String *newTooltip = nullptr;
522  {
523  float objX, objY;
525  objX += TargetObject->Shape.x;
526  objY += TargetObject->Shape.y - TargetObject->addtop();
528  SetTooltipText(StdStrBuf(newTooltip->GetCStr()));
529  }
530  else
531  {
532  SetTooltipRectangle(C4Rect(0, 0, 0, 0));
533  }
534  }
535 
536  if (!KeepCaption
537  && ToolTipRectangle.Wdt != 0
540  {
542 
544  {
546  }
547  }
548  else
549  {
550  // disable tooltip pop-up; whatever set it in the first place will set it again on the next mouse-enter
552  ToolTipRectangle.Wdt = 0;
553  }
554  }
555 
556  // Make a script callback if the object being hovered changes
557  if(!IsPassive() && OldTargetObject != TargetObject)
558  {
559  // TODO: This might put a heavy load on the network, depending on the number of
560  // selectable objects around. If it turns out to be a problem we might want to
561  // deduce these hover callbacks client-side instead.
562  // Or, make sure to send this at most once per control frame.
564  }
565 }
const int32_t C4MC_Tooltip_Delay
const int32_t C4MC_Cursor_Passive
const int32_t C4MC_Cursor_Crosshair
const int32_t C4MC_MD_NoClick
@ P_Tooltip
bool Inside(T ival, U lbound, V rbound)
Definition: Standard.h:43
static C4ControlPlayerMouse * Hover(const C4Player *player, const C4Object *target, const C4Object *old_target, const C4Object *drag=nullptr)
Definition: C4Control.cpp:446
void SetTooltipText(const StdStrBuf &text)
C4Object * GetTargetObject()
void SetTooltipRectangle(const C4Rect &rectangle)
void GetViewPos(float &riX, float &riY, float tx, float ty, const C4Facet &fctViewport) const
int32_t addtop() const
Definition: C4Object.h:280
C4Shape Shape
Definition: C4Object.h:146
C4String * GetPropertyStr(C4PropertyName k) const
Definition: C4PropList.cpp:744
const char * GetCStr() const
Definition: C4StringTable.h:49

References C4Control::Add(), C4Object::addtop(), C4D_IgnoreFoW, C4D_MouseSelect, C4MC_Cursor_Crosshair, C4MC_Cursor_Passive, C4MC_Cursor_Select, C4MC_Drag_Script, C4MC_MD_DropTarget, C4MC_MD_NoClick, C4MC_Tooltip_Delay, Caption, C4Object::Category, CID_PlrMouseMove, Cursor, Drag, DragObject, fctViewportGUI, FogOfWar, Game, C4PlayerList::Get(), C4String::GetCStr(), C4PropList::GetPropertyInt(), C4PropList::GetPropertyStr(), GetTargetObject(), C4Object::GetViewPos(), GuiX, GuiY, C4Rect::Hgt, C4ControlPlayerMouse::Hover(), C4Game::Input, Inside(), IsPassive(), KeepCaption, P_MouseDrag, P_Tooltip, Player, Players, Scrolling, SetTooltipRectangle(), SetTooltipText(), C4Object::Shape, TargetObject, TimeInTooltipRectangle, ToolTipRectangle, TooltipText, C4Rect::Wdt, C4Facet::X, C4Rect::x, C4Facet::Y, and C4Rect::y.

Referenced by ButtonUpDragScript(), DragNone(), DragScript(), and Move().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateFogOfWar()

void C4MouseControl::UpdateFogOfWar ( )
protected

Definition at line 791 of file C4MouseControl.cpp.

792 {
793  // Assume no fog of war
794  FogOfWar=false;
795  // Check for fog of war
796  // TODO: Check C4FoWRegion... should maybe be passed as a parameter?
797  // pDraw->GetFoW() might not be current at this time.
798  if (/*(pPlayer->fFogOfWar && !pPlayer->FoWIsVisible(int32_t(GameX),int32_t(GameY))) || */GameX<0 || GameY<0 || int32_t(GameX)>=::Landscape.GetWidth() || int32_t(GameY)>=::Landscape.GetHeight())
799  {
800  FogOfWar=true;
801  // allow dragging, scrolling, region selection and manipulations of objects not affected by FoW
803  {
805  }
806  }
807 }
C4Landscape Landscape
int32_t GetWidth() const
int32_t GetHeight() const

References C4D_IgnoreFoW, C4MC_Cursor_Passive, C4Object::Category, Cursor, FogOfWar, GameX, GameY, C4Landscape::GetHeight(), C4Landscape::GetWidth(), Landscape, Scrolling, and TargetObject.

Referenced by Move().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateScrolling()

void C4MouseControl::UpdateScrolling ( )
protected

Definition at line 582 of file C4MouseControl.cpp.

583 {
584  // Assume no scrolling
585  Scrolling=false;
586  // No scrolling if disabled by player
587  if (pPlayer) if (pPlayer->IsViewLocked()) return;
588  // Scrolling on border
589  if (VpX==0)
591  if (VpY==0)
593  if (VpX==Viewport->ViewWdt-1)
595  if (VpY==Viewport->ViewHgt-1)
597  // Set correct cursor
598  if ((VpX==0) && (VpY==0)) Cursor=C4MC_Cursor_UpLeft;
599  if ((VpX==Viewport->ViewWdt-1) && (VpY==0)) Cursor=C4MC_Cursor_UpRight;
600  if ((VpX==0) && (VpY==Viewport->ViewHgt-1)) Cursor=C4MC_Cursor_DownLeft;
602 }
void ScrollView(float iX, float iY, float ViewWdt, float ViewHgt)
bool IsViewLocked() const
Definition: C4Player.h:204

References C4MC_Cursor_Down, C4MC_Cursor_DownLeft, C4MC_Cursor_DownRight, C4MC_Cursor_Left, C4MC_Cursor_Right, C4MC_Cursor_Up, C4MC_Cursor_UpLeft, C4MC_Cursor_UpRight, Cursor, C4Player::IsViewLocked(), pPlayer, Scrolling, ScrollSpeed, ScrollView(), C4Viewport::ViewHgt, Viewport, C4Viewport::ViewWdt, VpX, VpY, and C4Viewport::Zoom.

Referenced by Move().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateSingleSelection()

int32_t C4MouseControl::UpdateSingleSelection ( )
protected

Definition at line 567 of file C4MouseControl.cpp.

568 {
569  // Set single selection if cursor on selection object (clear prior object selection)
572 
573  // Cursor has moved off single object (or target object) selection: clear selection
574  else if (Selection.GetObject())
577  Selection.Clear();
578 
579  return Selection.ObjectCount();
580 }
virtual bool Add(C4Object *new_obj, SortType sort_type, C4ObjectList *sorted_list=nullptr)
int ObjectCount(C4ID id=C4ID::None) const
bool ObjectInCrew(C4Object *tobj)
Definition: C4Player.cpp:90

References C4ObjectList::Add(), C4D_MouseSelect, C4MC_Cursor_Select, C4Object::Category, C4ObjectList::Clear(), Cursor, C4PlayerList::Get(), C4ObjectList::GetObject(), C4ObjectList::ObjectCount(), C4Player::ObjectInCrew(), Player, Players, Selection, C4ObjectList::stNone, and TargetObject.

Referenced by DragNone(), and DragScript().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Wheel()

void C4MouseControl::Wheel ( DWORD  dwFlags)
protected

Definition at line 719 of file C4MouseControl.cpp.

720 {
721 }

Referenced by Move().

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ C4Viewport

friend class C4Viewport
friend

Definition at line 68 of file C4MouseControl.h.

Member Data Documentation

◆ Active

bool C4MouseControl::Active
protected

◆ AltDown

bool C4MouseControl::AltDown
protected

Definition at line 96 of file C4MouseControl.h.

Referenced by Default(), DoMoveInput(), Execute(), and Move().

◆ ButtonDownOnSelection

bool C4MouseControl::ButtonDownOnSelection
protected

Definition at line 93 of file C4MouseControl.h.

Referenced by Default().

◆ Caption

StdCopyStrBuf C4MouseControl::Caption
protected

Definition at line 112 of file C4MouseControl.h.

Referenced by Default(), Draw(), GetCaption(), Move(), and UpdateCursorTarget().

◆ CaptionBottomY

int32_t C4MouseControl::CaptionBottomY
protected

Definition at line 115 of file C4MouseControl.h.

Referenced by Default(), and Move().

◆ ControlDown

bool C4MouseControl::ControlDown
protected

Definition at line 94 of file C4MouseControl.h.

Referenced by Default(), DoMoveInput(), Execute(), and Move().

◆ Cursor

int32_t C4MouseControl::Cursor
protected

◆ DownTarget

C4Object* C4MouseControl::DownTarget
protected

◆ DownX

float C4MouseControl::DownX
protected

Definition at line 87 of file C4MouseControl.h.

Referenced by Default(), DragNone(), LeftDown(), and RightDown().

◆ DownY

float C4MouseControl::DownY
protected

Definition at line 87 of file C4MouseControl.h.

Referenced by Default(), DragNone(), LeftDown(), and RightDown().

◆ Drag

◆ DragID

C4ID C4MouseControl::DragID
protected

Definition at line 105 of file C4MouseControl.h.

Referenced by ButtonUpDragScript(), and Default().

◆ DragImageDef

C4Def* C4MouseControl::DragImageDef
protected

Definition at line 106 of file C4MouseControl.h.

Referenced by ButtonUpDragScript(), ClearPointers(), Default(), DragNone(), and Draw().

◆ DragImageObject

C4Object* C4MouseControl::DragImageObject
protected

Definition at line 107 of file C4MouseControl.h.

Referenced by ButtonUpDragScript(), ClearPointers(), Default(), DragNone(), and Draw().

◆ DragObject

C4Object* C4MouseControl::DragObject
protected

◆ fctViewport

C4Facet C4MouseControl::fctViewport
protected

Definition at line 85 of file C4MouseControl.h.

Referenced by Default(), and Move().

◆ fctViewportGame

C4Facet C4MouseControl::fctViewportGame
protected

Definition at line 85 of file C4MouseControl.h.

Referenced by GetTargetObject(), and Move().

◆ fctViewportGUI

C4Facet C4MouseControl::fctViewportGUI
protected

Definition at line 85 of file C4MouseControl.h.

Referenced by GetTargetObject(), Move(), and UpdateCursorTarget().

◆ fMouseOwned

bool C4MouseControl::fMouseOwned
protected

◆ FogOfWar

bool C4MouseControl::FogOfWar
protected

Definition at line 99 of file C4MouseControl.h.

Referenced by Default(), DragNone(), Move(), UpdateCursorTarget(), and UpdateFogOfWar().

◆ GameX

float C4MouseControl::GameX
protected

◆ GameY

float C4MouseControl::GameY
protected

◆ GuiX

float C4MouseControl::GuiX
protected

◆ GuiY

float C4MouseControl::GuiY
protected

◆ InitCentered

bool C4MouseControl::InitCentered
protected

Definition at line 98 of file C4MouseControl.h.

Referenced by C4Viewport::AdjustPosition(), Default(), Init(), and Move().

◆ KeepCaption

int32_t C4MouseControl::KeepCaption
protected

Definition at line 116 of file C4MouseControl.h.

Referenced by Default(), Move(), and UpdateCursorTarget().

◆ LeftButtonDown

bool C4MouseControl::LeftButtonDown
protected

Definition at line 92 of file C4MouseControl.h.

Referenced by Default(), DragNone(), IsLeftDown(), LeftDouble(), LeftDown(), LeftUp(), Move(), and RightUp().

◆ LeftDoubleIgnoreUp

bool C4MouseControl::LeftDoubleIgnoreUp
protected

Definition at line 92 of file C4MouseControl.h.

Referenced by Default(), LeftDouble(), and LeftUp().

◆ Player

◆ pPlayer

C4Player* C4MouseControl::pPlayer
protected

Definition at line 76 of file C4MouseControl.h.

Referenced by Default(), DoMoveInput(), Draw(), Move(), ScrollView(), and UpdateScrolling().

◆ RightButtonDown

bool C4MouseControl::RightButtonDown
protected

Definition at line 92 of file C4MouseControl.h.

Referenced by Default(), DragNone(), LeftUp(), Move(), RightDown(), and RightUp().

◆ Scrolling

bool C4MouseControl::Scrolling
protected

◆ ScrollSpeed

int32_t C4MouseControl::ScrollSpeed
protected

Definition at line 89 of file C4MouseControl.h.

Referenced by Default(), and UpdateScrolling().

◆ Selection

C4ObjectList C4MouseControl::Selection
protected

◆ ShiftDown

bool C4MouseControl::ShiftDown
protected

Definition at line 95 of file C4MouseControl.h.

Referenced by Default(), DoMoveInput(), Execute(), and Move().

◆ TargetObject

C4Object* C4MouseControl::TargetObject
protected

◆ TimeInTooltipRectangle

int32_t C4MouseControl::TimeInTooltipRectangle
protected

Definition at line 117 of file C4MouseControl.h.

Referenced by SetTooltipRectangle(), and UpdateCursorTarget().

◆ ToolTipRectangle

C4Rect C4MouseControl::ToolTipRectangle
protected

Definition at line 118 of file C4MouseControl.h.

Referenced by SetTooltipRectangle(), and UpdateCursorTarget().

◆ TooltipText

StdCopyStrBuf C4MouseControl::TooltipText
protected

Definition at line 114 of file C4MouseControl.h.

Referenced by SetTooltipText(), and UpdateCursorTarget().

◆ Viewport

C4Viewport* C4MouseControl::Viewport
protected

Definition at line 77 of file C4MouseControl.h.

Referenced by Default(), IsViewport(), Move(), ScrollView(), and UpdateScrolling().

◆ ViewX

float C4MouseControl::ViewX
protected

Definition at line 82 of file C4MouseControl.h.

Referenced by Default(), GetTargetObject(), and Move().

◆ ViewY

float C4MouseControl::ViewY
protected

Definition at line 82 of file C4MouseControl.h.

Referenced by Default(), GetTargetObject(), and Move().

◆ Visible

bool C4MouseControl::Visible
protected

Definition at line 100 of file C4MouseControl.h.

Referenced by Default(), Draw(), HideCursor(), and ShowCursor().

◆ VpX

int32_t C4MouseControl::VpX
protected

Definition at line 81 of file C4MouseControl.h.

Referenced by C4Viewport::AdjustPosition(), Default(), Execute(), Move(), and UpdateScrolling().

◆ VpY

int32_t C4MouseControl::VpY
protected

Definition at line 81 of file C4MouseControl.h.

Referenced by C4Viewport::AdjustPosition(), Default(), Execute(), Move(), and UpdateScrolling().


The documentation for this class was generated from the following files: