diff options
| author | Greg Ercolano <erco@seriss.com> | 2017-09-11 00:50:06 +0000 |
|---|---|---|
| committer | Greg Ercolano <erco@seriss.com> | 2017-09-11 00:50:06 +0000 |
| commit | 88204a55245d41d0cbcec4c8b0e946c38de92549 (patch) | |
| tree | 599f32abcdfcdf1cdb767bd0bca4a1ea8874b05f /examples | |
| parent | b0a222364225bd49eeff41e6f0dc380804f7ac4c (diff) | |
Added example code to demonstrate Fl_Multi_Label for STR#3400.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12440 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/Makefile | 1 | ||||
| -rw-r--r-- | examples/howto-menu-with-images.cxx | 214 |
2 files changed, 215 insertions, 0 deletions
diff --git a/examples/Makefile b/examples/Makefile index a7b2d3c01..4bd44c838 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -11,6 +11,7 @@ ALL = clipboard$(EXEEXT) \ howto-add_fd-and-popen$(EXEEXT) \ howto-browser-with-icons$(EXEEXT) \ howto-drag-and-drop$(EXEEXT) \ + howto-menu-with-images$(EXEEXT) \ howto-parse-args$(EXEEXT) \ howto-text-over-image-button$(EXEEXT) \ menubar-add$(EXEEXT) \ diff --git a/examples/howto-menu-with-images.cxx b/examples/howto-menu-with-images.cxx new file mode 100644 index 000000000..5df44507d --- /dev/null +++ b/examples/howto-menu-with-images.cxx @@ -0,0 +1,214 @@ +// "$Id$" +// vim: autoindent tabstop=2 shiftwidth=2 expandtab softtabstop=2 filetype=cpp +// +// How to use Fl_Multi_Label to make menu items with images and labels. +// +// Copyright 2017 Greg Ercolano. +// Copyright 1998-2017 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// http://www.fltk.org/COPYING.php +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +#include <FL/Fl.H> +#include <FL/Fl_Double_Window.H> +#include <FL/Fl_Menu_Bar.H> +#include <FL/Fl_Menu_Button.H> +#include <FL/Fl_Choice.H> +#include <FL/Fl_Multi_Label.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Box.H> +#include <FL/Fl_Pixmap.H> +#include <FL/fl_message.H> + +// Document icon +static const char *L_document_xpm[] = { + "13 11 3 1", + " c None", + "x c #d8d8f8", + "@ c #202060", + " @@@@@@@@@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @xxxxxxx@ ", + " @@@@@@@@@ "}; +static Fl_Pixmap L_document_pixmap(L_document_xpm); + +// Folder icon +static const char *L_folder_xpm[] = { + "13 11 3 1", + " c None", + "x c #d8d833", + "@ c #808011", + " ", + " @@@@ ", + " @xxxx@ ", + "@@@@@xxxx@@ ", + "@xxxxxxxxx@ ", + "@xxxxxxxxx@ ", + "@xxxxxxxxx@ ", + "@xxxxxxxxx@ ", + "@xxxxxxxxx@ ", + "@xxxxxxxxx@ ", + "@@@@@@@@@@@ "}; +static Fl_Pixmap L_folder_pixmap(L_folder_xpm); + +// Red "X" +static const char *L_redx_xpm[] = { + "13 11 5 1", + " c None", + "+ c #222222", + "x c #555555", + "- c #882222", + "@ c #ffffff", + " x+++x ", + " ++---++ ", + " ++-----++ ", + "++-@@-@@-++ ", + "++--@@@--++ ", + "++---@---++ ", + "++--@@@--++ ", + "++-@@-@@-++ ", + " ++-----++ ", + " ++---++ ", + " x+++x "}; +static Fl_Pixmap L_redx_pixmap(L_redx_xpm); + +// Handle the different menu items.. +void Menu_CB(Fl_Widget *w, void* data) { + const char *itemname = (const char*)data; // "New", "Open", etc + //DEBUG printf("Clicked on '%s'\n", itemname); + if ( strcmp(itemname, "New") == 0 ) { + fl_message("File/New would happen here.."); + } else if ( strcmp(itemname, "Open") == 0 ) { + fl_message("File/Open would happen here.."); + } else if ( strcmp(itemname, "Quit") == 0 ) { + exit(0); + } else if ( strcmp(itemname, "Copy") == 0 ) { + fl_message("Edit/Copy would happen here.."); + } else if ( strcmp(itemname, "Paste") == 0 ) { + fl_message("Edit/Paste would happen here.."); + } else { + fl_message("'Image' operation '%s'..", itemname); + } +} + +// ADD AN IMAGE IN FRONT OF ITEM'S TEXT +int AddItemToMenu(Fl_Menu_ *menu, // menu to add item to + const char *labeltext, // label text + int shortcut, // shortcut (e.g. FL_COMMAND+'a') + Fl_Callback *cb, // callback to invoke + void *userdata, // userdata for callback + Fl_Pixmap* pixmap) { // image (if any) to add to item + // Add a new menu item + int i = menu->add(labeltext, shortcut, cb, userdata); + + if ( !pixmap ) return i; + Fl_Menu_Item *item = (Fl_Menu_Item*)&(menu->menu()[i]); + const char *itemtext = item->label(); // keep item's label() -- item->image() clobbers it! + + // Assign image to menu item + item->image(*pixmap); // note: clobbers item->label() + + // Create a multi label, assign it an image + text + Fl_Multi_Label *ml = new Fl_Multi_Label; + + // Left side of label is image + ml->typea = _FL_IMAGE_LABEL; + ml->labela = (const char*)pixmap; + + // Right side of label is text + ml->typeb = FL_NORMAL_LABEL; + ml->labelb = itemtext; + + // Assign multilabel to item + ml->label(item); + + return i; +} + +// Create Menu Items +// This same technique works for Fl_Menu_ derived widgets, +// e.g. Fl_Menu_Bar, Fl_Menu_Button, Fl_Choice.. +// +void CreateMenuItems(Fl_Menu_* menu) { + + // Add items with LABLES AND IMAGES using Fl_Multi_Label.. + AddItemToMenu(menu, "File/New", FL_COMMAND+'n', Menu_CB, (void*)"New", &L_document_pixmap); + AddItemToMenu(menu, "File/Open", FL_COMMAND+'o', Menu_CB, (void*)"Open", &L_folder_pixmap); + AddItemToMenu(menu, "File/Quit", FL_COMMAND+'q', Menu_CB, (void*)"Quit", &L_redx_pixmap); + + // Create menu bar items with JUST LABELS + menu->add("Edit/Copy", FL_COMMAND+'c', Menu_CB, (void*)"Copy"); + menu->add("Edit/Paste", FL_COMMAND+'v', Menu_CB, (void*)"Paste"); + + // Create menu bar items with JUST IMAGES (no labels) + // This shows why you need Fl_Multi_Label; the item->label() + // gets clobbered by the item->image() setting. + // + int i; + Fl_Menu_Item *item; + + i = menu->add("Images/One", 0, Menu_CB, (void*)"One"); + item = (Fl_Menu_Item*)&(menu->menu()[i]); + item->image(L_document_pixmap); // note: this clobbers the item's label() + + i = menu->add("Images/Two", 0, Menu_CB, (void*)"Two"); + item = (Fl_Menu_Item*)&(menu->menu()[i]); + item->image(L_folder_pixmap); + + i = menu->add("Images/Three", 0, Menu_CB, (void*)"Three"); + item = (Fl_Menu_Item*)&(menu->menu()[i]); + item->image(L_redx_pixmap); +} + +int main() { + Fl_Double_Window *win = new Fl_Double_Window(400, 400, "Menu items with images"); + win->tooltip("Right click on window background\nfor popup menu"); + + // Help message + Fl_Box *box = new Fl_Box(100,100,200,200); + box->copy_label(win->tooltip()); + box->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + + // Menu bar + Fl_Menu_Bar *menubar = new Fl_Menu_Bar(0,0,win->w(), 25); + CreateMenuItems(menubar); + + // Right click context menu + Fl_Menu_Button *menubutt = new Fl_Menu_Button(0,25,win->w(), win->h()-25); + CreateMenuItems(menubutt); + menubutt->type(Fl_Menu_Button::POPUP3); + + // Chooser menu + Fl_Choice *choice = new Fl_Choice(140,50,200,25,"Choice"); + CreateMenuItems(choice); + choice->value(1); + + // TODO: Show complex labels with Fl_Multi_Label. From docs: + // + // "More complex labels might be constructed by setting labelb as another + // Fl_Multi_Label and thus chaining up a series of label elements." + // + + win->end(); + win->resizable(win); + win->show(); + return Fl::run(); +} + +// +// End of "$Id$". +// |
