30BEGIN_IGRAPHICS_NAMESPACE
43#pragma mark - IPopupMenu::Item
57 Item(
const char* str,
int flags = kNoFlags,
int tag = -1)
72 void operator=(
const Item&) =
delete;
78 void SetText(
const char* str) { mText.Set(str); }
79 const char* GetText()
const {
return mText.Get(); };
81 bool GetEnabled()
const {
return !(mFlags & kDisabled); }
82 bool GetChecked()
const {
return (mFlags & kChecked) != 0; }
83 bool GetIsTitle()
const {
return (mFlags & kTitle) != 0; }
84 bool GetIsSeparator()
const {
return (mFlags & kSeparator) != 0; }
85 bool GetIsDeletable()
const {
return (mFlags & kDeletable) != 0; }
86 int GetTag()
const {
return mTag; }
87 IPopupMenu* GetSubmenu()
const {
return mSubmenu.get(); }
88 bool GetIsChoosable()
const
90 if(GetIsTitle())
return false;
91 if(GetIsSeparator())
return false;
92 if(GetSubmenu() !=
nullptr)
return false;
93 if(!GetEnabled())
return false;
98 void SetEnabled(
bool state) { SetFlag(kDisabled, !state); }
99 void SetChecked(
bool state) { SetFlag(kChecked, state); }
100 void SetDeletable(
bool state) { SetFlag(kDeletable, state); }
101 void SetTitle(
bool state) {SetFlag(kTitle, state); }
102 void SetSubmenu(
IPopupMenu* pSubmenu) { mSubmenu.reset(pSubmenu); }
105 void SetFlag(Flags flag,
bool state)
114 std::unique_ptr<IPopupMenu> mSubmenu;
121 IPopupMenu(
const char* rootTitle =
"",
int prefix = 0,
bool multicheck =
false,
const std::initializer_list<const char*>& items = {})
123 , mCanMultiCheck(multicheck)
124 , mRootTitle(rootTitle)
126 for (
auto& item : items)
130 IPopupMenu(
const char* rootTitle,
const std::initializer_list<const char*>& items, IPopupFunction func =
nullptr)
132 , mCanMultiCheck(false)
133 , mRootTitle(rootTitle)
135 for (
auto& item : items)
146 mMenuItems.Empty(
true);
149 static int Sortfunc(
const Item* a,
const Item* b)
151 return stricmp(a->GetText(), b->GetText());
154 Item* AddItem(Item* pItem,
int index = -1)
157 mMenuItems.Add(pItem);
158 else if (index == -2)
159 mMenuItems.InsertSorted(pItem, Sortfunc);
161 mMenuItems.Insert(index, pItem);
166 Item* AddItem(
const char* str,
int index = -1,
int itemFlags = Item::kNoFlags) {
return AddItem(
new Item(str, itemFlags), index); }
168 Item* AddItem(
const char* str,
int index,
IPopupMenu* pSubmenu)
170 assert(pSubmenu->GetFunction() ==
nullptr);
173 pSubmenu->SetFunction(GetFunction());
175 return AddItem(
new Item(str, pSubmenu), index);
178 Item* AddItem(
const char* str,
IPopupMenu* pSubmenu,
int index = -1)
180 assert(pSubmenu->GetFunction() ==
nullptr);
183 pSubmenu->SetFunction(GetFunction());
185 return AddItem(
new Item(str, pSubmenu), index);
188 Item* AddSeparator(
int index = -1)
190 Item* pItem =
new Item (
"", Item::kSeparator);
191 return AddItem(pItem, index);
194 void RemoveEmptySubmenus()
196 int n = mMenuItems.GetSize();
198 WDL_PtrList<IPopupMenu::Item> toDelete;
200 for (
int i = 0; i < n; i++)
206 if(pSubmenu && pSubmenu->NItems() == 0)
212 for (
int i = 0; i < toDelete.GetSize(); i++)
214 mMenuItems.DeletePtr(toDelete.Get(i));
218 void SetChosenItemIdx(
int index) { mChosenItemIdx = index; };
219 int GetChosenItemIdx()
const {
return mChosenItemIdx; }
220 int NItems()
const {
return mMenuItems.GetSize(); }
221 int NItemsPerColumn()
const {
return mNItemsPerColumn; }
222 void SetNItemsPerColumn(
int nItemsPerColumn) { mNItemsPerColumn = nItemsPerColumn; }
223 int GetPrefix()
const {
return mPrefix; }
224 bool GetCanMultiCheck()
const {
return mCanMultiCheck; }
228 int n = mMenuItems.GetSize();
230 for (
int i = 0; i < n; i++)
244 Item* GetItem(
int index)
246 int nItems = NItems();
248 if (index >= 0 && index < nItems)
250 return mMenuItems.Get(index);
258 int GetIndexOfItem(Item* pItem)
const
260 return mMenuItems.Find(pItem);
263 Item* GetChosenItem()
265 return GetItem(mChosenItemIdx);
268 const char* GetItemText(
int index)
270 Item* pItem = GetItem(index);
272 return pItem->GetText();
277 void SetPrefix(
int count)
279 if (count >= 0 && count < 4)
285 void SetMultiCheck(
bool multicheck) { mCanMultiCheck = multicheck; }
287 void Clear(
bool resetEverything =
true)
291 SetChosenItemIdx(-1);
293 mCanMultiCheck =
false;
296 mMenuItems.Empty(
true);
299 bool CheckItem(
int index,
bool state)
301 Item* pItem = mMenuItems.Get(index);
305 pItem->SetChecked(state);
311 void CheckItemAlone(
int index)
313 for (
int i = 0; i < mMenuItems.GetSize(); i++)
315 mMenuItems.Get(i)->SetChecked(i == index);
319 void CheckItemWithText(
const char* str,
bool state =
true)
321 for (
int i = 0; i < mMenuItems.GetSize(); i++)
323 if (strcmp(mMenuItems.Get(i)->GetText(), str) == 0)
325 mMenuItems.Get(i)->SetChecked(state);
331 void CheckItemAlone(Item* pItemToCheck)
333 int n = mMenuItems.GetSize();
335 for (
int i = 0; i < n; i++)
338 pItem->SetChecked(
false);
343 pSubmenu->CheckItemAlone(pItemToCheck);
345 else if (pItem == pItemToCheck)
347 pItem->SetChecked(
true);
352 bool IsItemChecked(
int index)
354 Item* pItem = mMenuItems.Get(index);
357 return pItem->GetChecked();
362 void SetFunction(IPopupFunction func)
367 IPopupFunction GetFunction()
377 const char* GetRootTitle()
const
379 return mRootTitle.Get();
382 void SetRootTitle(
const char* rootTitle)
384 return mRootTitle.Set(rootTitle);
388 int mNItemsPerColumn = 0;
390 int mChosenItemIdx = -1;
392 WDL_PtrList<Item> mMenuItems;
393 IPopupFunction mPopupFunc =
nullptr;
394 WDL_String mRootTitle;
397END_IGRAPHICS_NAMESPACE