1 // File: QtxGroupBox.cxx
2 // Author: Sergey TELKOV
4 #include "QtxGroupBox.h"
8 #include <qtoolbutton.h>
9 #include <qapplication.h>
10 #include <qobjectlist.h>
12 QtxGroupBox::QtxGroupBox( QWidget* parent, const char* name )
13 : QGroupBox( parent, name ),
18 QtxGroupBox::QtxGroupBox( const QString& title, QWidget* parent, const char* name )
19 : QGroupBox( title, parent, name ),
25 QtxGroupBox::QtxGroupBox( int strips, Orientation o, QWidget* parent, const char* name )
26 : QGroupBox( strips, o, parent, name ),
32 QtxGroupBox::QtxGroupBox( int strips, Orientation o, const QString& title,
33 QWidget* parent, const char* name )
34 : QGroupBox( strips, o, title, parent, name ),
40 QtxGroupBox::~QtxGroupBox()
45 void QtxGroupBox::initialize()
47 myContainer = new QHBox( this, 0, WStyle_Customize | WStyle_NoBorderEx | WStyle_Tool );
54 int QtxGroupBox::insideMargin() const
58 m = layout()->margin();
62 int QtxGroupBox::insideSpacing() const
66 s = layout()->spacing();
70 void QtxGroupBox::setInsideMargin( int m )
73 layout()->setMargin( m );
76 void QtxGroupBox::setInsideSpacing( int s )
79 layout()->setSpacing( s );
84 void QtxGroupBox::insertTitleWidget( QWidget* wid )
89 wid->reparent( myContainer, QPoint( 0, 0 ), true );
90 wid->installEventFilter( this );
95 void QtxGroupBox::removeTitleWidget( QWidget* wid )
97 if ( !myContainer || wid->parentWidget() != myContainer )
100 wid->reparent( 0, QPoint( 0, 0 ), false );
101 wid->removeEventFilter( this );
106 void QtxGroupBox::adjustInsideMargin()
108 QApplication::sendPostedEvents( myContainer, QEvent::ChildInserted );
110 myContainer->resize( myContainer->minimumSizeHint() );
112 setInsideMargin( myContainer->height() );
115 void QtxGroupBox::setAlignment( int align )
117 QGroupBox::setAlignment( align );
122 void QtxGroupBox::setTitle( const QString& title )
124 QGroupBox::setTitle( title );
129 void QtxGroupBox::setColumnLayout( int strips, Orientation o )
132 myContainer->reparent( 0, QPoint( 0, 0 ), false );
134 QGroupBox::setColumnLayout( strips, o );
137 myContainer->reparent( this, QPoint( 0, 0 ), false );
142 void QtxGroupBox::show()
149 void QtxGroupBox::update()
156 QSize QtxGroupBox::sizeHint() const
158 QSize sz = QGroupBox::sizeHint();
160 int sw = titleSize().width();
164 if ( alignment() == AlignCenter )
165 sw += 2 * ( myContainer->width() + 5 );
167 sw += 1 * ( myContainer->width() + 5 );
170 sw += frameRect().left();
172 return QSize( QMAX( sz.width(), sw ), sz.height() );
175 QSize QtxGroupBox::minimumSizeHint() const
177 QSize sz = QGroupBox::minimumSizeHint();
179 int sw = titleSize().width() + myContainer ? myContainer->width() + 5 : 0;
183 if ( alignment() == AlignCenter )
184 sw += 2 * ( myContainer->width() + 5 );
186 sw += 1 * ( myContainer->width() + 5 );
189 sw += frameRect().left();
191 return QSize( QMAX( sz.width(), sw ), sz.height() );
194 bool QtxGroupBox::eventFilter( QObject* obj, QEvent* e )
196 QEvent::Type type = e->type();
197 if ( myContainer && obj->parent() == myContainer &&
198 ( type == QEvent::Show || type == QEvent::ShowToParent ||
199 type == QEvent::Hide || type == QEvent::HideToParent ) )
200 QApplication::postEvent( this, new QCustomEvent( QEvent::User ) );
202 return QGroupBox::eventFilter( obj, e );
205 void QtxGroupBox::resizeEvent( QResizeEvent* e )
207 QGroupBox::resizeEvent( e );
212 void QtxGroupBox::childEvent( QChildEvent* e )
214 if ( e->type() == QEvent::ChildInserted && e->child() == myContainer )
217 QGroupBox::childEvent( e );
220 void QtxGroupBox::customEvent( QCustomEvent* )
225 void QtxGroupBox::frameChanged()
230 QSize QtxGroupBox::titleSize() const
237 for ( QLayoutIterator it = layout()->iterator(); it.current() && !si; ++it )
238 si = it.current()->spacerItem();
244 int h = sz.height() + insideMargin();
246 return QSize( w, h );
249 void QtxGroupBox::updateTitle()
254 int align = alignment();
255 if ( align == AlignAuto )
256 align = QApplication::reverseLayout() ? AlignRight : AlignLeft;
258 if ( title().isEmpty() )
261 QSize ts = titleSize();
265 int w = frameRect().width() - ts.width();
266 if ( align == AlignCenter )
271 QApplication::sendPostedEvents( myContainer, QEvent::ChildInserted );
272 myContainer->resize( myContainer->minimumSizeHint() );
275 const QObjectList* list = myContainer->children();
278 for ( QObjectListIt it( *list ); it.current() && !vis; ++it )
279 vis = it.current()->isWidgetType() &&
280 ((QWidget*)it.current())->isVisibleTo( myContainer );
283 if ( myContainer->height() > ts.height() || myContainer->width() > w || !vis )
288 if ( align == AlignRight )
289 x = frameRect().left() + m;
291 x = frameRect().right() - myContainer->width() - m;
293 int y = frameRect().top() - ( myContainer->height() - frameWidth() ) / 2;
295 QPoint pos( x, QMAX( 0, y ) );
296 pos = mapToGlobal( pos );
297 if ( myContainer->parentWidget() )
298 pos = myContainer->parentWidget()->mapFromGlobal( pos );
299 myContainer->move( pos );