OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
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 ( )

Definition at line 45 of file C4MouseControl.cpp.

References Default().

46 {
47  Default();
48 }

Here is the call graph for this function:

C4MouseControl::~C4MouseControl ( )

Definition at line 50 of file C4MouseControl.cpp.

References Clear().

51 {
52  Clear();
53 }

Here is the call graph for this function:

Member Function Documentation

void C4MouseControl::ButtonUpDragScript ( )
protected

Definition at line 758 of file C4MouseControl.cpp.

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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::Clear ( )

Definition at line 91 of file C4MouseControl.cpp.

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

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

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::ClearPointers ( C4Object pObj)

Definition at line 124 of file C4MouseControl.cpp.

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

Referenced by C4Game::ClearPointers().

125 {
126  if (TargetObject==pObj) TargetObject=nullptr;
127  if (DownTarget==pObj) DownTarget=nullptr;
128  if (DragObject==pObj)
129  {
130  DragObject=nullptr;
132  DragImageDef=nullptr;
133  DragImageObject=nullptr;
134  }
135  Selection.ClearPointers(pObj);
136 }
C4ObjectList Selection
C4Object * DragImageObject
C4Object * DownTarget
C4Object * TargetObject
const int32_t C4MC_Drag_None
C4Object * DragObject
C4Def * DragImageDef
int ClearPointers(C4Object *pObj)

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::Default ( )

Definition at line 55 of file C4MouseControl.cpp.

References Active, AltDown, ButtonDownOnSelection, C4MC_Drag_None, Caption, CaptionBottomY, StdStrBuf::Clear(), ControlDown, Cursor, C4ObjectList::Default(), C4Facet::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().

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 }
C4ObjectList Selection
C4Player * pPlayer
void Clear()
Definition: StdBuf.h:466
C4Object * DragImageObject
C4Object * DownTarget
bool ButtonDownOnSelection
C4Object * TargetObject
const int32_t C4MC_Drag_None
void Default()
Definition: C4Facet.cpp:31
StdCopyStrBuf Caption
int32_t ScrollSpeed
static const C4ID None
Definition: C4Id.h:39
C4Object * DragObject
const int NO_OWNER
Definition: C4Constants.h:137
int32_t CaptionBottomY
C4Viewport * Viewport
C4Def * DragImageDef
C4Facet fctViewport
virtual void Default()

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::DoMoveInput ( )

Definition at line 325 of file C4MouseControl.cpp.

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().

326 {
327  // current mouse move to input queue
328  // do sanity checks
329  if (!Active || !fMouseOwned) return;
330  if (!(pPlayer=::Players.Get(Player))) return;
331  if (!pPlayer->ControlSet) return;
333  pPlayer->Control.DoMouseInput(0 /* only 1 mouse supported so far */, C4MC_Button_None, GameX, GameY, GuiX, GuiY, ControlDown, ShiftDown, AltDown, 0);
334 }
C4Player * pPlayer
C4PlayerControl Control
Definition: C4Player.h:129
bool DoMouseInput(uint8_t mouse_id, int32_t mouseevent, float game_x, float game_y, float gui_x, float gui_y, bool is_ctrl_down, bool is_shift_down, bool is_alt_down, int wheel_dir)
C4Player * Get(int iPlayer) const
class C4PlayerControlAssignmentSet * ControlSet
Definition: C4Player.h:90
C4PlayerList Players
bool IsMouseControlAssigned(int32_t mouseevent) const
const int32_t C4MC_Button_None

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::DragNone ( )
protected

Definition at line 643 of file C4MouseControl.cpp.

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().

644 {
645  // Cursor movement
647  // Update selection
649 
650  // Button down: begin drag
653  {
654  bool fAllowDrag = true;
655  // check if target object allows scripted dragging
656  if (fAllowDrag && DownTarget && (!FogOfWar || (DownTarget->Category & C4D_IgnoreFoW)))
657  {
658  C4Object *drag_image_obj; C4Def * drag_image_def;
659 
660  // Drag only if MD_SOURCE is set and drag image is present
662  DownTarget->GetDragImage(&drag_image_obj, &drag_image_def))
663  {
665 
666  if(drag_image_obj) DragImageObject = drag_image_obj;
667  else DragImageDef = drag_image_def;
668 
670  }
671  }
672 
673  // dragging somewhere unhandled - mark drag process so moving over a draggable object won't start a drag
674  if (Drag == C4MC_Drag_None)
675  {
677  }
678  }
679 }
const int32_t C4MC_Drag_Script
bool GetDragImage(C4Object **drag_object, C4Def **drag_id) const
Definition: C4Object.cpp:4283
C4Object * DragImageObject
int32_t UpdateSingleSelection()
const int32_t C4MC_DragSensitivity
C4Object * DownTarget
const int32_t C4D_IgnoreFoW
Definition: C4Def.h:55
const int32_t C4MC_Drag_None
C4Object * DragObject
Definition: C4Def.h:98
C4Def * DragImageDef
int32_t Category
Definition: C4Object.h:113
const int32_t C4MC_Drag_Unhandled
const int32_t C4MC_MD_DragSource
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
T Abs(T val)
Definition: Standard.h:42

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::DragScript ( )
protected

Definition at line 728 of file C4MouseControl.cpp.

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

Referenced by Move().

729 {
730  // script drag should update target and selection so selection highlight on drop target is visible
731  // Cursor movement
733  // Update selection
736 }
const int32_t C4MC_Cursor_DragDrop
int32_t UpdateSingleSelection()

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 336 of file C4MouseControl.cpp.

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, C4Def::Graphics, C4Config::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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::Execute ( )

Definition at line 98 of file C4MouseControl.cpp.

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

Referenced by C4Game::Execute().

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  Move(C4MC_Button_None, VpX, VpY, wKeyState);
110  }
111 }
int32_t iTick5
Definition: C4Game.h:129
C4Game Game
Definition: C4Globals.cpp:52
void Move(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyFlags, bool fCenter=false)
const int32_t C4MC_Button_None
uint16_t WORD

Here is the call graph for this function:

Here is the caller graph for this function:

const char * C4MouseControl::GetCaption ( )

Definition at line 824 of file C4MouseControl.cpp.

References Caption, and StdStrBuf::getData().

Referenced by C4EditCursor::UpdateStatusBar().

825 {
826  return Caption.getData();
827 }
const char * getData() const
Definition: StdBuf.h:442
StdCopyStrBuf Caption

Here is the call graph for this function:

Here is the caller graph for this function:

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 875 of file C4MouseControl.cpp.

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

876 {
877  // safety
878  if (!Active || !fMouseOwned) return false;
879  // OK; assign last known pos
880  *x_out_gui = GuiX; *y_out_gui = GuiY;
881  *x_out_game = GameX; *y_out_game = GameY;
882  return true;
883 }
int32_t C4MouseControl::GetPlayer ( )
inline

Definition at line 167 of file C4MouseControl.h.

References Player.

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

167 { return Player; }

Here is the caller graph for this function:

C4Object * C4MouseControl::GetTargetObject ( )
protected

Definition at line 843 of file C4MouseControl.cpp.

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

Referenced by UpdateCursorTarget().

844 {
845  // find object
846  // gui object position currently wrong...will fall apart once GUIZoom is activated
848  if (!pObj) return nullptr;
849  return pObj;
850 }
float Y
Definition: C4Facet.h:118
C4Game Game
Definition: C4Globals.cpp:52
C4Facet fctViewportGame
const int32_t C4D_MouseSelect
Definition: C4Def.h:52
C4Facet fctViewportGUI
C4Object * FindVisObject(float tx, float ty, int32_t iPlr, const C4Facet &fctViewportGame, const C4Facet &fctViewportGUI, float iX, float iY, DWORD category, float gui_x, float gui_y)
Definition: C4Game.cpp:1225
float X
Definition: C4Facet.h:118

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::HideCursor ( )

Definition at line 819 of file C4MouseControl.cpp.

References Visible.

Referenced by C4EditCursor::SetMode().

820 {
821  Visible=false;
822 }

Here is the caller graph for this function:

bool C4MouseControl::Init ( int32_t  iPlayer)

Definition at line 113 of file C4MouseControl.cpp.

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

Referenced by C4FullScreen::ViewportCheck().

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

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4MouseControl::IsActive ( )
inline

Definition at line 138 of file C4MouseControl.h.

References Active.

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

138 { return !!Active; }

Here is the caller graph for this function:

bool C4MouseControl::IsDragging ( )

Definition at line 870 of file C4MouseControl.cpp.

References Active, C4MC_Drag_Script, and Drag.

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

871 {
872  return Active && Drag == C4MC_Drag_Script;
873 }
const int32_t C4MC_Drag_Script

Here is the caller graph for this function:

bool C4MouseControl::IsLeftDown ( )
inline

Definition at line 166 of file C4MouseControl.h.

References LeftButtonDown.

Referenced by C4ScriptGuiWindow::ProcessMouseInput().

166 { return LeftButtonDown; }

Here is the caller graph for this function:

bool C4MouseControl::IsMouseOwned ( )
inline

Definition at line 137 of file C4MouseControl.h.

References fMouseOwned.

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

137 { return fMouseOwned; }

Here is the caller graph for this function:

bool C4MouseControl::IsPassive ( )
protected

Definition at line 852 of file C4MouseControl.cpp.

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

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

853 {
855 }
C4GameControl Control
const int NO_OWNER
Definition: C4Constants.h:137
bool isReplay() const
Definition: C4GameControl.h:98

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4MouseControl::IsViewport ( C4Viewport pViewport)

Definition at line 138 of file C4MouseControl.cpp.

References Viewport.

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

139 {
140  return (Viewport==pViewport);
141 }
C4Viewport * Viewport

Here is the caller graph for this function:

void C4MouseControl::LeftDouble ( )
protected

Definition at line 681 of file C4MouseControl.cpp.

References C4MC_Drag_None, Drag, LeftButtonDown, and LeftDoubleIgnoreUp.

Referenced by Move().

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

Here is the caller graph for this function:

void C4MouseControl::LeftDown ( )
protected

Definition at line 609 of file C4MouseControl.cpp.

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

Referenced by Move().

610 {
611  // Set flag
612  LeftButtonDown=true;
613  // Store down values (same MoveRightDown -> use StoreDown)
616 }
C4Object * DownTarget
C4Object * TargetObject

Here is the caller graph for this function:

void C4MouseControl::LeftUp ( )
protected

Definition at line 618 of file C4MouseControl.cpp.

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

Referenced by Move().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::LeftUpDragNone ( )
protected

Definition at line 738 of file C4MouseControl.cpp.

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().

739 {
740  // might be in Drag_Unknown
742  // Single left click (might be on a target)
743  switch (Cursor)
744  {
745  case C4MC_Cursor_Select:
746  // Object selection to control queue
747  if (!IsPassive() && Selection.GetObject() == DownTarget)
749  break;
750  default:
751  // done in script
752  break;
753  }
754  // Clear selection
755  Selection.Clear();
756 }
C4ObjectList Selection
C4Game Game
Definition: C4Globals.cpp:52
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
Definition: C4Control.h:82
C4Object * DownTarget
const int32_t C4MC_Drag_None
const int32_t C4MC_Cursor_Select
C4Object * GetObject(int Index=0) const
C4Control & Input
Definition: C4Game.h:82
virtual void Clear()

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 174 of file C4MouseControl.cpp.

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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::RightDown ( )
protected

Definition at line 698 of file C4MouseControl.cpp.

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

Referenced by Move().

699 {
700  // Update status flag
701  RightButtonDown=true;
702  // Store down values (same MoveLeftDown -> use StoreDown)
705 }
C4Object * DownTarget
C4Object * TargetObject

Here is the caller graph for this function:

void C4MouseControl::RightUp ( )
protected

Definition at line 707 of file C4MouseControl.cpp.

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

Referenced by Move().

708 {
709  // Evaluate by drag status
710  switch (Drag)
711  {
712  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
713  case C4MC_Drag_Unhandled: // nobreak
714  case C4MC_Drag_None: RightUpDragNone(); break;
715  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
716  case C4MC_Drag_Script: ButtonUpDragScript(); break;
717  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
718  }
719  // Update status flag
720  RightButtonDown=false;
721  if(!LeftButtonDown) DownTarget = nullptr;
722 }
const int32_t C4MC_Drag_Script
C4Object * DownTarget
const int32_t C4MC_Drag_None
const int32_t C4MC_Drag_Unhandled

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::RightUpDragNone ( )
protected

Definition at line 782 of file C4MouseControl.cpp.

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().

783 {
784 
785  // might be in Drag_Unknown
787 
788  // Alternative object selection
791 
792  // TODO: Evaluate right click
793 
794 }
C4ObjectList Selection
C4Game Game
Definition: C4Globals.cpp:52
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
Definition: C4Control.h:82
C4Object * DownTarget
const int32_t C4MC_Drag_None
const int32_t C4MC_Cursor_Select
C4Object * GetObject(int Index=0) const
C4Control & Input
Definition: C4Game.h:82

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 857 of file C4MouseControl.cpp.

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

Referenced by UpdateScrolling().

858 {
859  // player assigned: scroll player view
860  if (pPlayer)
861  pPlayer->ScrollView(iX, iY, ViewWdt, ViewHgt);
862  else if (Viewport)
863  {
864  // no player: Scroll fullscreen viewport
865  Viewport->ScrollView(iX, iY);
866  }
867 
868 }
C4Player * pPlayer
void ScrollView(float iX, float iY, float ViewWdt, float ViewHgt)
Definition: C4Player.cpp:1364
void ScrollView(float byX, float byY)
Definition: C4Viewport.cpp:734
C4Viewport * Viewport

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::SetOwnedMouse ( bool  fToVal)
inline

Definition at line 136 of file C4MouseControl.h.

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

136 { fMouseOwned = fToVal; }

Here is the caller graph for this function:

void C4MouseControl::SetTooltipRectangle ( const C4Rect rectangle)

Definition at line 829 of file C4MouseControl.cpp.

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

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

830 {
831  // Set the tooltip rectangle slightly larger than originally requested.
832  // 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
833  // in case the GUI item uses a different check for bounds (< vs <=) than the tooltip rectangle.
834  ToolTipRectangle = C4Rect(rectangle.x - 2, rectangle.y - 2, rectangle.Wdt + 4, rectangle.Hgt + 4);
836 }
C4Rect ToolTipRectangle
int32_t TimeInTooltipRectangle
Definition: C4Rect.h:27
int32_t Wdt
Definition: C4Rect.h:30
int32_t y
Definition: C4Rect.h:30
int32_t x
Definition: C4Rect.h:30
int32_t Hgt
Definition: C4Rect.h:30

Here is the caller graph for this function:

void C4MouseControl::SetTooltipText ( const StdStrBuf text)

Definition at line 838 of file C4MouseControl.cpp.

References text, and TooltipText.

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

839 {
840  TooltipText = text;
841 }
StdCopyStrBuf TooltipText

Here is the caller graph for this function:

void C4MouseControl::ShowCursor ( )

Definition at line 814 of file C4MouseControl.cpp.

References Visible.

Referenced by C4EditCursor::SetMode().

815 {
816  Visible=true;
817 }

Here is the caller graph for this function:

void C4MouseControl::UpdateClip ( )

Definition at line 143 of file C4MouseControl.cpp.

References C4AbstractApp::Active, 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(), FullScreenWinProc(), Init(), C4Viewport::SetOutputSize(), and C4GUI::Screen::UpdateMouseFocus().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::UpdateCursorTarget ( )
protected

Definition at line 480 of file C4MouseControl.cpp.

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, C4Rect::x, C4Facet::X, C4Rect::y, and C4Facet::Y.

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

481 {
482  C4Object* OldTargetObject = TargetObject;
483 
484  if (Scrolling)
485  {
486  // Scrolling: no other target
487  TargetObject=nullptr;
488  }
489  else
490  {
491  // Target object
494 
495  // Movement
497 
498  // Target action
499  if (TargetObject && !IsPassive())
500  {
501  // default cursor for object; also set if not in FoW
503 
504  // select custom region. Can select an object if it does not have the MD_NoClick
505  // flag set. If we are currently dragging then selection depends on it being a drop target.
506  bool CanSelect;
507  if(Drag == C4MC_Drag_Script)
509  else
511 
512  if ( (TargetObject->Category & C4D_MouseSelect) && CanSelect)
514  else
515  TargetObject = nullptr;
516  }
517 
518  // passive cursor
519  if (IsPassive())
521 
522  // update tooltip information
523  if (OldTargetObject != TargetObject)
524  {
525  C4String *newTooltip = nullptr;
527  {
528  float objX, objY;
530  objX += TargetObject->Shape.x;
531  objY += TargetObject->Shape.y - TargetObject->addtop();
533  SetTooltipText(StdStrBuf(newTooltip->GetCStr()));
534  }
535  else
536  {
537  SetTooltipRectangle(C4Rect(0, 0, 0, 0));
538  }
539  }
540 
541  if (!KeepCaption
542  && ToolTipRectangle.Wdt != 0
545  {
547 
549  {
551  }
552  }
553  else
554  {
555  // disable tooltip pop-up; whatever set it in the first place will set it again on the next mouse-enter
557  ToolTipRectangle.Wdt = 0;
558  }
559  }
560 
561  // Make a script callback if the object being hovered changes
562  if(!IsPassive() && OldTargetObject != TargetObject)
563  {
564  // TODO: This might put a heavy load on the network, depending on the number of
565  // selectable objects around. If it turns out to be a problem we might want to
566  // deduce these hover callbacks client-side instead.
567  // Or, make sure to send this at most once per control frame.
569  }
570 }
void SetTooltipRectangle(const C4Rect &rectangle)
float Y
Definition: C4Facet.h:118
C4Rect ToolTipRectangle
const int32_t C4MC_Drag_Script
C4Game Game
Definition: C4Globals.cpp:52
int32_t TimeInTooltipRectangle
void GetViewPos(float &riX, float &riY, float tx, float ty, const C4Facet &fctViewport) const
Definition: C4Object.cpp:4325
const int32_t C4MC_Cursor_Passive
StdCopyStrBuf TooltipText
const char * GetCStr() const
Definition: C4StringTable.h:49
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
Definition: C4Control.h:82
Definition: C4Rect.h:27
C4Object * TargetObject
const int32_t C4MC_MD_NoClick
const int32_t C4MC_MD_DropTarget
int32_t Wdt
Definition: C4Rect.h:30
const int32_t C4D_IgnoreFoW
Definition: C4Def.h:55
void SetTooltipText(const StdStrBuf &text)
const int32_t C4D_MouseSelect
Definition: C4Def.h:52
C4Player * Get(int iPlayer) const
int32_t y
Definition: C4Rect.h:30
StdCopyStrBuf Caption
C4Object * DragObject
C4PlayerList Players
const int32_t C4MC_Tooltip_Delay
const int32_t C4MC_Cursor_Select
static C4ControlPlayerMouse * Hover(const C4Player *player, const C4Object *target, const C4Object *old_target, const C4Object *drag=nullptr)
Definition: C4Control.cpp:446
C4Facet fctViewportGUI
int32_t Category
Definition: C4Object.h:113
C4Control & Input
Definition: C4Game.h:82
int32_t x
Definition: C4Rect.h:30
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
Definition: C4PropList.cpp:886
int32_t Hgt
Definition: C4Rect.h:30
C4Shape Shape
Definition: C4Object.h:148
C4Object * GetTargetObject()
C4String * GetPropertyStr(C4PropertyName k) const
Definition: C4PropList.cpp:775
bool Inside(T ival, U lbound, V rbound)
Definition: Standard.h:43
float X
Definition: C4Facet.h:118
const int32_t C4MC_Cursor_Crosshair
int32_t addtop() const
Definition: C4Object.h:281

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::UpdateFogOfWar ( )
protected

Definition at line 796 of file C4MouseControl.cpp.

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

Referenced by Move().

797 {
798  // Assume no fog of war
799  FogOfWar=false;
800  // Check for fog of war
801  // TODO: Check C4FoWRegion... should maybe be passed as a parameter?
802  // pDraw->GetFoW() might not be current at this time.
803  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())
804  {
805  FogOfWar=true;
806  // allow dragging, scrolling, region selection and manipulations of objects not affected by FoW
808  {
810  }
811  }
812 }
const int32_t C4MC_Cursor_Passive
C4Object * TargetObject
const int32_t C4D_IgnoreFoW
Definition: C4Def.h:55
C4Landscape Landscape
int32_t Category
Definition: C4Object.h:113
int32_t GetHeight() const
int32_t GetWidth() const

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::UpdateScrolling ( )
protected

Definition at line 587 of file C4MouseControl.cpp.

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().

588 {
589  // Assume no scrolling
590  Scrolling=false;
591  // No scrolling if disabled by player
592  if (pPlayer) if (pPlayer->IsViewLocked()) return;
593  // Scrolling on border
594  if (VpX==0)
596  if (VpY==0)
598  if (VpX==Viewport->ViewWdt-1)
600  if (VpY==Viewport->ViewHgt-1)
602  // Set correct cursor
603  if ((VpX==0) && (VpY==0)) Cursor=C4MC_Cursor_UpLeft;
604  if ((VpX==Viewport->ViewWdt-1) && (VpY==0)) Cursor=C4MC_Cursor_UpRight;
605  if ((VpX==0) && (VpY==Viewport->ViewHgt-1)) Cursor=C4MC_Cursor_DownLeft;
607 }
C4Player * pPlayer
const int32_t C4MC_Cursor_Right
const int32_t C4MC_Cursor_Down
bool IsViewLocked() const
Definition: C4Player.h:204
void ScrollView(float iX, float iY, float ViewWdt, float ViewHgt)
int32_t ViewHgt
Definition: C4Viewport.h:36
int32_t ViewWdt
Definition: C4Viewport.h:36
const int32_t C4MC_Cursor_Left
int32_t ScrollSpeed
const int32_t C4MC_Cursor_DownLeft
C4Viewport * Viewport
float Zoom
Definition: C4Viewport.h:101
const int32_t C4MC_Cursor_Up
const int32_t C4MC_Cursor_UpLeft
const int32_t C4MC_Cursor_DownRight
const int32_t C4MC_Cursor_UpRight

Here is the call graph for this function:

Here is the caller graph for this function:

int32_t C4MouseControl::UpdateSingleSelection ( )
protected

Definition at line 572 of file C4MouseControl.cpp.

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().

573 {
574  // Set single selection if cursor on selection object (clear prior object selection)
577 
578  // Cursor has moved off single object (or target object) selection: clear selection
579  else if (Selection.GetObject())
582  Selection.Clear();
583 
584  return Selection.ObjectCount();
585 }
C4ObjectList Selection
virtual bool Add(C4Object *nObj, SortType eSort, C4ObjectList *pLstSorted=nullptr)
C4Object * TargetObject
const int32_t C4D_MouseSelect
Definition: C4Def.h:52
C4Player * Get(int iPlayer) const
C4PlayerList Players
const int32_t C4MC_Cursor_Select
C4Object * GetObject(int Index=0) const
int32_t Category
Definition: C4Object.h:113
int ObjectCount(C4ID id=C4ID::None) const
virtual void Clear()
bool ObjectInCrew(C4Object *tobj)
Definition: C4Player.cpp:90

Here is the call graph for this function:

Here is the caller graph for this function:

void C4MouseControl::Wheel ( DWORD  dwFlags)
protected

Definition at line 724 of file C4MouseControl.cpp.

Referenced by Move().

725 {
726 }

Here is the caller graph for this function:

Friends And Related Function Documentation

friend class C4Viewport
friend

Definition at line 68 of file C4MouseControl.h.

Member Data Documentation

bool C4MouseControl::Active
protected
bool C4MouseControl::AltDown
protected

Definition at line 96 of file C4MouseControl.h.

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

bool C4MouseControl::ButtonDownOnSelection
protected

Definition at line 93 of file C4MouseControl.h.

Referenced by Default().

StdCopyStrBuf C4MouseControl::Caption
protected

Definition at line 112 of file C4MouseControl.h.

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

int32_t C4MouseControl::CaptionBottomY
protected

Definition at line 115 of file C4MouseControl.h.

Referenced by Default(), and Move().

bool C4MouseControl::ControlDown
protected

Definition at line 94 of file C4MouseControl.h.

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

int32_t C4MouseControl::Cursor
protected
C4Object* C4MouseControl::DownTarget
protected
float C4MouseControl::DownX
protected

Definition at line 87 of file C4MouseControl.h.

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

float C4MouseControl::DownY
protected

Definition at line 87 of file C4MouseControl.h.

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

C4ID C4MouseControl::DragID
protected

Definition at line 105 of file C4MouseControl.h.

Referenced by ButtonUpDragScript(), and Default().

C4Def* C4MouseControl::DragImageDef
protected

Definition at line 106 of file C4MouseControl.h.

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

C4Object* C4MouseControl::DragImageObject
protected

Definition at line 107 of file C4MouseControl.h.

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

C4Object* C4MouseControl::DragObject
protected
C4Facet C4MouseControl::fctViewport
protected

Definition at line 85 of file C4MouseControl.h.

Referenced by Default(), and Move().

C4Facet C4MouseControl::fctViewportGame
protected

Definition at line 85 of file C4MouseControl.h.

Referenced by GetTargetObject(), and Move().

C4Facet C4MouseControl::fctViewportGUI
protected

Definition at line 85 of file C4MouseControl.h.

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

bool C4MouseControl::fMouseOwned
protected

Definition at line 74 of file C4MouseControl.h.

Referenced by Default(), DoMoveInput(), Draw(), Execute(), GetLastCursorPos(), IsMouseOwned(), and Move().

bool C4MouseControl::FogOfWar
protected

Definition at line 99 of file C4MouseControl.h.

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

float C4MouseControl::GameX
protected
float C4MouseControl::GameY
protected
float C4MouseControl::GuiX
protected
float C4MouseControl::GuiY
protected
bool C4MouseControl::InitCentered
protected

Definition at line 98 of file C4MouseControl.h.

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

int32_t C4MouseControl::KeepCaption
protected

Definition at line 116 of file C4MouseControl.h.

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

bool C4MouseControl::LeftButtonDown
protected

Definition at line 92 of file C4MouseControl.h.

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

bool C4MouseControl::LeftDoubleIgnoreUp
protected

Definition at line 92 of file C4MouseControl.h.

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

C4Player* C4MouseControl::pPlayer
protected

Definition at line 76 of file C4MouseControl.h.

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

bool C4MouseControl::RightButtonDown
protected

Definition at line 92 of file C4MouseControl.h.

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

bool C4MouseControl::Scrolling
protected
int32_t C4MouseControl::ScrollSpeed
protected

Definition at line 89 of file C4MouseControl.h.

Referenced by Default(), and UpdateScrolling().

C4ObjectList C4MouseControl::Selection
protected
bool C4MouseControl::ShiftDown
protected

Definition at line 95 of file C4MouseControl.h.

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

C4Object* C4MouseControl::TargetObject
protected
int32_t C4MouseControl::TimeInTooltipRectangle
protected

Definition at line 117 of file C4MouseControl.h.

Referenced by SetTooltipRectangle(), and UpdateCursorTarget().

C4Rect C4MouseControl::ToolTipRectangle
protected

Definition at line 118 of file C4MouseControl.h.

Referenced by SetTooltipRectangle(), and UpdateCursorTarget().

StdCopyStrBuf C4MouseControl::TooltipText
protected

Definition at line 114 of file C4MouseControl.h.

Referenced by SetTooltipText(), and UpdateCursorTarget().

C4Viewport* C4MouseControl::Viewport
protected

Definition at line 77 of file C4MouseControl.h.

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

float C4MouseControl::ViewX
protected

Definition at line 82 of file C4MouseControl.h.

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

float C4MouseControl::ViewY
protected

Definition at line 82 of file C4MouseControl.h.

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

bool C4MouseControl::Visible
protected

Definition at line 100 of file C4MouseControl.h.

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

int32_t C4MouseControl::VpX
protected

Definition at line 81 of file C4MouseControl.h.

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

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: