FLTK 1.4.4

Loading...
Searching...
No Matches
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:

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

## 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.
void | draw () FL_OVERRIDE
| Draw the tabs area, the optional pulldown button, and all children.
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.
void | handle_overflow_menu ()
| This is called when the user clicks the overflow pulldown menu button.
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.
virtual int | hit_overflow_menu (int event_x, int event_y)
| Determine if the coordinates are in the area of the overflow menu button.
virtual int | hit_tabs_area (int event_x, int event_y)
| Determine if the coordinates are within the tabs area.
int | maybe_do_callback (Fl_Widget *o)
| Set tab o as selected and call callbacks if needed.
int | on_insert (Fl_Widget *, int) FL_OVERRIDE
| Make sure that we redraw all tabs when new children are added.
int | on_move (int, int) FL_OVERRIDE
| Make sure that we redraw all tabs when children are moved.
void | on_remove (int) FL_OVERRIDE
| Make sure that we redraw all tabs when new children are removed.
virtual void | redraw_tabs ()
| Redraw all tabs (and only the tabs).
virtual int | tab_height ()
| Return space (height) in pixels usable for tabs.
virtual int | tab_positions ()
| Calculate tab positions and widths.
void | take_focus (Fl_Widget *o)
| Take keyboard focus if o is not NULL.
Protected Member Functions inherited from Fl_Group
Fl_Rect * | bounds ()
| Returns the internal array of widget sizes and positions.
void | draw_child (Fl_Widget &widget) const
| Forces a child to redraw.
void | draw_children ()
| Draws all children of the group.
void | draw_outside_label (const Fl_Widget &widget) const
| Parents normally call this to draw outside labels of child widgets.
int * | sizes ()
| Returns the internal array of widget sizes and positions.
void | update_child (Fl_Widget &widget) const
| Draws a child only if it needs it.
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.
void | draw_focus (Fl_Boxtype t, int X, int Y, int W, int H) const
| Draws a focus rectangle around the widget.
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.
void | draw_label () const
| Draws the widget's label at the defined label position.
void | draw_label (int, int, int, int) const
| Draws the label in an arbitrary bounding box.
| Fl_Widget (int x, int y, int w, int h, const char *label=0L)
| Creates a widget at the given position and size.
unsigned int | flags () const
| Gets the widget flags mask.
void | h (int v)
| Internal use only.
void | set_flag (unsigned int c)
| Sets a flag in the flags mask.
void | w (int v)
| Internal use only.
void | x (int v)
| Internal use only.
void | y (int v)
| Internal use only.

## 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.
int * | tab_flags
| Array of tab flag of tabs per child.
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.
int * | tab_width
| Array of widths of tabs per child.

## Additional Inherited Members
Static Public Member Functions inherited from Fl_Group
static Fl_Group * | current ()
| Returns the currently active group.
static void | current (Fl_Group *g)
| Sets the current group.
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.
static unsigned int | label_shortcut (const char *t)
| Returns the Unicode value of the '&x' shortcut in a given text.
static int | test_shortcut (const char *, const bool require_alt=false)
| Returns true if the given text `t` contains the entered '&x' shortcut.
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.

Note: The widgets contained in each child should leave some clear space (five pixels as of FLTK 1.4.x) at the top or bottom of the group (where the tabs are displayed). Otherwise drawing the children may interfere with the selection border between the tabs and the children. This is particularly important if the child group is an Fl_Scroll widget: either the Fl_Scroll widget must be inset by five pixels relative to other children or it can be wrapped inside another Fl_Group and inset by five pixels within this group so the contents of the Fl_Scroll widget are kept away from the tabs by this amount.

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();
  Fl_Group
  The Fl_Group class is the main FLTK container widget.
  Definition Fl_Group.H:56
  Fl_Group::end
  void end()
  Exactly the same as current(this->parent()).
  Definition Fl_Group.cxx:73
  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.
  Definition Fl_Tabs.cxx:1086

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_Widget::selection_color
  Fl_Color selection_color() const
  Gets the selection color.
  Definition Fl_Widget.H:473

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_Tabs::value
  Fl_Widget * value()
  Gets the currently visible widget/tab.
  Definition Fl_Tabs.cxx:721
  Fl_Widget::color
  Fl_Color color() const
  Gets the background color of the widget.
  Definition Fl_Widget.H:455
  Fl_Widget::callback
  Fl_Callback_p callback() const
  Gets the current callback function for the widget.
  Definition Fl_Widget.H:740
  Fl_Widget::w
  void w(int v)
  Internal use only.
  Definition Fl_Widget.H:154
  Fl::run
  static int run()
  Calls Fl::wait()repeatedly as long as any windows are displayed.
  Definition Fl.cxx:651

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: clip any tabs that extend beyond the right edge of the Fl_Tabs widget, making some tabs unreachable.
- Fl_Tabs::OVERFLOW_PULLDOWN: don't compress the tabs but instead generate a pulldown menu at the right end of the tabs area, displaying all available tabs.
- Fl_Tabs::OVERFLOW_DRAG: maintain 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
  Fl_Group::resizable
  void resizable(Fl_Widget &o)
  Sets the group's resizable widget.
  Definition Fl_Group.H:156

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 | ( |  | ) |
| protected virtual

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.
  This function requires access to the display drivers to determine the selected font height. If client_area is invoked before the first window is displayed, ensure that fl_open_display() is called beforehand.

`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] | tabh | position 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 |  | ) |
| protected virtual

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 )
| protected virtual

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] | x1 | horizontal position of the left visible edge of the tab
  [in] | x2 | horizontal position of the following tab
  [in] | W,H | width and height of the tab
  [in] | o | the child widget that corresponds to this tab
  [in] | flags | if bit 1 is set, this tab is overlapped by another tab
  [in] | what | can 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] | event | handle 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

  ov | overflow 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 then deleted.

## ◆ hit_close()

int Fl_Tabs::hit_close | ( | Fl_Widget * | o,
|  | int | event_x,
|  | int | event_y )
| protected virtual

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

  o | check the tab of this widget
  event_x,event_y | event 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 )
| protected virtual

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

Parameters

  event_x,event_y | event 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 )
| protected virtual

Determine if the coordinates are within the tabs area.

Parameters

  event_x,event_y | event coordinates

Returns
  1 if we hit the tabs area, and 0 otherwise

## ◆ maybe_do_callback()

int Fl_Tabs::maybe_do_callback | ( | Fl_Widget * | o | ) |
| protected

Set tab o as selected and call callbacks if needed.

Parameters

  [in] | o | the newly selected tab

Returns
  0 if o is invalid or was deleted by the callback and must no longer be used

## ◆ on_insert()

int Fl_Tabs::on_insert | ( | Fl_Widget * | candidate,
|  | int | index )
| protected virtual

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 )
| protected virtual

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

Reimplemented from Fl_Group.

## ◆ on_remove()

void Fl_Tabs::on_remove | ( | int | index | ) |
| protected virtual

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 | ( |  | ) |
| protected virtual

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 )
| virtual

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

Reimplemented from Fl_Group.

## ◆ show()

void Fl_Tabs::show | ( |  | ) |
| virtual

Ensure proper placement of selected tab.

Reimplemented from Fl_Widget.

## ◆ 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 | ( |  | ) |
| protected virtual

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.
  Full | height, if children() == 0.

## ◆ tab_positions()

int Fl_Tabs::tab_positions | ( |  | ) |
| protected virtual

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

  -1 | If 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 returns -1 if there are no children.
  For this method to work, only a 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()

## ◆ take_focus()

void Fl_Tabs::take_focus | ( | Fl_Widget * | o | ) |
| protected

Take keyboard focus if o is not NULL.

Parameters

  [in] | o | selected tab

## ◆ 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 currently 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] | newvalue | a 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_y | event coordinates

Returns
  pointer to the selected child widget, or NULL

## Member Data Documentation

## ◆ overflow_type

int Fl_Tabs::overflow_type
| protected

See also
  OVERFLOW_COMPRESS, OVERFLOW_CLIP, etc.

## ◆ 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:

- Fl_Tabs.H
- Fl_Tabs.cxx