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"
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 ,
WIDGET_CLEARBG = 1 < < 4 ,
WIDGET_WANT_TICKLE = 1 < < 5 ,
2002-07-13 22:41:29 +00:00
WIDGET_TRACK_MOUSE = 1 < < 6 ,
WIDGET_RETAIN_FOCUS = 1 < < 7 // 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-05 16:56:53 +00:00
} ;
2002-07-08 11:55:55 +00:00
enum {
kStaticTextWidget = ' TEXT ' ,
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 '
} ;
class CommandReceiver ;
class CommandSender ;
class CommandReceiver
{
friend class CommandSender ;
protected :
virtual void handleCommand ( CommandSender * sender , uint32 cmd , uint32 data ) = 0 ;
} ;
class CommandSender
{
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-13 18:32:09 +00:00
virtual void handleMouseDown ( int x , int y , int button ) { }
virtual void handleMouseUp ( int x , int y , int button ) { }
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-07-13 18:32:09 +00:00
virtual void handleKeyDown ( char key , int modifiers ) { }
virtual void handleKeyUp ( char key , int modifiers ) { }
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-07-05 16:56:53 +00:00
void setFlags ( int flags ) { _flags | = flags ; }
void clearFlags ( int flags ) { _flags & = ~ flags ; }
int getFlags ( ) const { return _flags ; }
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-07-12 16:24:11 +00:00
char * _label ;
2002-07-15 12:59:56 +00:00
bool _centred ;
2002-07-05 16:56:53 +00:00
public :
StaticTextWidget ( Dialog * boss , int x , int y , int w , int h , const char * text ) ;
2002-07-10 22:49:41 +00:00
~ StaticTextWidget ( ) ;
2002-07-12 16:24:11 +00:00
void setLabel ( const char * label ) ;
const char * getLabel ( ) const { return _label ; }
2002-07-15 12:59:56 +00:00
void setCentred ( bool centred ) { _centred = centred ; }
bool isCentred ( ) const { return _centred ; }
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-07-12 16:24:11 +00:00
uint32 _cmd ;
uint8 _hotkey ;
2002-07-05 16:56:53 +00:00
public :
2002-07-08 00:29:47 +00:00
ButtonWidget ( Dialog * boss , int x , int y , int w , int h , const char * label , uint32 cmd = 0 , uint8 hotkey = 0 ) ;
2002-07-12 16:24:11 +00:00
virtual ~ ButtonWidget ( ) ;
void setCmd ( uint32 cmd ) { _cmd = cmd ; }
uint32 getCmd ( ) const { return _cmd ; }
2002-07-06 12:57:51 +00:00
2002-07-13 22:41:29 +00:00
void handleMouseUp ( int x , int y , int button ) ;
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-07-05 16:56:53 +00:00
} ;
2002-07-07 23:37:47 +00:00
/* CheckboxWidget */
class CheckboxWidget : public ButtonWidget {
protected :
bool _state ;
public :
2002-07-08 00:29:47 +00:00
CheckboxWidget ( Dialog * boss , int x , int y , int w , int h , const char * label , uint32 cmd = 0 , uint8 hotkey = 0 ) ;
2002-07-07 23:37:47 +00:00
void setState ( bool state ) { _state = state ; }
2002-07-10 22:49:41 +00:00
bool getState ( ) const { return _state ; }
2002-07-07 23:37:47 +00:00
2002-07-13 18:32:09 +00:00
void handleMouseDown ( int x , int y , int button ) ;
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-08 22:11:47 +00:00
uint8 _value , _old_value ;
2002-07-13 18:32:09 +00:00
bool _isDragging ;
2002-07-08 13:52:50 +00:00
public :
SliderWidget ( Dialog * boss , int x , int y , int w , int h , const char * label , uint32 cmd = 0 , uint8 hotkey = 0 ) ;
2002-07-08 22:11:47 +00:00
void setValue ( uint8 value ) { _value = value ; }
2002-07-10 22:49:41 +00:00
uint8 getValue ( ) const { return _value ; }
2002-07-08 22:11:47 +00:00
2002-07-08 13:52:50 +00:00
void handleMouseMoved ( int x , int y , int button ) ;
2002-07-13 18:32:09 +00:00
void handleMouseDown ( int x , int y , int button ) ;
void handleMouseUp ( int x , int y , int button ) ;
2002-07-08 13:52:50 +00:00
protected :
void drawWidget ( bool hilite ) ;
} ;
2002-07-05 16:56:53 +00:00
# endif