#include "widget.h" namespace SDLwidgets { /////////// // Widget /////////// SDL_Color Widget::_default_color; Widget::Widget( Widget* parent ) : _parent( parent ), _pos_x( 0 ), _pos_y( 0 ), _width( 0 ), _height( 0 ), _min_width( 0 ), _min_height( 0 ), _max_width( 0 ), _max_height( 0 ), _horizontal_stretch( RIGID ), _vertical_stretch( RIGID ) { // default color is black _color = _default_color; } RootContainer* Widget::getRoot() { if ( _parent ) return _parent->getRoot(); return 0; } void Widget::getOffset( Sint16& offset_x, Sint16& offset_y ) const { if ( !_parent ) { offset_x = _pos_x; offset_y = _pos_y; } else { _parent->getOffset( offset_x, offset_y ); offset_x += _pos_x; offset_y += _pos_y; } } bool Widget::containsPoint( Uint16 x, Uint16 y ) { Sint16 offset_x, offset_y; getOffset( offset_x, offset_y ); return ( x >= offset_x && x <= offset_x + getWidth() - 1 && y >= offset_y && y <= offset_y + getHeight() - 1 ); } void Widget::setDefaultColor( SDL_Color color ) { _default_color = color; } //////////////////// // WidgetComposite //////////////////// WidgetComposite::WidgetComposite( Widget* parent ) : Widget( parent ), _valid( true ) { _layout_manager = new FreeLayout( this ); } WidgetComposite::~WidgetComposite() { removeAndDeleteAll(); delete _layout_manager; _layout_manager = 0; } void WidgetComposite::draw( SDL_Surface* surface ) { if ( !_valid ) { _layout_manager->arrangeAll(); _valid = true; } for ( std::vector::const_iterator iter = _children.begin(); iter != _children.end(); iter++ ) { (*iter)->draw( surface ); } } void WidgetComposite::drawOffset( SDL_Surface* surface, int x_offset, int y_offset ) { if ( !_valid ) { _layout_manager->arrangeAll(); _valid = true; } for ( std::vector::const_iterator iter = _children.begin(); iter != _children.end(); iter++ ) { (*iter)->drawOffset( surface, x_offset, y_offset ); } } void WidgetComposite::add( Widget* widget ) { std::vector::iterator it = std::find( _children.begin(), _children.end(), widget ); if ( it == _children.end() ) { widget->setParent( this ); _children.push_back( widget ); _layout_manager->add( widget ); } } void WidgetComposite::addBefore( Widget* old_widget, Widget* new_widget ) { std::vector::iterator it = std::find( _children.begin(), _children.end(), new_widget ); if ( it == _children.end() ) { std::vector::iterator it2 = std::find( _children.begin(), _children.end(), old_widget ); new_widget->setParent( this ); _children.insert( it2, new_widget ); _layout_manager->add( new_widget ); } } void WidgetComposite::remove( Widget* widget ) { std::vector::iterator it = std::find( _children.begin(), _children.end(), widget ); if ( it != _children.end() ) { _layout_manager->remove( *it ); _children.erase( it ); } } void WidgetComposite::removeAll() { for ( std::vector::iterator iter = _children.begin(); iter != _children.end(); iter++ ) { _layout_manager->remove( *iter ); } _children.clear(); } void WidgetComposite::removeAndDeleteAll() { for ( std::vector::iterator iter = _children.begin(); iter != _children.end(); iter++ ) { _layout_manager->remove( *iter ); delete *iter; } _children.clear(); } bool WidgetComposite::contains( const Widget* widget ) { for ( std::vector::iterator iter = _children.begin(); iter != _children.end(); iter++ ) { if ( *iter == widget || (*iter)->contains( widget ) ) return true; } return false; } void WidgetComposite::setLayout( LayoutManager* layout ) { _layout_manager = layout; for ( std::vector::iterator iter = _children.begin(); iter != _children.end(); iter++ ) { _layout_manager->add( *iter ); } } bool WidgetComposite::handleEvent( SDL_Event* event ) { for ( std::vector::const_iterator iter = _children.begin(); iter != _children.end(); iter++ ) { if ( (*iter)->handleEvent( event ) ) { return true; } } return false; } }