Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

pgmenubar.cpp

Go to the documentation of this file.
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         // check if we are visible
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 }

Generated on Tue Jun 24 01:27:48 2008 for Advanced Strategic Command by  doxygen 1.4.2