40 const char *HotkeyMarkup = (for_tooltip ?
"<c ff800000>%s</c>" :
"<c ffffff7f>%s</c>");
44 const char *input = sText.
getData();
48 while (input && *input)
58 if (*input ==
'\0' || *input ==
'&')
67 const char *accel_start = input;
70 std::string accel(accel_start, input);
74 if (
Inside(rcHotkey,
static_cast<uint32_t
>(
'a'),
static_cast<uint32_t
>(
'z')))
76 rcHotkey +=
static_cast<uint32_t
>(
'A') -
'a';
78 else if (!
Inside(rcHotkey,
static_cast<uint32_t
>(
'A'),
static_cast<uint32_t
>(
'Z')))
101 DWORD dwAlpha = std::max<DWORD>(rdwClr>>24&255, 0xff)<<24;
105 DWORD r=(rdwClr>>16&255), g=(rdwClr>>8&255),
b=(rdwClr&255);
106 int32_t iLightness = r*50 + g*87 +
b*27;
108 if (iLightness < 16575)
110 int32_t iInc = (16575-iLightness) / 164;
112 rdwClr = (std::min<DWORD>(r+iInc, 255)<<16) | (std::min<DWORD>(g+iInc, 255)<<8) | std::min<DWORD>(
b+iInc, 255);
121 if (!iHeight) iHeight = rBySfc.
Hgt;
122 if (!iBorderWidth) iBorderWidth = iHeight;
124 fctMiddle.
Set(&rBySfc,iBorderWidth,0,rBySfc.
Wdt-2*iBorderWidth,iHeight);
125 fctEnd.
Set(&rBySfc,rBySfc.
Wdt-iBorderWidth,0,iBorderWidth,iHeight);
130 if (!iBorderWidth) iBorderWidth = rByFct.
Hgt;
293 DWORD dwAlpha = byAlpha<<24;
315 int32_t iRightShowLength = wRight/3;
346 int32_t iRightShowLength = rFacets.
fctEnd.
Wdt/3;
350 int32_t w2=std::min<int32_t>(w,
rcBounds.
Wdt-int32_t(fZoom*iRightShowLength)-iX); rFacets.
fctMiddle.
Wdt=long(
float(w2)/fZoom);
387 for (int32_t iY = 0; iY <= barHeight; iY += h)
389 int32_t h2 = std::min(h, barHeight - iY);
403 rtBounds.
x += rtBounds.
Wdt - (iWidth + iHIndent) * (iIndexX + 1);
404 rtBounds.
y += iVIndent;
405 rtBounds.
Wdt = rtBounds.
Hgt = iHeight;
412 if (szNewTooltip) ToolTip.
Copy(szNewTooltip);
else ToolTip.
Clear();
414 is_immediate_tooltip = is_immediate;
439 if (!pDlg)
return false;
441 return pDlg->
IsActive(fForKeyboard);
466 if (iButton || iX!=
x || iY!=
y)
493 const float oldZoom = GuiZoom.
Zoom;
497 int32_t iOffsetX = -
GfxR->fctMouseCursor.Wdt/2;
498 int32_t iOffsetY = -
GfxR->fctMouseCursor.Hgt/2;
499 GfxR->fctMouseCursor.Draw(cgo.
Surface,
x+iOffsetX,
y+iOffsetY,0);
515 GuiZoom.
Zoom = oldZoom;
631 if ((pOtherDlg = pEl->
GetDlg()))
666 if (!fFade) pDlg->
fShow =
false;
697 if ((pDlg = pEl->
GetDlg()))
708 #ifdef USE_WIN32_WINDOWS
714 if ((pDlg = pEl->GetDlg()))
725 if ( (pDlg = pEl->
GetDlg()) !=
nullptr)
782 if (c[0] == 0x09)
return false;
802 bool fResult =
MouseInput(iButton, iX, iY, dwKeyParam,
nullptr, pVP);
841 float fX = float(iPxX) /
fZoom;
842 float fY = float(iPxY) /
fZoom;
849 int32_t iX2=fX, iY2=fY;
866 bool fProcessed =
false;
879 if (!pForDlg && !pForVP)
882 fX -= rcClientArea.
x; fY -= rcClientArea.
y;
906 if ((pDlg = pEl->
GetDlg()))
910 if (pForDlg && pDlg != pForDlg)
continue;
914 if (pForVP && pForVP != pVP)
continue;
917 int32_t iOffX=0, iOffY=0;
919 if (fIsExternalDrawDialog)
927 iOffX = rcOut.
x; iOffY = rcOut.
y;
933 pDlg->
MouseInput(
Mouse, iButton, fX - rcDlgBounds.
x - iOffX, fY - rcDlgBounds.
y - iOffY, dwKeyParam);
973 assert(pNewCtx); assert(pNewCtx !=
pContext);
996 (
pContext = pNewCtx)->Open(pAtElement, iX, iY);
1003 if ((pDlg = pEl->
GetDlg()))
1020 if (y < cgo.
Y+cgo.
TargetY+tHgt+5) tY = std::min<int32_t>(y+5, cgo.
TargetY+cgo.
Hgt-tHgt);
else tY = y-tHgt-5;
1041 if ((pDlg = pEl->
GetDlg()))
1044 if (fIncludeFading || !pDlg->
IsFading())
1070 rcOut.
x += (rcOut.
Wdt - iWdt) / 2;
1087 rcOut.
y += (rcOut.
Hgt - iHgt) / 2;
1103 rcOut.
y += (rcOut.
Hgt - iHgt) / 2;
1119 rcOut.
x += (rcOut.
Wdt - iWdt) / 2;
1145 LogF(
"ComponentAligner %s: (%d,%d)+(%d,%d), Margin (%d,%d)", szName,
rcClientArea.
x,
rcClientArea.
y,
rcClientArea.
Wdt,
rcClientArea.
Hgt,
iMarginX,
iMarginY);
1148 C4Rect &
ComponentAligner::GetGridCell(int32_t iSectX, int32_t iSectXMax, int32_t iSectY, int32_t iSectYMax, int32_t iSectSizeX, int32_t iSectSizeY,
bool fCenterPos, int32_t iSectNumX, int32_t iSectNumY)
1150 int32_t iSectSizeXO = iSectSizeX, iSectSizeYO = iSectSizeY;
1153 if (iSectSizeX<0 || fCenterPos) iSectSizeX=iSectSizeXMax;
else iSectSizeX=std::min<int32_t>(iSectSizeX, iSectSizeXMax);
1154 if (iSectSizeY<0 || fCenterPos) iSectSizeY=iSectSizeYMax;
else iSectSizeY=std::min<int32_t>(iSectSizeY, iSectSizeYMax);
1158 if (iSectSizeXO>=0 && fCenterPos)
1160 rcTemp.
x += (iSectSizeX - iSectSizeXO)/2;
1163 if (iSectSizeYO>=0 && fCenterPos)
1165 rcTemp.
y += (iSectSizeY - iSectSizeYO)/2;
C4Application Application
C4MouseControl MouseControl
C4GraphicsSystem GraphicsSystem
C4GraphicsResource GraphicsResource
#define C4GUI_ToolTipBGColor
#define C4GUI_ToolTipColor
#define C4GUI_ToolTipFrameColor
#define C4GUI_MaxToolTipWdt
#define C4GUI_BorderColor2
#define C4GUI_BorderColor1
#define C4GUI_BorderColor3
const char * LoadResStr(const char *id)
bool LogF(const char *strMessage,...)
const int32_t C4MC_Button_None
const int32_t C4MC_Button_RightDown
const int32_t C4MC_Button_RightUp
const int32_t C4MC_Button_LeftUp
const int32_t C4MC_Button_LeftDown
C4SoundInstance * StartSoundEffect(const char *szSndName, bool fLoop, int32_t iVolume, C4Object *pObj, int32_t iCustomFalloffDistance, int32_t iPitch, C4SoundModifier *modifier)
uint32_t GetNextCharacter(const char **pszString)
bool Inside(T ival, U lbound, V rbound)
void DrawFrameDw(C4Surface *sfcDest, int x1, int y1, int x2, int y2, DWORD dwClr, float width=1.0f)
void GetZoom(ZoomData *r)
void DrawBoxDw(C4Surface *sfcDest, int iX1, int iY1, int iX2, int iY2, DWORD dwClr)
void DrawLineDw(C4Surface *sfcTarget, float x1, float y1, float x2, float y2, DWORD dwClr, float width=1.0f)
void SetZoom(float X, float Y, float Zoom)
bool TextOut(const char *szText, CStdFont &rFont, float fZoom, C4Surface *sfcDest, float iTx, float iTy, DWORD dwFCol=0xffffffff, BYTE byForm=ALeft, bool fDoMarkup=true)
void Set(C4Surface &rSfc)
void DrawT(C4Surface *sfcTarget, float iX, float iY, int32_t iPhaseX, int32_t iPhaseY, C4DrawTransform *pTransform)
void Draw(C4Facet &cgo, bool fAspect=true, int32_t iPhaseX=0, int32_t iPhaseY=0, bool fTransparent=true)
void DrawX(C4Surface *sfcTarget, float iX, float iY, float iWdt, float iHgt, int32_t iPhaseX=0, int32_t iPhaseY=0) const
void Input(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam)
Element * pMouseOverElement
void OnElementGetsInvisible(Element *pChild)
Element * pPrevMouseOverElement
void Draw(C4TargetFacet &cgo, TooltipShowState draw_tool_tips)
void RemoveElement(Element *pChild)
CMouse(int32_t iX, int32_t iY)
void SetOwnedMouse(bool fToVal)
void GetLastXY(int32_t &rX, int32_t &rY, DWORD &rdwKeys)
bool GetFromLeft(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
bool GetCentered(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
bool GetFromRight(int32_t iWdt, int32_t iHgt, C4Rect &rcOut)
bool GetFromTop(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
void LogIt(const char *szName)
C4Rect & GetGridCell(int32_t iSectX, int32_t iSectXMax, int32_t iSectY, int32_t iSectYMax, int32_t iSectSizeX=-1, int32_t iSectSizeY=-1, bool fCenterPos=false, int32_t iSectNumX=1, int32_t iSectNumY=1)
bool GetFromBottom(int32_t iHgt, int32_t iWdt, C4Rect &rcOut)
void RemoveElement(Element *pChild) override
virtual void ElementPosChanged(Element *pOfElement)
virtual void ElementSizeChanged(Element *pOfElement)
void MakeLastElement(Element *pChild)
void InsertElement(Element *pChild, Element *pInsertBefore)
virtual void ApplyInvElementOffset(int32_t &riX, int32_t &riY)
virtual void ApplyElementOffset(int32_t &riX, int32_t &riY)
virtual bool OnContext(Element *pOnElement, int32_t iX, int32_t iY)=0
virtual bool CharIn(const char *c)
virtual C4Viewport * GetViewport()
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
virtual bool IsBottomPlacementDialog()
virtual bool IsFullscreenDialog()
bool IsExternalDrawDialog() override
virtual bool HasBackground()
bool IsActive(bool fForKeyboard)
virtual int32_t GetZOrdering()
virtual bool IsMouseControlled()
Dialog * GetDlg() override
virtual bool DoPlacement(Screen *pOnScreen, const C4Rect &rPreferredDlgRect)
virtual bool IsFreePlaceDialog()
Element * GetPrev() const
virtual void SetVisibility(bool fToValue)
virtual void RemoveElement(Element *pChild)
virtual Container * GetContainer()
C4Rect GetToprightCornerRect(int32_t iWidth=16, int32_t iHeight=16, int32_t iHIndent=4, int32_t iVIndent=4, int32_t iIndexX=0)
void DrawVBar(C4TargetFacet &cgo, DynBarFacet &rFacets)
virtual Screen * GetScreen()
Element * GetNext() const
C4Rect GetContainedClientRect()
bool IsInActiveDlg(bool fForKeyboard)
virtual void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam)
virtual void UpdateSize()
virtual C4Rect & GetClientRect()
void SetBounds(const C4Rect &rcNewBound)
virtual void StopDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam)
virtual ContextHandler * GetContextHandler()
void DrawBar(C4TargetFacet &cgo, DynBarFacet &rFacets)
void DrawHBarByVGfx(C4TargetFacet &cgo, DynBarFacet &rFacets)
virtual void StartDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam)
virtual void MouseEnter(CMouse &rMouse)
virtual class Dialog * GetDlg()
void DrawHVBar(C4TargetFacet &cgo, DynBarFacet &rFacets, C4DrawTransform &trf, int32_t iMiddleLength)
void SetToolTip(const char *szNewTooltip, bool is_immediate=false)
void ClientPos2ScreenPos(int32_t &riX, int32_t &riY)
const char * GetToolTip()
virtual void DoDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam)
ContextHandler * pContextHandler
bool IsImmediateToolTip() const
virtual void MouseLeave(CMouse &rMouse)
void Draw3DFrame(C4TargetFacet &cgo, bool fUp=false, int32_t iIndent=1, BYTE byAlpha=C4GUI_BorderAlpha, bool fDrawTop=true, int32_t iTopOff=0, bool fDrawLeft=true, int32_t iLeftOff=0)
virtual void UpdateOwnPos()
void ScreenPos2ClientPos(int32_t &riX, int32_t &riY)
Dialog * GetFullscreenDialog(bool fIncludeFading)
static Screen * GetScreenS()
void SetPreferredDlgRect(const C4Rect &rtNewPref)
static void DrawToolTip(const char *szTip, C4TargetFacet &cgo, float guix, float guiy)
void ShowDialog(Dialog *pDlg, bool fFade)
void RecheckActiveDialog()
virtual bool CharIn(const char *c)
void UpdateGamepadGUIControlEnabled()
void Init(int32_t tx, int32_t ty, int32_t twdt, int32_t thgt)
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
void SetMouseInGUI(bool fInGUI, bool fByMouse)
void RenderMouse(C4TargetFacet &cgo)
void Draw(C4TargetFacet &cgo) override
bool HasFullscreenDialog(bool fIncludeFading)
void ActivateDialog(Dialog *pDlg)
Dialog * GetDialog(C4Window *pWindow)
void AbortContext(bool fByUser)
void ElementPosChanged(Element *pOfElement) override
void MouseMove(int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam, class C4Viewport *pVP)
void CloseDialog(Dialog *pDlg, bool fFade)
void CloseAllDialogs(bool fWithOK)
void RemoveElement(Element *pChild) override
int32_t GetMouseControlledDialogCount()
void SetPos(int32_t iXPos, int32_t iYPos)
void MouseInput(CMouse &rMouse, int32_t iButton, int32_t iX, int32_t iY, DWORD dwKeyParam) override
void Draw(C4TargetFacet &cgo) override
C4Rect & GetClientRect() override
C4LoaderScreen * pLoaderScreen
void Draw(C4Facet &cgo, Flag options=Flag::ALL, int iProgress=0, class C4LogBuffer *pLog=nullptr, int Process=0)
void SetOwnedMouse(bool fToVal)
int32_t GetMiddleX() const
int32_t GetMiddleY() const
bool Contains(int32_t iX, int32_t iY) const
void Set(int32_t iX, int32_t iY, int32_t iWdt, int32_t iHgt)
void Set(const C4Facet &cpy)
void MouseMoveToViewport(int32_t button, int32_t x, int32_t y, DWORD key_param)
std::tuple< std::string, int > BreakMessage(const char *szMsg, int iWdt, bool fCheckMarkup, float fZoom=1.0f)
bool GetTextExtent(const char *szText, int32_t &rsx, int32_t &rsy, bool fCheckMarkup=true)
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
const char * getData() const
void AppendChar(char cChar)
DWORD MakeColorReadableOnBlack(DWORD &rdwClr)
bool ExpandHotkeyMarkup(StdStrBuf &sText, uint32_t &rcHotkey, bool for_tooltip)
void GUISound(const char *szSound)
void SetHorizontal(C4Surface &rBySfc, int iHeight=0, int iBorderWidth=0)