19 #include "wdlstring.h" 30 BEGIN_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); }
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; }
223 Item* GetItem(
int index)
225 int nItems = NItems();
227 if (index >= 0 && index < nItems)
229 return mMenuItems.Get(index);
237 Item* GetChosenItem()
239 return GetItem(mChosenItemIdx);
242 const char* GetItemText(
int index)
244 Item* pItem = GetItem(index);
246 return pItem->GetText();
251 void SetPrefix(
int count)
253 if (count >= 0 && count < 4)
259 void SetMultiCheck(
bool multicheck) { mCanMultiCheck = multicheck; }
261 void Clear(
bool resetEverything =
true)
266 mCanMultiCheck =
false;
269 mMenuItems.Empty(
true);
272 bool CheckItem(
int index,
bool state)
274 Item* pItem = mMenuItems.Get(index);
278 pItem->SetChecked(state);
284 void CheckItemAlone(
int index)
286 for (
int i = 0; i < mMenuItems.GetSize(); i++)
288 mMenuItems.Get(i)->SetChecked(i == index);
292 bool IsItemChecked(
int index)
294 Item* pItem = mMenuItems.Get(index);
297 return pItem->GetChecked();
302 void SetFunction(IPopupFunction func)
307 IPopupFunction GetFunction()
317 const char* GetRootTitle()
const 319 return mRootTitle.Get();
322 void SetRootTitle(
const char* rootTitle)
324 return mRootTitle.Set(rootTitle);
328 int mNItemsPerColumn = 0;
330 int mChosenItemIdx = -1;
332 WDL_PtrList<Item> mMenuItems;
333 IPopupFunction mPopupFunc =
nullptr;
334 WDL_String mRootTitle;
337 END_IGRAPHICS_NAMESPACE