FLTK 1.4.0
Fl_Tabs Class Reference

The Fl_Tabs widget is a container widget that displays a set of tabs, with each tab representing a different child widget. More...

#include <Fl_Tabs.H>

Inheritance diagram for Fl_Tabs:
Fl_Group Fl_Widget

Public Types

enum  { OVERFLOW_COMPRESS = 0 , OVERFLOW_CLIP , OVERFLOW_PULLDOWN , OVERFLOW_DRAG }
 

Public Member Functions

void client_area (int &rx, int &ry, int &rw, int &rh, int tabh=0)
 Returns the position and size available to be used by its children. More...
 
 Fl_Tabs (int X, int Y, int W, int H, const char *L=0)
 Creates a new Fl_Tabs widget using the given position, size, and label string. More...
 
int handle (int) FL_OVERRIDE
 Handle all events in the tabs area and forward the rest to the selected child. More...
 
void handle_overflow (int ov)
 Set a method to handle an overflowing tab bar. More...
 
Fl_Widgetpush () const
 Returns the tab group for the tab the user has currently down-clicked on and remains over until FL_RELEASE. More...
 
int push (Fl_Widget *)
 This is called by the tab widget's handle() method to set the tab group widget the user last FL_PUSH'ed on. More...
 
Fl_Align tab_align () const
 Gets the tab label alignment. More...
 
void tab_align (Fl_Align a)
 Sets the tab label alignment. More...
 
Fl_Widgetvalue ()
 Gets the currently visible widget/tab. More...
 
int value (Fl_Widget *)
 Sets the widget to become the current visible widget/tab. More...
 
virtual Fl_Widgetwhich (int event_x, int event_y)
 Return a pointer to the child widget with a tab at the given coordinates. More...
 
virtual ~Fl_Tabs ()
 Delete allocated resources and destroy all children.
 
- Public Member Functions inherited from Fl_Group
Fl_Widget *& _ddfdesign_kludge ()
 This is for forms compatibility only.
 
void add (Fl_Widget &)
 The widget is removed from its current group (if any) and then added to the end of this group.
 
void add (Fl_Widget *o)
 See void Fl_Group::add(Fl_Widget &w)
 
void add_resizable (Fl_Widget &o)
 Adds a widget to the group and makes it the resizable widget.
 
Fl_Widget *const * array () const
 Returns a pointer to the array of children. More...
 
Fl_Group const * as_group () const FL_OVERRIDE
 
Fl_Groupas_group () FL_OVERRIDE
 Returns an Fl_Group pointer if this widget is an Fl_Group. More...
 
void begin ()
 Sets the current group so you can build the widget tree by just constructing the widgets. More...
 
Fl_Widgetchild (int n) const
 Returns array()[n]. More...
 
int children () const
 Returns how many child widgets the group has.
 
void clear ()
 Deletes all child widgets from memory recursively. More...
 
unsigned int clip_children ()
 Returns the current clipping mode. More...
 
void clip_children (int c)
 Controls whether the group widget clips the drawing of child widgets to its bounding box. More...
 
virtual int delete_child (int n)
 Removes the widget at index from the group and deletes it. More...
 
void end ()
 Exactly the same as current(this->parent()). More...
 
int find (const Fl_Widget &o) const
 See int Fl_Group::find(const Fl_Widget *w) const.
 
int find (const Fl_Widget *) const
 Searches the child array for the widget and returns the index. More...
 
 Fl_Group (int, int, int, int, const char *=0)
 Creates a new Fl_Group widget using the given position, size, and label string. More...
 
void focus (Fl_Widget *W)
 
void forms_end ()
 This is for forms compatibility only.
 
int handle (int) FL_OVERRIDE
 Handles the specified event. More...
 
void init_sizes ()
 Resets the internal array of widget sizes and positions. More...
 
void insert (Fl_Widget &, int i)
 The widget is removed from its current group (if any) and then inserted into this group. More...
 
void insert (Fl_Widget &o, Fl_Widget *before)
 This does insert(w, find(before)). More...
 
void remove (Fl_Widget &)
 Removes a widget from the group but does not delete it. More...
 
void remove (Fl_Widget *o)
 Removes the widget o from the group. More...
 
void remove (int index)
 Removes the widget at index from the group but does not delete it. More...
 
Fl_Widgetresizable () const
 Returns the group's resizable widget. More...
 
void resizable (Fl_Widget &o)
 Sets the group's resizable widget. More...
 
void resizable (Fl_Widget *o)
 The resizable widget defines both the resizing box and the resizing behavior of the group and its children. More...
 
void resize (int, int, int, int) FL_OVERRIDE
 Resizes the Fl_Group widget and all of its children. More...
 
virtual ~Fl_Group ()
 The destructor also deletes all the children. More...
 
- Public Member Functions inherited from Fl_Widget
void _clear_fullscreen ()
 
void _set_fullscreen ()
 
void activate ()
 Activates the widget. More...
 
unsigned int active () const
 Returns whether the widget is active. More...
 
int active_r () const
 Returns whether the widget and all of its parents are active. More...
 
Fl_Align align () const
 Gets the label alignment. More...
 
void align (Fl_Align alignment)
 Sets the label alignment. More...
 
long argument () const
 Gets the current user data (long) argument that is passed to the callback function. More...
 
void argument (long v)
 Sets the current user data (long) argument that is passed to the callback function. More...
 
virtual class Fl_Gl_Windowas_gl_window ()
 Returns an Fl_Gl_Window pointer if this widget is an Fl_Gl_Window. More...
 
virtual class Fl_Gl_Window const * as_gl_window () const
 
virtual Fl_Groupas_group ()
 Returns an Fl_Group pointer if this widget is an Fl_Group. More...
 
virtual Fl_Group const * as_group () const
 
virtual Fl_Windowas_window ()
 Returns an Fl_Window pointer if this widget is an Fl_Window. More...
 
virtual Fl_Window const * as_window () const
 
void bind_deimage (Fl_Image *img)
 Sets the image to use as part of the widget label when in the inactive state. More...
 
void bind_deimage (int f)
 Bind the inactive image to the widget, so the widget will delete the image when it is no longer needed. More...
 
void bind_image (Fl_Image *img)
 Sets the image to use as part of the widget label when in the active state. More...
 
void bind_image (int f)
 Bind the image to the widget, so the widget will delete the image when it is no longer needed. More...
 
Fl_Boxtype box () const
 Gets the box type of the widget. More...
 
void box (Fl_Boxtype new_box)
 Sets the box type for the widget. More...
 
Fl_Callback_p callback () const
 Gets the current callback function for the widget. More...
 
void callback (Fl_Callback *cb)
 Sets the current callback function for the widget. More...
 
void callback (Fl_Callback *cb, Fl_Callback_User_Data *p, bool auto_free)
 Sets the current callback function and managed user data for the widget. More...
 
void callback (Fl_Callback *cb, void *p)
 Sets the current callback function and data for the widget. More...
 
void callback (Fl_Callback0 *cb)
 Sets the current callback function for the widget. More...
 
void callback (Fl_Callback1 *cb, long p=0)
 Sets the current callback function for the widget. More...
 
unsigned int changed () const
 Checks if the widget value changed since the last callback. More...
 
void clear_active ()
 Marks the widget as inactive without sending events or changing focus. More...
 
void clear_changed ()
 Marks the value of the widget as unchanged. More...
 
void clear_damage (uchar c=0)
 Clears or sets the damage flags. More...
 
void clear_output ()
 Sets a widget to accept input. More...
 
void clear_visible ()
 Hides the widget. More...
 
void clear_visible_focus ()
 Disables keyboard focus navigation with this widget. More...
 
Fl_Color color () const
 Gets the background color of the widget. More...
 
void color (Fl_Color bg)
 Sets the background color of the widget. More...
 
void color (Fl_Color bg, Fl_Color sel)
 Sets the background and selection color of the widget. More...
 
Fl_Color color2 () const
 For back compatibility only. More...
 
void color2 (unsigned a)
 For back compatibility only. More...
 
int contains (const Fl_Widget *w) const
 Checks if w is a child of this widget. More...
 
void copy_label (const char *new_label)
 Sets the current label. More...
 
void copy_tooltip (const char *text)
 Sets the current tooltip text. More...
 
uchar damage () const
 Returns non-zero if draw() needs to be called. More...
 
void damage (uchar c)
 Sets the damage bits for the widget. More...
 
void damage (uchar c, int x, int y, int w, int h)
 Sets the damage bits for an area inside the widget. More...
 
int damage_resize (int, int, int, int)
 Internal use only.
 
void deactivate ()
 Deactivates the widget. More...
 
Fl_Imagedeimage ()
 Gets the image that is used as part of the widget label when in the inactive state. More...
 
const Fl_Imagedeimage () const
 Gets the image that is used as part of the widget label when in the inactive state. More...
 
void deimage (Fl_Image &img)
 Sets the image to use as part of the widget label when in the inactive state. More...
 
void deimage (Fl_Image *img)
 Sets the image to use as part of the widget label when in the inactive state. More...
 
int deimage_bound () const
 Returns whether the inactive image is managed by the widget. More...
 
void do_callback (Fl_Callback_Reason reason=FL_REASON_UNKNOWN)
 Calls the widget callback function with default arguments. More...
 
void do_callback (Fl_Widget *widget, long arg, Fl_Callback_Reason reason=FL_REASON_UNKNOWN)
 Calls the widget callback function with arbitrary arguments. More...
 
void do_callback (Fl_Widget *widget, void *arg=0, Fl_Callback_Reason reason=FL_REASON_UNKNOWN)
 Calls the widget callback function with arbitrary arguments. More...
 
virtual void draw ()=0
 Draws the widget. More...
 
void draw_label (int, int, int, int, Fl_Align) const
 Draws the label in an arbitrary bounding box with an arbitrary alignment. More...
 
int h () const
 Gets the widget height. More...
 
virtual int handle (int event)
 Handles the specified event. More...
 
virtual void hide ()
 Makes a widget invisible. More...
 
Fl_Imageimage ()
 Gets the image that is used as part of the widget label when in the active state. More...
 
const Fl_Imageimage () const
 Gets the image that is used as part of the widget label when in the active state. More...
 
void image (Fl_Image &img)
 Sets the image to use as part of the widget label when in the active state. More...
 
void image (Fl_Image *img)
 Sets the image to use as part of the widget label when in the active state. More...
 
int image_bound () const
 Returns whether the image is managed by the widget. More...
 
int inside (const Fl_Widget *wgt) const
 Checks if this widget is a child of wgt. More...
 
int is_label_copied () const
 Returns whether the current label was assigned with copy_label(). More...
 
const char * label () const
 Gets the current label text. More...
 
void label (const char *text)
 Sets the current label pointer. More...
 
void label (Fl_Labeltype a, const char *b)
 Shortcut to set the label text and type in one call. More...
 
Fl_Color labelcolor () const
 Gets the label color. More...
 
void labelcolor (Fl_Color c)
 Sets the label color. More...
 
Fl_Font labelfont () const
 Gets the font to use. More...
 
void labelfont (Fl_Font f)
 Sets the font to use. More...
 
Fl_Fontsize labelsize () const
 Gets the font size in pixels. More...
 
void labelsize (Fl_Fontsize pix)
 Sets the font size in pixels. More...
 
Fl_Labeltype labeltype () const
 Gets the label type. More...
 
void labeltype (Fl_Labeltype a)
 Sets the label type. More...
 
void measure_label (int &ww, int &hh) const
 Sets width ww and height hh accordingly with the label size. More...
 
bool needs_keyboard () const
 Returns whether this widget needs a keyboard. More...
 
void needs_keyboard (bool needs)
 Sets whether this widget needs a keyboard. More...
 
unsigned int output () const
 Returns if a widget is used for output only. More...
 
Fl_Groupparent () const
 Returns a pointer to the parent widget. More...
 
void parent (Fl_Group *p)
 Internal use only - "for hacks only". More...
 
void position (int X, int Y)
 Repositions the window or widget. More...
 
void redraw ()
 Schedules the drawing of the widget. More...
 
void redraw_label ()
 Schedules the drawing of the label. More...
 
virtual void resize (int x, int y, int w, int h)
 Changes the size or position of the widget. More...
 
Fl_Color selection_color () const
 Gets the selection color. More...
 
void selection_color (Fl_Color a)
 Sets the selection color. More...
 
void set_active ()
 Marks the widget as active without sending events or changing focus. More...
 
void set_changed ()
 Marks the value of the widget as changed. More...
 
void set_output ()
 Sets a widget to output only. More...
 
void set_visible ()
 Makes the widget visible. More...
 
void set_visible_focus ()
 Enables keyboard focus navigation with this widget. More...
 
int shortcut_label () const
 Returns whether the widget's label uses '&' to indicate shortcuts. More...
 
void shortcut_label (int value)
 Sets whether the widget's label uses '&' to indicate shortcuts. More...
 
virtual void show ()
 Makes a widget visible. More...
 
void size (int W, int H)
 Changes the size of the widget. More...
 
int take_focus ()
 Gives the widget the keyboard focus. More...
 
unsigned int takesevents () const
 Returns if the widget is able to take events. More...
 
int test_shortcut ()
 Returns true if the widget's label contains the entered '&x' shortcut. More...
 
const char * tooltip () const
 Gets the current tooltip text. More...
 
void tooltip (const char *text)
 Sets the current tooltip text. More...
 
Fl_Windowtop_window () const
 Returns a pointer to the top-level window for the widget. More...
 
Fl_Windowtop_window_offset (int &xoff, int &yoff) const
 Finds the x/y offset of the current widget relative to the top-level window. More...
 
uchar type () const
 Gets the widget type. More...
 
void type (uchar t)
 Sets the widget type. More...
 
int use_accents_menu ()
 Returns non zero if MAC_USE_ACCENTS_MENU flag is set, 0 otherwise.
 
void * user_data () const
 Gets the user data for this widget. More...
 
void user_data (Fl_Callback_User_Data *v, bool auto_free)
 Sets the user data for this widget.
 
void user_data (void *v)
 Sets the user data for this widget.
 
unsigned int visible () const
 Returns whether a widget is visible. More...
 
unsigned int visible_focus () const
 Checks whether this widget has a visible focus. More...
 
void visible_focus (int v)
 Modifies keyboard focus navigation. More...
 
int visible_r () const
 Returns whether a widget and all its parents are visible. More...
 
int w () const
 Gets the widget width. More...
 
Fl_When when () const
 Returns the conditions under which the callback is called. More...
 
void when (uchar i)
 Sets the flags used to decide when a callback is called. More...
 
Fl_Windowwindow () const
 Returns a pointer to the nearest parent window up the widget hierarchy. More...
 
int x () const
 Gets the widget position in its window. More...
 
int y () const
 Gets the widget position in its window. More...
 
virtual ~Fl_Widget ()
 Destroys the widget. More...
 

Protected Member Functions

void check_overflow_menu ()
 Check if the tabs overflow and sets the has_overflow_menu flag accordingly.
 
virtual void clear_tab_positions ()
 Clear internal array of tab positions and widths. More...
 
void draw () FL_OVERRIDE
 Draw the tabs area, the optional pulldown button, and all children. More...
 
void draw_overflow_menu_button ()
 Draw square button-like graphics with a down arrow in the top or bottom right corner.
 
virtual void draw_tab (int x1, int x2, int W, int H, Fl_Widget *o, int flags, int sel)
 Draw a tab in the top or bottom tabs area. More...
 
void handle_overflow_menu ()
 This is called when the user clicks the overflow pulldown menu button. More...
 
virtual int hit_close (Fl_Widget *o, int event_x, int event_y)
 Check whether the coordinates fall within the "close" button area of the tab. More...
 
virtual int hit_overflow_menu (int event_x, int event_y)
 Determine if the coordinates are in the area of the overflow menu button. More...
 
virtual int hit_tabs_area (int event_x, int event_y)
 Determine if the coordinates are within the tabs area. More...
 
int on_insert (Fl_Widget *, int) FL_OVERRIDE
 Make sure that we redraw all tabs when new children are added. More...
 
int on_move (int, int) FL_OVERRIDE
 Make sure that we redraw all tabs when children are moved. More...
 
void on_remove (int) FL_OVERRIDE
 Make sure that we redraw all tabs when new children are removed. More...
 
virtual void redraw_tabs ()
 Redraw all tabs (and only the tabs). More...
 
void resize (int, int, int, int) FL_OVERRIDE
 Make sure that we redraw all tabs when the widget size changes. More...
 
virtual int tab_height ()
 Return space (height) in pixels usable for tabs. More...
 
virtual int tab_positions ()
 Calculate tab positions and widths. More...
 
- Protected Member Functions inherited from Fl_Group
Fl_Rectbounds ()
 Returns the internal array of widget sizes and positions. More...
 
void draw () FL_OVERRIDE
 Draws the widget. More...
 
void draw_child (Fl_Widget &widget) const
 Forces a child to redraw. More...
 
void draw_children ()
 Draws all children of the group. More...
 
void draw_outside_label (const Fl_Widget &widget) const
 Parents normally call this to draw outside labels of child widgets.
 
virtual int on_insert (Fl_Widget *, int)
 Allow derived groups to act when a widget is added as a child. More...
 
virtual int on_move (int, int)
 Allow derived groups to act when a widget is moved within the group. More...
 
virtual void on_remove (int)
 Allow derived groups to act when a child widget is removed from the group. More...
 
int * sizes ()
 Returns the internal array of widget sizes and positions. More...
 
void update_child (Fl_Widget &widget) const
 Draws a child only if it needs it. More...
 
- Protected Member Functions inherited from Fl_Widget
void clear_flag (unsigned int c)
 Clears a flag in the flags mask.
 
void draw_backdrop () const
 If FL_ALIGN_IMAGE_BACKDROP is set, the image or deimage will be drawn.
 
void draw_box () const
 Draws the widget box according its box style.
 
void draw_box (Fl_Boxtype t, Fl_Color c) const
 Draws a box of type t, of color c at the widget's position and size.
 
void draw_box (Fl_Boxtype t, int x, int y, int w, int h, Fl_Color c) const
 Draws a box of type t, of color c at the position X,Y and size W,H.
 
void draw_focus () const
 Draws a focus rectangle around the widget. More...
 
void draw_focus (Fl_Boxtype t, int X, int Y, int W, int H) const
 Draws a focus rectangle around the widget. More...
 
void draw_focus (Fl_Boxtype t, int x, int y, int w, int h, Fl_Color bg) const
 Draws a focus box for the widget at the given position and size. More...
 
void draw_label () const
 Draws the widget's label at the defined label position. More...
 
void draw_label (int, int, int, int) const
 Draws the label in an arbitrary bounding box. More...
 
 Fl_Widget (int x, int y, int w, int h, const char *label=0L)
 Creates a widget at the given position and size. More...
 
unsigned int flags () const
 Gets the widget flags mask.
 
void h (int v)
 Internal use only. More...
 
void set_flag (unsigned int c)
 Sets a flag in the flags mask.
 
void w (int v)
 Internal use only. More...
 
void x (int v)
 Internal use only. More...
 
void y (int v)
 Internal use only. More...
 

Protected Attributes

int has_overflow_menu
 set in OVERFLOW_PULLDOWN mode if tabs overflow. The actual menu array is created only on demand
 
int overflow_type
 
Fl_Align tab_align_
 tab label alignment
 
int tab_count
 Array size of tab positions etc. More...
 
int * tab_flags
 Array of tab flag of tabs per child. More...
 
int tab_offset
 for pulldown and drag overflow, this is the horizontal offset when the tabs bar is dragged by the user
 
int * tab_pos
 Array of x-offsets of tabs per child + 1. More...
 
int * tab_width
 Array of widths of tabs per child. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from Fl_Group
static Fl_Groupcurrent ()
 Returns the currently active group. More...
 
static void current (Fl_Group *g)
 Sets the current group. More...
 
- Static Public Member Functions inherited from Fl_Widget
static void default_callback (Fl_Widget *widget, void *data)
 The default callback for all widgets that don't set a callback. More...
 
static unsigned int label_shortcut (const char *t)
 Returns the Unicode value of the '&x' shortcut in a given text. More...
 
static int test_shortcut (const char *, const bool require_alt=false)
 Returns true if the given text t contains the entered '&x' shortcut. More...
 
- Protected Types inherited from Fl_Widget
enum  {
  INACTIVE = 1<<0 , INVISIBLE = 1<<1 , OUTPUT = 1<<2 , NOBORDER = 1<<3 ,
  FORCE_POSITION = 1<<4 , NON_MODAL = 1<<5 , SHORTCUT_LABEL = 1<<6 , CHANGED = 1<<7 ,
  OVERRIDE = 1<<8 , VISIBLE_FOCUS = 1<<9 , COPIED_LABEL = 1<<10 , CLIP_CHILDREN = 1<<11 ,
  MENU_WINDOW = 1<<12 , TOOLTIP_WINDOW = 1<<13 , MODAL = 1<<14 , NO_OVERLAY = 1<<15 ,
  GROUP_RELATIVE = 1<<16 , COPIED_TOOLTIP = 1<<17 , FULLSCREEN = 1<<18 , MAC_USE_ACCENTS_MENU = 1<<19 ,
  NEEDS_KEYBOARD = 1<<20 , IMAGE_BOUND = 1<<21 , DEIMAGE_BOUND = 1<<22 , AUTO_DELETE_USER_DATA = 1<<23 ,
  MAXIMIZED = 1<<24 , POPUP = 1<<25 , USERFLAG3 = 1<<29 , USERFLAG2 = 1<<30 ,
  USERFLAG1 = 1<<31
}
 flags possible values enumeration. More...
 

Detailed Description

The Fl_Tabs widget is a container widget that displays a set of tabs, with each tab representing a different child widget.

The user can select a tab by clicking on it, and the corresponding child widget will be displayed. The Fl_Tabs widget is useful for organizing a large number of controls or other widgets into a compact space, allowing the user to switch between different sets of controls as needed.

Clicking the tab makes a child visible() by calling show() on it, and all other children are made invisible by calling hide() on them. Usually the children are Fl_Group widgets containing several widgets themselves.

Each child makes a card, and its label() is printed on the card tab, including the label font and style. The selection color of that child is used to color the tab, while the color of the child determines the background color of the pane. '&' in labels are used to prefix a shortcut that is drawn underlined and that activates the corresponding tab; repeated '&&' avoids that.

The size of the tabs is controlled by the bounding box of the children (there should be some space between the children and the edge of the Fl_Tabs), and the tabs may be placed "inverted" on the bottom - this is determined by which gap is larger. It is easiest to lay this out in FLUID, using the FLUID browser to select each child group and resize them until the tabs look the way you want them to.

The background area behind and to the right of the tabs is "transparent", exposing the background detail of the parent. The value of Fl_Tabs::box() does not affect this area. So if Fl_Tabs is resized by itself without the parent, force the appropriate parent (visible behind the tabs) to redraw() to prevent artifacts.

See "Resizing Caveats" below on how to keep tab heights constant. See "Callback's Use Of when()" on how to control the details of how clicks invoke the callback().

A typical use of the Fl_Tabs widget:

// Typical use of Fl_Tabs
Fl_Tabs *tabs = new Fl_Tabs(10,10,300,200);
{
Fl_Group *grp1 = new Fl_Group(20,30,280,170,"Tab1");
{
..widgets that go in tab#1..
}
grp1->end();
Fl_Group *grp2 = new Fl_Group(20,30,280,170,"Tab2");
{
..widgets that go in tab#2..
}
grp2->end();
}
tabs->end();
The Fl_Group class is the FLTK container widget.
Definition: Fl_Group.H:56
void end()
Exactly the same as current(this->parent()).
Definition: Fl_Group.cxx:73
The Fl_Tabs widget is a container widget that displays a set of tabs, with each tab representing a di...
Definition: Fl_Tabs.H:239
Fl_Tabs(int X, int Y, int W, int H, const char *L=0)
Creates a new Fl_Tabs widget using the given position, size, and label string.
Definition: Fl_Tabs.cxx:1021

Default Appearance

The appearance of each "tab" is taken from the label() and color() of the child group corresponding to that "tab" and panel. Where the "tabs" appear depends on the position and size of the child groups that make up the panels within the Fl_Tabs widget, i.e. whether there is more space above or below them. The height of the "tabs" depends on how much free space is available.

Fl_Tabs Default Appearance

Highlighting The Selected Tab

The selected "tab" can be highlighted further by setting the selection_color() of the Fl_Tab itself, e.g.

..
tabs = new Fl_Tabs(..);
tabs->selection_color(FL_DARK3);
..
Fl_Color selection_color() const
Gets the selection color.
Definition: Fl_Widget.H:465

The result of the above looks like:

Highlighting the selected tab

Uniform Tab and Panel Appearance

In order to have uniform tab and panel appearance, not only must the color() and selection_color() for each child group be set, but also the selection_color() of the Fl_Tab itself any time a new "tab" is selected. This can be achieved within the Fl_Tab callback, e.g.

void MyTabCallback(Fl_Widget *w, void*) {
Fl_Tabs *tabs = (Fl_Tabs*)w;
// When tab changed, make sure it has same color as its group
tabs->selection_color( (tabs->value())->color() );
}
..
int main(..) {
// Define tabs widget
tabs = new Fl_Tabs(..);
tabs->callback(MyTabCallback);
// Create three tabs each colored differently
grp1 = new Fl_Group(.. "One");
grp1->color(9);
grp1->selection_color(9);
grp1->end();
grp2 = new Fl_Group(.. "Two");
grp2->color(10);
grp2->selection_color(10);
grp2->end();
grp3 = new Fl_Group(.. "Three");
grp3->color(14);
grp3->selection_color(14);
grp3->end();
..
// Make sure default tab has same color as its group
tabs->selection_color( (tab->value())->color() );
..
return Fl::run();
}
Fl_Widget * value()
Gets the currently visible widget/tab.
Definition: Fl_Tabs.cxx:670
Fl_Widget is the base class for all widgets in FLTK.
Definition: Fl_Widget.H:104
Fl_Color color() const
Gets the background color of the widget.
Definition: Fl_Widget.H:447
int w() const
Gets the widget width.
Definition: Fl_Widget.H:363
Fl_Callback_p callback() const
Gets the current callback function for the widget.
Definition: Fl_Widget.H:701
static int run()
Calls Fl::wait()repeatedly as long as any windows are displayed.
Definition: Fl.cxx:604

The result of the above looks like:

Fl_Tabs with uniform colors

If Fl_Tabs has no children, the widget will be drawn as a flat rectangle in the background color set by color().

Close Button on Tabs

The Fl_Tabs widget allows you to specify that a child widget should display a close button in its tab. If the FL_WHEN_CLOSED flag is set for the child widget, an "X" symbol will be displayed to the left of the label text in the tab. When the close button is clicked, the child widget's callback function will be called with the FL_REASON_CLOSED reason. It is then the responsibility of the child widget to remove itself from the Fl_Tabs container.

Tabs that are in a compressed state will not display a close button until they are fully expanded.

Overflowing Tabs

When the combined width of the tabs exceeds that of the Fl_Tabs widget, the tabs will overflow. Fl_Tabs provides four options for managing tabs overflow:

  • Fl_Tabs::OVERFLOW_COMPRESS: proportionally compress the tabs to the left and right of the selected tab until they all fit within the widget.
  • Fl_Tabs::OVERFLOW_CLIP: clips any tabs that extend beyond the right edge of the Fl_Tabs widget, making some tabs unreachable.
  • Fl_Tabs::OVERFLOW_PULLDOWN: doesn't compress the tabs but instead generates a pulldown menu at the right end of the tabs area, displaying all available tabs.
  • Fl_Tabs::OVERFLOW_DRAG: maintains the tabs' original sizes, allowing horizontal dragging of the tabs area using the mouse, a horizontal mouse wheel, or the horizontal scrolling gesture on touchpads.

Resizing Caveats

When Fl_Tabs is resized vertically, the default behavior scales the tab's height as well as its children. To keep the tab height constant during resizing, set the tab widget's resizable() to one of the tab's child groups, i.e.

tabs = new Fl_Tabs(..);
grp1 = new Fl_Group(..);
..
grp2 = new Fl_Group(..);
..
tabs->end();
tabs->resizable(grp1); // keeps tab height constant
void resizable(Fl_Widget &o)
Sets the group's resizable widget.
Definition: Fl_Group.H:144
Callback's Use Of when()

As of FLTK 1.3.3, Fl_Tabs() supports the following flags for when():

  • FL_WHEN_NEVER – callback never invoked (all flags off)
  • FL_WHEN_CHANGED – if flag set, invokes callback when a tab has been changed (on click or keyboard navigation)
  • FL_WHEN_NOT_CHANGED – if flag set, invokes callback when the tabs remain unchanged (on click or keyboard navigation)
  • FL_WHEN_RELEASE – if flag set, invokes callback on RELEASE of mouse button or keyboard navigation

Notes:

  1. The above flags can be logically OR-ed (|) or added (+) to combine behaviors.
  2. The default value for when() is FL_WHEN_RELEASE (inherited from Fl_Widget).
  3. If FL_WHEN_RELEASE is the only flag specified, the behavior will be as if (FL_WHEN_RELEASE|FL_WHEN_CHANGED) was specified.
  4. The value of changed() will be valid during the callback.
  5. If both FL_WHEN_CHANGED and FL_WHEN_NOT_CHANGED are specified, the callback is invoked whether the tab has been changed or not. The changed() method can be used to determine the cause.
  6. FL_WHEN_NOT_CHANGED can happen if someone clicks on an already selected tab, or if a keyboard navigation attempt results in no change to the tabs, such as using the arrow keys while at the left or right end of the tabs.
  7. Fl::callback_reason() returns FL_REASON_SELECTED or FL_REASON_RESELECTED

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
OVERFLOW_COMPRESS 

Tabs will be compressed and overlaid on top of each other.

OVERFLOW_CLIP 

Only the first tabs that fit will be displayed.

OVERFLOW_PULLDOWN 

Tabs that do not fit will be placed in a pull-down menu.

OVERFLOW_DRAG 

The tab bar can be dragged horizontally to reveal additional tabs.

Constructor & Destructor Documentation

◆ Fl_Tabs()

Fl_Tabs::Fl_Tabs ( int  X,
int  Y,
int  W,
int  H,
const char *  L = 0 
)

Creates a new Fl_Tabs widget using the given position, size, and label string.

The default boxtype is FL_THIN_UP_BOX.

Use add(Fl_Widget*) to add each child, which are usually Fl_Group widgets. The children should be sized to stay away from the top or bottom edge of the Fl_Tabs widget, which is where the tabs will be drawn.

All children of Fl_Tabs should have the same size and exactly fit on top of each other. They should only leave space above or below where the tabs will go, but not on the sides. If the first child of Fl_Tabs is set to "resizable()", the riders will not resize when the tabs are resized.

The destructor also deletes all the children. This allows a whole tree to be deleted at once, without having to keep a pointer to all the children in the user code. A kludge has been done so the Fl_Tabs and all of its children can be automatic (local) variables, but you must declare the Fl_Tabs widget first so that it is destroyed last.

Member Function Documentation

◆ clear_tab_positions()

void Fl_Tabs::clear_tab_positions ( )
protectedvirtual

Clear internal array of tab positions and widths.

See also
tab_positions().

◆ client_area()

void Fl_Tabs::client_area ( int &  rx,
int &  ry,
int &  rw,
int &  rh,
int  tabh = 0 
)

Returns the position and size available to be used by its children.

If there isn't any child yet the tabh parameter will be used to calculate the return values. This assumes that the children's labelsize is the same as the Fl_Tabs' labelsize and adds a small border.

If there are already children, the values of child(0) are returned, and tabh is ignored.

Note
Children should always use the same positions and sizes.

tabh can be one of

  • 0: calculate label size, tabs on top
  • -1: calculate label size, tabs on bottom
  • > 0: use given tabh value, tabs on top (height = tabh)
  • < -1: use given tabh value, tabs on bottom (height = -tabh)
Parameters
[in]tabhposition and optional height of tabs (see above)
[out]rx,ry,rw,rh(x,y,w,h) of client area for children
Since
FLTK 1.3.0

◆ draw()

void Fl_Tabs::draw ( void  )
protectedvirtual

Draw the tabs area, the optional pulldown button, and all children.

Reimplemented from Fl_Group.

◆ draw_tab()

void Fl_Tabs::draw_tab ( int  x1,
int  x2,
int  W,
int  H,
Fl_Widget o,
int  flags,
int  what 
)
protectedvirtual

Draw a tab in the top or bottom tabs area.

Tabs can be selected, or on the left or right side of the selected tab. If overlapping, left tabs are drawn bottom to top using clipping. The selected tab is then the topmost, followed by the right side tabs drawn top to bottom.

Tabs with the FL_WHEN_CLOSE bit set will draw a cross on their left side only if they are not compressed/overlapping.

Parameters
[in]x1horizontal position of the left visible edge of the tab
[in]x2horizontal position of the following tab
[in]W,Hwidth and height of the tab
[in]othe child widget that corresponds to this tab
[in]flagsif bit 1 is set, this tab is overlapped by another tab
[in]whatcan be LEFT, SELECTED, or RIGHT to indicate if the tab is to the left side or the right side of the selected tab, or the selected tab itself

◆ handle()

int Fl_Tabs::handle ( int  event)
virtual

Handle all events in the tabs area and forward the rest to the selected child.

Parameters
[in]eventhandle this event
Returns
1 if the event was handled

Reimplemented from Fl_Group.

◆ handle_overflow()

void Fl_Tabs::handle_overflow ( int  ov)

Set a method to handle an overflowing tab bar.

The Fl_Tabs widget allows you to specify how to handle the situation where there are more tabs than can be displayed at once. The available options are:

  • OVERFLOW_COMPRESS: Tabs will be compressed and overlaid on top of each other.
  • OVERFLOW_CLIP: Only the first tabs that fit will be displayed.
  • OVERFLOW_PULLDOWN: Tabs that do not fit will be placed in a pull-down menu.
  • OVERFLOW_DRAG: The tab bar can be dragged horizontally to reveal additional tabs.

You can set the desired behavior using the overflow() method.

Parameters
ovoverflow type
See also
OVERFLOW_COMPRESS, OVERFLOW_CLIP, OVERFLOW_PULLDOWN, OVERFLOW_DRAG

◆ handle_overflow_menu()

void Fl_Tabs::handle_overflow_menu ( )
protected

This is called when the user clicks the overflow pulldown menu button.

This method creates a menu item array that contains the titles of all tabs in the Fl_Tabs group. Visible and invisible tabs are separated by dividers to indicate their state.

The menu is then presented until the user selects an item or cancels. The chosen tab is then selected and made visible.

The menu item array is the deleted.

◆ hit_close()

int Fl_Tabs::hit_close ( Fl_Widget o,
int  event_x,
int  event_y 
)
protectedvirtual

Check whether the coordinates fall within the "close" button area of the tab.

The Fl_Tabs::hit_close() method checks whether the given event coordinates fall within the area of the "close" button on the tab of the specified child widget. This method should be called after the Fl_Tabs::which() method, which updates a lookup table used to determine the width of each tab.

Parameters
ocheck the tab of this widget
event_x,event_yevent coordinates
Returns
1 if we hit the close button, and 0 otherwise

◆ hit_overflow_menu()

int Fl_Tabs::hit_overflow_menu ( int  event_x,
int  event_y 
)
protectedvirtual

Determine if the coordinates are in the area of the overflow menu button.

Parameters
event_x,event_yevent coordinates
Returns
1 if we hit the overflow menu button, and 0 otherwise

◆ hit_tabs_area()

int Fl_Tabs::hit_tabs_area ( int  event_x,
int  event_y 
)
protectedvirtual

Determine if the coordinates are within the tabs area.

Parameters
event_x,event_yevent coordinates
Returns
1 if we hit the tabs area, and 0 otherwise

◆ on_insert()

int Fl_Tabs::on_insert ( Fl_Widget candidate,
int  index 
)
protectedvirtual

Make sure that we redraw all tabs when new children are added.

Reimplemented from Fl_Group.

◆ on_move()

int Fl_Tabs::on_move ( int  a,
int  b 
)
protectedvirtual

Make sure that we redraw all tabs when children are moved.

Reimplemented from Fl_Group.

◆ on_remove()

void Fl_Tabs::on_remove ( int  index)
protectedvirtual

Make sure that we redraw all tabs when new children are removed.

Reimplemented from Fl_Group.

◆ push() [1/2]

Fl_Widget * Fl_Tabs::push ( ) const
inline

Returns the tab group for the tab the user has currently down-clicked on and remains over until FL_RELEASE.

Otherwise, returns NULL.

While the user is down-clicked on a tab, the return value is the tab group for that tab. But as soon as the user releases, or drags off the tab with the button still down, the return value will be NULL.

See also
push(Fl_Widget*).

◆ push() [2/2]

int Fl_Tabs::push ( Fl_Widget o)

This is called by the tab widget's handle() method to set the tab group widget the user last FL_PUSH'ed on.

Set back to zero on FL_RELEASE.

As of this writing, the value is mainly used by draw_tab() to determine whether or not to draw a 'down' box for the tab when it's clicked, and to turn it off if the user drags off it.

See also
push().

◆ redraw_tabs()

void Fl_Tabs::redraw_tabs ( )
protectedvirtual

Redraw all tabs (and only the tabs).

This method sets the Fl_Tab's damage flags so the tab area is redrawn.

◆ resize()

void Fl_Tabs::resize ( int  X,
int  Y,
int  W,
int  H 
)
protectedvirtual

Make sure that we redraw all tabs when the widget size changes.

Reimplemented from Fl_Group.

◆ tab_align() [1/2]

Fl_Align Fl_Tabs::tab_align ( ) const
inline

Gets the tab label alignment.

See also
tab_align(Fl_Align)

◆ tab_align() [2/2]

void Fl_Tabs::tab_align ( Fl_Align  a)
inline

Sets the tab label alignment.

The default is FL_ALIGN_CENTER so tab labels are centered, but since the label space is measured (per label) to fit the labels, there wouldn't be any difference if labels were aligned left or right.

If you want to show an image (icon) next to the group's label you can set a different label alignment. FL_ALIGN_IMAGE_NEXT_TO_TEXT is the recommended alignment to show the icon left of the text.

◆ tab_height()

int Fl_Tabs::tab_height ( )
protectedvirtual

Return space (height) in pixels usable for tabs.

The calculated height is the largest space between all children and the upper and lower widget boundaries, respectively. If the space at the bottom is larger than at the top, the value will be negative and the tabs should be placed at the bottom.

Returns
Vertical space that can be used for the tabs.
Return values
>0 To put the tabs at the top of the widget.
<0 To put the tabs on the bottom.
Fullheight, if children() == 0.

◆ tab_positions()

int Fl_Tabs::tab_positions ( )
protectedvirtual

Calculate tab positions and widths.

This protected method calculates the horizontal display positions and widths of all tabs. If the number of children 'nc' (see below) is > 0 three internal arrays are allocated, otherwise the arrays are free'd and the pointers are set to NULL. Note that the first array is larger (nc+1).

  • tab_pos[nc+1] : The left edges of each tab plus a fake left edge for a tab past the right-hand one.
  • tab_width[nc] : The width of each tab
  • tab_flags[nc] : Flags, bit 0 is set if the tab is compressed

If needed, these arrays are (re)allocated.

These positions are actually of the left edge of the slope. They are either separated by the correct distance or by EXTRASPACE or by zero.

In OVERFLOW_COMPRESS mode, tab positions and widths are compressed to make the entire tabs bar fit into the width of Fl_Tabs while keeping the selected tab fully visible.

In other overflow modes, the tabs area may be dragged horizontally using tab_offset. The tab_pos array is not adjusted to the horizontal offset, but starts at this->x() plus the box's left margin.

The protected variable tab_count is set to the currently allocated size, i.e. the number of children (nc).

Returns
Index of the selected item
Return values
-1If the number of children is 0 (zero).
Note
Return values in 1.3 were not documented. Return values before Sep 2023 were documented as 1 based index and 0 if there were no children. This was actually never the case. It always returned a 0 based index and the (useless) value of also 0 if there were no children. The current version return -1 if there are no children.
For this method to work, only on single child should be selected. Calling the method value() before calling tab_positions() will ensure that exactly one child is selected and return a pointer to that child.
See also
clear_tab_positions()

◆ value() [1/2]

Fl_Widget * Fl_Tabs::value ( )

Gets the currently visible widget/tab.

The Fl_Tabs::value() method returns a pointer to the currently visible child widget of the Fl_Tabs container. The visible child is the first child that is currently being displayed, or the last child if none of the children are being displayed.

If child widgets have been added, moved, or deleted, this method ensures that only one tab is visible at a time.

Returns
a pointer to the currently visible child

◆ value() [2/2]

int Fl_Tabs::value ( Fl_Widget newvalue)

Sets the widget to become the current visible widget/tab.

The Fl_Tabs::value() method allows you to set a particular child widget of the Fl_Tabs container to be the currently visible widget. If the specified widget is a child of the Fl_Tabs container, it will be made visible and all other children will be hidden. The method returns 1 if the value was changed, and 0 if the specified value was already set.

Parameters
[in]newvaluea poiner to a child widget
Returns
1 if a different tab was chosen
0 if there was no change (new value already set)

◆ which()

Fl_Widget * Fl_Tabs::which ( int  event_x,
int  event_y 
)
virtual

Return a pointer to the child widget with a tab at the given coordinates.

The Fl_Tabs::which() method returns a pointer to the child widget of the Fl_Tabs container that corresponds to the tab at the given event coordinates. If the event coordinates are outside the area of the tabs or if the Fl_Tabs container has no children, the method returns NULL.

Parameters
event_x,event_yevent coordinates
Returns
pointer to the selected child widget, or NULL

Member Data Documentation

◆ overflow_type

int Fl_Tabs::overflow_type
protected

◆ tab_count

int Fl_Tabs::tab_count
protected

Array size of tab positions etc.

See also
tab_positions()

◆ tab_flags

int* Fl_Tabs::tab_flags
protected

Array of tab flag of tabs per child.

See also
tab_positions()

◆ tab_pos

int* Fl_Tabs::tab_pos
protected

Array of x-offsets of tabs per child + 1.

See also
tab_positions()

◆ tab_width

int* Fl_Tabs::tab_width
protected

Array of widths of tabs per child.

See also
tab_positions()

The documentation for this class was generated from the following files: