summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Ercolano <erco@seriss.com>2017-09-11 00:50:06 +0000
committerGreg Ercolano <erco@seriss.com>2017-09-11 00:50:06 +0000
commit88204a55245d41d0cbcec4c8b0e946c38de92549 (patch)
tree599f32abcdfcdf1cdb767bd0bca4a1ea8874b05f
parentb0a222364225bd49eeff41e6f0dc380804f7ac4c (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
-rw-r--r--examples/Makefile1
-rw-r--r--examples/howto-menu-with-images.cxx214
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$".
+//