diff --git a/src/GUI/CanvasWidget.hxx b/src/GUI/CanvasWidget.hxx index 0dd654367..011c80944 100644 --- a/src/GUI/CanvasWidget.hxx +++ b/src/GUI/CanvasWidget.hxx @@ -20,7 +20,7 @@ #define CANVASWIDGET_HXX_ #include <Main/fg_props.hxx> -#include <plib/pu.h> +#include "pu.h" #include <simgear/canvas/canvas_fwd.hxx> diff --git a/src/GUI/FGFontCache.cxx b/src/GUI/FGFontCache.cxx index cd73999e3..e23beef30 100755 --- a/src/GUI/FGFontCache.cxx +++ b/src/GUI/FGFontCache.cxx @@ -19,8 +19,7 @@ // this is our one in 3rdparty #include "fnt.h" - -#include <plib/pu.h> +#include "pu.h" #include <simgear/props/props.hxx> #include <simgear/misc/sg_dir.hxx> diff --git a/src/GUI/FGPUIMenuBar.cxx b/src/GUI/FGPUIMenuBar.cxx index 3c055767a..cf1678769 100644 --- a/src/GUI/FGPUIMenuBar.cxx +++ b/src/GUI/FGPUIMenuBar.cxx @@ -4,7 +4,6 @@ #include <string.h> #include <iostream> -#include <plib/pu.h> #include <simgear/debug/logstream.hxx> #include <simgear/structure/SGBinding.hxx> #include <simgear/props/props_io.hxx> @@ -15,6 +14,7 @@ #include "new_gui.hxx" #include "FGPUIMenuBar.hxx" +#include "pu.h" using std::vector; using std::string; diff --git a/src/GUI/MapWidget.hxx b/src/GUI/MapWidget.hxx index 39a8ab4c8..4c49ed124 100644 --- a/src/GUI/MapWidget.hxx +++ b/src/GUI/MapWidget.hxx @@ -7,8 +7,8 @@ #include <simgear/props/props.hxx> #include <Navaids/positioned.hxx> -#include <plib/pu.h> +#include "pu.h" #include "FGPUIDialog.hxx" // forward decls diff --git a/src/GUI/QQuickDrawable.cxx b/src/GUI/QQuickDrawable.cxx index 4ea21233d..76b065502 100755 --- a/src/GUI/QQuickDrawable.cxx +++ b/src/GUI/QQuickDrawable.cxx @@ -64,7 +64,7 @@ #include <simgear/structure/commands.hxx> #if defined(HAVE_PUI) -#include <plib/pu.h> +#include "pu.h" #endif using namespace osgGA; diff --git a/src/GUI/WaypointList.hxx b/src/GUI/WaypointList.hxx index 27d17a217..240649e1a 100644 --- a/src/GUI/WaypointList.hxx +++ b/src/GUI/WaypointList.hxx @@ -9,8 +9,7 @@ #include <simgear/timing/timestamp.hxx> #include <simgear/misc/strutils.hxx> -#include <plib/pu.h> - +#include "pu.h" #include "FGPUIDialog.hxx" // for GUI_ID // forward decls diff --git a/src/GUI/fonts.cxx b/src/GUI/fonts.cxx index ee9f0f591..33db83801 100644 --- a/src/GUI/fonts.cxx +++ b/src/GUI/fonts.cxx @@ -2,8 +2,7 @@ #include <config.h> #endif -#include <plib/pu.h> - +#include "pu.h" #include "fnt.h" diff --git a/src/GUI/gui.cxx b/src/GUI/gui.cxx index 7efb5edeb..a31debd07 100644 --- a/src/GUI/gui.cxx +++ b/src/GUI/gui.cxx @@ -39,8 +39,6 @@ #include <simgear/props/props.hxx> #include <simgear/props/props_io.hxx> -#include <plib/pu.h> - #include <Main/main.hxx> #include <Main/globals.hxx> #include <Main/locale.hxx> diff --git a/src/GUI/gui.h b/src/GUI/gui.h index c6a533cfd..1f1048505 100644 --- a/src/GUI/gui.h +++ b/src/GUI/gui.h @@ -29,10 +29,10 @@ # include <config.h> #endif -#include <plib/pu.h> - #include <simgear/structure/exception.hxx> +#include "pu.h" + #define TR_HIRES_SNAP 1 namespace osg diff --git a/src/GUI/layout-props.cxx b/src/GUI/layout-props.cxx index 2d691036f..765717a79 100644 --- a/src/GUI/layout-props.cxx +++ b/src/GUI/layout-props.cxx @@ -2,9 +2,9 @@ # include <config.h> #endif -#include <plib/pu.h> #include <simgear/props/props.hxx> +#include "pu.h" #include "layout.hxx" // This file contains the code implementing the LayoutWidget class in diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index 3ff7a7bc3..1562edef2 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -11,7 +11,7 @@ #include <cstring> #include <sys/types.h> -#include <plib/pu.h> +#include "pu.h" #include <simgear/compiler.h> #include <simgear/structure/exception.hxx> diff --git a/src/GUI/pu.h b/src/GUI/pu.h new file mode 100644 index 000000000..08a9e9bbd --- /dev/null +++ b/src/GUI/pu.h @@ -0,0 +1,1615 @@ +/* + PLIB - A Suite of Portable Game Libraries + Copyright (C) 1998,2002 Steve Baker + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + For further information visit http://plib.sourceforge.net + + $Id: pu.h 2160 2010-02-27 03:48:23Z fayjf $ +*/ + +#ifndef _PU_H_ +#define _PU_H_ 1 + +#include <stdio.h> +#include <plib/fnt.h> +#include <plib/ulRTTI.h> + +/* + Configuration +*/ + +#define PU_NOBUTTON -1 +#define PU_LEFT_BUTTON 0 +#define PU_MIDDLE_BUTTON 1 +#define PU_RIGHT_BUTTON 2 +#define PU_SCROLL_UP_BUTTON 3 +#define PU_SCROLL_DOWN_BUTTON 4 +#define PU_DOWN 0 +#define PU_UP 1 + +class puFont +{ +protected: + fntFont * fnt_font_handle ; + float pointsize ; + float slant ; + +public: + + puFont () ; + + puFont ( fntFont *tfh, float ps = 13, float sl = 0 ) + { + initialize ( tfh, ps, sl ) ; + } + + void initialize ( fntFont *tfh, float ps, float sl = 0 ) + { + fnt_font_handle = tfh ; + pointsize = ps ; + slant = sl ; + } + + float getPointSize ( ) const { return pointsize; } + + int getStringDescender ( void ) const ; + int getStringHeight ( const char *str ) const ; + int getStringHeight ( void ) const { return getStringHeight ( "" ) ; } + + float getFloatStringWidth ( const char *str ) const ; + int getStringWidth ( const char *str ) const /* Deprecated ? */ + { + return (int) getFloatStringWidth ( str ) ; + } + + void drawString ( const char *str, int x, int y ) ; +} ; + + +extern puFont PUFONT_8_BY_13 ; +extern puFont PUFONT_9_BY_15 ; +extern puFont PUFONT_TIMES_ROMAN_10 ; +extern puFont PUFONT_TIMES_ROMAN_24 ; +extern puFont PUFONT_HELVETICA_10 ; +extern puFont PUFONT_HELVETICA_12 ; +extern puFont PUFONT_HELVETICA_18 ; + +#define PU_UP_AND_DOWN 254 +#define PU_DRAG 255 +#define PU_CONTINUAL PU_DRAG + +/* + WARNING: These have to be the same as PW_KEY_whatever and also + the same as (GLUT_KEY_whatever+256) +*/ + +#define PU_KEY_GLUT_SPECIAL_OFFSET 256 + +#define PU_KEY_F1 (1 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F2 (2 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F3 (3 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F4 (4 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F5 (5 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F6 (6 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F7 (7 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F8 (8 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F9 (9 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F10 (10 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F11 (11 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_F12 (12 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_LEFT (100 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_UP (101 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_RIGHT (102 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_DOWN (103 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_PAGE_UP (104 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_PAGE_DOWN (105 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_HOME (106 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_END (107 + PU_KEY_GLUT_SPECIAL_OFFSET) +#define PU_KEY_INSERT (108 + PU_KEY_GLUT_SPECIAL_OFFSET) + +#define PUARROW_UP 0 +#define PUARROW_DOWN 1 +#define PUARROW_FASTUP 2 +#define PUARROW_FASTDOWN 3 +#define PUARROW_LEFT 4 +#define PUARROW_RIGHT 5 +#define PUARROW_FASTLEFT 6 +#define PUARROW_FASTRIGHT 7 + +#define PUBUTTON_NORMAL 0 +#define PUBUTTON_RADIO 1 +#define PUBUTTON_CIRCLE 2 +#define PUBUTTON_VCHECK 3 /* v-shaped checkmark */ +#define PUBUTTON_XCHECK 4 /* X checkmark */ + +/* Rational Definitions of PUI Legend and Label Places */ +#define PUPLACE_TOP_LEFT 0 +#define PUPLACE_TOP_CENTERED 1 +#define PUPLACE_TOP_RIGHT 2 + +#define PUPLACE_CENTERED_LEFT 3 +#define PUPLACE_CENTERED_RIGHT 4 + +#define PUPLACE_BOTTOM_LEFT 5 +#define PUPLACE_BOTTOM_CENTERED 6 +#define PUPLACE_BOTTOM_RIGHT 7 + +/* Additional definitions for PUI Legend places */ +#define PUPLACE_CENTERED_CENTERED 8 + +/* Additional definitions for PUI Label places */ +#define PUPLACE_ABOVE_LEFT 9 +#define PUPLACE_ABOVE_RIGHT 10 + +#define PUPLACE_BELOW_LEFT 11 +#define PUPLACE_BELOW_RIGHT 12 + +#define PUPLACE_UPPER_LEFT 13 +#define PUPLACE_UPPER_RIGHT 14 + +#define PUPLACE_LOWER_LEFT 15 +#define PUPLACE_LOWER_RIGHT 16 + +/* Default places */ +#define PUPLACE_LABEL_DEFAULT PUPLACE_LOWER_RIGHT +#define PUPLACE_LEGEND_DEFAULT PUPLACE_CENTERED_CENTERED + +/* Keep these for backwards compatibility but deprecate them */ +#define PUPLACE_ABOVE PUPLACE_TOP_LEFT +#define PUPLACE_BELOW PUPLACE_BOTTOM_LEFT +#define PUPLACE_LEFT PUPLACE_LOWER_LEFT +#define PUPLACE_RIGHT PUPLACE_LOWER_RIGHT +#define PUPLACE_CENTERED PUPLACE_CENTERED_CENTERED +#define PUPLACE_TOP_CENTER PUPLACE_TOP_CENTERED +#define PUPLACE_BOTTOM_CENTER PUPLACE_BOTTOM_CENTERED +#define PUPLACE_LEFT_CENTER PUPLACE_CENTERED_LEFT +#define PUPLACE_RIGHT_CENTER PUPLACE_CENTERED_RIGHT + +#define PUPLACE_DEFAULT PUPLACE_LABEL_DEFAULT + +#define PUCOL_FOREGROUND 0 +#define PUCOL_BACKGROUND 1 +#define PUCOL_HIGHLIGHT 2 +#define PUCOL_LABEL 3 +#define PUCOL_LEGEND 4 +#define PUCOL_MISC 5 +#define PUCOL_EDITFIELD 6 +#define PUCOL_MAX 7 + +#define PUSLIDER_CLICK 0 +#define PUSLIDER_ALWAYS 1 +#define PUSLIDER_DELTA 2 + +/* These styles may be negated to get 'highlighted' graphics */ + +#define PUSTYLE_DEFAULT PUSTYLE_SHADED +#define PUSTYLE_NONE 0 +#define PUSTYLE_PLAIN 1 +#define PUSTYLE_BEVELLED 2 +#define PUSTYLE_BOXED 3 +#define PUSTYLE_DROPSHADOW 4 +#define PUSTYLE_SPECIAL_UNDERLINED 5 +#define PUSTYLE_SMALL_BEVELLED 6 +#define PUSTYLE_RADIO 7 /* deprecated ! */ +#define PUSTYLE_SHADED 8 +#define PUSTYLE_SMALL_SHADED 9 +#define PUSTYLE_MAX 10 + +/* These are the gaps that we try to leave around text objects */ + +#define PUSTR_TGAP 5 +#define PUSTR_BGAP 5 +#define PUSTR_LGAP 5 +#define PUSTR_RGAP 5 + +#define PU_RADIO_BUTTON_SIZE 16 + +/* When to deactivate a widget and call its down callback */ +#define PUDEACTIVATE_ON_MOUSE_CLICK 0 +#define PUDEACTIVATE_ON_NEXT_WIDGET_ACTIVATION 1 + +extern int puRefresh ; /* Should not be used directly by applications any + longer. Instead, use puPostRefresh () and + puNeedRefresh (). */ + +#define PUCLASS_VALUE 0x00000001 +#define PUCLASS_OBJECT 0x00000002 +#define PUCLASS_GROUP 0x00000004 +#define PUCLASS_INTERFACE 0x00000008 +#define PUCLASS_FRAME 0x00000010 +#define PUCLASS_TEXT 0x00000020 +#define PUCLASS_BUTTON 0x00000040 +#define PUCLASS_ONESHOT 0x00000080 +#define PUCLASS_POPUP 0x00000100 +#define PUCLASS_POPUPMENU 0x00000200 +#define PUCLASS_MENUBAR 0x00000400 +#define PUCLASS_INPUT 0x00000800 +#define PUCLASS_BUTTONBOX 0x00001000 +#define PUCLASS_SLIDER 0x00002000 +#define PUCLASS_DIALOGBOX 0x00004000 +#define PUCLASS_ARROW 0x00008000 +#define PUCLASS_LISTBOX 0x00010000 +#define PUCLASS_DIAL 0x00020000 + +class puValue ; +class puObject ; +class puGroup ; +class puInterface ; +class puButtonBox ; +class puFrame ; +class puText ; +class puButton ; +class puOneShot ; +class puPopup ; +class puPopupMenu ; +class puMenuBar ; +class puInput ; +class puSlider ; +class puListBox ; +class puArrowButton ; +class puDial ; + +// Global function to move active object to the end of the "dlist" +// so it is displayed in front of everything else + +void puMoveToLast ( puObject *ob ) ; + +typedef float puColour [ 4 ] ; /* RGBA */ +typedef puColour puColor ; + +struct puBox +{ + int min [ 2 ] ; + int max [ 2 ] ; + + void draw ( int dx, int dy, int style, puColour colour[], int am_default, int border ) ; + void extend ( puBox *bx ) ; + + void empty ( void ) { min[0]=min[1]=1000000 ; max[0]=max[1]=-1000000 ; } + int isEmpty ( void ) const { return min[0]>max[0] || min[1]>max[1] ; } +} ; + +#define PUSTRING_MAX 256 + +/* With many memory managers, allocating powers of two is more efficient */ +#define PUSTRING_INITIAL 64 + + +inline void puSetColour ( puColour dst, const puColour src ) +{ + dst[0] = src[0] ; dst[1] = src[1] ; dst[2] = src[2] ; dst[3] = src[3] ; +} +inline void puSetColor ( puColour dst, const puColour src ) +{ + dst[0] = src[0] ; dst[1] = src[1] ; dst[2] = src[2] ; dst[3] = src[3] ; +} + +inline void puSetColour ( puColour c, float r, float g, float b, float a = 1.0f ) +{ + c [ 0 ] = r ; c [ 1 ] = g ; c [ 2 ] = b ; c [ 3 ] = a ; +} +inline void puSetColor ( puColour c, float r, float g, float b, float a = 1.0f ) +{ + c [ 0 ] = r ; c [ 1 ] = g ; c [ 2 ] = b ; c [ 3 ] = a ; +} + + +// puInit () -- is a macro, see below +void puRealInit ( void ) ; +void puExit ( void ) ; +void puDisplay ( void ) ; +void puDisplay ( int window_number ) ; /* Deprecated */ +int puMouse ( int button, int updown, int x, int y ) ; +int puMouse ( int x, int y ) ; +int puKeyboard ( int key, int updown, int x, int y ) ; /* For PW */ +int puKeyboard ( int key, int updown ) ; +void puHideCursor ( void ) ; +void puShowCursor ( void ) ; +int puCursorIsHidden ( void ) ; +void puDeleteObject ( puObject *ob ) ; + +int puNeedRefresh ( void ) ; +void puPostRefresh ( void ) ; + +int puGetWindow ( void ) ; +void puGetWindowSize ( int *width, int *height ) ; +int puGetWindowWidth ( void ) ; +int puGetWindowHeight ( void ) ; + +void puSetWindow ( int w ) ; // don't use it! +void puSetWindowSize ( int width, int height ) ; // don't use it! + +void puSetResizeMode ( int mode ) ; // DEPRECATED + + +// Active widget functions + +void puDeactivateWidget ( void ) ; +void puSetActiveWidget ( puObject *w, int x, int y ) ; +puObject *puActiveWidget ( void ) ; + +// Return the currently active mouse button +extern int puGetPressedButton () ; + + + +class puValue +{ + UL_TYPE_DATA + +protected: + int type ; + + int integer ; + float floater ; + char *string ; + bool boolean ; + + int *res_integer ; + float *res_floater ; + char *res_string ; + bool *res_bool ; + + int string_size ; + int res_string_sz ; + + int convert ; + + void re_eval ( void ) ; + void update_res ( void ) const { } /* Obsolete ! */ ; + + void copy_stringval ( const char *str ) ; + + int * getIntegerp ( void ) { return res_integer != NULL ? res_integer : &integer ; } + float * getFloaterp ( void ) { return res_floater != NULL ? res_floater : &floater ; } + char * getStringp ( void ) { return res_string != NULL ? res_string : string ; } + bool * getBooleanp ( void ) { return res_bool != NULL ? res_bool : &boolean ; } + + void enableConversion ( void ) { convert = TRUE ; } + void disableConversion ( void ) { convert = FALSE ; } + int conversionEnabled ( void ) const { return convert ; } + +public: + puValue () + { + convert = TRUE ; + + string_size = PUSTRING_INITIAL ; + string = new char [ string_size ] ; + + type = PUCLASS_VALUE ; + res_integer = NULL ; + res_floater = NULL ; + res_string = NULL ; + res_bool = NULL ; + clrValue () ; + } + + virtual ~puValue () { delete [] string ; } + + int getType ( void ) const { return type ; } + const char *getTypeString ( void ) const ; + void clrValue ( void ) { setValue ( "" ) ; } + + virtual void setValue ( puValue *pv ) + { + *getIntegerp () = pv -> getIntegerValue () ; + *getFloaterp () = pv -> getFloatValue () ; + copy_stringval ( pv -> getStringValue () ) ; + *getBooleanp () = pv -> getBooleanValue () ; + puPostRefresh () ; + } + + void setValuator ( int *i ) + { + res_integer = i ; + + if ( convert == TRUE ) + { + res_floater = NULL ; res_string = NULL ; res_bool = NULL ; + re_eval () ; + } + } + + void setValuator ( float *f ) + { + res_floater = f ; + + if ( convert == TRUE ) + { + res_integer = NULL ; res_string = NULL ; res_bool = NULL ; + re_eval () ; + } + } + + void setValuator ( char *s, int size ) + { + res_string = s ; + res_string_sz = size ; + + if ( convert == TRUE ) + { + res_integer = NULL ; res_floater = NULL ; res_bool = NULL ; + re_eval () ; + } + } + + void setValuator ( bool *b ) + { + res_bool = b ; + + if ( convert == TRUE ) + { + res_integer = NULL ; res_floater = NULL ; res_string = NULL ; + re_eval () ; + } + } + + /* Obsolete ! */ + void setValuator ( char *s ) { setValuator ( s, PUSTRING_MAX ) ; } + + virtual void setValue ( int i ) + { + *getIntegerp () = i ; + + if ( convert == TRUE ) + { + *getFloaterp () = (float) i ; sprintf ( getStringp (), "%d", i ) ; *getBooleanp () = ( i != 0 ) ; + } + + puPostRefresh () ; + } + + virtual void setValue ( float f ) + { + *getFloaterp () = f ; + + if ( convert == TRUE ) + { + *getIntegerp () = (int) f ; sprintf ( getStringp (), "%g", f ) ; *getBooleanp () = ( f != 0.0 ) ; + } + + puPostRefresh () ; + } + + virtual void setValue ( const char *s ) ; + + virtual void setValue ( bool b ) + { + *getBooleanp () = b ; + + if ( convert == TRUE ) + { + *getIntegerp () = b ? 1 : 0 ; *getFloaterp () = b ? 1.0f : 0.0f ; sprintf ( getStringp (), "%s", b ? "1" : "0" ) ; + } + + puPostRefresh () ; + } + + void getValue ( int *i ) { re_eval () ; *i = *getIntegerp () ; } + void getValue ( float *f ) { re_eval () ; *f = *getFloaterp () ; } + void getValue ( char **s ) { re_eval () ; *s = getStringp () ; } + void getValue ( char *s, int size ) + { + re_eval () ; + + /* Work around ANSI strncpy's null-fill behaviour */ + + s[0] = '\0' ; + strncat ( s, getStringp (), size-1 ) ; + } + + void getValue ( char *s ) { getValue ( s, PUSTRING_MAX ) ; } /* Obsolete ! */ + void getValue ( bool *b ) { re_eval () ; *b = *getBooleanp () ; } + + int getValue ( void ) { return getIntegerValue () ; } /* Obsolete ! */ + + virtual int getIntegerValue ( void ) { re_eval () ; return *getIntegerp () ; } + virtual float getFloatValue ( void ) { re_eval () ; return *getFloaterp () ; } + virtual char getCharValue ( void ) { re_eval () ; return getStringp ()[0]; } + virtual char *getStringValue ( void ) { re_eval () ; return getStringp () ; } + virtual bool getBooleanValue ( void ) { re_eval () ; return *getBooleanp () ; } + + /* RTTI */ + ulRTTItypeid getTypeInfo ( void ) const { return RTTI_vinfo () ; } +} ; + +typedef void (*puCallback)(class puObject *) ; +typedef void (*puRenderCallback)(class puObject *, int dx, int dy, void *) ; + +void puSetDefaultStyle ( int style ) ; +int puGetDefaultStyle ( void ) ; +void puSetDefaultBorderThickness ( int t ) ; +int puGetDefaultBorderThickness ( void ) ; +void puSetDefaultFonts ( puFont legendFont, puFont labelFont ) ; +void puGetDefaultFonts ( puFont *legendFont, puFont *labelFont ) ; + +puFont puGetDefaultLabelFont ( void ) ; +puFont puGetDefaultLegendFont ( void ) ; + +void puSetDefaultColourScheme ( float r, float g, float b, float a = 1.0f ) ; +inline void puSetDefaultColorScheme ( float r, float g, float b, float a = 1.0f ) +{ + puSetDefaultColourScheme ( r, g, b, a ) ; +} + +void puGetDefaultColourScheme ( float *r, float *g, float *b, float *a = NULL ); +inline void puGetDefaultColorScheme ( float *r, float *g, float *b, float *a = NULL ) +{ + puGetDefaultColourScheme ( r, g, b, a ) ; +} + +class puObject : public puValue +{ + UL_TYPE_DATA + +protected: + puValue default_value ; + + puBox bbox ; /* Bounding box of entire Object */ + puBox abox ; /* Active (clickable) area */ + puColour colour [ PUCOL_MAX ] ; + puGroup *parent ; + + int active_mouse_edge ; /* is it PU_UP or PU_DOWN (or both) that activates this? */ + int active_mouse_button ; /* which mouse button or buttons activate this */ + int style ; + int visible ; + int active ; + int highlighted ; + int am_default ; + int window ; /* Which window does the object appear in? */ + int v_status ; /* 1 if the Object should lock in the top left corner, 0 if not */ + + const char *label ; puFont labelFont ; int labelPlace ; + const char *legend ; puFont legendFont ; int legendPlace ; + + void *user_data ; + puCallback cb ; + puCallback active_cb ; + puCallback down_cb ; + puRenderCallback r_cb ; + void *render_data ; + int border_thickness ; + + short when_to_deactivate ; /* On next mouseclick or on next widget activation */ + + virtual void draw_legend ( int dx, int dy ) ; + virtual void draw_label ( int dx, int dy ) ; + +public: + virtual int isHit ( int x, int y ) const { return isVisible() && isActive() && + x > abox.min[0] && + x < abox.max[0] && + y > abox.min[1] && + y < abox.max[1] && + window == puGetWindow () ; } + + virtual void doHit ( int button, int updown, int x, int y ) ; + + puObject ( int minx, int miny, int maxx, int maxy ) ; + ~puObject () ; + + puObject *next ; /* Should not be used directly by applications any longer. */ + puObject *prev ; /* Instead, use the setNextObject and setPrevObject + methods. */ + + puBox *getBBox ( void ) const { return (puBox *) &bbox ; } + puBox *getABox ( void ) const { return (puBox *) &abox ; } + + void getAbsolutePosition ( int *x, int *y ) const ; + + virtual void setPosition ( int x, int y ) + { + if ( abox.isEmpty() ) + { + abox.max[0] = abox.min[0] = x ; + abox.max[1] = abox.min[1] = y ; + } + else + { + abox.max[0] += x - abox.min[0] ; + abox.max[1] += y - abox.min[1] ; + abox.min[0] = x ; + abox.min[1] = y ; + } + recalc_bbox() ; puPostRefresh () ; + } + + virtual void setSize ( int w, int h ) + { + abox.max[0] = abox.min[0] + w ; + abox.max[1] = abox.min[1] + h ; + recalc_bbox() ; puPostRefresh () ; + } + + void getPosition ( int *x, int *y ) const + { + if ( abox.isEmpty () ) + { + if ( x ) *x = 0 ; + if ( y ) *y = 0 ; + } + else + { + if ( x ) *x = abox.min[0] ; + if ( y ) *y = abox.min[1] ; + } + } + + void getSize ( int *w, int *h ) const + { + if ( abox.isEmpty () ) + { + if ( w ) *w = 0 ; + if ( h ) *h = 0 ; + } + else + { + if ( w ) *w = abox.max[0] - abox.min[0] ; + if ( h ) *h = abox.max[1] - abox.min[1] ; + } + } + + virtual void recalc_bbox ( void ) ; + virtual int checkHit ( int button, int updown, int x, int y ) ; + virtual int checkKey ( int key , int updown ) ; + virtual void draw ( int dx, int dy ) = 0 ; + + puGroup *getParent ( void ) const { return parent ; } + void setParent ( puGroup* p ) { parent = p ; } + + void setNextObject ( puObject *obj ) { next = obj ; } + puObject *getNextObject ( void ) const { return next ; } + void setPrevObject ( puObject *obj ) { prev = obj ; } + puObject *getPrevObject ( void ) const { return prev ; } + + void setCallback ( puCallback c ) { cb = c ; } + puCallback getCallback ( void ) const { return cb ; } + void invokeCallback ( void ) { if ( cb != NULL ) (*cb)(this) ; } + + void setActiveCallback ( puCallback c ) { active_cb = c ; } + puCallback getActiveCallback ( void ) const { return active_cb ; } + void invokeActiveCallback ( void ) { if ( active_cb != NULL ) (*active_cb)(this) ; } + + void setDownCallback ( puCallback c ) { down_cb = c ; } + puCallback getDownCallback ( void ) const { return down_cb ; } + virtual void invokeDownCallback ( void ) { if ( down_cb != NULL ) (*down_cb)(this) ; } + + void setRenderCallback ( puRenderCallback c, void *d = NULL ) { r_cb = c ; render_data = d ; } + puRenderCallback getRenderCallback ( void ) const { return r_cb ; } + void *getRenderCallbackData ( void ) const { return render_data ; } + void invokeRenderCallback ( int dx, int dy ) { if ( r_cb != NULL ) (*r_cb)(this, dx, dy, render_data) ; } + + void setBorderThickness ( int t ) { border_thickness = t ; puPostRefresh () ; } + int getBorderThickness ( void ) const { return border_thickness ; } + + void makeReturnDefault ( int def ) { am_default = def ; puPostRefresh () ; } + int isReturnDefault ( void ) const { return am_default ; } + + int getWindow ( void ) const { return window ; } + void setWindow ( int w ) { window = w ; puPostRefresh () ; } + + void setActiveDirn ( int e ) { active_mouse_edge = e ; } + int getActiveDirn ( void ) const { return active_mouse_edge ; } + + void setActiveButton ( int b ) { active_mouse_button = b ; } + int getActiveButton ( void ) const { return active_mouse_button ; } + + void setWhenToDeactivate ( short d ) { when_to_deactivate = d ; } + short getWhenToDeactivate ( void ) const { return when_to_deactivate ; } + + void setLegend ( const char *l ) { legend = l ; recalc_bbox() ; puPostRefresh () ; } + const char *getLegend ( void ) const { return legend ; } + + void setLegendFont ( puFont f ) { legendFont = f ; recalc_bbox() ; puPostRefresh () ; } + puFont getLegendFont ( void ) const { return legendFont ; } + + void setLegendPlace ( int lp ) { legendPlace = lp ; recalc_bbox() ; puPostRefresh () ; } + int getLegendPlace ( void ) const { return legendPlace ; } + + void setLabel ( const char *l ) { label = l ; recalc_bbox() ; puPostRefresh () ; } + const char *getLabel ( void ) const { return label ; } + + void setLabelFont ( puFont f ) { labelFont = f ; recalc_bbox() ; puPostRefresh () ; } + puFont getLabelFont ( void ) const { return labelFont ; } + + void setLabelPlace ( int lp ) { labelPlace = lp ; recalc_bbox() ; puPostRefresh () ; } + int getLabelPlace ( void ) const { return labelPlace ; } + + void activate ( void ) { if ( ! active ) { active = TRUE ; puPostRefresh () ; } } + void greyOut ( void ) { if ( active ) { active = FALSE ; puPostRefresh () ; } } + int isActive ( void ) const { return active ; } + + void highlight ( void ) { if ( ! highlighted ) { highlighted = TRUE ; puPostRefresh () ; } } + void lowlight ( void ) { if ( highlighted ) { highlighted = FALSE ; puPostRefresh () ; } } + int isHighlighted( void ) const { return highlighted ; } + + void reveal ( void ) { if ( ! visible ) { visible = TRUE ; puPostRefresh () ; } } + void hide ( void ) { if ( visible ) { visible = FALSE ; puPostRefresh () ; } } + int isVisible ( void ) const { return visible ; } + + void setStyle ( int which ) + { + style = which ; + + switch ( abs(style) ) + { + case PUSTYLE_SPECIAL_UNDERLINED : + border_thickness = 1 ; + break ; + + case PUSTYLE_SMALL_BEVELLED : + case PUSTYLE_SMALL_SHADED : + case PUSTYLE_BOXED : + border_thickness = 2 ; + break ; + + case PUSTYLE_BEVELLED : + case PUSTYLE_SHADED : + case PUSTYLE_DROPSHADOW : + border_thickness = 5 ; + break ; + } + + recalc_bbox () ; + puPostRefresh () ; + } + + int getStyle ( void ) const { return style ; } + + virtual void setColourScheme ( float r, float g, float b, float a = 1.0f ) ; + void setColorScheme ( float r, float g, float b, float a = 1.0f ) + { + setColourScheme ( r, g, b, a ) ; + } + + virtual void setColour ( int which, float r, float g, float b, float a = 1.0f ) + { + puSetColour ( colour [ which ], r, g, b, a ) ; + puPostRefresh () ; + } + void setColor ( int which, float r, float g, float b, float a = 1.0f ) + { + setColour ( which, r, g, b, a ) ; + } + + void getColour ( int which, float *r, float *g, float *b, float *a = NULL ) const + { + if ( r ) *r = colour[which][0] ; + if ( g ) *g = colour[which][1] ; + if ( b ) *b = colour[which][2] ; + if ( a ) *a = colour[which][3] ; + } + void getColor ( int which, float *r, float *g, float *b, float *a = NULL ) const + { + getColour ( which, r, g, b, a ); + } + + void setUserData ( void *data ) { user_data = data ; } + void *getUserData ( void ) const { return user_data ; } + + void defaultValue ( void ) { setValue ( & default_value ) ; } + + void setDefaultValue ( int i ) { default_value.setValue ( i ) ; } + void setDefaultValue ( float f ) { default_value.setValue ( f ) ; } + void setDefaultValue ( const char *s ) { default_value.setValue ( s ) ; } + + void getDefaultValue ( int *i ) { default_value.getValue ( i ) ; } + void getDefaultValue ( float *f ) { default_value.getValue ( f ) ; } + void getDefaultValue ( char **s ) { default_value.getValue ( s ) ; } + void getDefaultValue ( char *s ) { default_value.getValue ( s ) ; } + + int getDefaultValue ( void ) { return default_value.getValue () ; } /* Obsolete ! */ + + int getDefaultIntegerValue ( void ) { return default_value.getIntegerValue () ; } + float getDefaultFloatValue ( void ) { return default_value.getFloatValue () ; } + char *getDefaultStringValue ( void ) { return default_value.getStringValue () ; } + + int getVStatus ( void ) const { return v_status ; } /* JCJ 6 Jun 2002 */ + void setVStatus ( int vstat ) { v_status = vstat ; } +} ; + +/* + The 'live' interface stack is used for clicking and rendering. +*/ + +void puPushLiveInterface ( puInterface *in ) ; +void puPopLiveInterface ( puInterface *in = 0 ) ; +int puNoLiveInterface ( void ) ; +puInterface *puGetBaseLiveInterface ( void ) ; +puInterface *puGetUltimateLiveInterface ( void ) ; + +/* + The regular group stack is used for adding widgets +*/ + +void puPushGroup ( puGroup *in ) ; +void puPopGroup ( void ) ; +int puNoGroup ( void ) ; +puGroup *puGetCurrGroup ( void ) ; + +class puGroup : public puObject +{ + UL_TYPE_DATA + +protected: + int num_children ; + puObject *dlist ; + + int mouse_x ; // Coordinates of mouse when right button pressed for + int mouse_y ; // drag and drop + + int mouse_active; // Flag telling whether interface is presently being dragged + + void doHit ( int button, int updown, int x, int y ) ; + + int floating; // DEPRECATED! -- Flag telling whether the interface floats in the window or stays put + +public: + + puGroup ( int x, int y ) : puObject ( x, y, x, y ) + { + type |= PUCLASS_GROUP ; + dlist = NULL ; + num_children = 0 ; + mouse_x = 0 ; + mouse_y = 0 ; + mouse_active = FALSE ; + floating = FALSE ; // DEPRECATED! + puPushGroup ( this ) ; + } + + ~puGroup () ; + + void recalc_bbox ( void ) ; + virtual void add ( puObject *new_object ) ; + virtual void remove ( puObject *old_object ) ; + virtual void empty ( void ) ; + + void draw ( int dx, int dy ) ; + int checkHit ( int button, int updown, int x, int y ) ; + int checkKey ( int key , int updown ) ; + + puObject *getFirstChild ( void ) const { return dlist ; } + puObject *getLastChild ( void ) const + { + puObject *bo = dlist ; + + if ( bo != NULL ) + { + while ( bo -> getNextObject() != NULL ) + bo = bo -> getNextObject() ; + } + + return bo ; + } + int getNumChildren ( void ) const { return num_children ; } + + virtual void close ( void ) + { + if ( puGetCurrGroup () != this ) + ulSetError ( UL_WARNING, "PUI: puGroup::close() is mismatched!" ) ; + else + puPopGroup () ; + } + + void setFloating ( int value ) { floating = value ; } // DEPRECATED! + int getFloating ( void ) const { return floating ; } // DEPRECATED! + + void setChildStyle ( int childs, int which, int recursive = FALSE ) ; + void setChildBorderThickness ( int childs, int t, int recursive = FALSE ) ; + + void setChildColour ( int childs, int which, + float r, float g, float b, float a = 1.0f, + int recursive = FALSE ) ; + void setChildColor ( int childs, int which, + float r, float g, float b, float a = 1.0f, + int recursive = FALSE ) + { + setChildColour ( childs, which, r, g, b, a, recursive ) ; + } + + void setChildColourScheme ( int childs, + float r, float g, float b, float a = 1.0f, + int recursive = FALSE ) ; + void setChildColorScheme ( int childs, + float r, float g, float b, float a = 1.0f, + int recursive = FALSE ) + { + setChildColourScheme ( childs, r, g, b, a, recursive ) ; + } + + void setChildLegendFont ( int childs, puFont f, int recursive = FALSE ) ; + void setChildLabelFont ( int childs, puFont f, int recursive = FALSE ) ; +} ; + + +class puInterface : public puGroup +{ + UL_TYPE_DATA + +public: + + puInterface ( int x, int y ) : puGroup ( x, y ) + { + type |= PUCLASS_INTERFACE ; + puPushLiveInterface ( this ) ; + } + + ~puInterface () ; +} ; + + +class puFrame : public puObject +{ + UL_TYPE_DATA + +public: + void draw ( int dx, int dy ) ; + puFrame ( int minx, int miny, int maxx, int maxy ) : + puObject ( minx, miny, maxx, maxy ) + { + type |= PUCLASS_FRAME ; + } + + void doHit ( int button, int updown, int x, int y ) + { + if ( puActiveWidget() && ( this != puActiveWidget() ) ) + { + // Active widget exists and is not this one; call its down callback if it exists + + puActiveWidget() -> invokeDownCallback () ; + puDeactivateWidget () ; + } + + if ( isHit ( x, y ) && ( updown != PU_DRAG ) ) + puMoveToLast ( this -> parent ); + } +} ; + + + +class puText : public puObject +{ + UL_TYPE_DATA + +public: + virtual int isHit ( int /* x */, int /* y */ ) const { return FALSE ; } + void draw ( int dx, int dy ) ; + puText ( int x, int y ) : puObject ( x, y, x, y ) + { + type |= PUCLASS_TEXT ; + } +} ; + + +class puButton : public puObject +{ + UL_TYPE_DATA + +protected: + int button_type ; + +public: + void doHit ( int button, int updown, int x, int y ) ; + void draw ( int dx, int dy ) ; + + int getButtonType ( void ) const { return button_type ; } + void setButtonType ( int btype ) { button_type = btype ; puPostRefresh () ; } + + puButton ( int minx, int miny, const char *l ) : + puObject ( minx, miny, + minx + puGetDefaultLegendFont().getStringWidth ( l ) + PUSTR_LGAP + PUSTR_RGAP, + miny + puGetDefaultLegendFont().getStringHeight ( l ) + puGetDefaultLegendFont().getStringDescender () + PUSTR_TGAP + PUSTR_BGAP ) + { + type |= PUCLASS_BUTTON ; + button_type = PUBUTTON_NORMAL ; + setLegend ( l ) ; + } + + puButton ( int minx, int miny, int maxx, int maxy, int btype = PUBUTTON_NORMAL ) : + puObject ( minx, miny, maxx, maxy ) + { + type |= PUCLASS_BUTTON ; + button_type = btype ; + } +} ; + + +class puOneShot : public puButton +{ + UL_TYPE_DATA + +protected: +public: + void doHit ( int button, int updown, int x, int y ) ; + + puOneShot ( int minx, int miny, const char *l ) : puButton ( minx, miny, l ) + { + type |= PUCLASS_ONESHOT ; + } + + puOneShot ( int minx, int miny, int maxx, int maxy ) : + puButton ( minx, miny, maxx, maxy ) + { + type |= PUCLASS_ONESHOT ; + } +} ; + + + +class puArrowButton : public puOneShot +{ + UL_TYPE_DATA + +protected: + int arrow_type ; + +public: + void draw ( int dx, int dy ) ; + + int getArrowType ( void ) const { return arrow_type ; } + void setArrowType ( int i ) { arrow_type = i ; puPostRefresh () ; } + + puArrowButton ( int minx, int miny, int maxx, int maxy, int ptype ) : + puOneShot ( minx, miny, maxx, maxy ) + { + type |= PUCLASS_ARROW ; + arrow_type = ptype ; + } +} ; + +class puRange +{ + UL_TYPE_DATA + +protected: + float minimum_value ; + float maximum_value ; + float step_size ; + float last_cb_value ; + float cb_delta ; + int cb_mode ; + + void puRange_init ( float minval, float maxval, float step ) + { + if ( maxval == minval ) + { + maxval = 1.0f ; + minval = 0.0f ; + } + + minimum_value = minval ; + maximum_value = maxval ; + step_size = step ; + last_cb_value = -1.0f ; + cb_delta = 0.1f ; + cb_mode = PUSLIDER_ALWAYS ; + } + + float clamp ( float f ) + { + if ( f < minimum_value ) return minimum_value ; + else if ( f > maximum_value ) return maximum_value ; + return f ; + } + +public: + puRange () + { + puRange_init ( 0.0f, 1.0f, 0.0f ) ; + } + + puRange ( float minval, float maxval, float step = 0.0f ) + { + puRange_init ( minval, maxval, step ) ; + } + + virtual ~puRange() + { + } + + float getMaxValue ( void ) const { return maximum_value ; } + virtual void setMaxValue ( float f ) { maximum_value = f ; } + + float getMinValue ( void ) const { return minimum_value ; } + virtual void setMinValue ( float f ) { minimum_value = f ; } + + float getStepSize ( void ) const { return step_size ; } + void setStepSize ( float f ) { step_size = f ; } + + float checkStep ( float val_to_check ) const + { + float step = val_to_check ; + + if ( getStepSize () > 0.0f ) + { + step = val_to_check - (float) fmod ( val_to_check, getStepSize () ) ; + + if ( ( val_to_check - step ) > ( step + getStepSize() - val_to_check ) ) + step += getStepSize () ; + } + + return step ; + } + + void setCBMode ( int m ) { cb_mode = m ; } + int getCBMode ( void ) const { return cb_mode ; } + + void setDelta ( float f ) { cb_delta = (f<=0.0f) ? 0.1f : (f>=1.0f) ? 0.9f : f ; } + float getDelta ( void ) const { return cb_delta ; } +} ; + +class puSlider : public puRange, public puObject +{ + UL_TYPE_DATA + +protected: + int vert ; + int start_offset ; + float slider_fraction ; + float page_step_size ; + void draw_slider_box ( int dx, int dy, const puBox &box, float val, const char *box_label = NULL ) ; + + void puSlider_init ( int vertical ) + { + type |= PUCLASS_SLIDER ; + vert = vertical ; + slider_fraction = 0.1f ; + page_step_size = 0.0f ; + } + +public: + void doHit ( int button, int updown, int x, int y ) ; + void draw ( int dx, int dy ) ; + puSlider ( int minx, int miny, int sz, int vertical = FALSE ) : + puRange (), + puObject ( minx, miny, vertical ? + ( minx + puGetDefaultLegendFont().getStringWidth ( "W" ) + + PUSTR_LGAP + PUSTR_RGAP ) : + ( minx + sz ), + vertical ? + ( miny + sz ) : + ( miny + puGetDefaultLegendFont().getStringHeight () + + puGetDefaultLegendFont().getStringDescender () + + PUSTR_TGAP + PUSTR_BGAP ) + ) + { + puSlider_init ( vertical ) ; + } + + /* Blake Friesen - alternate constructor which lets you explicitly set width */ + puSlider ( int minx, int miny, int sz, int vertical, int width ) : + puRange (), + puObject ( minx, miny, vertical ? + ( minx + width ) : + ( minx + sz ), + vertical ? + ( miny + sz ) : + ( miny + width ) + ) + { + puSlider_init ( vertical ) ; + } + + int isVertical ( void ) const { return vert ; } + + void setSliderFraction ( float f ) ; + float getSliderFraction ( void ) const { return slider_fraction ; } + void setPageStepSize ( float s ) { page_step_size = s ; } + float getPageStepSize ( void ) const { return page_step_size ; } +} ; + + +class puListBox : public puButton +{ + UL_TYPE_DATA + +protected: + char ** list ; + int num ; + int top ; + +public: + void doHit ( int button, int updown, int x, int y ) ; + void draw ( int dx, int dy ) ; + puListBox ( int minx, int miny, int maxx, int maxy, char** list = NULL ) ; + + void newList ( char ** _list ) ; + int getNumItems ( void ) const { return num ; } + int getNumVisible ( void ) const + { + int ysize = abox.max[1] - abox.min[1] + 1 ; + int yinc = legendFont.getStringHeight () + PUSTR_BGAP ; + return (ysize - PUSTR_BGAP) / yinc ; + } + + int getTopItem ( void ) const { return top ; } + void setTopItem ( int item_index ) ; +} ; + + +class puDial : public puRange, public puObject +{ + UL_TYPE_DATA + +protected: + int wrap ; // Flag telling whether you can wrap around the bottom of the dial +public: + void doHit ( int button, int updown, int x, int y ) ; + void draw ( int dx, int dy ) ; + + puDial ( int minx, int miny, int sz ) : + puRange (), puObject ( minx, miny, minx+sz, miny+sz ) + { + type |= PUCLASS_DIAL ; + setValue ( 0.0f ) ; + wrap = TRUE ; + } + + puDial ( int minx, int miny, int sz, float minval, float maxval, float step = 0.0f ) : + puRange ( minval, maxval, step ), + puObject ( minx, miny, minx+sz, miny+sz ) + { + type |= PUCLASS_DIAL ; + setValue ( 0.0f ) ; + wrap = TRUE ; + } + + void setWrap ( int in ) { wrap = in ; } + int getWrap ( void ) const { return wrap ; } +} ; + + + +class puPopup : public puInterface +{ + UL_TYPE_DATA + +protected: +public: + puPopup ( int x, int y ) : puInterface ( x, y ) + { + type |= PUCLASS_POPUP ; + hide () ; + } +} ; + + +class puPopupMenu : public puPopup +{ + UL_TYPE_DATA + +protected: +public: + puPopupMenu ( int x, int y ) : puPopup ( x, y ) + { + type |= PUCLASS_POPUPMENU ; + } + + puObject *add_item ( const char *str, puCallback _cb, + void *_user_data = NULL ) ; + int checkHit ( int button, int updown, int x, int y ) ; + int checkKey ( int key , int updown ) ; + void close ( void ) ; +} ; + + +class puMenuBar : public puInterface +{ + UL_TYPE_DATA + +protected: + int bar_height ; + +public: + puMenuBar ( int h = -1 ) : puInterface ( 0, 0 ) + { + type |= PUCLASS_MENUBAR ; + + bar_height = h ; + } + + void add_submenu ( const char *str, char *items[], puCallback _cb[], + void *_user_data[] = NULL ) ; + void close ( void ) ; +} ; + + +class puInputBase +{ + UL_TYPE_DATA + +protected: + int accepting ; + int cursor_position ; + int select_start_position ; + int select_end_position ; + char *valid_data ; + int input_disabled ; + + char *displayed_text ; // Pointer to text as it is displayed in the box (chopped or word-wrapped) + + puObject *widget ; /* Pointer to associated input box widget */ + + virtual void normalizeCursors ( void ) ; + virtual void removeSelectRegion ( void ) ; + +public: + int isAcceptingInput ( void ) const { return accepting ; } + void rejectInput ( void ) { accepting = FALSE ; puPostRefresh () ; } + + void acceptInput ( void ) + { + accepting = TRUE ; + cursor_position = strlen ( widget -> getStringValue () ) ; + select_start_position = select_end_position = -1 ; + puPostRefresh () ; + } + + int getCursor ( void ) const { return cursor_position ; } + void setCursor ( int c ) { cursor_position = c ; puPostRefresh () ; } + + virtual void setSelectRegion ( int s, int e ) + { + select_start_position = s ; + select_end_position = e ; + puPostRefresh () ; + } + + void getSelectRegion ( int *s, int *e ) const + { + if ( s ) *s = select_start_position ; + if ( e ) *e = select_end_position ; + } + + char *getValidData ( void ) const { return valid_data ; } + void setValidData ( const char *data ) + { + delete [] valid_data ; + valid_data = ( data != NULL ) ? ulStrDup ( data ) : NULL ; + } + + void addValidData ( const char *data ) ; + + int isValidCharacter ( char c ) const + { + if ( valid_data != NULL ) + return ( strchr ( valid_data, c ) != NULL ) ? 1 : 0 ; + else + return 1 ; + } + + void enableInput ( void ) { input_disabled = FALSE ; } + void disableInput ( void ) { input_disabled = TRUE ; } + int inputDisabled ( void ) const { return input_disabled ; } + + puInputBase ( void ) + { + accepting = FALSE ; + cursor_position = 0 ; + select_start_position = -1 ; + select_end_position = -1 ; + valid_data = NULL; + displayed_text = NULL ; + + widget = (puObject *)NULL ; + + input_disabled = FALSE ; + } + + virtual ~puInputBase () { delete [] valid_data ; delete [] displayed_text ; } +} ; + + +class puInput : public puInputBase, public puObject +{ + UL_TYPE_DATA + + int display_starting_point ; + + char *getDisplayedText ( void ) + { + return ( displayed_text == NULL ? getStringValue () : displayed_text ) ; + } + +public: + void draw ( int dx, int dy ) ; + void doHit ( int button, int updown, int x, int y ) ; + int checkKey ( int key, int updown ) ; + + void invokeDownCallback ( void ) + { + rejectInput () ; + normalizeCursors () ; + if ( down_cb != NULL ) (*down_cb)(this) ; + } + + puInput ( int minx, int miny, int maxx, int maxy ) : + puInputBase (), puObject ( minx, miny, maxx, maxy ) + { + type |= PUCLASS_INPUT ; + + display_starting_point = 0 ; + + setColourScheme ( colour [ PUCOL_EDITFIELD ][0], + colour [ PUCOL_EDITFIELD ][1], + colour [ PUCOL_EDITFIELD ][2], + colour [ PUCOL_EDITFIELD ][3] ) ; + setColour ( PUCOL_MISC, 0.1f, 0.1f, 1.0f ) ; /* Colour of 'I' bar cursor */ + + widget = this ; + } + + virtual void setValue ( puValue *pv ) + { + puValue::setValue ( pv ) ; + delete [] displayed_text ; displayed_text = NULL ; + } + + virtual void setValue ( int i ) + { + puValue::setValue ( i ) ; + delete [] displayed_text ; displayed_text = NULL ; + } + + virtual void setValue ( float f ) + { + puValue::setValue ( f ) ; + delete [] displayed_text ; displayed_text = NULL ; + } + + virtual void setValue ( const char *s ) + { + puValue::setValue ( s ) ; + delete [] displayed_text ; displayed_text = NULL ; + } + + virtual void setValue ( bool b ) + { + puValue::setValue ( b ) ; + delete [] displayed_text ; displayed_text = NULL ; + } +} ; + + +class puButtonBox : public puObject +{ + UL_TYPE_DATA + +protected: + int one_only ; + int num_kids ; + char **button_labels ; + +public: + + puButtonBox ( int minx, int miny, int maxx, int maxy, + char **labels, int one_button ) ; + + int isOneButton ( void ) const { return one_only ; } + + void newList ( char ** _list ) ; + int getNumItems ( void ) const { return num_kids ; } + + int checkKey ( int key , int updown ) ; + int checkHit ( int button, int updown, int x, int y ) ; + void draw ( int dx, int dy ) ; +} ; + + +class puDialogBox : public puPopup +{ + UL_TYPE_DATA + +protected: +public: + + puDialogBox ( int x, int y ) : puPopup ( x, y ) + { + type |= PUCLASS_DIALOGBOX ; + } +} ; + + + +/* + * Window System Integration + * ------------------------- + * + * PUI has direct support for GLUT, PW, FLTK, SDL and GTK. All code is provided + * inline, making PUI itself independent. There are several ways to choose + * implementation, for instance: + * + * #include <FL/Fl.H> + * #include <plib/pu.h> + * + * or simply: + * + * #include <plib/puFLTK.h> + * + * Note that both cases may fail if pu.h has been included earlier. + * A safer option is therefore to compile with -DPU_USE_FLTK. + * + * The default system is GLUT for backwards compability. + * + * To use PUI with an unsupported system, define PU_USE_NONE and + * provide your own callbacks (if needed, the defaults will work + * in many cases). + * + * When compiling the PUI library itself, PU_USE_NONE must be defined. + * + */ + +typedef int (*puGetWindowCallback) ( ) ; +typedef void (*puSetWindowCallback) ( int window ) ; +typedef void (*puGetWindowSizeCallback) ( int *width, int *height ) ; +typedef void (*puSetWindowSizeCallback) ( int width, int height ) ; + +void puSetWindowFuncs ( puGetWindowCallback, + puSetWindowCallback, + puGetWindowSizeCallback, + puSetWindowSizeCallback ) ; + + +// Choose implementation + +#if !defined(PU_USE_GLUT) && \ + !defined(PU_USE_PW) && \ + !defined(PU_USE_FLTK) && \ + !defined(PU_USE_SDL) && \ + !defined(PU_USE_NATIVE) && \ + !defined(PU_USE_NONE) + +// Nothing selected. Try to figure out which one to use. +#if defined(PW_IS_PRESENT) +# define PU_USE_PW +#elif defined(FL_MAJOR_VERSION) +# define PU_USE_FLTK +#elif defined(SDL_MAJOR_VERSION) +# define PU_USE_SDL +#else +# define PU_USE_GLUT +#endif + +#endif + + +// Roll out the code and define puInit + +#if defined(PU_USE_GLUT) +# include "puGLUT.h" +# define puInit puInitGLUT +#elif defined(PU_USE_PW) +# include "puPW.h" +# define puInit puInitPW +#elif defined(PU_USE_FLTK) +# include "puFLTK.h" +# define puInit puInitFLTK +#elif defined(PU_USE_SDL) +# include "puSDL.h" +# define puInit puInitSDL +#elif defined(PU_USE_NATIVE) +# include "puNative.h" +# define puInit puInitNative +#else +# define puInit +#endif + + +#endif diff --git a/src/Main/fg_os_common.cxx b/src/Main/fg_os_common.cxx index 3dd07c610..8af604cf8 100644 --- a/src/Main/fg_os_common.cxx +++ b/src/Main/fg_os_common.cxx @@ -21,7 +21,7 @@ #include <config.h> #endif -#include <plib/pu.h> +#include <GUI/pu.h> #include <osg/GraphicsContext> #include <Viewer/renderer.hxx> diff --git a/src/Model/panelnode.cxx b/src/Model/panelnode.cxx index e59b9a5b6..c493e54c3 100644 --- a/src/Model/panelnode.cxx +++ b/src/Model/panelnode.cxx @@ -20,8 +20,7 @@ #include <simgear/scene/util/SGSceneUserData.hxx> #include <simgear/scene/util/SGNodeMasks.hxx> -#include <plib/pu.h> - +#include <GUI/pu.h> #include <Main/fg_os.hxx> #include <Cockpit/panel.hxx> #include <Cockpit/panel_io.hxx> diff --git a/src/Viewer/FGEventHandler.cxx b/src/Viewer/FGEventHandler.cxx index 620e2bf88..f837ba37d 100644 --- a/src/Viewer/FGEventHandler.cxx +++ b/src/Viewer/FGEventHandler.cxx @@ -7,7 +7,7 @@ #include <osg/Viewport> #include <osgViewer/Viewer> -#include <plib/pu.h> +#include <GUI/pu.h> #include <Main/fg_props.hxx> #include "CameraGroup.hxx" #include "FGEventHandler.hxx" diff --git a/src/Viewer/PUICamera.cxx b/src/Viewer/PUICamera.cxx index 4d5b94414..45a467c47 100644 --- a/src/Viewer/PUICamera.cxx +++ b/src/Viewer/PUICamera.cxx @@ -34,10 +34,9 @@ #include <osgUtil/CullVisitor> #include <osgViewer/Viewer> -#include <plib/pu.h> - #include <simgear/scene/util/SGNodeMasks.hxx> +#include <GUI/pu.h> #include <Main/fg_props.hxx> #include <Main/globals.hxx> #include <Main/locale.hxx>