49 const char *szCommand, int32_t iCount,
C4Object *pObject,
const char *szInfoCaption,
50 C4ID idID,
const char *szCommand2,
bool fOwnValue, int32_t iValue, int32_t iStyle,
bool fIsSelectable)
51 :
C4GUI::Element(), Count(iCount), id(idID),
Object(pObject), pSymbolObj(nullptr), pSymbolGraphics(nullptr), dwSymbolClr(0u),
52 fOwnValue(fOwnValue), iValue(iValue), fSelected(false), iStyle(iStyle), pMenu(pMenu),
53 iIndex(iIndex), IsSelectable(fIsSelectable), TextDisplayProgress(-1)
81 while (riByVal && *szPos)
90 if(c ==
'{' && *szPos ==
'{')
93 if(end > 0 && szPos[end+1] ==
'}')
103 bool C4MenuItem::IsDragElement()
110 int32_t C4MenuItem::GetSymbolWidth(int32_t iForHeight)
114 return std::max(
Symbol.
Wdt * iForHeight / std::max(
Symbol.
Hgt, 1.0f),
static_cast<float>(iForHeight));
131 C4Facet cgoItemSymbol,cgoItemText;
132 cgoItemSymbol=cgoItemText=cgoOut;
134 if ((iSymWidth = GetSymbolWidth(cgoItemText.
Hgt)))
142 C4Facet cgoSymbolOut(cgoItemSymbol.
Surface, cgoItemSymbol.
X, cgoItemSymbol.
Y, cgoItemSymbol.
Wdt, cgoItemSymbol.
Wdt);
174 char cXChg=
'\0';
int iStopPos = 0;
186 if (cXChg)
Caption[iStopPos] = cXChg;
223 ParentClass::MouseInput(rMouse, iButton, iX, iY, dwKeyParam);
231 ParentClass::MouseEnter(rMouse);
304 return InitMenu(szEmpty, iExtra, iExtraData, iId, iStyle);
311 return InitMenu(szEmpty, iExtra, iExtraData, iId, iStyle);
314 bool C4Menu::InitMenu(
const char *szEmpty, int32_t iExtra, int32_t iExtraData, int32_t iId, int32_t iStyle)
338 int32_t iCount,
C4Object *pObject,
const char *szInfoCaption,
339 C4ID idID,
const char *szCommand2,
bool fOwnValue, int32_t iValue,
bool fIsSelectable)
343 C4MenuItem *pNew =
new C4MenuItem(
this,
ItemCount, szCaption,szCommand,iCount,pObject,szInfoCaption,idID,szCommand2,fOwnValue,iValue,
Style,fIsSelectable);
347 return AddItem(pNew, szCaption, szCommand, iCount, pObject, szInfoCaption, idID, szCommand2, fOwnValue, iValue, fIsSelectable);
351 int32_t iCount,
C4Object *pObject,
const char *szInfoCaption,
352 C4ID idID,
const char *szCommand2,
bool fOwnValue, int32_t iValue,
bool fIsSelectable)
356 C4MenuItem *pNew =
new C4MenuItem(
this,
ItemCount, szCaption,szCommand,iCount,pObject,szInfoCaption,idID,szCommand2,fOwnValue,iValue,
Style,fIsSelectable);
360 return AddItem(pNew, szCaption, szCommand, iCount, pObject, szInfoCaption, idID, szCommand2, fOwnValue, iValue, fIsSelectable);
364 int32_t iCount,
C4Object *pObject,
const char *szInfoCaption,
365 C4ID idID,
const char *szCommand2,
bool fOwnValue, int32_t iValue,
bool fIsSelectable)
369 C4MenuItem *pNew =
new C4MenuItem(
this,
ItemCount, szCaption,szCommand,iCount,pObject,szInfoCaption,idID,szCommand2,fOwnValue,iValue,
Style,fIsSelectable);
373 return AddItem(pNew, szCaption, szCommand, iCount, pObject, szInfoCaption, idID, szCommand2, fOwnValue, iValue, fIsSelectable);
377 int32_t iCount,
C4Object *pObject,
const char *szInfoCaption,
378 C4ID idID,
const char *szCommand2,
bool fOwnValue, int32_t iValue,
bool fIsSelectable)
382 C4MenuItem *pNew =
new C4MenuItem(
this,
ItemCount, szCaption,szCommand,iCount,pObject,szInfoCaption,idID,szCommand2,fOwnValue,iValue,
Style,fIsSelectable);
386 return AddItem(pNew, szCaption, szCommand, iCount, pObject, szInfoCaption, idID, szCommand2, fOwnValue, iValue, fIsSelectable);
389 bool C4Menu::AddItem(
C4MenuItem *pNew,
const char *szCaption,
const char *szCommand,
390 int32_t iCount,
C4Object *pObject,
const char *szInfoCaption,
391 C4ID idID,
const char *szCommand2,
bool fOwnValue, int32_t iValue,
bool fIsSelectable)
396 C4RCMenuAdd rc = { pObject ? pObject->
Number : -1, iCount, idID, fOwnValue, iValue, fIsSelectable };
404 if (!
ItemCount && (!szCaption || !*szCaption))
524 if (!iBy)
return false;
532 if (!Inside<int32_t>(iNewSel, 0,
ItemCount-1))
return false;
541 return !!
SetSelection(iNewSel, fAdjustPosition, fDoCalls);
620 if (iToHgt)
Lines=iToHgt;
641 for (
int i = 0; (pItem =
GetItem(i)); ++i)
652 int32_t iWdt,iHgt,iLargestTextWdt;
659 for (int32_t i=0; (pItem=
GetItem(i)); ++i)
665 iLargestTextWdt = std::max(iLargestTextWdt, iWdt);
788 ParentClass::Draw(cgo);
812 ParentClass::DrawElement(cgo);
874 bool fRefilled =
false;
879 if (!fSuccess)
return false;
898 while ((pItem =
GetItem(0)))
delete pItem;
920 {
Close(
false);
return false; }
935 if ((pSelection =
GetItem(iSel)))
972 bool fAnyItemUnfinished =
false;
997 if (pVP->IsViewportMenu(
this))
1019 if (pCurr->
GetBounds() != rcPortraitBounds)
1028 int32_t iMaxDlgOptionHeight = -1;
1031 while ((pCurr =
pNext))
1041 int32_t iWdt, iAvailWdt =
ItemWidth, iSymWdt;
1044 iSymWdt = std::min<int32_t>(pCurr->GetSymbolWidth(iAssumedItemHeight), iAvailWdt/2);
1048 if (!iSymWdt || rcNewBounds.
Hgt <= iAssumedItemHeight)
break;
1051 iAssumedItemHeight = rcNewBounds.
Hgt;
1056 if (iMaxDlgOptionHeight < 0)
1059 iMaxDlgOptionHeight = rcNewBounds.
Hgt;
1061 else if (rcNewBounds.
Hgt <= iMaxDlgOptionHeight)
1064 rcNewBounds.
Hgt = iMaxDlgOptionHeight;
1069 iMaxDlgOptionHeight = rcNewBounds.
Hgt;
1070 pNext = pFirstStack;
1077 assert(iWdt <= iAvailWdt);
1079 rcNewBounds.
y = yOff;
1080 yOff += rcNewBounds.
Hgt;
1087 rcNewBounds.
x += xOff;
1112 ParentClass::UpdateOwnPos();
1152 if (iPlayer ==
NO_OWNER)
return true;
1161 for (int32_t i=0; (pItem =
GetItem(i)); ++i)
1166 void C4Menu::AssertSurfaceNotUsed(
C4Surface *sfc)
1171 for (int32_t i=0; (pItem =
GetItem(i)); ++i)
C4Object * Object(C4PropList *_this)
const BYTE COM_MenuSelect
const BYTE COM_MenuEnterAll
const BYTE COM_MenuShowText
C4Def * C4Id2Def(C4ID id)
const int32_t C4FCT_Right
C4MouseControl MouseControl
C4GraphicsResource GraphicsResource
#define C4GUI_ScrollBarWdt
constexpr bool DEBUGREC_MENU
const int32_t C4MC_Button_RightUp
const int32_t C4MC_Button_LeftUp
const int32_t C4MC_Button_LeftDown
void AddDbgRec(C4RecordChunkType eType, const void *pData, int iSize)
void SReplaceChar(char *str, char fc, char tc)
int SCharPos(char cTarget, const char *szInStr, int iIndex)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
uint32_t GetNextCharacter(const char **pszString)
void Draw(C4Facet &cgo, DWORD iColor, C4Object *pObj, int32_t iPhaseX, int32_t iPhaseY, C4DrawTransform *trans)
int32_t GetValue(C4Object *pInBase, int32_t iBuyPlayer)
bool SubPrimaryClipper(int iX1, int iY1, int iX2, int iY2)
void DrawFrameDw(C4Surface *sfcDest, int x1, int y1, int x2, int y2, DWORD dwClr, float width=1.0f)
bool RestorePrimaryClipper()
void DrawBoxDw(C4Surface *sfcDest, int iX1, int iY1, int iX2, int iY2, DWORD dwClr)
bool StorePrimaryClipper()
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 DrawValue(C4Facet &cgo, int32_t iValue, int32_t iPhaseX=0, int32_t iPhaseY=0, int32_t iAlign=C4FCT_Center)
void DrawClr(C4Facet &cgo, bool fAspect=true, DWORD dwClr=0)
C4Facet Truncate(int32_t iAlign, int32_t iSize)
void GrabFrom(C4FacetSurface &rSource)
void Set(const C4Facet &cpy)
void AddElement(Element *pChild)
Element * GetElementByIndex(int32_t i)
void SetVisibility(bool fToValue) override
int32_t GetMarginTop() override
void SetTitle(const char *szToTitle, bool fShowCloseButton=true)
Element * GetNext() const
C4Rect GetContainedClientRect()
void SetBounds(const C4Rect &rcNewBound)
virtual void StartDragging(CMouse &rMouse, int32_t iX, int32_t iY, DWORD dwKeyParam)
void SetToolTip(const char *szNewTooltip, bool is_immediate=false)
void ClientPos2ScreenPos(int32_t &riX, int32_t &riY)
virtual void UpdateOwnPos()
static void DrawToolTip(const char *szTip, C4TargetFacet &cgo, float guix, float guiy)
void ShowDialog(Dialog *pDlg, bool fFade)
void RemoveElement(Element *pChild) override
void SetPos(int32_t iXPos, int32_t iYPos)
virtual int32_t GetMarginRight()
virtual int32_t GetMarginTop()
virtual int32_t GetMarginLeft()
virtual int32_t GetMarginBottom()
void SetIcon(const C4Facet &rfctIcon)
bool SkipTags(const char **ppText)
void DrawPicture(C4Facet &cgo, bool fSelected=false, C4DrawTransform *transform=nullptr)
C4Player * Get(int iPlayer) const
C4Viewport * GetFirstViewport()
int GetLineHeight() const
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)
const char * getData() const
const char * getPtr(size_t i) const