diff options
| -rw-r--r-- | fluid/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | fluid/Fl_Button_Type.cxx | 235 | ||||
| -rw-r--r-- | fluid/Fl_Button_Type.h | 43 | ||||
| -rw-r--r-- | fluid/Fl_Function_Type.h | 40 | ||||
| -rw-r--r-- | fluid/Fl_Group_Type.h | 35 | ||||
| -rw-r--r-- | fluid/Fl_Menu_Type.cxx | 10 | ||||
| -rw-r--r-- | fluid/Fl_Menu_Type.h | 201 | ||||
| -rw-r--r-- | fluid/Fl_Type.cxx | 82 | ||||
| -rw-r--r-- | fluid/Fl_Type.h | 3 | ||||
| -rw-r--r-- | fluid/Fl_Widget_Type.cxx | 42 | ||||
| -rw-r--r-- | fluid/Fl_Window_Type.h | 13 | ||||
| -rw-r--r-- | fluid/align_widget.cxx | 26 | ||||
| -rw-r--r-- | fluid/factory.cxx | 359 | ||||
| -rw-r--r-- | fluid/file.cxx | 2 |
14 files changed, 700 insertions, 393 deletions
diff --git a/fluid/CMakeLists.txt b/fluid/CMakeLists.txt index 2b825c805..715b4ffc4 100644 --- a/fluid/CMakeLists.txt +++ b/fluid/CMakeLists.txt @@ -26,6 +26,7 @@ set (CPPFILES Fl_Type.cxx Fl_Widget_Type.cxx Fl_Window_Type.cxx + Fl_Button_Type.cxx Fluid_Image.cxx about_panel.cxx align_widget.cxx @@ -54,6 +55,7 @@ set (HEADERFILES Fl_Type.h Fl_Widget_Type.h Fl_Window_Type.h + Fl_Button_Type.h Fluid_Image.h StyleParse.h about_panel.h diff --git a/fluid/Fl_Button_Type.cxx b/fluid/Fl_Button_Type.cxx new file mode 100644 index 000000000..16541224a --- /dev/null +++ b/fluid/Fl_Button_Type.cxx @@ -0,0 +1,235 @@ +// +// Widget factory code for the Fast Light Tool Kit (FLTK). +// +// Type classes for most of the fltk widgets. Most of the work +// is done by code in Fl_Widget_Type.C. Also a factory instance +// of each of these type classes. +// +// This file also contains the "new" menu, which has a pointer +// to a factory instance for every class (both the ones defined +// here and ones in other files) +// +// Copyright 1998-2017 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please see the following page on how to report bugs and issues: +// +// https://www.fltk.org/bugs.php +// + +#include "Fl_Button_Type.h" + +#include "fluid.h" +#include "Fl_Window_Type.h" +#include "Fl_Group_Type.h" +#include "Fd_Snap_Action.h" +#include "pixmaps.h" +#include "undo.h" + +#include <FL/Fl.H> +#include <FL/Fl_Adjuster.H> +#include <FL/Fl_Box.H> +#include <FL/Fl_Browser.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Check_Browser.H> +#include <FL/Fl_Check_Button.H> +#include <FL/Fl_Clock.H> +#include <FL/Fl_Counter.H> +#include <FL/Fl_Dial.H> +#include <FL/Fl_File_Browser.H> +#include <FL/Fl_File_Input.H> +#include <FL/Fl_Flex.H> +#include <FL/Fl_Group.H> +#include <FL/Fl_Help_View.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Light_Button.H> +#include <FL/Fl_Menu_Item.H> +#include <FL/Fl_Output.H> +#include <FL/Fl_Pixmap.H> +#include <FL/Fl_Progress.H> +#include <FL/Fl_Return_Button.H> +#include <FL/Fl_Repeat_Button.H> +#include <FL/Fl_Round_Button.H> +#include <FL/Fl_Roller.H> +#include <FL/Fl_Scrollbar.H> +#include <FL/Fl_Simple_Terminal.H> +#include <FL/Fl_Spinner.H> +#include <FL/Fl_Text_Display.H> +#include <FL/Fl_Text_Editor.H> +#include <FL/Fl_Tree.H> +#include <FL/Fl_Value_Slider.H> +#include <FL/Fl_Value_Input.H> +#include <FL/Fl_Value_Output.H> +#include <FL/Fl_Window.H> +#include "../src/flstring.h" + +#include <stdio.h> +#include <stdlib.h> + + +// ---- Button Types --------------------------------------------------- MARK: - + + +// ---- Button ---- + +static Fl_Menu_Item buttontype_menu[] = { + {"Normal", 0, 0, (void*)0}, + {"Toggle", 0, 0, (void*)FL_TOGGLE_BUTTON}, + {"Radio", 0, 0, (void*)FL_RADIO_BUTTON}, + {0} +}; + +Fl_Menu_Item *Fl_Button_Type::subtypes() FL_OVERRIDE { + return buttontype_menu; +} + +void Fl_Button_Type::ideal_size(int &w, int &h) FL_OVERRIDE { + h = layout->labelsize + 8; + w = layout->labelsize * 4 + 8; + Fd_Snap_Action::better_size(w, h); +} + +Fl_Widget *Fl_Button_Type::widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Button(x, y, w, h, "Button"); +} + +Fl_Button_Type Fl_Button_type; + + +// ---- Return Button ---- + +/** + \brief The Return Button is simply a Button with the return key as a hotkey. + */ +class Fl_Return_Button_Type : public Fl_Button_Type +{ + typedef Fl_Button_Type super; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + h = layout->labelsize + 8; + w = layout->labelsize * 4 + 8 + h; // make room for the symbol + Fd_Snap_Action::better_size(w, h); + } + const char *type_name() FL_OVERRIDE { return "Fl_Return_Button"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::ReturnButton"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Return_Button(x, y, w, h, "Button"); + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Return_Button_Type(); } + ID id() const FL_OVERRIDE { return ID_Return_Button; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Return_Button) ? true : super::is_a(inID); } +}; + +Fl_Return_Button_Type Fl_Return_Button_type; + + +// ---- Repeat Button ---- + +/** + \brief Handler for Fl_Repeat_Button. + \note Even though Fl_Repeat_Button is somewhat limited compared to Fl_Button, + and some settings may not make much sense, it is still derived from it, + so the wrapper should be as well. + */ +class Fl_Repeat_Button_Type : public Fl_Button_Type +{ + typedef Fl_Button_Type super; +public: + const char *type_name() FL_OVERRIDE { return "Fl_Repeat_Button"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::RepeatButton"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Repeat_Button(x, y, w, h, "Button"); + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Repeat_Button_Type(); } + ID id() const FL_OVERRIDE { return ID_Repeat_Button; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Repeat_Button) ? true : super::is_a(inID); } +}; + +Fl_Repeat_Button_Type Fl_Repeat_Button_type; + + +// ---- Light Button ---- + +/** + \brief A handler for a toggle button with an indicator light. + */ +class Fl_Light_Button_Type : public Fl_Button_Type +{ + typedef Fl_Button_Type super; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + h = layout->labelsize + 8; + w = layout->labelsize * 4 + 8 + layout->labelsize; // make room for the light + Fd_Snap_Action::better_size(w, h); + } + const char *type_name() FL_OVERRIDE { return "Fl_Light_Button"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::LightButton"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Light_Button(x, y, w, h, "Button"); + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Light_Button_Type(); } + ID id() const FL_OVERRIDE { return ID_Light_Button; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Light_Button) ? true : super::is_a(inID); } +}; + +Fl_Light_Button_Type Fl_Light_Button_type; + + +// ---- Check Button ---- + +/** + \brief Manage buttons with a check mark on its left. + */ +class Fl_Check_Button_Type : public Fl_Button_Type +{ + typedef Fl_Button_Type super; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + h = layout->labelsize + 8; + w = layout->labelsize * 4 + 8 + layout->labelsize; // make room for the symbol + Fd_Snap_Action::better_size(w, h); + } + const char *type_name() FL_OVERRIDE { return "Fl_Check_Button"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::CheckButton"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Check_Button(x, y, w, h, "Button"); + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Check_Button_Type(); } + ID id() const FL_OVERRIDE { return ID_Check_Button; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Check_Button) ? true : super::is_a(inID); } +}; + +Fl_Check_Button_Type Fl_Check_Button_type; + + +// ---- Round Button ---- + +/** + \brief Manage buttons with a round indicator on its left. + */ +class Fl_Round_Button_Type : public Fl_Button_Type +{ + typedef Fl_Button_Type super; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + h = layout->labelsize + 8; + w = layout->labelsize * 4 + 8 + layout->labelsize; // make room for the symbol + Fd_Snap_Action::better_size(w, h); + } + const char *type_name() FL_OVERRIDE { return "Fl_Round_Button"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::RadioButton"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Round_Button(x, y, w, h, "Button"); + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Round_Button_Type(); } + ID id() const FL_OVERRIDE { return ID_Round_Button; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Round_Button) ? true : super::is_a(inID); } +}; + +Fl_Round_Button_Type Fl_Round_Button_type; + diff --git a/fluid/Fl_Button_Type.h b/fluid/Fl_Button_Type.h new file mode 100644 index 000000000..f80a60beb --- /dev/null +++ b/fluid/Fl_Button_Type.h @@ -0,0 +1,43 @@ +// +// Widget type header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2021 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please see the following page on how to report bugs and issues: +// +// https://www.fltk.org/bugs.php +// + +#ifndef _FLUID_FACTORY_H +#define _FLUID_FACTORY_H + +#include "Fl_Widget_Type.h" + +/** + \brief A handler for the simple push button and a base class for all other buttons. + */ +class Fl_Button_Type : public Fl_Widget_Type +{ + typedef Fl_Widget_Type super; + Fl_Menu_Item *subtypes() FL_OVERRIDE; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE; + const char *type_name() FL_OVERRIDE { return "Fl_Button"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::Button"; } + Fl_Widget *widget(int x, int y, int w, int h); + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Button_Type(); } + int is_button() const FL_OVERRIDE { return 1; } + ID id() const FL_OVERRIDE { return ID_Button; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Button) ? true : super::is_a(inID); } +}; + +extern Fl_Button_Type Fl_Button_type; + + +#endif // _FLUID_FACTORY_H diff --git a/fluid/Fl_Function_Type.h b/fluid/Fl_Function_Type.h index 5da55cb49..d844016c9 100644 --- a/fluid/Fl_Function_Type.h +++ b/fluid/Fl_Function_Type.h @@ -42,7 +42,9 @@ const char *c_check(const char *c, int type = 0); // ---- Fl_Function_Type declaration -class Fl_Function_Type : public Fl_Type { +class Fl_Function_Type : public Fl_Type +{ + typedef Fl_Type super; const char* return_type; char public_, cdecl_, constructor, havewidgets; @@ -62,6 +64,7 @@ public: int is_code_block() const FL_OVERRIDE {return 1;} int is_public() const FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Function; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Function) ? true : super::is_a(inID); } void write_properties(Fd_Project_Writer &f) FL_OVERRIDE; void read_property(Fd_Project_Reader &f, const char *) FL_OVERRIDE; int has_signature(const char *, const char*) const; @@ -69,7 +72,9 @@ public: // ---- Fl_Code_Type declaration -class Fl_Code_Type : public Fl_Type { +class Fl_Code_Type : public Fl_Type +{ + typedef Fl_Type super; ExternalCodeEditor editor_; int cursor_position_; int code_input_scroll_row; @@ -86,6 +91,7 @@ public: int is_code_block() const FL_OVERRIDE {return 0;} int is_code() const FL_OVERRIDE {return 1;} ID id() const FL_OVERRIDE { return ID_Code; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Code) ? true : super::is_a(inID); } int is_public() const FL_OVERRIDE { return -1; } int is_editing(); int reap_editor(); @@ -94,7 +100,9 @@ public: // ---- Fl_CodeBlock_Type declaration -class Fl_CodeBlock_Type : public Fl_Type { +class Fl_CodeBlock_Type : public Fl_Type +{ + typedef Fl_Type super; const char* after; public: @@ -109,13 +117,16 @@ public: int is_parent() const FL_OVERRIDE {return 1;} int is_public() const FL_OVERRIDE { return -1; } ID id() const FL_OVERRIDE { return ID_CodeBlock; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_CodeBlock) ? true : super::is_a(inID); } void write_properties(Fd_Project_Writer &f) FL_OVERRIDE; void read_property(Fd_Project_Reader &f, const char *) FL_OVERRIDE; }; // ---- Fl_Decl_Type declaration -class Fl_Decl_Type : public Fl_Type { +class Fl_Decl_Type : public Fl_Type +{ + typedef Fl_Type super; protected: char public_; @@ -132,11 +143,14 @@ public: void read_property(Fd_Project_Reader &f, const char *) FL_OVERRIDE; int is_public() const FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Decl; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Decl) ? true : super::is_a(inID); } }; // ---- Fl_Data_Type declaration -class Fl_Data_Type : public Fl_Decl_Type { +class Fl_Data_Type : public Fl_Decl_Type +{ + typedef Fl_Decl_Type super; const char *filename_; int text_mode_; @@ -151,11 +165,14 @@ public: void write_properties(Fd_Project_Writer &f) FL_OVERRIDE; void read_property(Fd_Project_Reader &f, const char *) FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Data; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Data) ? true : super::is_a(inID); } }; // ---- Fl_DeclBlock_Type declaration -class Fl_DeclBlock_Type : public Fl_Type { +class Fl_DeclBlock_Type : public Fl_Type +{ + typedef Fl_Type super; const char* after; char public_; @@ -173,11 +190,14 @@ public: int is_decl_block() const FL_OVERRIDE {return 1;} int is_public() const FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_DeclBlock; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_DeclBlock) ? true : super::is_a(inID); } }; // ---- Fl_Comment_Type declaration -class Fl_Comment_Type : public Fl_Type { +class Fl_Comment_Type : public Fl_Type +{ + typedef Fl_Type super; char in_c_, in_h_, style_; char title_buf[64]; @@ -194,11 +214,14 @@ public: int is_public() const FL_OVERRIDE { return 1; } int is_comment() const FL_OVERRIDE { return 1; } ID id() const FL_OVERRIDE { return ID_Comment; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Comment) ? true : super::is_a(inID); } }; // ---- Fl_Class_Type declaration -class Fl_Class_Type : public Fl_Type { +class Fl_Class_Type : public Fl_Type +{ + typedef Fl_Type super; const char* subclass_of; char public_; const char* class_prefix; @@ -220,6 +243,7 @@ public: int is_class() const FL_OVERRIDE {return 1;} int is_public() const FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Class; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Class) ? true : super::is_a(inID); } void write_properties(Fd_Project_Writer &f) FL_OVERRIDE; void read_property(Fd_Project_Reader &f, const char *) FL_OVERRIDE; diff --git a/fluid/Fl_Group_Type.h b/fluid/Fl_Group_Type.h index 4be5973e9..d98e6121c 100644 --- a/fluid/Fl_Group_Type.h +++ b/fluid/Fl_Group_Type.h @@ -36,7 +36,9 @@ public: igroup(int X,int Y,int W,int H) : Fl_Group(X,Y,W,H) {Fl_Group::current(0);} }; -class Fl_Group_Type : public Fl_Widget_Type { +class Fl_Group_Type : public Fl_Widget_Type +{ + typedef Fl_Widget_Type super; public: const char *type_name() FL_OVERRIDE {return "Fl_Group";} const char *alt_type_name() FL_OVERRIDE {return "fltk::Group";} @@ -52,6 +54,7 @@ public: int is_parent() const FL_OVERRIDE {return 1;} int is_group() const FL_OVERRIDE {return 1;} ID id() const FL_OVERRIDE { return ID_Group; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Group) ? true : super::is_a(inID); } Fl_Widget *enter_live_mode(int top=0) FL_OVERRIDE; void leave_live_mode() FL_OVERRIDE; void copy_properties() FL_OVERRIDE; @@ -62,13 +65,16 @@ public: extern const char pack_type_name[]; extern Fl_Menu_Item pack_type_menu[]; -class Fl_Pack_Type : public Fl_Group_Type { +class Fl_Pack_Type : public Fl_Group_Type +{ + typedef Fl_Group_Type super; Fl_Menu_Item *subtypes() FL_OVERRIDE {return pack_type_menu;} public: const char *type_name() FL_OVERRIDE {return pack_type_name;} const char *alt_type_name() FL_OVERRIDE {return "fltk::PackedGroup";} Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Pack_Type();} ID id() const FL_OVERRIDE { return ID_Pack; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Pack) ? true : super::is_a(inID); } Fl_Widget *enter_live_mode(int top=0) FL_OVERRIDE; void copy_properties() FL_OVERRIDE; }; @@ -78,7 +84,9 @@ public: extern const char flex_type_name[]; extern Fl_Menu_Item flex_type_menu[]; -class Fl_Flex_Type : public Fl_Group_Type { +class Fl_Flex_Type : public Fl_Group_Type +{ + typedef Fl_Group_Type super; Fl_Menu_Item *subtypes() FL_OVERRIDE {return flex_type_menu;} int fixedSizeTupleSize; /* number of pairs in array */ int *fixedSizeTuple; /* [ index, size, index2, size2, ... ] */ @@ -91,6 +99,7 @@ public: Fl_Widget *widget(int X,int Y,int W,int H) FL_OVERRIDE { Fl_Flex *g = new Fl_Flex(X,Y,W,H); Fl_Group::current(0); return g;} ID id() const FL_OVERRIDE { return ID_Flex; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Flex) ? true : super::is_a(inID); } void write_properties(Fd_Project_Writer &f) FL_OVERRIDE; void read_property(Fd_Project_Reader &f, const char *) FL_OVERRIDE; Fl_Widget *enter_live_mode(int top=0) FL_OVERRIDE; @@ -137,7 +146,9 @@ public: itabs(int X,int Y,int W,int H) : Fl_Tabs(X,Y,W,H) {} }; -class Fl_Tabs_Type : public Fl_Group_Type { +class Fl_Tabs_Type : public Fl_Group_Type +{ + typedef Fl_Group_Type super; public: const char *type_name() FL_OVERRIDE {return tabs_type_name;} const char *alt_type_name() FL_OVERRIDE {return "fltk::TabGroup";} @@ -148,6 +159,7 @@ public: void add_child(Fl_Type*, Fl_Type*) FL_OVERRIDE; void remove_child(Fl_Type*) FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Tabs; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Tabs) ? true : super::is_a(inID); } Fl_Widget *enter_live_mode(int top=0) FL_OVERRIDE; int is_tabs() const FL_OVERRIDE {return 1;} }; @@ -157,13 +169,16 @@ public: extern const char scroll_type_name[]; extern Fl_Menu_Item scroll_type_menu[]; -class Fl_Scroll_Type : public Fl_Group_Type { +class Fl_Scroll_Type : public Fl_Group_Type +{ + typedef Fl_Group_Type super; Fl_Menu_Item *subtypes() FL_OVERRIDE {return scroll_type_menu;} public: const char *type_name() FL_OVERRIDE {return scroll_type_name;} const char *alt_type_name() FL_OVERRIDE {return "fltk::ScrollGroup";} Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Scroll_Type();} ID id() const FL_OVERRIDE { return ID_Scroll; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Scroll) ? true : super::is_a(inID); } Fl_Widget *enter_live_mode(int top=0) FL_OVERRIDE; void copy_properties() FL_OVERRIDE; int is_scroll() const FL_OVERRIDE { return 1; } @@ -173,12 +188,15 @@ public: extern const char tile_type_name[]; -class Fl_Tile_Type : public Fl_Group_Type { +class Fl_Tile_Type : public Fl_Group_Type +{ + typedef Fl_Group_Type super; public: const char *type_name() FL_OVERRIDE {return tile_type_name;} const char *alt_type_name() FL_OVERRIDE {return "fltk::TileGroup";} Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Tile_Type();} ID id() const FL_OVERRIDE { return ID_Tile; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Tile) ? true : super::is_a(inID); } void copy_properties() FL_OVERRIDE; }; @@ -193,7 +211,9 @@ public: extern const char wizard_type_name[]; -class Fl_Wizard_Type : public Fl_Group_Type { +class Fl_Wizard_Type : public Fl_Group_Type +{ + typedef Fl_Group_Type super; public: const char *type_name() FL_OVERRIDE {return wizard_type_name;} const char *alt_type_name() FL_OVERRIDE {return "fltk::WizardGroup";} @@ -201,6 +221,7 @@ public: iwizard *g = new iwizard(X,Y,W,H); Fl_Group::current(0); return g;} Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Wizard_Type();} ID id() const FL_OVERRIDE { return ID_Wizard; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Wizard) ? true : super::is_a(inID); } }; #endif // _FLUID_FL_GROUP_TYPE_H diff --git a/fluid/Fl_Menu_Type.cxx b/fluid/Fl_Menu_Type.cxx index 37d44148d..7b582e65b 100644 --- a/fluid/Fl_Menu_Type.cxx +++ b/fluid/Fl_Menu_Type.cxx @@ -158,7 +158,7 @@ Fl_Type *Fl_Menu_Item_Type::make(Strategy strategy) { if ( (force_parent && q->is_menu_item()) || !q->is_parent()) p = p->parent; } force_parent = 0; - if (!p || !(p->is_menu_button() || (p->is_menu_item() && p->is_parent()))) { + if (!p || !(p->is_a(ID_Menu_Manager_) || (p->is_menu_item() && p->is_parent()))) { fl_message("Please select a menu to add to"); return 0; } @@ -532,7 +532,7 @@ void Fl_Menu_Item_Type::write_code2(Fd_Code_Writer&) {} // children. An actual array of Fl_Menu_Items is kept parallel // with the child objects and updated as they change. -void Fl_Menu_Type::build_menu() { +void Fl_Menu_Base_Type::build_menu() { Fl_Menu_* w = (Fl_Menu_*)o; // count how many Fl_Menu_Item structures needed: int n = 0; @@ -596,7 +596,7 @@ void Fl_Menu_Type::build_menu() { o->redraw(); } -Fl_Type* Fl_Menu_Type::click_test(int, int) { +Fl_Type* Fl_Menu_Base_Type::click_test(int, int) { if (selected) return 0; // let user move the widget Fl_Menu_* w = (Fl_Menu_*)o; if (!menusize) return 0; @@ -615,7 +615,7 @@ Fl_Type* Fl_Menu_Type::click_test(int, int) { return this; } -void Fl_Menu_Type::write_code2(Fd_Code_Writer& f) { +void Fl_Menu_Manager_Type::write_code2(Fd_Code_Writer& f) { if (next && next->is_menu_item()) { f.write_c("%s%s->menu(%s);\n", f.indent(), name() ? name() : "o", f.unique_id(this, "menu", name(), label())); @@ -623,7 +623,7 @@ void Fl_Menu_Type::write_code2(Fd_Code_Writer& f) { Fl_Widget_Type::write_code2(f); } -void Fl_Menu_Type::copy_properties() { +void Fl_Menu_Base_Type::copy_properties() { Fl_Widget_Type::copy_properties(); Fl_Menu_ *s = (Fl_Menu_*)o, *d = (Fl_Menu_*)live_widget; d->menu(s->menu()); diff --git a/fluid/Fl_Menu_Type.h b/fluid/Fl_Menu_Type.h index 69de6bfaa..f6238930b 100644 --- a/fluid/Fl_Menu_Type.h +++ b/fluid/Fl_Menu_Type.h @@ -21,17 +21,28 @@ #ifndef _FLUID_FL_MENU_TYPE_H #define _FLUID_FL_MENU_TYPE_H -#include "Fl_Widget_Type.h" +#include "Fl_Button_Type.h" +#include <FL/Fl_Choice.H> #include <FL/Fl_Menu_.H> #include <FL/Fl_Menu_Button.H> #include <FL/Fl_Input_Choice.H> #include <FL/Fl_Window.H> #include <FL/Fl_Menu_Bar.H> +extern Fl_Menu_Item dummymenu[]; +extern Fl_Menu_Item button_type_menu[]; extern Fl_Menu_Item menu_item_type_menu[]; -class Fl_Menu_Item_Type : public Fl_Widget_Type { // FIXME: hmmmmm +/** + \brief Manage all types on menu items. + Deriving Fl_Menu_Item_Type from Fl_Button_Type is intentional. For the purpose + of editing, a Menu Item is implemented with `o` pointing to an Fl_Button for + holding all properties. + */ +class Fl_Menu_Item_Type : public Fl_Button_Type +{ + typedef Fl_Button_Type super; public: Fl_Menu_Item* subtypes() FL_OVERRIDE {return menu_item_type_menu;} const char* type_name() FL_OVERRIDE {return "MenuItem";} @@ -48,23 +59,45 @@ public: void write_code1(Fd_Code_Writer& f) FL_OVERRIDE; void write_code2(Fd_Code_Writer& f) FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Menu_Item; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Menu_Item) ? true : super::is_a(inID); } }; -class Fl_Radio_Menu_Item_Type : public Fl_Menu_Item_Type { +/** + \brief Manage Radio style Menu Items. + */ +class Fl_Radio_Menu_Item_Type : public Fl_Menu_Item_Type +{ + typedef Fl_Menu_Item_Type super; public: const char* type_name() FL_OVERRIDE {return "RadioMenuItem";} Fl_Type* make(Strategy strategy) FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Radio_Menu_Item; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Radio_Menu_Item) ? true : super::is_a(inID); } }; -class Fl_Checkbox_Menu_Item_Type : public Fl_Menu_Item_Type { +/** + \brief Manage Checkbox style Menu Items. + */ +class Fl_Checkbox_Menu_Item_Type : public Fl_Menu_Item_Type +{ + typedef Fl_Menu_Item_Type super; public: const char* type_name() FL_OVERRIDE {return "CheckMenuItem";} Fl_Type* make(Strategy strategy) FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Checkbox_Menu_Item; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Checkbox_Menu_Item) ? true : super::is_a(inID); } }; -class Fl_Submenu_Type : public Fl_Menu_Item_Type { +/** + \brief Manage Submenu style Menu Items. + Submenu Items are simply buttons just like all other menu items, but they + can also hold a pointer to a list of submenus, or have a flag set that + allows submenus to follow in the current array. As buttons, they can + be clicked by the user, and they will call their callback, if one is set. + */ +class Fl_Submenu_Type : public Fl_Menu_Item_Type +{ + typedef Fl_Menu_Item_Type super; public: Fl_Menu_Item* subtypes() FL_OVERRIDE {return 0;} const char* type_name() FL_OVERRIDE {return "Submenu";} @@ -78,9 +111,90 @@ public: void move_child(Fl_Type*a, Fl_Type*b) FL_OVERRIDE {parent->move_child(a,b);} void remove_child(Fl_Type*a) FL_OVERRIDE {parent->remove_child(a);} ID id() const FL_OVERRIDE { return ID_Submenu; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Submenu) ? true : super::is_a(inID); } +}; + +// ----------------------------------------------------------------------------- + +/** + \brief Base class for all widgets that can have a pulldown menu attached. + Widgets with this type can be derived from Fl_Menu_ or from + Fl_Group (Fl_Input_Choice). + */ +class Fl_Menu_Manager_Type : public Fl_Widget_Type +{ + typedef Fl_Widget_Type super; +public: + int is_parent() const FL_OVERRIDE {return 1;} + int menusize; + virtual void build_menu() = 0; + Fl_Menu_Manager_Type() : Fl_Widget_Type() {menusize = 0;} + void add_child(Fl_Type*, Fl_Type*) FL_OVERRIDE { build_menu(); } + void move_child(Fl_Type*, Fl_Type*) FL_OVERRIDE { build_menu(); } + void remove_child(Fl_Type*) FL_OVERRIDE { build_menu();} + Fl_Type* click_test(int x, int y) FL_OVERRIDE = 0; + void write_code2(Fd_Code_Writer& f) FL_OVERRIDE; + void copy_properties() FL_OVERRIDE = 0; + ID id() const FL_OVERRIDE { return ID_Menu_Manager_; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Menu_Manager_) ? true : super::is_a(inID); } }; -class Fl_Menu_Type : public Fl_Widget_Type { +/** + \brief Manage the composite widget Input Choice. + \note Input Choice is a composite window, so `o` will be pointing to a widget + derived from Fl_Group. All menu related methods from Fl_Menu_Trait_Type must + be virtual and must be reimplemented here (click_test, build_menu, textstuff). + */ +class Fl_Input_Choice_Type : public Fl_Menu_Manager_Type +{ + typedef Fl_Menu_Manager_Type super; + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) FL_OVERRIDE { + Fl_Input_Choice *myo = (Fl_Input_Choice*)(w==4 ? ((Fl_Widget_Type*)this->factory)->o : this->o); + switch (w) { + case 4: + case 0: f = (Fl_Font)myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; + } +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + Fl_Input_Choice *myo = (Fl_Input_Choice *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() - 6; + w = o->w() - 20 - Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + 20 + Fl::box_dw(o->box()); + if (h < 15) h = 15; + if (w < (15 + h)) w = 15 + h; + } + ~Fl_Input_Choice_Type() { + if (menusize) delete[] (Fl_Menu_Item*)(((Fl_Input_Choice*)o)->menu()); + } + const char *type_name() FL_OVERRIDE {return "Fl_Input_Choice";} + const char *alt_type_name() FL_OVERRIDE {return "fltk::ComboBox";} + Fl_Type* click_test(int,int) FL_OVERRIDE; + Fl_Widget *widget(int X,int Y,int W,int H) FL_OVERRIDE { + Fl_Input_Choice *myo = new Fl_Input_Choice(X,Y,W,H,"input choice:"); + myo->menu(dummymenu); + myo->value("input"); + return myo; + } + Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Input_Choice_Type();} + void build_menu() FL_OVERRIDE; + ID id() const FL_OVERRIDE { return ID_Input_Choice; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Input_Choice) ? true : super::is_a(inID); } + void copy_properties() FL_OVERRIDE; +}; + +/** + \brief Base class to handle widgets that are derived from Fl_Menu_. + */ +class Fl_Menu_Base_Type : public Fl_Menu_Manager_Type +{ + typedef Fl_Menu_Manager_Type super; int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) FL_OVERRIDE { Fl_Menu_ *myo = (Fl_Menu_*)(w==4 ? ((Fl_Widget_Type*)this->factory)->o : this->o); switch (w) { @@ -93,26 +207,25 @@ class Fl_Menu_Type : public Fl_Widget_Type { return 1; } public: - int is_menu_button() const FL_OVERRIDE {return 1;} int is_parent() const FL_OVERRIDE {return 1;} - int menusize; - virtual void build_menu(); - Fl_Menu_Type() : Fl_Widget_Type() {menusize = 0;} - ~Fl_Menu_Type() { + void build_menu() FL_OVERRIDE; + ~Fl_Menu_Base_Type() { if (menusize) delete[] (Fl_Menu_Item*)(((Fl_Menu_*)o)->menu()); } - void add_child(Fl_Type*, Fl_Type*) FL_OVERRIDE {build_menu();} - void move_child(Fl_Type*, Fl_Type*) FL_OVERRIDE {build_menu();} - void remove_child(Fl_Type*) FL_OVERRIDE {build_menu();} Fl_Type* click_test(int x, int y) FL_OVERRIDE; - void write_code2(Fd_Code_Writer& f) FL_OVERRIDE; void copy_properties() FL_OVERRIDE; ID id() const FL_OVERRIDE { return ID_Menu_; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Menu_) ? true : super::is_a(inID); } }; extern Fl_Menu_Item button_type_menu[]; -class Fl_Menu_Button_Type : public Fl_Menu_Type { +/** + \brief Makae Menu Button widgets. + */ +class Fl_Menu_Button_Type : public Fl_Menu_Base_Type +{ + typedef Fl_Menu_Base_Type super; Fl_Menu_Item *subtypes() FL_OVERRIDE {return button_type_menu;} public: void ideal_size(int &w, int &h) FL_OVERRIDE { @@ -128,12 +241,16 @@ public: return new Fl_Menu_Button(X,Y,W,H,"menu");} Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Menu_Button_Type();} ID id() const FL_OVERRIDE { return ID_Menu_Button; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Menu_Button) ? true : super::is_a(inID); } }; -extern Fl_Menu_Item dummymenu[]; -#include <FL/Fl_Choice.H> -class Fl_Choice_Type : public Fl_Menu_Type { +/** + \brief Manage Choice type menu widgets. + */ +class Fl_Choice_Type : public Fl_Menu_Base_Type +{ + typedef Fl_Menu_Base_Type super; public: void ideal_size(int &w, int &h) FL_OVERRIDE { Fl_Widget_Type::ideal_size(w, h); @@ -155,47 +272,16 @@ public: } Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Choice_Type();} ID id() const FL_OVERRIDE { return ID_Choice; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Choice) ? true : super::is_a(inID); } }; -class Fl_Input_Choice_Type : public Fl_Menu_Type { // FIXME: Composite: Fl_Group - int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) FL_OVERRIDE { - Fl_Input_Choice *myo = (Fl_Input_Choice*)(w==4 ? ((Fl_Widget_Type*)this->factory)->o : this->o); - switch (w) { - case 4: - case 0: f = (Fl_Font)myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; - case 1: myo->textfont(f); break; - case 2: myo->textsize(s); break; - case 3: myo->textcolor(c); break; - } - return 1; - } -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - Fl_Input_Choice *myo = (Fl_Input_Choice *)o; - fl_font(myo->textfont(), myo->textsize()); - h = fl_height() + myo->textsize() - 6; - w = o->w() - 20 - Fl::box_dw(o->box()); - int ww = (int)fl_width('m'); - w = ((w + ww - 1) / ww) * ww + 20 + Fl::box_dw(o->box()); - if (h < 15) h = 15; - if (w < (15 + h)) w = 15 + h; - } - const char *type_name() FL_OVERRIDE {return "Fl_Input_Choice";} - const char *alt_type_name() FL_OVERRIDE {return "fltk::ComboBox";} - Fl_Type* click_test(int,int) FL_OVERRIDE; - Fl_Widget *widget(int X,int Y,int W,int H) FL_OVERRIDE { - Fl_Input_Choice *myo = new Fl_Input_Choice(X,Y,W,H,"input choice:"); - myo->menu(dummymenu); - myo->value("input"); - return myo; - } - Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Input_Choice_Type();} - void build_menu() FL_OVERRIDE; - ID id() const FL_OVERRIDE { return ID_Input_Choice; } - void copy_properties() FL_OVERRIDE; -}; -class Fl_Menu_Bar_Type : public Fl_Menu_Type { +/** + \brief Manage Menubar widgets. + */ +class Fl_Menu_Bar_Type : public Fl_Menu_Base_Type +{ + typedef Fl_Menu_Base_Type super; public: void ideal_size(int &w, int &h) FL_OVERRIDE { w = o->window()->w(); @@ -207,6 +293,7 @@ public: Fl_Widget *widget(int X,int Y,int W,int H) FL_OVERRIDE {return new Fl_Menu_Bar(X,Y,W,H);} Fl_Widget_Type *_make() FL_OVERRIDE {return new Fl_Menu_Bar_Type();} ID id() const FL_OVERRIDE { return ID_Menu_Bar; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Menu_Bar) ? true : super::is_a(inID); } }; diff --git a/fluid/Fl_Type.cxx b/fluid/Fl_Type.cxx index 18c108ca8..110122a1e 100644 --- a/fluid/Fl_Type.cxx +++ b/fluid/Fl_Type.cxx @@ -18,17 +18,79 @@ /// \{ /** \class Fl_Type -Each object described by Fluid is one of these objects. They -are all stored in a double-linked list. + Each object described by Fluid is one of these objects. They + are all stored in a double-linked list. + + The "type" of the object is covered by the virtual functions. + There will probably be a lot of these virtual functions. + + The type browser is also a list of these objects, but they + are "factory" instances, not "real" ones. These objects exist + only so the "make" method can be called on them. They are + not in the linked list and are not written to files or + copied or otherwise examined. + + The Fl_Type inheritance is currently: + --+-- Fl_Type + +-- Fl_Function_Type + +-- Fl_Code_Type + +-- Fl_CodeBlock_Type + +-+ Fl_Decl_Type + | +-- Fl_Data + +-- Fl_DeclBlock_Type + +-- Fl_Comment_Type + +-- Fl_Class_Type + +-+ Fl_Widget_Type, 'o' points to a class derived from Fl_Widget + +-+ Fl_Browser_Base_Type, 'o' is Fl_Browser + | +-+ Fl_Browser + | | +-- Fl_File_Browser + | +-- Fl_Check_Browser + +-- Fl_Tree_Type + +-- Fl_Help_View_Type + +-+ Fl_Valuator_Type, 'o' is Fl_Valuator_ + | +-- Fl_Counter_Type + | +-- Fl_Adjuster_Type + | +-- Fl_Dial_Type + | +-- Fl_Roller_Type + | +-- Fl_Slider_Type + | +-- Fl_Value_Input_Type + | +-- Fl_Value_Output_Type + +-+ Fl_Input_Type + | +-- Fl_Output_Type + +-+ Fl_Text_Display_Type + | +-- Fl_Text_Editor+Type + | +-- Fl_Simple_Terminal_Type + +-- Fl_Box_Type + +-- Fl_Clock_Type + +-- Fl_Progress_Type + +-- Fl_Spinner_Type + +-+ Fl_Group_Type + | +-- Fl_Pack_Type + | +-- Fl_Flex_Type + | +-- Fl_Table_Type + | +-- Fl_Tabs_Type + | +-- Fl_Scroll_Type + | +-- Fl_Tile_Type + | +-- Fl_Wizard_Type + | +-+ Fl_Window_Type + | +-- Fl_Widget_Class_Type + +-+ Fl_Menu_Manager_Type, 'o' is based on Fl_Widget + | +-+ Fl_Menu_Base_Type, 'o' is based on Fl_Menu_ + | | +-- Fl_Menu_Button_Type + | | +-- Fl_Choice_Type + | | +-- Fl_Menu_Bar_Type + | +-- Fl_Input_Choice_Type, 'o' is based on Fl_Input_Choice which is Fl_Group + +-+ Fl_Button_Type + +-- Fl_Return_Button_Type + +-- Fl_Repeat_Button_Type + +-- Fl_Light_Button_Type + +-- Fl_Check_Button_Type + +-- Fl_Round_Button_Type + +-+ Fl_Menu_Item_Type, 'o' is derived from Fl_Button in FLUID + +-- Fl_Radio_Menu_Item_Type + +-- Fl_Checkbox_Menu_Item_Type + +-- Fl_Submenu_Item_Type -The "type" of the object is covered by the virtual functions. -There will probably be a lot of these virtual functions. - -The type browser is also a list of these objects, but they -are "factory" instances, not "real" ones. These objects exist -only so the "make" method can be called on them. They are -not in the linked list and are not written to files or -copied or otherwise examined. */ #include "Fl_Type.h" diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h index bd604eae3..85879fea9 100644 --- a/fluid/Fl_Type.h +++ b/fluid/Fl_Type.h @@ -89,7 +89,7 @@ public: enum ID { // administrative - ID_Base_, ID_Widget_, ID_Menu_, ID_Browser_, ID_Valuator, + ID_Base_, ID_Widget_, ID_Menu_Manager_, ID_Menu_, ID_Browser_, ID_Valuator_, // non-widget ID_Function, ID_Code, ID_CodeBlock, ID_Decl, ID_DeclBlock, ID_Class, @@ -187,7 +187,6 @@ public: /// TODO: Misnamed: This is true if the widget is a button or a menu item with button functionality virtual int is_button() const {return 0;} virtual int is_menu_item() const {return 0;} - virtual int is_menu_button() const {return 0;} virtual int is_group() const {return 0;} virtual int is_tabs() const {return 0;} virtual int is_scroll() const {return 0;} diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx index a45100563..96631a149 100644 --- a/fluid/Fl_Widget_Type.cxx +++ b/fluid/Fl_Widget_Type.cxx @@ -1050,7 +1050,7 @@ void down_box_cb(Fl_Choice* i, void *v) { n = ((Fl_Button*)(current_widget->o))->down_box(); else if (current_widget->id() == Fl_Type::ID_Input_Choice) n = ((Fl_Input_Choice*)(current_widget->o))->down_box(); - else if (current_widget->is_menu_button()) + else if (current_widget->is_a(Fl_Type::ID_Menu_Manager_)) n = ((Fl_Menu_*)(current_widget->o))->down_box(); else { i->deactivate(); return; @@ -1074,7 +1074,7 @@ void down_box_cb(Fl_Choice* i, void *v) { } else if (o->id() == Fl_Type::ID_Input_Choice) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; ((Fl_Input_Choice*)(q->o))->down_box((Fl_Boxtype)n); - } else if (o->is_menu_button()) { + } else if (o->is_a(Fl_Type::ID_Menu_Manager_)) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; ((Fl_Menu_*)(q->o))->down_box((Fl_Boxtype)n); } @@ -2037,7 +2037,7 @@ void slider_size_cb(Fl_Value_Input* i, void* v) { void min_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { - if (current_widget->is_a(Fl_Type::ID_Valuator)) { + if (current_widget->is_a(Fl_Type::ID_Valuator_)) { i->activate(); i->value(((Fl_Valuator*)(current_widget->o))->minimum()); } else if (current_widget->is_a(Fl_Type::ID_Spinner)) { @@ -2054,7 +2054,7 @@ void min_cb(Fl_Value_Input* i, void* v) { for (Fl_Type *o = Fl_Type::first; o; o = o->next) { if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; - if (q->is_a(Fl_Type::ID_Valuator)) { + if (q->is_a(Fl_Type::ID_Valuator_)) { ((Fl_Valuator*)(q->o))->minimum(n); q->o->redraw(); mod = 1; @@ -2071,7 +2071,7 @@ void min_cb(Fl_Value_Input* i, void* v) { void max_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { - if (current_widget->is_a(Fl_Type::ID_Valuator)) { + if (current_widget->is_a(Fl_Type::ID_Valuator_)) { i->activate(); i->value(((Fl_Valuator*)(current_widget->o))->maximum()); } else if (current_widget->is_a(Fl_Type::ID_Spinner)) { @@ -2088,7 +2088,7 @@ void max_cb(Fl_Value_Input* i, void* v) { for (Fl_Type *o = Fl_Type::first; o; o = o->next) { if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; - if (q->is_a(Fl_Type::ID_Valuator)) { + if (q->is_a(Fl_Type::ID_Valuator_)) { ((Fl_Valuator*)(q->o))->maximum(n); q->o->redraw(); mod = 1; @@ -2105,7 +2105,7 @@ void max_cb(Fl_Value_Input* i, void* v) { void step_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { - if (current_widget->is_a(Fl_Type::ID_Valuator)) { + if (current_widget->is_a(Fl_Type::ID_Valuator_)) { i->activate(); i->value(((Fl_Valuator*)(current_widget->o))->step()); } else if (current_widget->is_a(Fl_Type::ID_Spinner)) { @@ -2122,7 +2122,7 @@ void step_cb(Fl_Value_Input* i, void* v) { for (Fl_Type *o = Fl_Type::first; o; o = o->next) { if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; - if (q->is_a(Fl_Type::ID_Valuator)) { + if (q->is_a(Fl_Type::ID_Valuator_)) { ((Fl_Valuator*)(q->o))->step(n); q->o->redraw(); mod = 1; @@ -2139,7 +2139,7 @@ void step_cb(Fl_Value_Input* i, void* v) { void value_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { - if (current_widget->is_a(Fl_Type::ID_Valuator)) { + if (current_widget->is_a(Fl_Type::ID_Valuator_)) { i->activate(); i->value(((Fl_Valuator*)(current_widget->o))->value()); } else if (current_widget->is_button()) { @@ -2157,7 +2157,7 @@ void value_cb(Fl_Value_Input* i, void* v) { for (Fl_Type *o = Fl_Type::first; o; o = o->next) { if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; - if (q->is_a(Fl_Type::ID_Valuator)) { + if (q->is_a(Fl_Type::ID_Valuator_)) { ((Fl_Valuator*)(q->o))->value(n); mod = 1; } else if (q->is_button()) { @@ -3041,7 +3041,7 @@ void Fl_Widget_Type::write_widget_code(Fd_Code_Writer& f) { Fl_Input_Choice* b = (Fl_Input_Choice*)o; if (b->down_box()) f.write_c("%s%s->down_box(FL_%s);\n", f.indent(), var, boxname(b->down_box())); - } else if (is_menu_button()) { + } else if (is_a(Fl_Type::ID_Menu_Manager_)) { Fl_Menu_* b = (Fl_Menu_*)o; if (b->down_box()) f.write_c("%s%s->down_box(FL_%s);\n", f.indent(), var, boxname(b->down_box())); @@ -3061,7 +3061,7 @@ void Fl_Widget_Type::write_widget_code(Fd_Code_Writer& f) { f.write_c("%s%s->labelsize(%d);\n", f.indent(), var, o->labelsize()); if (o->labelcolor() != tplate->labelcolor() || subclass()) write_color(f, "labelcolor", o->labelcolor()); - if (is_a(ID_Valuator)) { + if (is_a(ID_Valuator_)) { Fl_Valuator* v = (Fl_Valuator*)o; Fl_Valuator* t = (Fl_Valuator*)(tplate); if (v->minimum()!=t->minimum()) @@ -3217,7 +3217,7 @@ void Fl_Widget_Type::write_properties(Fd_Project_Writer &f) { Fl_Input_Choice* b = (Fl_Input_Choice*)o; if (b->down_box()) { f.write_string("down_box"); f.write_word(boxname(b->down_box()));} - } else if (is_menu_button()) { + } else if (is_a(Fl_Type::ID_Menu_)) { Fl_Menu_* b = (Fl_Menu_*)o; if (b->down_box()) { f.write_string("down_box"); f.write_word(boxname(b->down_box()));} @@ -3240,7 +3240,7 @@ void Fl_Widget_Type::write_properties(Fd_Project_Writer &f) { f.write_string("align %d", o->align()); if (o->when() != tplate->when()) f.write_string("when %d", o->when()); - if (is_a(ID_Valuator)) { + if (is_a(ID_Valuator_)) { Fl_Valuator* v = (Fl_Valuator*)o; Fl_Valuator* t = (Fl_Valuator*)(tplate); if (v->minimum()!=t->minimum()) f.write_string("minimum %g",v->minimum()); @@ -3351,7 +3351,7 @@ void Fl_Widget_Type::read_property(Fd_Project_Reader &f, const char *c) { if (x == ZERO_ENTRY) x = 0; ((Fl_Input_Choice*)o)->down_box((Fl_Boxtype)x); } - } else if (is_menu_button() && !strcmp(c,"down_box")) { + } else if (is_a(Fl_Type::ID_Menu_) && !strcmp(c,"down_box")) { const char* value = f.read_word(); if ((x = boxnumber(value))) { if (x == ZERO_ENTRY) x = 0; @@ -3398,21 +3398,19 @@ void Fl_Widget_Type::read_property(Fd_Project_Reader &f, const char *c) { } else if (!strcmp(c,"when")) { if (sscanf(f.read_word(),"%d",&x) == 1) o->when(x); } else if (!strcmp(c,"minimum")) { - if (is_a(ID_Valuator)) ((Fl_Valuator*)o)->minimum(strtod(f.read_word(),0)); + if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->minimum(strtod(f.read_word(),0)); if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->minimum(strtod(f.read_word(),0)); } else if (!strcmp(c,"maximum")) { - if (is_a(ID_Valuator)) ((Fl_Valuator*)o)->maximum(strtod(f.read_word(),0)); + if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->maximum(strtod(f.read_word(),0)); if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->maximum(strtod(f.read_word(),0)); } else if (!strcmp(c,"step")) { - if (is_a(ID_Valuator)) ((Fl_Valuator*)o)->step(strtod(f.read_word(),0)); + if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->step(strtod(f.read_word(),0)); if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->step(strtod(f.read_word(),0)); } else if (!strcmp(c,"value")) { - if (is_a(ID_Valuator)) ((Fl_Valuator*)o)->value(strtod(f.read_word(),0)); + if (is_a(ID_Valuator_)) ((Fl_Valuator*)o)->value(strtod(f.read_word(),0)); if (is_a(ID_Spinner)) ((Fl_Spinner*)o)->value(strtod(f.read_word(),0)); } else if ( (!strcmp(c,"slider_size") || !strcmp(c,"size")) && is_a(ID_Slider)) { ((Fl_Slider*)o)->slider_size(strtod(f.read_word(),0)); - } else if ( (!strcmp(c,"slider_size") || !strcmp(c,"size")) ) { - int x = is_a(ID_Slider); } else if (!strcmp(c,"textfont")) { if (sscanf(f.read_word(),"%d",&x) == 1) {ft=(Fl_Font)x; textstuff(1,ft,s,cc);} } else if (!strcmp(c,"textsize")) { @@ -3658,7 +3656,7 @@ void Fl_Widget_Type::copy_properties() { } // copy all attributes specific to Fl_Valuator and derived classes - if (is_a(ID_Valuator)) { + if (is_a(ID_Valuator_)) { Fl_Valuator* d = (Fl_Valuator*)live_widget, *s = (Fl_Valuator*)o; d->minimum(s->minimum()); d->maximum(s->maximum()); diff --git a/fluid/Fl_Window_Type.h b/fluid/Fl_Window_Type.h index 5d232217d..7d4bc6474 100644 --- a/fluid/Fl_Window_Type.h +++ b/fluid/Fl_Window_Type.h @@ -21,12 +21,13 @@ #ifndef _FLUID_FL_WINDOW_TYPE_H #define _FLUID_FL_WINDOW_TYPE_H -#include "Fl_Widget_Type.h" +#include "Fl_Group_Type.h" class Fl_Widget_Class_Type; extern Fl_Menu_Item window_type_menu[]; extern Fl_Widget_Class_Type *current_widget_class; + void toggle_overlays(Fl_Widget *,void *); void toggle_guides(Fl_Widget *,void *); void toggle_restricted(Fl_Widget *,void *); @@ -43,7 +44,9 @@ enum { FD_BOX = 32 // user creates a new selection box }; -class Fl_Window_Type : public Fl_Widget_Type { // FIXME: Fl_Group +class Fl_Window_Type : public Fl_Group_Type +{ + typedef Fl_Group_Type super; protected: Fl_Menu_Item* subtypes() FL_OVERRIDE {return window_type_menu;} @@ -71,6 +74,7 @@ protected: int recalc; // set by fix_overlay() void moveallchildren(); ID id() const FL_OVERRIDE { return ID_Window; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Window) ? true : super::is_a(inID); } void open_(); public: @@ -122,7 +126,9 @@ public: static int popupx, popupy; }; -class Fl_Widget_Class_Type : private Fl_Window_Type { +class Fl_Widget_Class_Type : private Fl_Window_Type +{ + typedef Fl_Window_Type super; protected: Fl_Menu_Item* subtypes() FL_OVERRIDE {return 0;} @@ -143,6 +149,7 @@ public: Fl_Type *make(Strategy strategy) FL_OVERRIDE; const char *type_name() FL_OVERRIDE {return "widget_class";} ID id() const FL_OVERRIDE { return ID_Widget_Class; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Widget_Class) ? true : super::is_a(inID); } int is_parent() const FL_OVERRIDE {return 1;} int is_code_block() const FL_OVERRIDE {return 1;} int is_decl_block() const FL_OVERRIDE {return 1;} diff --git a/fluid/align_widget.cxx b/fluid/align_widget.cxx index 20a85a394..ecfea0dc4 100644 --- a/fluid/align_widget.cxx +++ b/fluid/align_widget.cxx @@ -60,7 +60,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(left, w->y(), w->w(), w->h()); } else { @@ -95,7 +95,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize((center2-w->w())/2, w->y(), w->w(), w->h()); } else { @@ -127,7 +127,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(right-w->w(), w->y(), w->w(), w->h()); } else { @@ -158,7 +158,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(w->x(), top, w->w(), w->h()); } else { @@ -193,7 +193,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(w->x(), (center2-w->h())/2, w->w(), w->h()); } else { @@ -225,7 +225,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize( w->x(), bot-w->h(), w->w(), w->h()); } else { @@ -265,7 +265,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(left+wsum+wdt*cnt/n, w->y(), w->w(), w->h()); } else { @@ -307,7 +307,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(w->x(), top+hsum+hgt*cnt/n, w->w(), w->h()); } else { @@ -342,7 +342,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(w->x(), w->y(), wdt, w->h()); } else { @@ -373,7 +373,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize( w->x(), w->y(), w->w(), hgt); } else { @@ -406,7 +406,7 @@ void align_widget_cb(Fl_Widget*, long how) } Fl_Widget *w = ((Fl_Widget_Type *)o)->o; if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize( w->x(), w->y(), wdt, hgt); } else { @@ -434,7 +434,7 @@ void align_widget_cb(Fl_Widget*, long how) else center2 = 2*p->x()+p->w(); if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button() && !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize((center2-w->w())/2, w->y(), w->w(), w->h()); } else { @@ -461,7 +461,7 @@ void align_widget_cb(Fl_Widget*, long how) else center2 = 2*p->y()+p->h(); if (o->next && o->next->level > o->level && !o->next->selected && - !o->is_menu_button()) { + !o->is_a(Fl_Type::ID_Menu_Manager_)) { // When resizing a group, make sure we also move the children... ((igroup *)w)->full_resize(w->x(), (center2-w->h())/2, w->w(), w->h()); } else { diff --git a/fluid/factory.cxx b/fluid/factory.cxx index aa75beb76..43139403b 100644 --- a/fluid/factory.cxx +++ b/fluid/factory.cxx @@ -72,268 +72,6 @@ #include <stdlib.h> - -// ---- Other Types --------------------------------------------------- MARK: - - - -// ---- Box ---- - -/** - \brief Manage box widgets. - Ideal size is set to 100x100, snapped to layout. - */ -class Fl_Box_Type : public Fl_Widget_Type -{ - typedef Fl_Widget_Type super; -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - w = 100; h = 100; - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Box"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::Widget"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Box(x, y, w, h, "label"); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Box_Type(); } - ID id() const FL_OVERRIDE { return ID_Box; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Box) ? true : super::is_a(inID); } -}; - -static Fl_Box_Type Fl_Box_type; - - -// ---- Clock ---- - -/** - \brief Manage Clock widgets. - Ideal size is set to 80x80 snapped to layout. - */ -class Fl_Clock_Type : public Fl_Widget_Type -{ - typedef Fl_Widget_Type super; -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - w = 80; h = 80; - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Clock"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::Clock"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Clock(x, y, w, h); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Clock_Type(); } - ID id() const FL_OVERRIDE { return ID_Clock; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Clock) ? true : super::is_a(inID); } -}; - -static Fl_Clock_Type Fl_Clock_type; - - -// ---- Progress ---- - -/** - \brief Manage a Progress widget. - Ideal size is set to match the label font and label text width times 3. - \note minimum, maximum, and value must be set via extra code fields. - */ -class Fl_Progress_Type : public Fl_Widget_Type -{ - typedef Fl_Widget_Type super; -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - h = layout->labelsize + 8; - w = layout->labelsize * 12; - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Progress"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::ProgressBar"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - Fl_Progress *myo = new Fl_Progress(x, y, w, h, "label"); - myo->value(50); - return myo; - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Progress_Type(); } - ID id() const FL_OVERRIDE { return ID_Progress; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Progress) ? true : super::is_a(inID); } -}; - -static Fl_Progress_Type Fl_Progress_type; - - - -// ---- Button Types --------------------------------------------------- MARK: - - - -// ---- Button ---- - -static Fl_Menu_Item buttontype_menu[] = { - {"Normal", 0, 0, (void*)0}, - {"Toggle", 0, 0, (void*)FL_TOGGLE_BUTTON}, - {"Radio", 0, 0, (void*)FL_RADIO_BUTTON}, - {0} -}; - -/** - \brief A handler for the simple push button and a base class for all other buttons. - */ -class Fl_Button_Type : public Fl_Widget_Type -{ - typedef Fl_Widget_Type super; - Fl_Menu_Item *subtypes() FL_OVERRIDE { return buttontype_menu; } -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - h = layout->labelsize + 8; - w = layout->labelsize * 4 + 8; - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Button"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::Button"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Button(x, y, w, h, "Button"); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Button_Type(); } - int is_button() const FL_OVERRIDE { return 1; } - ID id() const FL_OVERRIDE { return ID_Button; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Button) ? true : super::is_a(inID); } -}; - -static Fl_Button_Type Fl_Button_type; - - -// ---- Return Button ---- - -/** - \brief The Return Button is simply a Button with the return key as a hotkey. - */ -class Fl_Return_Button_Type : public Fl_Button_Type -{ - typedef Fl_Button_Type super; -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - h = layout->labelsize + 8; - w = layout->labelsize * 4 + 8 + h; // make room for the symbol - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Return_Button"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::ReturnButton"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Return_Button(x, y, w, h, "Button"); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Return_Button_Type(); } - ID id() const FL_OVERRIDE { return ID_Return_Button; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Return_Button) ? true : super::is_a(inID); } -}; - -static Fl_Return_Button_Type Fl_Return_Button_type; - - -// ---- Repeat Button ---- - -/** - \brief Handler for Fl_Repeat_Button. - \note Even though Fl_Repeat_Button is somewhat limited compared to Fl_Button, - and some settings may not make much sense, it is still derived from it, - so the wrapper should be as well. - */ -class Fl_Repeat_Button_Type : public Fl_Button_Type -{ - typedef Fl_Button_Type super; -public: - const char *type_name() FL_OVERRIDE { return "Fl_Repeat_Button"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::RepeatButton"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Repeat_Button(x, y, w, h, "Button"); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Repeat_Button_Type(); } - ID id() const FL_OVERRIDE { return ID_Repeat_Button; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Repeat_Button) ? true : super::is_a(inID); } -}; - -static Fl_Repeat_Button_Type Fl_Repeat_Button_type; - - -// ---- Light Button ---- - -/** - \brief A handler for a toggle button with an indicator light. - */ -class Fl_Light_Button_Type : public Fl_Button_Type -{ - typedef Fl_Button_Type super; -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - h = layout->labelsize + 8; - w = layout->labelsize * 4 + 8 + layout->labelsize; // make room for the light - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Light_Button"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::LightButton"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Light_Button(x, y, w, h, "Button"); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Light_Button_Type(); } - ID id() const FL_OVERRIDE { return ID_Light_Button; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Light_Button) ? true : super::is_a(inID); } -}; - -static Fl_Light_Button_Type Fl_Light_Button_type; - - -// ---- Check Button ---- - -/** - \brief Manage buttons with a check mark on its left. - */ -class Fl_Check_Button_Type : public Fl_Button_Type -{ - typedef Fl_Button_Type super; -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - h = layout->labelsize + 8; - w = layout->labelsize * 4 + 8 + layout->labelsize; // make room for the symbol - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Check_Button"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::CheckButton"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Check_Button(x, y, w, h, "Button"); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Check_Button_Type(); } - ID id() const FL_OVERRIDE { return ID_Check_Button; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Check_Button) ? true : super::is_a(inID); } -}; - -static Fl_Check_Button_Type Fl_Check_Button_type; - - -// ---- Round Button ---- - -/** - \brief Manage buttons with a round indicator on its left. - */ -class Fl_Round_Button_Type : public Fl_Button_Type -{ - typedef Fl_Button_Type super; -public: - void ideal_size(int &w, int &h) FL_OVERRIDE { - h = layout->labelsize + 8; - w = layout->labelsize * 4 + 8 + layout->labelsize; // make room for the symbol - Fd_Snap_Action::better_size(w, h); - } - const char *type_name() FL_OVERRIDE { return "Fl_Round_Button"; } - const char *alt_type_name() FL_OVERRIDE { return "fltk::RadioButton"; } - Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { - return new Fl_Round_Button(x, y, w, h, "Button"); - } - Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Round_Button_Type(); } - ID id() const FL_OVERRIDE { return ID_Round_Button; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Round_Button) ? true : super::is_a(inID); } -}; -static Fl_Round_Button_Type Fl_Round_Button_type; - - - // ---- Browser Types -------------------------------------------------- MARK: - @@ -586,8 +324,8 @@ public: return new Fl_Slider(x, y, w, h, "Valuator"); } Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Valuator_Type(); } - ID id() const FL_OVERRIDE { return ID_Valuator; } - bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Valuator) ? true : super::is_a(inID); } + ID id() const FL_OVERRIDE { return ID_Valuator_; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Valuator_) ? true : super::is_a(inID); } }; static Fl_Valuator_Type Fl_Valuator_type; @@ -1149,6 +887,90 @@ static Fl_Simple_Terminal_Type Fl_Simple_Terminal_type; // ---- Other ---------------------------------------------------------- MARK: - +// ---- Box ---- + +/** + \brief Manage box widgets. + Ideal size is set to 100x100, snapped to layout. + */ +class Fl_Box_Type : public Fl_Widget_Type +{ + typedef Fl_Widget_Type super; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + w = 100; h = 100; + Fd_Snap_Action::better_size(w, h); + } + const char *type_name() FL_OVERRIDE { return "Fl_Box"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::Widget"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Box(x, y, w, h, "label"); + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Box_Type(); } + ID id() const FL_OVERRIDE { return ID_Box; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Box) ? true : super::is_a(inID); } +}; + +static Fl_Box_Type Fl_Box_type; + + +// ---- Clock ---- + +/** + \brief Manage Clock widgets. + Ideal size is set to 80x80 snapped to layout. + */ +class Fl_Clock_Type : public Fl_Widget_Type +{ + typedef Fl_Widget_Type super; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + w = 80; h = 80; + Fd_Snap_Action::better_size(w, h); + } + const char *type_name() FL_OVERRIDE { return "Fl_Clock"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::Clock"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + return new Fl_Clock(x, y, w, h); + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Clock_Type(); } + ID id() const FL_OVERRIDE { return ID_Clock; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Clock) ? true : super::is_a(inID); } +}; + +static Fl_Clock_Type Fl_Clock_type; + + +// ---- Progress ---- + +/** + \brief Manage a Progress widget. + Ideal size is set to match the label font and label text width times 3. + \note minimum, maximum, and value must be set via extra code fields. + */ +class Fl_Progress_Type : public Fl_Widget_Type +{ + typedef Fl_Widget_Type super; +public: + void ideal_size(int &w, int &h) FL_OVERRIDE { + h = layout->labelsize + 8; + w = layout->labelsize * 12; + Fd_Snap_Action::better_size(w, h); + } + const char *type_name() FL_OVERRIDE { return "Fl_Progress"; } + const char *alt_type_name() FL_OVERRIDE { return "fltk::ProgressBar"; } + Fl_Widget *widget(int x, int y, int w, int h) FL_OVERRIDE { + Fl_Progress *myo = new Fl_Progress(x, y, w, h, "label"); + myo->value(50); + return myo; + } + Fl_Widget_Type *_make() FL_OVERRIDE { return new Fl_Progress_Type(); } + ID id() const FL_OVERRIDE { return ID_Progress; } + bool is_a(ID inID) FL_OVERRIDE { return (inID==ID_Progress) ? true : super::is_a(inID); } +}; + +static Fl_Progress_Type Fl_Progress_type; + // ---- Spinner ---- static Fl_Menu_Item spinner_type_menu[] = { @@ -1226,6 +1048,13 @@ extern class Fl_Radio_Menu_Item_Type Fl_Radio_Menu_Item_type; extern class Fl_Submenu_Type Fl_Submenu_type; extern class Fl_Wizard_Type Fl_Wizard_type; +extern class Fl_Button_Type Fl_Button_type; +extern class Fl_Return_Button_Type Fl_Return_Button_type; +extern class Fl_Light_Button_Type Fl_Light_Button_type; +extern class Fl_Check_Button_Type Fl_Check_Button_type; +extern class Fl_Repeat_Button_Type Fl_Repeat_Button_type; +extern class Fl_Round_Button_Type Fl_Round_Button_type; + extern void select(Fl_Type *,int); extern void select_only(Fl_Type *); @@ -1351,7 +1180,7 @@ Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy) { if ((t->parent && t->parent->is_flex())) { // Do not resize or layout the widget. Flex will need the widget size. - } else if (wt->id() == Fl_Type::ID_Menu_Bar) { + } else if (wt->is_a(Fl_Type::ID_Menu_Bar)) { // Move and resize the menubar across the top of the window... wt->o->resize(0, 0, w, h); } else { diff --git a/fluid/file.cxx b/fluid/file.cxx index d6faf29c3..3e7e7348d 100644 --- a/fluid/file.cxx +++ b/fluid/file.cxx @@ -420,7 +420,7 @@ int Fd_Project_Reader::read_project(const char *filename, int merge, Strategy st Fl_Type::current = 0; // Force menu items to be rebuilt... for (o = Fl_Type::first; o; o = o->next) - if (o->is_menu_button()) + if (o->is_a(Fl_Type::ID_Menu_Manager_)) o->add_child(0,0); for (o = Fl_Type::first; o; o = o->next) if (o->selected) { |
