00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00016
00017 #ifndef GUIMENU_H
00018 #define GUIMENU_H
00019
00020
00021 #include <Midad/Gui/GuiBase.h>
00022 #include <TGMenu.h>
00023
00024 #include <list>
00025 #include <map>
00026 #include <string>
00027
00028 class TGLayoutHints;
00029 class GuiMenu;
00030
00031 class GuiMenuEntry : public SigC::Object
00032 {
00033 TGMenuEntry* fMenuEntry;
00034 SigC::Signal0<void> fSig;
00035 public:
00036 GuiMenuEntry() : fMenuEntry(0) {}
00037 virtual ~GuiMenuEntry() { }
00038 void Connect(SigC::Slot0<void> s) { fSig.connect(s); }
00039 void Trigger() { fSig.emit(); }
00040 void SetEntry(TGMenuEntry* tgme) { fMenuEntry = tgme; }
00041 TGMenuEntry* GetEntry() { return fMenuEntry; }
00042 };
00043
00044 class GuiMenu : public TGPopupMenu, public GuiBase
00045 {
00046
00047 public:
00048
00049 typedef std::list<SigC::Ptr<GuiMenuEntry> > GuiMenuList;
00050 typedef std::list<SigC::Ptr<GuiMenu> > GuiSubMenuList;
00051
00052
00053 GuiMenu();
00054
00055 virtual ~GuiMenu() {
00056 fEntries.erase(fEntries.begin(),fEntries.end());
00057 }
00058
00059
00060 virtual void Activated(int id);
00061
00062
00063 GuiMenuList::iterator Add(const char* label);
00064 GuiMenuList::iterator Add(const char* label, SigC::Slot0<void> slot);
00065 GuiMenuList::iterator Add(const char* label, GuiMenu& menu);
00066 GuiMenuList::iterator Insert(GuiMenuList::iterator gmitr,
00067 const char* label);
00068 GuiMenuList::iterator Insert(GuiMenuList::iterator gmitr,
00069 const char* label,
00070 SigC::Slot0<void> slot);
00071 GuiMenuList::iterator Insert(GuiMenuList::iterator gmitr,
00072 const char* label,
00073 GuiMenu& menu);
00074
00075
00076
00077 void CheckEntry(GuiMenuList::iterator& mit, bool check_it = true);
00078 bool IsEntryChecked(GuiMenuList::iterator& mit);
00079 GuiMenuList& GetMenuList() { return fEntries; }
00080
00081
00082 void ClearAll();
00083
00084 private:
00085
00086 void CheckEntry(int) {}
00087 bool IsEntryChecked(int) { return false; }
00088
00089 GuiMenuList fEntries;
00090 GuiSubMenuList fSubMenus;
00091 };
00092
00093 class GuiMenuBar : public TGMenuBar, public GuiBase
00094 {
00095 public:
00096 typedef std::map<std::string,SigC::Ptr<GuiMenu> > GuiMenuMap;
00097 GuiMenuBar(TGWindow& parent);
00098
00099 virtual ~GuiMenuBar() { }
00100
00101 void AddMenu(GuiMenu& menu, const char* label);
00102 GuiMenu* MakeAddMenu(const char* label);
00103
00104 GuiMenu* GetMenu(const char* label);
00105 void RemoveMenu(const char* label);
00106
00107 private:
00108
00109 GuiMenuMap fMenuMap;
00110
00111 };
00112
00113 #endif // GUIMENU_H