Backported the fltk2.0 tooltips. This may be somewhat binary incompatable

as Fl_Widget::tooltip(x) is no longer an inline (though the previous version
will work if there is at least one call to the new one). It may be better
to just enable tooltips all the time. Also Fl_Tooltip::enable() is changed,
but few programs call that.


git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@2210 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Bill Spitzak 2002-05-13 05:05:11 +00:00
parent a35c5a6a2e
commit 80465e4bff
7 changed files with 227 additions and 244 deletions

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_Tooltip.H,v 1.16.2.7 2002/04/14 02:43:48 easysw Exp $"
// "$Id: Fl_Tooltip.H,v 1.16.2.8 2002/05/13 05:05:11 spitzak Exp $"
//
// Tooltip header file for the Fast Light Tool Kit (FLTK).
//
@ -23,59 +23,42 @@
// Please report all bugs and problems to "fltk-bugs@fltk.org".
//
#ifndef _Fl_Tooltip_H_
#define _Fl_Tooltip_H_
#ifndef Fl_Tooltip_H
#define Fl_Tooltip_H
#include <FL/Fl.H>
#include <FL/Fl_Widget.H>
class Fl_Tooltip_Box;
class Fl_Tooltip_Window;
class FL_EXPORT Fl_Tooltip {
friend class Fl_Tooltip_Box;
friend class Fl_Tooltip_Window;
friend class Fl_Widget;
static float delay_;
static Fl_Tooltip_Box *box;
static Fl_Tooltip_Window *window;
static Fl_Widget *widget;
static int shown;
static unsigned color_;
static int font_;
static int size_;
static void tooltip_timeout(void *);
static void tooltip_exit(Fl_Widget *);
static void (*tooltip_callback_)(void *);
static void (*tooltip_exit_)(void *);
public:
// These functions are user-called functions
static float delay() { return delay_; }
static void delay(float f) { delay_ = (f < 0.1f) ? 0.1f : f; }
static void delay(float f) { delay_ = f; }
static int enabled() { return enabled_; }
static void enable(int b = 1) { enabled_ = b;}
static void disable() { enabled_ = 0; }
static void (*enter)(Fl_Widget* w);
static void enter_area(Fl_Widget* w, int X, int Y, int W, int H, const char* tip);
static void (*exit)(Fl_Widget *w);
static int font() { return font_; }
static int size() { return size_; }
static void font(int i) { font_ = i; }
static void size(int s) { size_ = s; }
static void color(unsigned c) { color_ = c; }
static Fl_Color color() { return (Fl_Color)color_; }
static void enter(Fl_Widget *w);
static void exit(Fl_Widget *w);
static int enabled() {return tooltip_callback_ != 0;}
static void enable(int b = 1) {if (!b) enter(0); tooltip_callback_ = b ? tooltip_timeout : 0; tooltip_exit_ = b ? (void (*)(void *))tooltip_exit : 0;}
static void disable() {enter(0); tooltip_callback_ = 0; tooltip_exit_ = 0;}
static void textcolor(unsigned c) { textcolor_ = c; }
static Fl_Color textcolor() { return (Fl_Color)textcolor_; }
private:
static float delay_;
static int enabled_;
static unsigned color_;
static unsigned textcolor_;
static int font_;
static int size_;
};
#endif
//
// End of "$Id: Fl_Tooltip.H,v 1.16.2.7 2002/04/14 02:43:48 easysw Exp $".
// End of "$Id: Fl_Tooltip.H,v 1.16.2.8 2002/05/13 05:05:11 spitzak Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_Widget.H,v 1.6.2.4.2.13 2002/01/01 15:11:28 easysw Exp $"
// "$Id: Fl_Widget.H,v 1.6.2.4.2.14 2002/05/13 05:05:11 spitzak Exp $"
//
// Widget header file for the Fast Light Tool Kit (FLTK).
//
@ -143,7 +143,7 @@ public:
void deimage(Fl_Image* a) {label_.deimage=a;}
void deimage(Fl_Image& a) {label_.deimage=&a;}
const char *tooltip() const {return tooltip_;}
void tooltip(const char *t) {tooltip_=t;}
FL_EXPORT void tooltip(const char *t);
Fl_Callback_p callback() const {return callback_;}
void callback(Fl_Callback* c, void* p) {callback_=c; user_data_=p;}
void callback(Fl_Callback* c) {callback_=c;}
@ -207,5 +207,5 @@ public:
#endif
//
// End of "$Id: Fl_Widget.H,v 1.6.2.4.2.13 2002/01/01 15:11:28 easysw Exp $".
// End of "$Id: Fl_Widget.H,v 1.6.2.4.2.14 2002/05/13 05:05:11 spitzak Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl.cxx,v 1.24.2.41.2.26 2002/04/13 22:17:46 easysw Exp $"
// "$Id: Fl.cxx,v 1.24.2.41.2.27 2002/05/13 05:05:11 spitzak Exp $"
//
// Main event handling code for the Fast Light Tool Kit (FLTK).
//
@ -423,8 +423,8 @@ void Fl::belowmouse(Fl_Widget *o) {
if (grab()) return; // don't do anything while grab is on
Fl_Widget *p = belowmouse_;
if (o != p) {
if (!dnd_flag) Fl_Tooltip::enter(o);
belowmouse_ = o;
if (!dnd_flag) Fl_Tooltip::enter(o);
for (; p && !p->contains(o); p = p->parent()) {
p->handle(dnd_flag ? FL_DND_LEAVE : FL_LEAVE);
}
@ -440,6 +440,10 @@ Fl_Window *fl_xmousewin;// which window X thinks has FL_ENTER
Fl_Window *Fl::grab_; // most recent Fl::grab()
Fl_Window *Fl::modal_; // topmost modal() window
static void nothing(Fl_Widget *) {}
void (*Fl_Tooltip::enter)(Fl_Widget *) = nothing;
void (*Fl_Tooltip::exit)(Fl_Widget *) = nothing;
// Update modal(), focus() and other state according to system state,
// and send FL_ENTER, FL_LEAVE, FL_FOCUS, and/or FL_UNFOCUS events.
// This is the only function that produces these events in response
@ -550,7 +554,7 @@ int Fl::handle(int event, Fl_Window* window)
return 1;
case FL_PUSH:
if (!pushed()) Fl_Tooltip::enter(0);
Fl_Tooltip::enter((Fl_Widget*)0);
if (grab()) w = grab();
else if (modal() && w != modal()) return 0;
pushed_ = w;
@ -623,8 +627,6 @@ int Fl::handle(int event, Fl_Window* window)
e_number = event = FL_SHORTCUT;
case FL_SHORTCUT:
Fl_Tooltip::enter((Fl_Widget*)0);
if (grab()) {w = grab(); break;} // send it to grab window
// Try it as shortcut, sending to mouse widget and all parents:
@ -753,7 +755,7 @@ void Fl_Window::hide() {
delete x;
// Hide any visible tooltips...
Fl_Tooltip::enter(0);
//Fl_Tooltip::enter(0);
}
Fl_Window::~Fl_Window() {
@ -890,5 +892,5 @@ void Fl_Window::flush() {
}
//
// End of "$Id: Fl.cxx,v 1.24.2.41.2.26 2002/04/13 22:17:46 easysw Exp $".
// End of "$Id: Fl.cxx,v 1.24.2.41.2.27 2002/05/13 05:05:11 spitzak Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_Group.cxx,v 1.8.2.8.2.13 2002/05/10 00:18:37 easysw Exp $"
// "$Id: Fl_Group.cxx,v 1.8.2.8.2.14 2002/05/13 05:05:11 spitzak Exp $"
//
// Group widget for the Fast Light Tool Kit (FLTK).
//
@ -34,7 +34,6 @@
#include <FL/Fl_Window.H>
#include <FL/fl_draw.H>
#include <stdlib.h>
#include <FL/Fl_Tooltip.H> // tooltip
Fl_Group* Fl_Group::current_;
@ -139,11 +138,9 @@ int Fl_Group::handle(int event) {
return 0;
case FL_KEYBOARD:
Fl_Tooltip::exit(this); // tooltip
return navigation(navkey());
case FL_SHORTCUT:
Fl_Tooltip::exit(this); // tooltip
for (i = children(); i--;) {
o = a[i];
if (o->takesevents() && Fl::event_inside(o) && send(o,FL_SHORTCUT))
@ -158,8 +155,6 @@ int Fl_Group::handle(int event) {
return 0;
case FL_ENTER:
Fl_Tooltip::enter(this); // tooltip
case FL_MOVE:
for (i = children(); i--;) {
o = a[i];
@ -192,7 +187,6 @@ int Fl_Group::handle(int event) {
return 0;
case FL_PUSH:
Fl_Tooltip::exit(this); // tooltip
for (i = children(); i--;) {
o = a[i];
if (o->takesevents() && Fl::event_inside(o)) {
@ -235,9 +229,6 @@ int Fl_Group::handle(int event) {
}
return 1;
case FL_LEAVE: // tooltip
Fl_Tooltip::exit(this); // tooltip
default:
// For all other events, try to give to each child, starting at focus:
for (i = 0; i < children(); i ++)
@ -589,5 +580,5 @@ void Fl_Group::draw_outside_label(const Fl_Widget& w) const {
}
//
// End of "$Id: Fl_Group.cxx,v 1.8.2.8.2.13 2002/05/10 00:18:37 easysw Exp $".
// End of "$Id: Fl_Group.cxx,v 1.8.2.8.2.14 2002/05/13 05:05:11 spitzak Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_Tooltip.cxx,v 1.38.2.16 2002/05/02 15:02:31 easysw Exp $"
// "$Id: Fl_Tooltip.cxx,v 1.38.2.17 2002/05/13 05:05:11 spitzak Exp $"
//
// Tooltip source file for the Fast Light Tool Kit (FLTK).
//
@ -23,203 +23,158 @@
// Please report all bugs and problems to "fltk-bugs@fltk.org".
//
#include <FL/Fl.H>
#include <FL/Fl_Menu_Window.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Tooltip.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Menu_Window.H>
#include <stdio.h>
//
// Fl_Tooltip global variables...
//
void (*Fl_Tooltip::tooltip_callback_)(void *) = Fl_Tooltip::tooltip_timeout;
void (*Fl_Tooltip::tooltip_exit_)(void *) = (void (*)(void *))Fl_Tooltip::tooltip_exit;
float Fl_Tooltip::delay_ = 0.5;
Fl_Tooltip_Box *Fl_Tooltip::box = 0;
Fl_Tooltip_Window *Fl_Tooltip::window = 0;
Fl_Widget *Fl_Tooltip::widget = 0;
int Fl_Tooltip::shown = 0;
float Fl_Tooltip::delay_ = 1.0f;
int Fl_Tooltip::enabled_ = 1;
unsigned Fl_Tooltip::color_ = fl_color_cube(FL_NUM_RED - 1,
FL_NUM_GREEN - 1,
FL_NUM_BLUE - 2);
unsigned Fl_Tooltip::textcolor_ = FL_BLACK;
int Fl_Tooltip::font_ = FL_HELVETICA;
int Fl_Tooltip::size_ = FL_NORMAL_SIZE;
#define MAX_WIDTH 400
//
// Tooltip window class...
//
class Fl_Tooltip_Window : public Fl_Menu_Window {
public:
FL_EXPORT ~Fl_Tooltip_Window() {}
Fl_Tooltip_Window(int W, int H, const char *l = 0)
: Fl_Menu_Window(W,H,l) { set_override(); }
Fl_Tooltip_Window(int X, int Y, int W, int H, const char *l = 0)
: Fl_Menu_Window(X,Y,W,H,l) {}
};
//
// Tooltip label class...
//
class Fl_Tooltip_Box : public Fl_Box {
class Fl_TooltipBox : public Fl_Menu_Window {
public:
Fl_Tooltip_Box() : Fl_Box(0,0,10,10) {
color(Fl_Tooltip::color_);
align(FL_ALIGN_CENTER);
box(FL_BORDER_BOX);
Fl_Tooltip::widget = 0;
}
~Fl_Tooltip_Box() { }
void draw() {
tooltip(0); // Just in case
if (!Fl_Tooltip::widget || !Fl_Tooltip::widget->tooltip())
return;
Fl_Window *widgetWindow = Fl_Tooltip::widget->window();
if (!widgetWindow) {
// printf("!widgetWindow\n");
return;
}
int ww, hh;
ww = 0;
labelfont(Fl_Tooltip::font_);
labelsize(Fl_Tooltip::size_);
color(Fl_Tooltip::color_);
fl_font(Fl_Tooltip::font_, Fl_Tooltip::size_);
fl_measure(Fl_Tooltip::widget->tooltip(), ww, hh);
label(Fl_Tooltip::widget->tooltip());
int ox = Fl::event_x_root() + 10;
int oy = Fl::event_y_root() + 10;
if (ox >= (Fl::w() - ww - 6))
ox = Fl::w() - ww - 6;
if (oy >= (Fl::h() - hh - 6))
oy = widgetWindow->y_root() + Fl_Tooltip::widget->y() - hh - 6;
parent()->resize(ox, oy, ww+6, hh+6);
draw_box();
draw_label();
Fl_TooltipBox() : Fl_Menu_Window(0, 0) {
set_override();
end();
}
void draw();
void layout();
#ifdef _WIN32
// You have to destroy the window or it will not raise next time:
void hide() {destroy();}
#endif
};
static const char* tip;
static Fl_Widget* widget;
static Fl_TooltipBox *window = 0;
static int X,Y,W,H;
// This function is called by widgets
// when the pointer enters them
void
Fl_Tooltip::enter(Fl_Widget *w) {
// printf("Fl_Tooltip::enter(%p)\n", w);
// if (w) {
// printf(" label() = \"%s\"\n", w->label() ? w->label() : "(null)");
// printf(" visible() = %d\n", w->visible());
// printf(" active() = %d\n", w->active());
// }
Fl_Widget* temp = w;
while (temp && !temp->tooltip()) {
if (temp == window) return; // Don't do anything if pointed at tooltip
temp = temp->parent();
void Fl_TooltipBox::layout() {
fl_font(Fl_Tooltip::font(), Fl_Tooltip::size());
int ww, hh;
ww = MAX_WIDTH;
fl_measure(tip, ww, hh, FL_ALIGN_LEFT|FL_ALIGN_WRAP|FL_ALIGN_INSIDE);
ww += 6; hh += 6;
// find position on the screen of the widget:
int ox = Fl::event_x_root();
//int ox = X+W/2;
int oy = Y + H+2;
for (Fl_Widget* p = widget; p; p = p->window()) {
//ox += p->x();
oy += p->y();
}
if ((!w || !w->tooltip()) && tooltip_callback_) {
// puts("Hiding tooltip...");
Fl::remove_timeout(tooltip_callback_);
if (window) window->hide();
shown = 0;
return;
}
if (!tooltip_callback_ || !w || !w->tooltip()) return;
Fl::remove_timeout(tooltip_callback_);
if (window && window->shown()) (*tooltip_callback_)(w);
else Fl::add_timeout(delay_, tooltip_callback_, w);
}
// This function must be called when
// an event != FL_MOVE has occured in
// the widget
void
Fl_Tooltip::exit(Fl_Widget *w) {
// printf("Fl_Tooltip::exit(%p)\n", w);
if (tooltip_exit_) tooltip_exit_(w);
}
void
Fl_Tooltip::tooltip_exit(Fl_Widget *w) {
// printf("Fl_Tooltip::tooltip_exit(%p), widget = %p, window = %p, shown = %d\n",
// w, widget, window, shown);
if (!w || w != widget) return;
Fl::remove_timeout(tooltip_callback_);
widget = 0;
if (window) {
// puts("Hiding tooltip...");
window->hide();
shown = 0;
}
}
void
Fl_Tooltip::tooltip_timeout(void *v) {
// printf("Fl_Tooltip::tooltip_timeout(%p)\n", v);
if (!window) {
Fl_Group* saveCurrent = Fl_Group::current();
Fl_Group::current(0);
window = new Fl_Tooltip_Window(0, 0, 10, 10, 0);
window->clear_border();
window->box(FL_NO_BOX);
window->set_override();
window->begin();
box = new Fl_Tooltip_Box;
box->color(FL_YELLOW);
box->align(FL_ALIGN_CENTER);
window->resizable(box);
window->end();
Fl_Group::current(saveCurrent);
// printf("Fl_Tooltip::window = %p\n", window);
// printf("Fl_Tooltip::box = %p\n", box);
}
if (!v)
return;
if (shown && widget != (Fl_Widget *)v) {
tooltip_exit(widget);
}
widget = (Fl_Widget*) v;
Fl_Window *widgetWindow = widget->window();
if (widgetWindow) {
// puts("Showing tooltip");
window->show();
shown = 1;
if (ox+ww > Fl::w()) ox = Fl::w() - ww;
if (ox < 0) ox = 0;
if (H > 30) {
oy = Fl::event_y_root()+13;
if (oy+hh > Fl::h()) oy -= 23+hh;
} else {
widget = 0;
if (oy+hh > Fl::h()) oy -= (4+hh+H);
}
if (oy < 0) oy = 0;
resize(ox, oy, ww, hh);
}
void Fl_TooltipBox::draw() {
draw_box(FL_BORDER_BOX, 0, 0, w(), h(), Fl_Tooltip::color());
fl_color(Fl_Tooltip::textcolor());
fl_font(Fl_Tooltip::font(), Fl_Tooltip::size());
fl_draw(tip, 3, 3, w()-6, h()-6, Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_WRAP));
}
static char recent_tooltip;
static void recent_timeout(void*) {
recent_tooltip = 0;
}
static char recursion;
static void tooltip_timeout(void*) {
if (recursion) return;
recursion = 1;
if (!tip || !*tip) return;
//if (Fl::grab()) return;
if (!window) window = new Fl_TooltipBox;
// this cast bypasses the normal Fl_Window label() code:
((Fl_Widget*)window)->label(tip);
window->layout();
window->redraw();
window->show();
Fl::remove_timeout(recent_timeout);
recent_tooltip = 1;
recursion = 0;
}
// This is called when a widget is destroyed:
static void
tt_exit(Fl_Widget *w) {
if (w && w == widget) Fl_Tooltip::enter_area(0,0,0,0,0,0);
}
static void
tt_enter(Fl_Widget* widget) {
// find the enclosing group with a tooltip:
Fl_Widget* w = widget;
while (w && !w->tooltip()) {
if (w == window) return; // don't do anything if pointed at tooltip
w = w->parent();
}
if (!w) {
Fl_Tooltip::enter_area(0, 0, 0, 0, 0, 0);
} else {
Fl_Tooltip::enter_area(widget,0,0,widget->w(), widget->h(), w->tooltip());
}
}
void
Fl_Tooltip::enter_area(Fl_Widget* wid, int x,int y,int w,int h, const char* t)
{
if (recursion) return;
Fl::remove_timeout(tooltip_timeout);
Fl::remove_timeout(recent_timeout);
if (t && *t && enabled()) { // there is a tooltip
// do nothing if it is the same:
if (wid==widget && x==X && y==Y && w==W && h==H && t==tip) return;
// remember it:
widget = wid; X = x; Y = y; W = w; H = h; tip = t;
if (recent_tooltip || Fl_Tooltip::delay() < .1) {
// switch directly from a previous tooltip to the new one:
tooltip_timeout(0);
} else {
if (window) window->hide();
Fl::add_timeout(Fl_Tooltip::delay(), tooltip_timeout);
}
} else { // no tooltip
tip = 0;
widget = 0;
if (window) window->hide();
if (recent_tooltip) Fl::add_timeout(.2, recent_timeout);
}
}
void Fl_Widget::tooltip(const char *tt) {
static char beenhere = 0;
if (!beenhere) {
beenhere = 1;
Fl_Tooltip::enter = tt_enter;
Fl_Tooltip::exit = tt_exit;
}
tooltip_ = tt;
}
//
// End of "$Id: Fl_Tooltip.cxx,v 1.38.2.16 2002/05/02 15:02:31 easysw Exp $".
// End of "$Id: Fl_Tooltip.cxx,v 1.38.2.17 2002/05/13 05:05:11 spitzak Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: input.cxx,v 1.5.2.4.2.2 2002/01/01 15:11:33 easysw Exp $"
// "$Id: input.cxx,v 1.5.2.4.2.3 2002/05/13 05:05:11 spitzak Exp $"
//
// Input field test program for the Fast Light Tool Kit (FLTK).
//
@ -77,13 +77,18 @@ int main(int argc, char **argv) {
int y = 10;
input[0] = new Fl_Input(70,y,300,30,"Normal:"); y += 35;
input[0]->tooltip("Normal input field");
// input[0]->cursor_color(FL_SELECTION_COLOR);
// input[0]->maximum_size(20);
// input[0]->static_value("this is a testgarbage");
input[1] = new Fl_Float_Input(70,y,300,30,"Float:"); y += 35;
input[1]->tooltip("Input field for floating-point number");
input[2] = new Fl_Int_Input(70,y,300,30,"Int:"); y += 35;
input[2]->tooltip("Input field for integer number");
input[3] = new Fl_Secret_Input(70,y,300,30,"Secret:"); y += 35;
input[3]->tooltip("Input field for password");
input[4] = new Fl_Multiline_Input(70,y,300,100,"Multiline:"); y += 105;
input[4]->tooltip("Input field for short text with newlines");
for (int i = 0; i < 4; i++) {
input[i]->when(0); input[i]->callback(cb);
@ -93,24 +98,32 @@ int main(int argc, char **argv) {
Fl_Button *b;
b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_&CHANGED");
b->callback(toggle_cb, FL_WHEN_CHANGED); y += 25;
b->tooltip("Do callback each time the text changes");
b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_&RELEASE");
b->callback(toggle_cb, FL_WHEN_RELEASE); y += 25;
b->tooltip("Do callback when widget loses focus");
b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_&ENTER_KEY");
b->callback(toggle_cb, FL_WHEN_ENTER_KEY); y += 25;
b->tooltip("Do callback when user hits Enter key");
b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_&NOT_CHANGED");
b->callback(toggle_cb, FL_WHEN_NOT_CHANGED); y += 25;
b->tooltip("Do callback even if the text is not changed");
y += 5;
b = new Fl_Button(10,y,200,25,"&print changed()");
b->callback(button_cb);
b->tooltip("Print widgets that have changed() flag set");
b = new Fl_Button(220,y1,100,25,"color"); y1 += 25;
b->color(input[0]->color()); b->callback(color_cb, (void*)0);
b->tooltip("Color behind the text");
b = new Fl_Button(220,y1,100,25,"selection_color"); y1 += 25;
b->color(input[0]->selection_color()); b->callback(color_cb, (void*)1);
b->labelcolor(fl_contrast(FL_BLACK,b->color()));
b->tooltip("Color behind selected text");
b = new Fl_Button(220,y1,100,25,"textcolor"); y1 += 25;
b->color(input[0]->textcolor()); b->callback(color_cb, (void*)2);
b->labelcolor(fl_contrast(FL_BLACK,b->color()));
b->tooltip("Color of the text");
window->end();
window->show(argc,argv);
@ -118,5 +131,5 @@ int main(int argc, char **argv) {
}
//
// End of "$Id: input.cxx,v 1.5.2.4.2.2 2002/01/01 15:11:33 easysw Exp $".
// End of "$Id: input.cxx,v 1.5.2.4.2.3 2002/05/13 05:05:11 spitzak Exp $".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: symbols.cxx,v 1.4.2.3.2.2 2002/01/01 15:11:33 easysw Exp $"
// "$Id: symbols.cxx,v 1.4.2.3.2.3 2002/05/13 05:05:11 spitzak Exp $"
//
// Symbol test program for the Fast Light Tool Kit (FLTK).
//
@ -26,19 +26,46 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <FL/Fl.H>
#include <FL/Fl_Single_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Value_Slider.H>
#include <FL/fl_draw.H>
int N = 0;
#define W 60
#define H 60
#define W 70
#define H 70
#define ROWS 5
#define COLS 5
Fl_Window *window;
void slider_cb(Fl_Widget *w, void *data) {
static char buf[80];
int val = (int)(((Fl_Value_Slider*)w)->value());
Fl_Window *win = (Fl_Window*)w->parent(); // get parent window
for (int i = win->children(); i--; ) { // all window children
Fl_Widget *wc = win->child(i);
const char *l = wc->label();
if ( *l == '@' ) { // all children with '@'
if ( *(++l) == '@' ) { // ascii legend?
l++;
while (isdigit(*l)) { l++; }
if (val == 0) { sprintf(buf, "@@%s", l); }
else { sprintf(buf, "@@%d%s", val, l); }
} else { // box with symbol
while (isdigit(*l)) { l++; }
if (val == 0) { sprintf(buf, "@%s", l); }
else { sprintf(buf, "@%d%s", val, l); }
}
free((void*)(wc->label()));
wc->label(strdup(buf));
}
}
win->redraw();
}
void bt(const char *name) {
int x = N%COLS;
int y = N/COLS;
@ -50,12 +77,12 @@ void bt(const char *name) {
Fl_Box *a = new Fl_Box(FL_NO_BOX,x,y,W-20,H-20,strdup(buf));
a->align(FL_ALIGN_BOTTOM);
a->labelsize(11);
Fl_Box *b = new Fl_Box(FL_UP_BOX,x,y,W-20,H-20,name);
Fl_Box *b = new Fl_Box(FL_UP_BOX,x,y,W-20,H-20,strdup(name));
b->labelcolor(FL_DARK3);
}
int main(int argc, char ** argv) {
window = new Fl_Single_Window(COLS*W,ROWS*H+20);
window = new Fl_Single_Window(COLS*W,ROWS*H+60);
bt("@->");
bt("@>");
bt("@>>");
@ -81,11 +108,23 @@ bt("@line");
bt("@menu");
bt("@UpArrow");
bt("@DnArrow");
Fl_Value_Slider slider((int)(window->w()*.10+.5),
window->h()-40,
(int)(window->w()*.80+.5),
16,
"Orientation");
slider.type(FL_HORIZONTAL);
slider.range(0.0, 9.0);
slider.value(0.0);
slider.step(1);
slider.callback(slider_cb, &slider);
window->resizable(window);
window->show(argc,argv);
return Fl::run();
}
//
// End of "$Id: symbols.cxx,v 1.4.2.3.2.2 2002/01/01 15:11:33 easysw Exp $".
// End of "$Id: symbols.cxx,v 1.4.2.3.2.3 2002/05/13 05:05:11 spitzak Exp $".
//