2002-07-05 16:56:53 +00:00
/* ScummVM - Scumm Interpreter
* Copyright ( C ) 2002 The ScummVM project
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program 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 General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*
* $ Header $
*/
# ifndef WIDGET_H
# define WIDGET_H
# include "scummsys.h"
2002-09-08 01:08:12 +00:00
# include "common/str.h"
2002-07-05 16:56:53 +00:00
class Dialog ;
enum {
WIDGET_ENABLED = 1 < < 0 ,
WIDGET_INVISIBLE = 1 < < 1 ,
2002-07-06 12:57:51 +00:00
WIDGET_HILITED = 1 < < 2 ,
WIDGET_BORDER = 1 < < 3 ,
2002-10-19 01:22:41 +00:00
WIDGET_INV_BORDER = 1 < < 4 ,
WIDGET_CLEARBG = 1 < < 5 ,
WIDGET_WANT_TICKLE = 1 < < 7 ,
WIDGET_TRACK_MOUSE = 1 < < 8 ,
WIDGET_RETAIN_FOCUS = 1 < < 9 // Retain focus on mouse up. By default widgets lose focus on mouseup, but some widgets might want to retain it - widgets where you enter text, for instance
2002-07-13 22:41:29 +00:00
2002-07-05 16:56:53 +00:00
} ;
2002-07-08 11:55:55 +00:00
enum {
kStaticTextWidget = ' TEXT ' ,
2002-11-21 15:20:52 +00:00
kEditTextWidget = ' EDIT ' ,
2002-07-08 11:55:55 +00:00
kButtonWidget = ' BTTN ' ,
kCheckboxWidget = ' CHKB ' ,
2002-07-10 22:49:41 +00:00
kSliderWidget = ' SLDE ' ,
2002-07-12 16:24:11 +00:00
kListWidget = ' LIST ' ,
kScrollBarWidget = ' SCRB '
} ;
2002-11-21 15:20:52 +00:00
enum {
kCaretBlinkTime = 300
} ;
2002-10-12 00:26:24 +00:00
enum {
2002-11-05 22:34:50 +00:00
kButtonWidth = 56 ,
2002-12-25 00:38:53 +00:00
kButtonHeight = 16
2002-10-12 00:26:24 +00:00
} ;
2002-07-12 16:24:11 +00:00
class CommandReceiver ;
class CommandSender ;
2002-12-13 21:43:46 +00:00
class CommandReceiver {
friend class CommandSender ;
2002-07-12 16:24:11 +00:00
protected :
virtual void handleCommand ( CommandSender * sender , uint32 cmd , uint32 data ) = 0 ;
} ;
2002-12-13 21:43:46 +00:00
class CommandSender {
// TODO - allow for multiple targets, i.e. store targets in a list
// and add methods addTarget/removeTarget.
2002-07-12 16:24:11 +00:00
protected :
CommandReceiver * _target ;
public :
CommandSender ( CommandReceiver * target ) : _target ( target ) { }
void setTarget ( CommandReceiver * target ) { _target = target ; }
CommandReceiver * getTarget ( ) const { return _target ; }
virtual void sendCommand ( uint32 cmd , uint32 data )
{
if ( _target & & cmd )
_target - > handleCommand ( this , cmd , data ) ;
}
2002-07-08 11:55:55 +00:00
} ;
2002-07-05 16:56:53 +00:00
/* Widget */
class Widget {
friend class Dialog ;
protected :
2002-07-13 22:41:29 +00:00
uint32 _type ;
2002-07-05 16:56:53 +00:00
Dialog * _boss ;
Widget * _next ;
int16 _x , _y ;
uint16 _w , _h ;
uint16 _id ;
2002-07-13 22:41:29 +00:00
uint16 _flags ;
2002-07-16 10:52:48 +00:00
bool _hasFocus ;
2002-07-13 22:41:29 +00:00
2002-07-05 16:56:53 +00:00
public :
Widget ( Dialog * boss , int x , int y , int w , int h ) ;
2002-07-10 22:49:41 +00:00
virtual ~ Widget ( ) { }
2002-07-05 16:56:53 +00:00
2002-07-27 14:16:14 +00:00
virtual void handleMouseDown ( int x , int y , int button , int clickCount ) { }
virtual void handleMouseUp ( int x , int y , int button , int clickCount ) { }
2002-07-10 22:49:41 +00:00
virtual void handleMouseEntered ( int button ) { }
virtual void handleMouseLeft ( int button ) { }
2002-07-08 13:52:50 +00:00
virtual void handleMouseMoved ( int x , int y , int button ) { }
2002-10-16 20:32:12 +00:00
virtual void handleMouseWheel ( int x , int y , int direction ) { }
2002-11-22 14:02:54 +00:00
virtual bool handleKeyDown ( uint16 ascii , int keycode , int modifiers ) { return false ; } // Return true if the event was handled
virtual bool handleKeyUp ( uint16 ascii , int keycode , int modifiers ) { return false ; } // Return true if the event was handled
2002-07-13 22:41:29 +00:00
virtual void handleTickle ( ) { }
2002-07-05 16:56:53 +00:00
void draw ( ) ;
2002-07-16 22:34:16 +00:00
void receivedFocus ( ) { _hasFocus = true ; receivedFocusWidget ( ) ; }
2002-07-16 10:52:48 +00:00
void lostFocus ( ) { _hasFocus = false ; lostFocusWidget ( ) ; }
2002-09-08 16:00:13 +00:00
virtual bool wantsFocus ( ) { return false ; } ;
2002-07-05 16:56:53 +00:00
void setFlags ( int flags ) { _flags | = flags ; }
void clearFlags ( int flags ) { _flags & = ~ flags ; }
int getFlags ( ) const { return _flags ; }
2002-09-08 16:00:13 +00:00
2002-10-01 23:11:19 +00:00
void setEnabled ( bool e ) { if ( e ) setFlags ( WIDGET_ENABLED ) ; else clearFlags ( WIDGET_ENABLED ) ; }
bool isEnabled ( ) const { return _flags & WIDGET_ENABLED ; }
bool isVisible ( ) const { return ! ( _flags & WIDGET_INVISIBLE ) ; }
2002-07-05 16:56:53 +00:00
protected :
virtual void drawWidget ( bool hilite ) { }
2002-07-16 10:52:48 +00:00
2002-07-16 22:34:16 +00:00
virtual void receivedFocusWidget ( ) { }
2002-07-16 10:52:48 +00:00
virtual void lostFocusWidget ( ) { }
2002-07-05 16:56:53 +00:00
} ;
/* StaticTextWidget */
class StaticTextWidget : public Widget {
protected :
2002-08-31 13:42:07 +00:00
typedef ScummVM : : String String ;
String _label ;
2002-07-27 00:36:09 +00:00
int _align ;
2002-07-05 16:56:53 +00:00
public :
2002-08-31 13:42:07 +00:00
StaticTextWidget ( Dialog * boss , int x , int y , int w , int h , const String & text , int align ) ;
2002-07-27 00:05:46 +00:00
void setValue ( int value ) ;
2002-08-31 13:42:07 +00:00
void setLabel ( const String & label ) { _label = label ; }
const String & getLabel ( ) const { return _label ; }
void setAlign ( int align ) { _align = align ; }
int getAlign ( ) const { return _align ; }
2002-07-05 16:56:53 +00:00
protected :
void drawWidget ( bool hilite ) ;
} ;
/* ButtonWidget */
2002-07-12 16:24:11 +00:00
class ButtonWidget : public StaticTextWidget , public CommandSender {
friend class Dialog ; // Needed for the hotkey handling
2002-07-05 16:56:53 +00:00
protected :
2002-10-19 01:22:41 +00:00
uint32 _cmd ;
uint8 _hotkey ;
2002-07-05 16:56:53 +00:00
public :
2002-08-31 13:42:07 +00:00
ButtonWidget ( Dialog * boss , int x , int y , int w , int h , const String & label , uint32 cmd = 0 , uint8 hotkey = 0 ) ;
2002-07-12 16:24:11 +00:00
void setCmd ( uint32 cmd ) { _cmd = cmd ; }
uint32 getCmd ( ) const { return _cmd ; }
2002-07-06 12:57:51 +00:00
2002-07-27 14:16:14 +00:00
void handleMouseUp ( int x , int y , int button , int clickCount ) ;
2002-07-07 21:46:53 +00:00
void handleMouseEntered ( int button ) { setFlags ( WIDGET_HILITED ) ; draw ( ) ; }
void handleMouseLeft ( int button ) { clearFlags ( WIDGET_HILITED ) ; draw ( ) ; }
2002-10-12 00:26:24 +00:00
protected :
void drawWidget ( bool hilite ) ;
2002-07-05 16:56:53 +00:00
} ;
2002-10-19 01:22:41 +00:00
/* PushButtonWidget */
class PushButtonWidget : public ButtonWidget {
2002-07-07 23:37:47 +00:00
protected :
bool _state ;
public :
2002-10-19 01:22:41 +00:00
PushButtonWidget ( Dialog * boss , int x , int y , int w , int h , const String & label , uint32 cmd = 0 , uint8 hotkey = 0 ) ;
void setState ( bool state ) ;
void toggleState ( ) { setState ( ! _state ) ; }
2002-07-10 22:49:41 +00:00
bool getState ( ) const { return _state ; }
2002-10-19 01:22:41 +00:00
} ;
/* CheckboxWidget */
class CheckboxWidget : public PushButtonWidget {
protected :
public :
CheckboxWidget ( Dialog * boss , int x , int y , int w , int h , const String & label , uint32 cmd = 0 , uint8 hotkey = 0 ) ;
2002-07-07 23:37:47 +00:00
2002-10-19 01:22:41 +00:00
void handleMouseUp ( int x , int y , int button , int clickCount ) ;
2002-07-07 23:37:47 +00:00
virtual void handleMouseEntered ( int button ) { }
virtual void handleMouseLeft ( int button ) { }
protected :
void drawWidget ( bool hilite ) ;
} ;
2002-07-08 13:52:50 +00:00
/* SliderWidget */
class SliderWidget : public ButtonWidget {
protected :
2002-07-26 23:29:43 +00:00
int _value , _oldValue ;
2002-07-26 15:34:04 +00:00
int _valueMin , _valueMax ;
2002-07-13 18:32:09 +00:00
bool _isDragging ;
2002-07-08 13:52:50 +00:00
public :
2002-08-31 13:42:07 +00:00
SliderWidget ( Dialog * boss , int x , int y , int w , int h , const String & label , uint32 cmd = 0 , uint8 hotkey = 0 ) ;
2002-07-28 14:59:27 +00:00
void setValue ( int value ) { _value = value ; }
int getValue ( ) const { return _value ; }
2002-07-08 22:11:47 +00:00
2002-07-26 15:34:04 +00:00
void setMinValue ( int value ) { _valueMin = value ; }
2002-07-26 00:41:07 +00:00
int getMinValue ( ) const { return _valueMin ; }
2002-07-26 15:34:04 +00:00
void setMaxValue ( int value ) { _valueMax = value ; }
2002-07-26 00:41:07 +00:00
int getMaxValue ( ) const { return _valueMax ; }
2002-07-08 13:52:50 +00:00
void handleMouseMoved ( int x , int y , int button ) ;
2002-07-27 14:16:14 +00:00
void handleMouseDown ( int x , int y , int button , int clickCount ) ;
void handleMouseUp ( int x , int y , int button , int clickCount ) ;
2002-07-08 13:52:50 +00:00
protected :
void drawWidget ( bool hilite ) ;
2002-07-26 23:29:43 +00:00
int valueToPos ( int value ) ;
int posToValue ( int pos ) ;
2002-07-08 13:52:50 +00:00
} ;
2002-07-05 16:56:53 +00:00
# endif