30BEGIN_IGRAPHICS_NAMESPACE
43#pragma mark - IPopupMenu::Item
56 Item(
const char* str,
int flags = kNoFlags,
int tag = -1)
71 void operator=(
const Item&) =
delete;
77 void SetText(
const char* str) { mText.Set(str); }
78 const char* GetText()
const {
return mText.Get(); };
80 bool GetEnabled()
const {
return !(mFlags & kDisabled); }
81 bool GetChecked()
const {
return (mFlags & kChecked) != 0; }
82 bool GetIsTitle()
const {
return (mFlags & kTitle) != 0; }
83 bool GetIsSeparator()
const {
return (mFlags & kSeparator) != 0; }
84 int GetTag()
const {
return mTag; }
85 IPopupMenu* GetSubmenu()
const {
return mSubmenu.get(); }
86 bool GetIsChoosable()
const
88 if(GetIsTitle())
return false;
89 if(GetIsSeparator())
return false;
90 if(GetSubmenu() !=
nullptr)
return false;
91 if(!GetEnabled())
return false;
96 void SetEnabled(
bool state) { SetFlag(kDisabled, !state); }
97 void SetChecked(
bool state) { SetFlag(kChecked, state); }
98 void SetTitle(
bool state) {SetFlag(kTitle, state); }
99 void SetSubmenu(
IPopupMenu* pSubmenu) { mSubmenu.reset(pSubmenu); }
102 void SetFlag(Flags flag,
bool state)
111 std::unique_ptr<IPopupMenu> mSubmenu;
118 IPopupMenu(
const char* rootTitle =
"",
int prefix = 0,
bool multicheck =
false,
const std::initializer_list<const char*>& items = {})
120 , mCanMultiCheck(multicheck)
121 , mRootTitle(rootTitle)
123 for (
auto& item : items)
127 IPopupMenu(
const char* rootTitle,
const std::initializer_list<const char*>& items, IPopupFunction func =
nullptr)
129 , mCanMultiCheck(false)
130 , mRootTitle(rootTitle)
132 for (
auto& item : items)
143 mMenuItems.Empty(
true);
146 static int Sortfunc(
const Item **a,
const Item **b)
148 return stricmp((*a)->GetText(),(*b)->GetText());
151 Item* AddItem(Item* pItem,
int index = -1)
154 mMenuItems.Add(pItem);
155 else if (index == -2)
156 mMenuItems.InsertSorted(pItem, Sortfunc);
158 mMenuItems.Insert(index, pItem);
163 Item* AddItem(
const char* str,
int index = -1,
int itemFlags = Item::kNoFlags) {
return AddItem(
new Item(str, itemFlags), index); }
165 Item* AddItem(
const char* str,
int index,
IPopupMenu* pSubmenu)
167 assert(pSubmenu->GetFunction() ==
nullptr);
170 pSubmenu->SetFunction(GetFunction());
172 return AddItem(
new Item(str, pSubmenu), index);
175 Item* AddItem(
const char* str,
IPopupMenu* pSubmenu,
int index = -1)
177 assert(pSubmenu->GetFunction() ==
nullptr);
180 pSubmenu->SetFunction(GetFunction());
182 return AddItem(
new Item(str, pSubmenu), index);
185 Item* AddSeparator(
int index = -1)
187 Item* pItem =
new Item (
"", Item::kSeparator);
188 return AddItem(pItem, index);
191 void RemoveEmptySubmenus()
193 int n = mMenuItems.GetSize();
195 WDL_PtrList<IPopupMenu::Item> toDelete;
197 for (
int i = 0; i < n; i++)
203 if(pSubmenu && pSubmenu->NItems() == 0)
209 for (
int i = 0; i < toDelete.GetSize(); i++)
211 mMenuItems.DeletePtr(toDelete.Get(i));
215 void SetChosenItemIdx(
int index) { mChosenItemIdx = index; };
216 int GetChosenItemIdx()
const {
return mChosenItemIdx; }
217 int NItems()
const {
return mMenuItems.GetSize(); }
218 int NItemsPerColumn()
const {
return mNItemsPerColumn; }
219 void SetNItemsPerColumn(
int nItemsPerColumn) { mNItemsPerColumn = nItemsPerColumn; }
220 int GetPrefix()
const {
return mPrefix; }
221 bool GetCanMultiCheck()
const {
return mCanMultiCheck; }
225 int n = mMenuItems.GetSize();
227 for (
int i = 0; i < n; i++)
241 Item* GetItem(
int index)
243 int nItems = NItems();
245 if (index >= 0 && index < nItems)
247 return mMenuItems.Get(index);
255 int GetIndexOfItem(Item* pItem)
const
257 return mMenuItems.Find(pItem);
260 Item* GetChosenItem()
262 return GetItem(mChosenItemIdx);
265 const char* GetItemText(
int index)
267 Item* pItem = GetItem(index);
269 return pItem->GetText();
274 void SetPrefix(
int count)
276 if (count >= 0 && count < 4)
282 void SetMultiCheck(
bool multicheck) { mCanMultiCheck = multicheck; }
284 void Clear(
bool resetEverything =
true)
288 SetChosenItemIdx(-1);
290 mCanMultiCheck =
false;
293 mMenuItems.Empty(
true);
296 bool CheckItem(
int index,
bool state)
298 Item* pItem = mMenuItems.Get(index);
302 pItem->SetChecked(state);
308 void CheckItemAlone(
int index)
310 for (
int i = 0; i < mMenuItems.GetSize(); i++)
312 mMenuItems.Get(i)->SetChecked(i == index);
316 void CheckItemWithText(
const char* str,
bool state =
true)
318 for (
int i = 0; i < mMenuItems.GetSize(); i++)
320 if (strcmp(mMenuItems.Get(i)->GetText(), str) == 0)
322 mMenuItems.Get(i)->SetChecked(state);
328 void CheckItemAlone(Item* pItemToCheck)
330 int n = mMenuItems.GetSize();
332 for (
int i = 0; i < n; i++)
335 pItem->SetChecked(
false);
340 pSubmenu->CheckItemAlone(pItemToCheck);
342 else if (pItem == pItemToCheck)
344 pItem->SetChecked(
true);
349 bool IsItemChecked(
int index)
351 Item* pItem = mMenuItems.Get(index);
354 return pItem->GetChecked();
359 void SetFunction(IPopupFunction func)
364 IPopupFunction GetFunction()
374 const char* GetRootTitle()
const
376 return mRootTitle.Get();
379 void SetRootTitle(
const char* rootTitle)
381 return mRootTitle.Set(rootTitle);
385 int mNItemsPerColumn = 0;
387 int mChosenItemIdx = -1;
389 WDL_PtrList<Item> mMenuItems;
390 IPopupFunction mPopupFunc =
nullptr;
391 WDL_String mRootTitle;
394END_IGRAPHICS_NAMESPACE