Skip to content

Instantly share code, notes, and snippets.

@anaselli
Last active November 2, 2020 21:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anaselli/f243a82ab1dda0898b1334f5386e12b8 to your computer and use it in GitHub Desktop.
Save anaselli/f243a82ab1dda0898b1334f5386e12b8 to your computer and use it in GitHub Desktop.
MenuBar yui example
/*
* Copyright 2020 by Angelo Naselli <anaselli at linux dot it>
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the
* License, or (at your option) version 3.0 of the License. This library
* is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details. You should have received a copy of the GNU
* Lesser General Public License along with this library; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
// Menu Button example demonstrating also shortcut resolver.
//
// Compile with:
//
// g++ -I/usr/include/yui -lyui MenuBar-yui.cc -o MenuBar-yui
#include "YUI.h"
#include "YWidgetFactory.h"
#include "YDialog.h"
#include "YLayoutBox.h"
#include "YEvent.h"
#include "YExternalWidgets.h"
#include "YMenuButton.h"
#include "YPushButton.h"
#include "YLabel.h"
#include "YMenuItem.h"
#include "YExternalWidgets.h"
#include "YMenuBar.h"
#define YUILogComponent "YMenuBar"
#include "YUILog.h"
int main( int argc, char **argv )
{
// If you need logging uncommment next two lines
YUILog::setLogFileName( "/tmp/libyui-mga-examples.log" );
YUILog::enableDebugLogging();
YDialog * dialog = YUI::widgetFactory()->createPopupDialog();
YLayoutBox * vbox = YUI::widgetFactory()->createVBox( dialog );
YMenuBar *menuBar = YUI::widgetFactory()->createMenuBar(vbox);
YMenuItem *top = new YMenuItem("&Menu");
// "Enable submenu4" is disabled
YMenuItem *m1 = new YMenuItem(top, "&Enable submenu4");
m1->setEnabled(false);
YMenuItem *enM1Item = new YMenuItem(top, "&Enabler/disable Menu 1");
new YMenuItem(top, "submenu&3");
YMenuItem *m4 = new YMenuItem(top, "Enable &submen1");
YMenuItem *hideM2Item = new YMenuItem(top, "&Hide/Show Menu 2");
menuBar->addItem(top);
// "Menu 1" is disabled
YMenuItem *menu1Item = new YMenuItem("Menu &1");
new YMenuItem( new YMenuItem(menu1Item, "m&1"), "sm1" );
new YMenuItem(menu1Item, "m&2");
new YMenuItem(menu1Item, "m&3");
menu1Item->setEnabled(false);
menuBar->addItem(menu1Item);
// "Menu 2" is hidden at startup
YMenuItem *hiddenMenu = new YMenuItem("Menu &2");
YMenuItem *showNextMenuItem = new YMenuItem(hiddenMenu, "&Show/Hide next item");
YMenuItem *hiddenMenuItem = new YMenuItem( hiddenMenu, "&Hidden menu" );
hiddenMenuItem->setVisible(false);
hiddenMenu->setVisible(false);
menuBar->addItem(hiddenMenu);
YMenuItem* mItem = new YMenuItem("Menu &3");
YMenuItem *tmi = new YMenuItem(mItem, "m3 &1");
new YMenuItem( tmi, "sm1" );
new YMenuItem( tmi, "m3 sm2" );
new YMenuItem(mItem, "m3 &2");
new YMenuItem(mItem, "m3 &3");
new YMenuItem(mItem, "m3 &4");
new YMenuItem(mItem, "m3 &5");
new YMenuItem(mItem, "m3 &6");
new YMenuItem(mItem, "m3 &7");
new YMenuItem(mItem, "m3 &8");
new YMenuItem(mItem, "m3 &9");
new YMenuItem(mItem, "m3 &10");
new YMenuItem(mItem, "m3 &11");
new YMenuItem(mItem, "m3 &12");
menuBar->addItem(mItem);
mItem = new YMenuItem("Menu &4");
new YMenuItem(mItem, "m4 &1");
new YMenuItem(mItem, "m4 &2");
menuBar->addItem(mItem);
menuBar->resolveShortcutConflicts();
menuBar->rebuildMenuTree();
YLabel *label = YUI::widgetFactory()->createLabel( vbox, "Here you'll see chosen menu item " );
YLayoutBox * hbox = YUI::widgetFactory()->createHBox( vbox );
YPushButton* changeMenuButton = YUI::widgetFactory()->createPushButton( hbox, "&Change Menu");
YPushButton* quitButton = YUI::widgetFactory()->createPushButton( hbox, "&Quit");
YMenuItem *quitMenu = NULL;
while ( true )
{
YEvent * event = dialog->waitForEvent();
YEvent::EventType eventType = event->eventType();
if (eventType == YEvent::CancelEvent)
break;
else if (eventType == YEvent::MenuEvent)
{
YItem *item = event->item();
if (item)
{
label->setValue(item->label());
if (item == enM1Item)
{
menuBar->setItemEnabled(menu1Item, !menu1Item->isEnabled());
}
else if (item == m1)
{
menuBar->setItemEnabled(m4, true);
menuBar->setItemEnabled(m1, false);
}
else if (item == m4)
{
menuBar->setItemEnabled(m1, true);
menuBar->setItemEnabled(m4, false);
}
else if (item == showNextMenuItem)
{
menuBar->setItemVisible(hiddenMenuItem, !hiddenMenuItem->isVisible());
}
else if (item == hideM2Item)
{
menuBar->setItemVisible(hiddenMenu, !hiddenMenu->isVisible());
}
else if (item == quitMenu)
break;
}
}
else if (eventType == YEvent::WidgetEvent)
{
YWidget *wdg = event->widget();
if (wdg == (YWidget*)quitButton)
break;
else if (wdg == (YWidget*)changeMenuButton)
{
menuBar->startMultipleChanges();
menuBar->deleteAllItems();
menuBar->doneMultipleChanges();
changeMenuButton->setEnabled(false);
// next items have been removed but are still managed into loop
// this is a simple exmaple so let's avoid to test them wrongly
// setting to NULL
enM1Item = NULL;
hiddenMenu = NULL;
hiddenMenuItem = NULL;
showNextMenuItem = NULL;
m1 = m4 = NULL;
menu1Item = hideM2Item = NULL;
YItemCollection itemCollection;
YMenuItem* mItem = new YMenuItem("&File");
YMenuItem *tmi = new YMenuItem(mItem, "&New");
new YMenuItem( tmi, "New &1" , "document-new");
new YMenuItem( tmi, "New &2" , "contact-new");
mItem->addSeparator();
new YMenuItem(mItem, "&Open", "document-open.png");
mItem->addSeparator();
new YMenuItem(mItem, "&Save", "document-save.png");
new YMenuItem(mItem, "&Save as", "document-save-as");
mItem->addSeparator();
quitMenu = new YMenuItem(mItem, "&Quit", "application-exit");
itemCollection.push_back(mItem);
YMenuItem* mItem1 = new YMenuItem("&Edit");
new YMenuItem(mItem1, "&Undo", "edit-undo.png");
new YMenuItem(mItem1, "&Redo", "edit-redo.png");
mItem1->addSeparator();
new YMenuItem(mItem1, "Cu&t", "edit-cut.png");
new YMenuItem(mItem1, "&Copy", "edit-copy.png");
new YMenuItem(mItem1, "&Paste", "edit-paste.png");
itemCollection.push_back(mItem1);
menuBar->addItems(itemCollection);
menuBar->rebuildMenuTree();
}
}
}
dialog->destroy();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment