00001 #include "pgmenubar.h"
00002 #include "pgbutton.h"
00003 #include "pgpopupmenu.h"
00004 #include "pglog.h"
00005 #include "pgapplication.h"
00006 #include "pgeventsupplier.h"
00007
00008 PG_MenuBar::PG_MenuBar(PG_Widget* parent, const PG_Rect& rect, const std::string& style) : PG_ThemeWidget(parent, rect, style) {
00009 my_btnOffsetY = 2;
00010 my_style = style;
00011 my_active = NULL;
00012 }
00013
00014 PG_MenuBar::~PG_MenuBar() {
00015 Cleanup();
00016 }
00017
00018 void PG_MenuBar::Add(const std::string& text, PG_PopupMenu* menu, Uint16 indent, Uint16 width) {
00019 MenuBarItem* last = NULL;
00020 Uint16 xpos = 0;
00021 Uint16 height = 0;
00022
00023 if(menu == NULL) {
00024 return;
00025 }
00026
00027 if(ItemList.size() > 0) {
00028 last = ItemList.back();
00029 }
00030
00031 if(last != NULL) {
00032 xpos = (last->button->x + last->button->w) - my_xpos;
00033 }
00034
00035 xpos += indent;
00036
00037 if(width == 0) {
00038 GetTextSize(width, height, text);
00039 width += 6;
00040 }
00041
00042 last = new MenuBarItem;
00043
00044 last->button = new PG_Button(
00045 this,
00046 PG_Rect(xpos, my_btnOffsetY, width, my_height - my_btnOffsetY*2),
00047 text, -1,
00048 my_style);
00049
00050 last->button->SetBehaviour( PG_Button::SIGNALONCLICK );
00051 last->button->SetFontSize(GetFontSize());
00052
00053 last->button->sigClick.connect(slot(*this, &PG_MenuBar::handle_button), (PG_Pointer)last);
00054 last->button->sigMouseLeave.connect(slot(*this, &PG_MenuBar::leaveButton), (PG_Pointer)last );
00055 last->button->sigMouseEnter.connect(slot(*this, &PG_MenuBar::enterButton), (PG_Pointer)last );
00056 last->button->activateHotkey( getHotkeyModifier() );
00057
00058 last->popupmenu = menu;
00059
00060 ItemList.push_back(last);
00061
00062 menu->sigSelectMenuItem.connect( SigC::slot( *this, &PG_MenuBar::deactivateItem ));
00063 }
00064
00065 bool PG_MenuBar::deactivateItem()
00066 {
00067 my_active->Hide();
00068 my_active = NULL;
00069 return true;
00070 }
00071
00072
00073 bool PG_MenuBar::leaveButton( PG_Pointer last ) {
00074 MenuBarItem* item = static_cast<MenuBarItem*>(last);
00075 if( my_active ) {
00076 if ( my_active->IsMouseInside() ) {
00077 my_active->trackMenu( item->button->x, item->button->y + item->button->h );
00078 } else {
00079 my_active->Hide();
00080 my_active = NULL;
00081 }
00082 }
00083 return true;
00084 }
00085
00086 bool PG_MenuBar::enterButton( PG_Pointer last ) {
00087 MenuBarItem* item = static_cast<MenuBarItem*>(last);
00088 int x, y;
00089 if ( PG_Application::GetEventSupplier()->GetMouseState(x,y) & SDL_BUTTON_LEFT ) {
00090 handle_button( item->button, last );
00091 }
00092 return true;
00093 }
00094
00095
00096 bool PG_MenuBar::handle_button(PG_Button* button, PG_Pointer last) {
00097 MenuBarItem* item = static_cast<MenuBarItem*>(last);
00098
00099
00100 if(item->popupmenu->IsVisible()) {
00101 item->popupmenu->Hide();
00102 my_active = NULL;
00103 return true;
00104 }
00105
00106 if(my_active != NULL) {
00107 my_active->Hide();
00108 my_active = NULL;
00109 }
00110
00111 my_active = item->popupmenu;
00112 my_active->openMenu(button->x, button->y + button->h);
00113
00114 return true;
00115 }
00116
00117 void PG_MenuBar::Cleanup() {
00118 for(std::vector<MenuBarItem*>::iterator i = ItemList.begin(); i != ItemList.end(); i = ItemList.begin()) {
00119 delete (*i)->button;
00120 delete (*i);
00121 ItemList.erase(i);
00122 }
00123 }