1 //
2 // "$Id$"
3 //
4 //    Demonstrate creating an Fl_Browser with icons - Greg Ercolano 10/07/09 (STR#1739)
5 //
6 //    Shows how one can add icons to items in a browser.
7 //
8 // Copyright 2009,2013 Greg Ercolano.
9 // Copyright 1998-2010 by Bill Spitzak and others.
10 //
11 // This library is free software. Distribution and use rights are outlined in
12 // the file "COPYING" which should have been included with this file.  If this
13 // file is missing or damaged, see the license at:
14 //
15 //     http://www.fltk.org/COPYING.php
16 //
17 // Please report all bugs and problems on the following page:
18 //
19 //     http://www.fltk.org/str.php
20 //
21 #include <FL/Fl.H>
22 #include <FL/Fl_Double_Window.H>
23 #include <FL/Fl_Browser.H>
24 #include <FL/Fl_Choice.H>
25 #include <FL/Fl_Image.H>
26 #include <FL/Fl_Pixmap.H>
27 
28 static const char *big[] = {                       // XPM
29   "50 34 4 1",
30   "  c #000000",
31   "o c #ff9900",
32   "@ c #ffffff",
33   "# c None",
34   "##################################################",
35   "###      ##############################       ####",
36   "### ooooo  ###########################  ooooo ####",
37   "### oo  oo  #########################  oo  oo ####",
38   "### oo   oo  #######################  oo   oo ####",
39   "### oo    oo  #####################  oo    oo ####",
40   "### oo     oo  ###################  oo     oo ####",
41   "### oo      oo                     oo      oo ####",
42   "### oo       oo  ooooooooooooooo  oo       oo ####",
43   "### oo        ooooooooooooooooooooo        oo ####",
44   "### oo     ooooooooooooooooooooooooooo    ooo ####",
45   "#### oo   ooooooo ooooooooooooo ooooooo   oo #####",
46   "####  oo oooooooo ooooooooooooo oooooooo oo  #####",
47   "##### oo oooooooo ooooooooooooo oooooooo oo ######",
48   "#####  o ooooooooooooooooooooooooooooooo o  ######",
49   "###### ooooooooooooooooooooooooooooooooooo #######",
50   "##### ooooooooo     ooooooooo     ooooooooo ######",
51   "##### oooooooo  @@@  ooooooo  @@@  oooooooo ######",
52   "##### oooooooo @@@@@ ooooooo @@@@@ oooooooo ######",
53   "##### oooooooo @@@@@ ooooooo @@@@@ oooooooo ######",
54   "##### oooooooo  @@@  ooooooo  @@@  oooooooo ######",
55   "##### ooooooooo     ooooooooo     ooooooooo ######",
56   "###### oooooooooooooo       oooooooooooooo #######",
57   "###### oooooooo@@@@@@@     @@@@@@@oooooooo #######",
58   "###### ooooooo@@@@@@@@@   @@@@@@@@@ooooooo #######",
59   "####### ooooo@@@@@@@@@@@ @@@@@@@@@@@ooooo ########",
60   "######### oo@@@@@@@@@@@@ @@@@@@@@@@@@oo ##########",
61   "########## o@@@@@@ @@@@@ @@@@@ @@@@@@o ###########",
62   "########### @@@@@@@     @     @@@@@@@ ############",
63   "############  @@@@@@@@@@@@@@@@@@@@@  #############",
64   "##############  @@@@@@@@@@@@@@@@@  ###############",
65   "################    @@@@@@@@@    #################",
66   "####################         #####################",
67   "##################################################",
68 };
69 
70 
71 static const char *med[] = {                       // XPM
72   "14 14 2 1",
73   "# c #000000",
74   "  c #ffffff",
75   "##############",
76   "##############",
77   "##          ##",
78   "##  ##  ##  ##",
79   "##  ##  ##  ##",
80   "##   ####   ##",
81   "##    ##    ##",
82   "##    ##    ##",
83   "##   ####   ##",
84   "##  ##  ##  ##",
85   "##  ##  ##  ##",
86   "##          ##",
87   "##############",
88   "##############",
89 };
90 
91 static const char *sml[] = {                       // XPM
92   "9 11 5 1",
93   ".  c None",
94   "@  c #000000",
95   "+  c #808080",
96   "r  c #802020",
97   "#  c #ff8080",
98   ".........",
99   ".........",
100   "@+.......",
101   "@@@+.....",
102   "@@r@@+...",
103   "@@##r@@+.",
104   "@@####r@@",
105   "@@##r@@+.",
106   "@@r@@+...",
107   "@@@+.....",
108   "@+.......",
109 };
110 
111 // Create a custom browser
112 //
113 //    You don't *have* to derive a class just to control icons in a browser,
114 //    but in final apps it's something you'd do to keep the implementation clean.
115 //
116 //    All it really comes down to is calling browser->icon() to define icons
117 //    for the items you want.
118 //
119 class MyBrowser : public Fl_Browser {
120   Fl_Image *big_icon;
121   Fl_Image *med_icon;
122   Fl_Image *sml_icon;
123 
124 public:
MyBrowser(int X,int Y,int W,int H,const char * L=0)125   MyBrowser(int X,int Y,int W,int H,const char *L=0) : Fl_Browser(X,Y,W,H,L) {
126 
127     // Create icons (these could also be pngs, jpegs..)
128     big_icon = new Fl_Pixmap(big);
129     med_icon = new Fl_Pixmap(med);
130     sml_icon = new Fl_Pixmap(sml);
131 
132     // Normal browser initialization stuff
133     textfont(FL_COURIER);
134     textsize(14);
135     type(FL_MULTI_BROWSER);
136     add("One");
137     add("Two");
138     add("Three");
139     add("Four");
140     add("Five");
141     add("Six");
142     add("Seven");
143   }
Choice_CB(Fl_Widget * w,void * d)144   static void Choice_CB(Fl_Widget*w, void *d) {
145     MyBrowser *mb = (MyBrowser*)d;
146     Fl_Choice *ch = (Fl_Choice*)w;
147 
148     // See which icon the user picked
149     Fl_Image *i = 0;
150 	 if ( strcmp(ch->text(), "None"  ) == 0 ) { i = 0; }
151     else if ( strcmp(ch->text(), "Small" ) == 0 ) { i = mb->sml_icon; }
152     else if ( strcmp(ch->text(), "Medium") == 0 ) { i = mb->med_icon; }
153     else if ( strcmp(ch->text(), "Large" ) == 0 ) { i = mb->big_icon; }
154 
155     // Change the icon of three browser items to what the user picked
156     //    This is all you have to do to change a browser item's icon.
157     //    The browser will automatically resize the items if need be.
158     mb->icon(3,i);
159     mb->icon(4,i);
160     mb->icon(5,i);
161   }
162 };
main()163 int main() {
164   Fl_Double_Window *w = new Fl_Double_Window(400,300);
165 
166   // Create a browser
167   MyBrowser *b = new MyBrowser(10,40,w->w()-20,w->h()-50);
168 
169   // Create a chooser to let the user change the icons
170   Fl_Choice *choice = new Fl_Choice(60,10,140,25,"Icon:");
171   choice->add("None");
172   choice->add("Small");
173   choice->add("Medium");
174   choice->add("Large");
175   choice->callback(MyBrowser::Choice_CB, (void*)b);
176   choice->take_focus();
177   choice->value(1); choice->do_callback();
178 
179   w->end();
180   w->show();
181   return(Fl::run());
182 }
183 
184 //
185 // End of "$Id$".
186 //
187