20#include "kexiflowlayout.h"
26class KexiFlowLayoutIterator : public TQGLayoutIterator
29 KexiFlowLayoutIterator( TQPtrList<TQLayoutItem> *list )
30 : m_idx(0), m_list( list )
33 TQLayoutItem *current();
35 TQLayoutItem *takeCurrent();
39 TQPtrList<TQLayoutItem> *m_list;
43KexiFlowLayoutIterator::count() const
45 return m_list->count();
49KexiFlowLayoutIterator::current()
51 return (m_idx < ( int)count()) ? m_list->at(m_idx) : 0;
55KexiFlowLayoutIterator::next()
62KexiFlowLayoutIterator::takeCurrent()
64 return (m_idx < ( int)count()) ? m_list->take(m_idx) : 0;
69KexiFlowLayout::KexiFlowLayout(TQWidget *parent, int border, int space, const char *name)
70 : TQLayout(parent, border, space, name)
72 m_orientation =TQt::Horizontal;
77KexiFlowLayout::KexiFlowLayout(TQLayout* parent, int space, const char *name)
78 : TQLayout( parent, space, name )
80 m_orientation =TQt::Horizontal;
85KexiFlowLayout::KexiFlowLayout( int space, const char *name)
86 : TQLayout(space, name)
88 m_orientation =TQt::Horizontal;
93KexiFlowLayout::~KexiFlowLayout()
99KexiFlowLayout::addItem(TQLayoutItem *item)
105KexiFlowLayout::addSpacing( int size)
107 if (m_orientation ==TQt::Horizontal)
108 addItem( new TQSpacerItem( size, 0, TQSizePolicy::Fixed, TQSizePolicy::Minimum ) );
110 addItem( new TQSpacerItem( 0, size, TQSizePolicy::Minimum, TQSizePolicy::Fixed ) );
114KexiFlowLayout::iterator()
116 return TQLayoutIterator( new KexiFlowLayoutIterator(&m_list) );
122 TQPtrList<TQWidget> *list = new TQPtrList<TQWidget>();
123 for (TQPtrListIterator<TQLayoutItem> it(m_list); it.current(); ++it) {
124 if(it.current()->widget())
125 list->append(it.current()->widget());
131KexiFlowLayout::invalidate()
133 TQLayout::invalidate();
134 m_cached_sizeHint = TQSize();
135 m_cached_minSize = TQSize();
140KexiFlowLayout::isEmpty()
142 return m_list.isEmpty();
146KexiFlowLayout::hasHeightForWidth() const
148 return (m_orientation ==TQt::Horizontal);
152KexiFlowLayout::heightForWidth( int w) const
154 if(m_cached_width != w) {
156 KexiFlowLayout *mthis = (KexiFlowLayout*) this;
157 int h = mthis->simulateLayout( TQRect(0,0,w,0) );
158 mthis->m_cached_hfw = h;
159 mthis->m_cached_width = w;
166KexiFlowLayout::sizeHint() const
168 if(m_cached_sizeHint.isEmpty()) {
169 KexiFlowLayout *mthis = (KexiFlowLayout*) this;
170 TQRect r = TQRect(0, 0, 2000, 2000);
171 mthis->simulateLayout(r);
173 return m_cached_sizeHint;
177KexiFlowLayout::minimumSize() const
183 if(m_cached_minSize.isEmpty()) {
184 KexiFlowLayout *mthis = (KexiFlowLayout*) this;
185 TQRect r = TQRect(0, 0, 2000, 2000);
186 mthis->simulateLayout(r);
189 return m_cached_minSize;
192TQSizePolicy::ExpandData
193KexiFlowLayout::expanding() const
195 if(m_orientation == TQt::Vertical)
196 return TQSizePolicy::Vertically;
198 return TQSizePolicy::Horizontally;
202KexiFlowLayout::setGeometry( const TQRect &r)
204 TQLayout::setGeometry(r);
205 if(m_orientation ==TQt::Horizontal)
212KexiFlowLayout::simulateLayout( const TQRect &r)
214 if(m_orientation ==TQt::Horizontal)
226 int availableSpace = r.width() + spacing();
227 int expandingWidgets=0;
228 TQPtrListIterator<TQLayoutItem> it(m_list);
229 TQPtrList<TQLayoutItem> currentLine;
231 TQSize minSize, sizeHint(20, 20);
232 int minSizeHeight = 0 - spacing();
234 while ( (o = it.current()) != 0 ) {
241 TQSize oSizeHint = o->sizeHint();
242 if ((x + oSizeHint.width()) > r.right() && h > 0) {
244 TQPtrListIterator<TQLayoutItem> it2(currentLine);
247 int sizeHintWidth = 0 -spacing(), minSizeWidth=0 - spacing(), lineMinHeight=0;
248 while( (item = it2.current()) != 0 ) {
249 TQSize itemSizeHint = item->sizeHint();
250 TQSize itemMinSize = item->minimumSize();
253 if(expandingWidgets != 0) {
254 if(item->expanding() == TQSizePolicy::Horizontally || item->expanding() == TQSizePolicy::BothDirections)
255 s = TQSize( TQMIN(itemSizeHint.width() + availableSpace / expandingWidgets
256 , r.width()), itemSizeHint.height() );
258 s = TQSize( TQMIN(itemSizeHint.width(), r.width()), itemSizeHint.height() );
261 s = TQSize( TQMIN(itemSizeHint.width() + availableSpace / ( int)currentLine.count()
262 , r.width()), itemSizeHint.height() );
265 s = TQSize ( TQMIN(itemSizeHint.width(), r.width()), itemSizeHint.height() );
267 item->setGeometry( TQRect(TQPoint(wx, y), s) );
268 wx = wx + s.width() + spacing();
269 minSizeWidth = minSizeWidth + spacing() + itemMinSize.width();
270 sizeHintWidth = sizeHintWidth + spacing() + itemSizeHint.width();
271 lineMinHeight = TQMAX( lineMinHeight, itemMinSize.height() );
274 sizeHint = sizeHint.expandedTo( TQSize(sizeHintWidth, 0) );
275 minSize = minSize.expandedTo( TQSize(minSizeWidth, 0) );
276 minSizeHeight = minSizeHeight + spacing() + lineMinHeight;
278 y = y + spacing() + h;
282 expandingWidgets = 0;
283 availableSpace = r.width() + spacing();
286 x = x + spacing() + oSizeHint.width();
287 h = TQMAX( h, oSizeHint.height() );
288 currentLine.append(o);
289 if(o->expanding() == TQSizePolicy::Horizontally || o->expanding() == TQSizePolicy::BothDirections)
291 availableSpace = TQMAX(0, availableSpace - spacing() - oSizeHint.width());
296 TQPtrListIterator<TQLayoutItem> it2(currentLine);
299 int sizeHintWidth = 0 -spacing(), minSizeWidth=0 - spacing(), lineMinHeight=0;
300 while( (item = it2.current()) != 0 ) {
301 TQSize itemSizeHint = item->sizeHint();
302 TQSize itemMinSize = item->minimumSize();
305 if(expandingWidgets != 0) {
306 if(item->expanding() == TQSizePolicy::Horizontally || item->expanding() == TQSizePolicy::BothDirections)
307 s = TQSize( TQMIN(itemSizeHint.width() + availableSpace / expandingWidgets
308 , r.width()), itemSizeHint.height() );
310 s = TQSize( TQMIN(itemSizeHint.width(), r.width()), itemSizeHint.height() );
313 s = TQSize( TQMIN(itemSizeHint.width() + availableSpace / ( int)currentLine.count()
314 , r.width()), itemSizeHint.height() );
317 s = TQSize ( TQMIN(itemSizeHint.width(), r.width()), itemSizeHint.height() );
319 item->setGeometry( TQRect(TQPoint(wx, y), s) );
320 wx = wx + s.width() + spacing();
321 minSizeWidth = minSizeWidth + spacing() + itemMinSize.width();
322 sizeHintWidth = sizeHintWidth + spacing() + itemSizeHint.width();
323 lineMinHeight = TQMAX( lineMinHeight, itemMinSize.height() );
326 sizeHint = sizeHint.expandedTo( TQSize(sizeHintWidth, y + spacing() + h) );
327 minSizeHeight = minSizeHeight + spacing() + lineMinHeight;
328 minSize = minSize.expandedTo( TQSize(minSizeWidth, minSizeHeight) );
331 m_cached_sizeHint = sizeHint + TQSize(2* margin(), 2*margin());
332 m_cached_minSize = minSize + TQSize(2* margin() , 2*margin());
334 return y + h - r.y();
343 int availableSpace = r.height() + spacing();
344 int expandingWidgets=0;
345 TQPtrListIterator<TQLayoutItem> it(m_list);
346 TQPtrList<TQLayoutItem> currentLine;
348 TQSize minSize, sizeHint(20, 20);
349 int minSizeWidth = 0 - spacing();
351 while ( (o = it.current()) != 0 ) {
357 TQSize oSizeHint = o->sizeHint();
358 if (y + oSizeHint.height() > r.bottom() && w > 0) {
360 TQPtrListIterator<TQLayoutItem> it2(currentLine);
363 int sizeHintHeight = 0 - spacing(), minSizeHeight = 0 - spacing(), colMinWidth=0;
364 while( (item = it2.current()) != 0 ) {
365 TQSize itemSizeHint = item->sizeHint();
366 TQSize itemMinSize = item->minimumSize();
369 if(expandingWidgets != 0) {
370 if(item->expanding() == TQSizePolicy::Vertically || item->expanding() == TQSizePolicy::BothDirections)
371 s = TQSize( itemSizeHint.width(), TQMIN(itemSizeHint.height() + availableSpace / expandingWidgets
374 s = TQSize( itemSizeHint.width(), TQMIN(itemSizeHint.height(), r.height()) );
377 s = TQSize( itemSizeHint.width(), TQMIN(itemSizeHint.height() + availableSpace / ( int)currentLine.count()
381 s = TQSize ( itemSizeHint.width(), TQMIN(itemSizeHint.height(), r.height()) );
383 item->setGeometry( TQRect(TQPoint(x, wy), s) );
384 wy = wy + s.height() + spacing();
385 minSizeHeight = minSizeHeight + spacing() + itemMinSize.height();
386 sizeHintHeight = sizeHintHeight + spacing() + itemSizeHint.height();
387 colMinWidth = TQMAX( colMinWidth, itemMinSize.width() );
390 sizeHint = sizeHint.expandedTo( TQSize(0, sizeHintHeight) );
391 minSize = minSize.expandedTo( TQSize(0, minSizeHeight) );
392 minSizeWidth = minSizeWidth + spacing() + colMinWidth;
394 x = x + spacing() + w;
398 expandingWidgets = 0;
399 availableSpace = r.height() + spacing();
402 y = y + spacing() + oSizeHint.height();
403 w = TQMAX( w, oSizeHint.width() );
404 currentLine.append(o);
405 if(o->expanding() == TQSizePolicy::Vertically || o->expanding() == TQSizePolicy::BothDirections)
407 availableSpace = TQMAX(0, availableSpace - spacing() - oSizeHint.height());
412 TQPtrListIterator<TQLayoutItem> it2(currentLine);
415 int sizeHintHeight = 0 - spacing(), minSizeHeight = 0 - spacing(), colMinWidth=0;
416 while( (item = it2.current()) != 0 ) {
417 TQSize itemSizeHint = item->sizeHint();
418 TQSize itemMinSize = item->minimumSize();
421 if(expandingWidgets != 0) {
422 if(item->expanding() == TQSizePolicy::Vertically || item->expanding() == TQSizePolicy::BothDirections)
423 s = TQSize( itemSizeHint.width(), TQMIN(itemSizeHint.height() + availableSpace / expandingWidgets
426 s = TQSize( itemSizeHint.width(), TQMIN(itemSizeHint.height(), r.height()) );
429 s = TQSize( itemSizeHint.width(), TQMIN(itemSizeHint.height() + availableSpace / ( int)currentLine.count()
433 s = TQSize ( itemSizeHint.width(), TQMIN(itemSizeHint.height(), r.height()) );
435 item->setGeometry( TQRect(TQPoint(x, wy), s) );
436 wy = wy + s.height() + spacing();
437 minSizeHeight = minSizeHeight + spacing() + itemMinSize.height();
438 sizeHintHeight = sizeHintHeight + spacing() + itemSizeHint.height();
439 colMinWidth = TQMAX( colMinWidth, itemMinSize.width() );
442 sizeHint = sizeHint.expandedTo( TQSize( x + spacing() + w, sizeHintHeight) );
443 minSizeWidth = minSizeWidth + spacing() + colMinWidth;
444 minSize = minSize.expandedTo( TQSize(minSizeWidth, minSizeHeight) );
447 m_cached_sizeHint = sizeHint + TQSize(2* margin(), 2*margin());
448 m_cached_minSize = minSize + TQSize(2* margin(), 2*margin());
450 return x + w - r.x();
int doVerticalLayout(const TQRect &, bool testonly=false)
TQPtrList< TQWidget > * widgetList() const
int doHorizontalLayout(const TQRect &, bool testonly=false)
|