30#include <tqsimplerichtext.h>
33#include <tdeapplication.h>
36#include <tdeglobalsettings.h>
37#include <kiconloader.h>
40#include <tdepopupmenu.h>
41#include <kstringhandler.h>
43class LayerItemIterator:
public TQListViewItemIterator
46 LayerItemIterator( LayerList *list ): TQListViewItemIterator( list ) { }
47 LayerItemIterator( LayerList *list, IteratorFlag flags ): TQListViewItemIterator( list, flags ) { }
48 LayerItemIterator( LayerItem *item ): TQListViewItemIterator( item ) { }
49 LayerItemIterator( LayerItem *item, IteratorFlag flags ): TQListViewItemIterator( item, flags ) { }
50 LayerItem *operator*() {
return static_cast<LayerItem*
>( TQListViewItemIterator::operator*() ); }
58 TQPixmap disabledIcon;
62 LayerProperty(): defaultValue( false ), validForFolders( true ) { }
63 LayerProperty(
const TQString &pname,
const TQString &pdisplayName,
const TQPixmap &enabled,
const TQPixmap &disabled,
64 bool pdefaultValue,
bool pvalidForFolders )
66 displayName( pdisplayName ),
67 enabledIcon( enabled ),
68 disabledIcon( disabled ),
69 defaultValue( pdefaultValue ),
70 validForFolders( pvalidForFolders )
75class LayerList::Private
78 LayerItem *activeLayer;
79 bool foldersCanBeActive;
82 TQValueList<LayerProperty> properties;
83 TDEPopupMenu contextMenu;
84 LayerToolTip *tooltip;
86 Private( TQWidget *parent, LayerList *list );
90class LayerItem::Private
95 TQValueList<bool> properties;
96 TQImage *previewImage;
98 TQPixmap scaledPreview;
100 TQPoint previewOffset;
102 Private(
int pid ): isFolder( false ), id( pid ), previewImage( 0 ), previewChanged( false )
106static const int MAX_SIZE = 256;
107class LayerToolTip:
public TQToolTip,
public TQFrame
116 LayerToolTip( TQWidget *parent, LayerList *list )
117 : TQToolTip( parent ),
118 TQFrame( 0, 0, WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WStyle_StaysOnTop | WX11BypassWM | WNoAutoErase ),
121 TQFrame::setPalette( TQToolTip::palette() );
122 connect( &m_timer, TQ_SIGNAL( timeout() ), m_list, TQ_SLOT( hideTip() ) );
123 tqApp->installEventFilter(
this );
126 virtual void maybeTip(
const TQPoint &pos )
129 LayerItem *prev = m_item;
130 m_item =
static_cast<LayerItem*
>(m_list->itemAt( m_pos ));
131 if( TQToolTip::parentWidget() && m_list->showToolTips() && m_item )
143 m_img = m_item->tooltipPreview();
144 m_timer.start( 15000,
true );
145 if( !isVisible() || sizeHint() != size() )
147 resize( sizeHint() );
164 m_list->triggerUpdate();
167 virtual void drawContents( TQPainter *painter )
169 TQPixmap buf( width(), height() );
171 buf.fill( colorGroup().background() );
172 p.setPen( colorGroup().foreground() );
173 p.drawRect( buf.rect() );
175 TQSimpleRichText text( m_item->tooltip(), TQToolTip::font() );
176 text.setWidth( TQCOORD_MAX );
179 if( !m_img.isNull() )
181 if( m_img.width() > MAX_SIZE || m_img.height() > MAX_SIZE )
182 m_img = m_img.scale( MAX_SIZE, MAX_SIZE, TQImage::ScaleMin );
184 if( m_img.height() < text.height() )
185 y = text.height()/2 - m_img.height()/2;
186 p.drawImage( 0, y, m_img );
187 p.drawRect( -1, y-1, m_img.width()+2, m_img.height()+2 );
188 p.translate( m_img.width() + 10, 0 );
191 text.draw( &p, 0, 0, rect(), colorGroup() );
193 painter->drawPixmap( 0, 0, buf );
196 virtual TQSize sizeHint()
const
199 return TQSize( 0, 0 );
201 TQSimpleRichText text( m_item->tooltip(), TQToolTip::font() );
202 text.setWidth( TQCOORD_MAX );
204 int width = text.widthUsed();
205 if( !m_img.isNull() )
206 width += kMin( m_img.width(), MAX_SIZE ) + 10;
209 int height = text.height();
210 if( !m_img.isNull() && kMin( m_img.height(), MAX_SIZE ) > height )
211 height = kMin( m_img.height(), MAX_SIZE );
214 return TQSize( width, height );
219 const TQRect drect = TQApplication::desktop()->availableGeometry( TQToolTip::parentWidget() );
220 const TQSize size = sizeHint();
221 const int width = size.width(), height = size.height();
222 const TQRect tmp = m_item->rect();
223 const TQRect irect( m_list->viewport()->mapToGlobal( m_list->contentsToViewport(tmp.topLeft()) ), tmp.size() );
226 if( irect.bottom() + height < drect.bottom() )
229 y = kMax( drect.top(), irect.top() - height );
231 int x = kMax( drect.x(), TQToolTip::parentWidget()->mapToGlobal( m_pos ).x() - width/2 );
232 if( x + width > drect.right() )
233 x = drect.right() - width;
238 virtual bool eventFilter( TQObject *, TQEvent *e )
243 case TQEvent::KeyPress:
244 case TQEvent::KeyRelease:
245 case TQEvent::MouseButtonPress:
246 case TQEvent::MouseButtonRelease:
248 case TQEvent::FocusIn:
249 case TQEvent::FocusOut:
260LayerList::Private::Private( TQWidget *parent, LayerList *list )
261 : activeLayer( 0 ), foldersCanBeActive( false ), previewsShown( false ), itemHeight( 32 ),
262 tooltip( new LayerToolTip( parent, list ) ) { }
264LayerList::Private::~Private()
276static TQSize iconSize() {
return TQIconSet::iconSize( TQIconSet::Small ); }
283LayerList::LayerList( TQWidget *parent,
const char *name )
284 : super( parent, name ), d( new Private( viewport(), this ) )
286 setSelectionMode( TQListView::Extended );
287 setRootIsDecorated(
true );
290 setAllColumnsShowFocus(
true );
291 setFullWidth(
true );
292 setItemsRenameable(
false );
293 setDropHighlighter(
true );
294 setDefaultRenameAction( TQListView::Accept );
295 setDragEnabled(
true );
296 setAcceptDrops(
true );
297 setItemsMovable(
true );
298 addColumn( TQString() );
301 TQToolTip::add(
this, i18n(
"Right-click to create folders. Click on the layername to change the layer's name. Click and drag to move layers."));
305 connect(
this, TQ_SIGNAL( itemRenamed( TQListViewItem*,
const TQString&,
int ) ),
306 TQ_SLOT( slotItemRenamed( TQListViewItem*,
const TQString&,
int ) ) );
307 connect(
this, TQ_SIGNAL( moved( TQPtrList<TQListViewItem>&, TQPtrList<TQListViewItem>&, TQPtrList<TQListViewItem>& ) ),
308 TQ_SLOT( slotItemMoved( TQPtrList<TQListViewItem>&, TQPtrList<TQListViewItem>&, TQPtrList<TQListViewItem>& ) ) );
309 connect(
this, TQ_SIGNAL( onItem( TQListViewItem* ) ), TQ_SLOT( hideTip() ) );
310 connect(
this, TQ_SIGNAL( onViewport() ), TQ_SLOT( hideTip() ) );
313LayerList::~LayerList()
318void LayerList::addProperty(
const TQString &name,
const TQString &displayName,
const TQIconSet &icon,
319 bool defaultValue,
bool validForFolders )
321 addProperty( name, displayName, icon.pixmap( TQIconSet::Small, TQIconSet::Normal ), icon.pixmap( TQIconSet::Small, TQIconSet::Disabled ), defaultValue, validForFolders );
324void LayerList::addProperty(
const TQString &name,
const TQString &displayName, TQPixmap enabled, TQPixmap disabled,
325 bool defaultValue,
bool validForFolders )
327 d->properties.append( LayerProperty( name, displayName, enabled, disabled, defaultValue, validForFolders ) );
329 for( LayerItemIterator it(
this ); *it; ++it )
330 (*it)->d->properties.append( defaultValue );
333 for( LayerItemIterator it(
this ); *it; ++it )
334 if( validForFolders || !(*it)->isFolder() )
336 emit propertyChanged( *it, name, defaultValue );
337 emit propertyChanged( (*it)->id(), name, defaultValue );
343LayerItem *LayerList::layer(
int id )
const
345 if( !firstChild() ||
id == -1 )
348 for( LayerItemIterator it( firstChild() ); *it; ++it )
349 if( (*it)->id() ==
id )
355LayerItem *LayerList::folder(
int id )
const
357 if( !firstChild() ||
id == -1 )
360 for( LayerItemIterator it( firstChild() ); *it; ++it )
361 if( (*it)->id() ==
id && (*it)->isFolder() )
367LayerItem *LayerList::activeLayer()
const
369 return d->activeLayer;
372int LayerList::activeLayerID()
const
375 return activeLayer()->id();
379TQValueList<LayerItem*> LayerList::selectedLayers()
const
382 return TQValueList<LayerItem*>();
384 TQValueList<LayerItem*> layers;
385 for( LayerItemIterator it( firstChild() ); *it; ++it )
386 if( (*it)->isSelected() )
387 layers.append( *it );
392TQValueList<int> LayerList::selectedLayerIDs()
const
394 const TQValueList<LayerItem*> layers = selectedLayers();
395 TQValueList<int> ids;
396 for(
int i = 0, n = layers.count(); i < n; ++i )
397 ids.append( layers[i]->id() );
402bool LayerList::foldersCanBeActive()
const
404 return d->foldersCanBeActive;
407bool LayerList::previewsShown()
const
409 return d->previewsShown;
412int LayerList::itemHeight()
const
414 return d->itemHeight;
417int LayerList::numRows()
const
419 if( itemHeight() < kMax( fontMetrics().height(), iconSize().height() ) )
422 return ( itemHeight() - fontMetrics().height() ) / iconSize().height() + 1;
425void LayerList::makeFolder(
int id )
427 LayerItem*
const l = layer(
id );
432bool LayerList::isFolder(
int id )
const
434 LayerItem*
const l = layer(
id );
438 return l->isFolder();
441TQString LayerList::displayName(
int id )
const
443 LayerItem*
const l = layer(
id );
447 return l->displayName();
450bool LayerList::property(
int id,
const TQString &name )
const
452 LayerItem*
const l = layer(
id );
456 return l->property( name );
459TDEPopupMenu *LayerList::contextMenu()
const
461 return &( d->contextMenu );
464void LayerList::setFoldersCanBeActive(
bool can )
466 d->foldersCanBeActive = can;
467 if( !can && activeLayer() && activeLayer()->isFolder() )
470 emit activated(
static_cast<LayerItem*
>( 0 ) );
471 emit activated( -1 );
475void LayerList::setPreviewsShown(
bool show )
477 d->previewsShown = show;
481void LayerList::setItemHeight(
int height )
483 d->itemHeight = height;
484 for( LayerItemIterator it(
this ); *it; ++it )
489void LayerList::setNumRows(
int rows )
495 setItemHeight( kMax( fontMetrics().height(), iconSize().height() ) );
497 setItemHeight( fontMetrics().height() + ( rows - 1 ) * iconSize().height() );
500void LayerList::setActiveLayer( LayerItem *layer )
502 if( !foldersCanBeActive() && layer && layer->isFolder() )
505 ensureItemVisible( layer );
507 if( d->activeLayer == layer )
510 d->activeLayer = layer;
512 if( currentItem() != layer )
513 setCurrentItem( layer );
517 for( LayerItemIterator it(
this, LayerItemIterator::Selected ); n < 2 && (*it); ++it ) { n++; }
519 (*LayerItemIterator(
this, LayerItemIterator::Selected ))->setSelected(
false );
521 layer->setSelected(
true );
524 emit activated( layer );
526 emit activated( layer->id() );
528 emit activated( -1 );
531void LayerList::setActiveLayer(
int id )
533 setActiveLayer( layer(
id ) );
536void LayerList::setLayerDisplayName( LayerItem *layer,
const TQString &displayName )
541 layer->setDisplayName( displayName );
544void LayerList::setLayerDisplayName(
int id,
const TQString &displayName )
546 setLayerDisplayName( layer(
id ), displayName );
549void LayerList::setLayerProperty( LayerItem *layer,
const TQString &name,
bool on )
554 layer->setProperty( name, on );
557void LayerList::setLayerProperty(
int id,
const TQString &name,
bool on )
559 setLayerProperty( layer(
id ), name, on );
562void LayerList::toggleLayerProperty( LayerItem *layer,
const TQString &name )
567 layer->toggleProperty( name );
570void LayerList::toggleLayerProperty(
int id,
const TQString &name )
572 toggleLayerProperty( layer(
id ), name );
575void LayerList::setLayerPreviewImage( LayerItem *layer, TQImage *image )
580 layer->setPreviewImage( image );
583void LayerList::setLayerPreviewImage(
int id, TQImage *image )
585 setLayerPreviewImage( layer(
id ), image );
588void LayerList::layerPreviewChanged( LayerItem *layer )
593 layer->previewChanged();
596void LayerList::layerPreviewChanged(
int id )
598 layerPreviewChanged( layer(
id ) );
601LayerItem *LayerList::addLayer(
const TQString &displayName, LayerItem *after,
int id )
603 return new LayerItem( displayName,
this, after,
id );
606LayerItem *LayerList::addLayer(
const TQString &displayName,
int afterID,
int id )
608 return new LayerItem( displayName,
this, layer( afterID ),
id );
612LayerItem *LayerList::addLayerToParent(
const TQString &displayName, LayerItem *parent, LayerItem *after,
int id )
614 if( parent && parent->isFolder() )
615 return parent->addLayer( displayName, after,
id );
620LayerItem *LayerList::addLayerToParent(
const TQString &displayName,
int parentID,
int afterID,
int id )
622 return addLayerToParent( displayName, folder( parentID ), layer( afterID ),
id );
625void LayerList::moveLayer( LayerItem *layer, LayerItem *parent, LayerItem *after )
630 if( parent && !parent->isFolder() )
633 if( layer->parent() == parent && layer->prevSibling() == after )
636 TQListViewItem *current = currentItem();
638 moveItem( layer, parent, after );
640 emit layerMoved( layer, parent, after );
641 emit layerMoved( layer->id(), parent ? parent->id() : -1, after ? after->id() : -1 );
643 setCurrentItem( current );
646void LayerList::moveLayer(
int id,
int parentID,
int afterID )
648 moveLayer( layer(
id ), folder( parentID ), layer( afterID ) );
651void LayerList::removeLayer( LayerItem *layer )
656void LayerList::removeLayer(
int id )
661void LayerList::contentsMousePressEvent( TQMouseEvent *e )
663 LayerItem *item =
static_cast<LayerItem*
>( itemAt( contentsToViewport( e->pos() ) ) );
667 TQMouseEvent m( TQEvent::MouseButtonPress, item->mapFromListView( e->pos() ), e->button(), e->state() );
668 if( !item->mousePressEvent( &m ) )
669 super::contentsMousePressEvent( e );
673 super::contentsMousePressEvent( e );
674 if( e->button() == TQt::RightButton )
679void LayerList::contentsMouseDoubleClickEvent( TQMouseEvent *e )
681 super::contentsMouseDoubleClickEvent( e );
682 if( LayerItem *layer =
static_cast<LayerItem*
>( itemAt( contentsToViewport( e->pos() ) ) ) )
684 if( !layer->iconsRect().contains( layer->mapFromListView( e->pos() ) ) )
686 emit requestLayerProperties( layer );
687 emit requestLayerProperties( layer->id() );
692 emit requestNewLayer(
static_cast<LayerItem*
>( 0 ),
static_cast<LayerItem*
>( 0 ) );
693 emit requestNewLayer( -1, -1 );
697void LayerList::findDrop(
const TQPoint &pos, TQListViewItem *&parent, TQListViewItem *&after )
699 LayerItem *item =
static_cast<LayerItem*
>( itemAt( contentsToViewport( pos ) ) );
700 if( item && item->isFolder() )
706 super::findDrop( pos, parent, after );
709void LayerList::showContextMenu()
711 LayerItem *layer =
static_cast<LayerItem*
>( itemAt( viewport()->mapFromGlobal( TQCursor::pos() ) ) );
713 setCurrentItem( layer );
714 d->contextMenu.clear();
715 constructMenu( layer );
716 menuActivated( d->contextMenu.exec( TQCursor::pos() ), layer );
719void LayerList::hideTip()
721 d->tooltip->hideTip();
724void LayerList::maybeTip()
726 d->tooltip->maybeTip( d->tooltip->TQToolTip::parentWidget()->mapFromGlobal( TQCursor::pos() ) );
729void LayerList::constructMenu( LayerItem *layer )
733 for(
int i = 0, n = d->properties.count(); i < n; ++i )
734 if( !layer->isFolder() || d->properties[i].validForFolders )
735 d->contextMenu.insertItem( layer->d->properties[i] ? d->properties[i].enabledIcon : d->properties[i].disabledIcon, d->properties[i].displayName, MenuItems::COUNT + i );
736 d->contextMenu.insertItem( SmallIconSet(
"application-vnd.tde.info" ), i18n(
"&Properties" ), MenuItems::LayerProperties );
737 d->contextMenu.insertSeparator();
738 d->contextMenu.insertItem( SmallIconSet(
"edit-delete" ),
739 selectedLayers().count() > 1 ? i18n(
"Remove Layers" )
740 : layer->isFolder() ? i18n(
"&Remove Folder" )
741 : i18n(
"&Remove Layer" ), MenuItems::RemoveLayer );
743 d->contextMenu.insertItem( SmallIconSet(
"document-new" ), i18n(
"&New Layer" ), MenuItems::NewLayer );
744 d->contextMenu.insertItem( SmallIconSet(
"folder" ), i18n(
"New &Folder" ), MenuItems::NewFolder );
747void LayerList::menuActivated(
int id, LayerItem *layer )
749 const TQValueList<LayerItem*> selected = selectedLayers();
751 LayerItem *parent = ( layer && layer->isFolder() ) ? layer : 0;
752 LayerItem *after = 0;
753 if( layer && !parent )
755 parent = layer->parent();
756 after = layer->prevSibling();
760 case MenuItems::NewLayer:
761 emit requestNewLayer( parent, after );
762 emit requestNewLayer( parent ? parent->id() : -1, after ? after->id() : -1 );
764 case MenuItems::NewFolder:
765 emit requestNewFolder( parent, after );
766 emit requestNewFolder( parent ? parent->id() : -1, after ? after->id() : -1 );
768 case MenuItems::RemoveLayer:
770 TQValueList<int> ids;
771 for(
int i = 0, n = selected.count(); i < n; ++i )
773 ids.append( selected[i]->
id() );
774 emit requestRemoveLayer( selected[i]->
id() );
776 emit requestRemoveLayers( ids );
778 for(
int i = 0, n = selected.count(); i < n; ++i )
779 emit requestRemoveLayer( selected[i] );
780 emit requestRemoveLayers( selected );
782 case MenuItems::LayerProperties:
785 emit requestLayerProperties( layer );
786 emit requestLayerProperties( layer->id() );
790 if(
id >= MenuItems::COUNT && layer )
791 for(
int i = 0, n = selected.count(); i < n; ++i )
792 selected[i]->toggleProperty( d->properties[
id - MenuItems::COUNT ].name );
796void LayerList::slotItemRenamed( TQListViewItem *item,
const TQString &text,
int col )
798 if( !item || col != 0 )
801 emit displayNameChanged(
static_cast<LayerItem*
>( item ), text );
802 emit displayNameChanged(
static_cast<LayerItem*
>( item )->
id(), text );
805void LayerList::slotItemMoved( TQPtrList<TQListViewItem> &items, TQPtrList<TQListViewItem> &, TQPtrList<TQListViewItem> &afterNow )
807 for(
int i = 0, n = items.count(); i < n; ++i )
809 LayerItem *l =
static_cast<LayerItem*
>( items.at(i) ), *a =
static_cast<LayerItem*
>( afterNow.at(i) );
814 l->parent()->setOpen(
true );
816 emit layerMoved( l, l->parent(), a );
817 emit layerMoved( l->id(), l->parent() ? l->parent()->id() : -1, a ? a->id() : -1 );
821void LayerList::setCurrentItem( TQListViewItem *item )
826 super::setCurrentItem( item );
827 ensureItemVisible( item );
829 for( LayerItemIterator it(
this, LayerItemIterator::Selected ); n < 2 && (*it); ++it ) { n++; }
831 (*LayerItemIterator(
this, LayerItemIterator::Selected ))->setSelected(
false );
832 item->setSelected(
true );
833 if( activeLayer() != item )
834 setActiveLayer(
static_cast<LayerItem*
>(item) );
842LayerItem::LayerItem(
const TQString &displayName, LayerList *p, LayerItem *after,
int id )
843 : super( p, after ), d( new Private( id ) )
846 setDisplayName( displayName );
849LayerItem::LayerItem(
const TQString &displayName, LayerItem *p, LayerItem *after,
int id )
850 : super( ( p && p->isFolder() ) ? p : 0, after ), d( new Private( id ) )
853 setDisplayName( displayName );
856void LayerItem::init()
861 for(
int i = 0, n = listView()->d->properties.count(); i < n; ++i )
862 d->properties.append( listView()->d->properties[i].defaultValue );
865 parent()->setOpen(
true );
868LayerItem::~LayerItem()
870 if (listView() && (listView()->activeLayer() ==
this || contains(listView()->activeLayer())))
871 listView()->setActiveLayer(
static_cast<LayerItem*
>( 0 ) );
875void LayerItem::makeFolder()
878 setPixmap( 0, SmallIcon(
"folder", 16 ) );
879 if( isActive() && !listView()->foldersCanBeActive() )
880 listView()->setActiveLayer(
static_cast<LayerItem*
>( 0 ) );
883bool LayerItem::isFolder()
const
888bool LayerItem::contains(
const LayerItem *item)
890 TQListViewItemIterator it(
this);
892 while (it.current()) {
893 if (
static_cast<const LayerItem *
>(it.current()) == item) {
901int LayerItem::id()
const
906TQString LayerItem::displayName()
const
911void LayerItem::setDisplayName(
const TQString &s )
913 if( displayName() == s )
916 emit listView()->displayNameChanged(
this, s );
917 emit listView()->displayNameChanged(
id(), s );
920bool LayerItem::isActive()
const
922 return listView()->activeLayer() ==
this;
925void LayerItem::setActive()
927 listView()->setActiveLayer(
this );
930bool LayerItem::property(
const TQString &name )
const
932 int i = listView()->d->properties.count() - 1;
933 while( i && listView()->d->properties[i].name != name )
939 return d->properties[i];
942void LayerItem::setProperty(
const TQString &name,
bool on )
944 int i = listView()->d->properties.count() - 1;
945 while( i && listView()->d->properties[i].name != name )
948 if( i < 0 || ( isFolder() && !listView()->d->properties[i].validForFolders ) )
951 const bool notify = ( on != d->properties[i] );
952 d->properties[i] = on;
955 emit listView()->propertyChanged(
this, name, on );
956 emit listView()->propertyChanged(
id(), name, on );
962void LayerItem::toggleProperty(
const TQString &name )
964 int i = listView()->d->properties.count() - 1;
965 while( i && listView()->d->properties[i].name != name )
968 if( i < 0 || ( isFolder() && !listView()->d->properties[i].validForFolders ) )
971 d->properties[i] = !(d->properties[i]);
972 emit listView()->propertyChanged(
this, name, d->properties[i] );
973 emit listView()->propertyChanged(
id(), name, d->properties[i] );
978void LayerItem::setPreviewImage( TQImage *image )
980 d->previewImage = image;
984void LayerItem::previewChanged()
986 d->previewChanged =
true;
990LayerItem *LayerItem::addLayer(
const TQString &displayName, LayerItem *after,
int id )
994 return new LayerItem( displayName,
this, after,
id );
997LayerItem *LayerItem::prevSibling()
const
999 LayerItem *item = parent() ? parent()->firstChild() : listView()->firstChild();
1000 if( !item ||
this == item )
1002 for(; item &&
this != item->nextSibling(); item = item->nextSibling() );
1006int LayerItem::mapXFromListView(
int x )
const
1008 return x - rect().left();
1011int LayerItem::mapYFromListView(
int y )
const
1013 return y - rect().top();
1016TQPoint LayerItem::mapFromListView(
const TQPoint &point )
const
1018 return TQPoint( mapXFromListView( point.x() ), mapYFromListView( point.y() ) );
1021TQRect LayerItem::mapFromListView(
const TQRect &rect )
const
1023 return TQRect( mapFromListView( rect.topLeft() ), rect.size() );
1026int LayerItem::mapXToListView(
int x )
const
1028 return x + rect().left();
1031int LayerItem::mapYToListView(
int y )
const
1033 return y + rect().top();
1036TQPoint LayerItem::mapToListView(
const TQPoint &point )
const
1038 return TQPoint( mapXToListView( point.x() ), mapYToListView( point.y() ) );
1041TQRect LayerItem::mapToListView(
const TQRect &rect )
const
1043 return TQRect( mapToListView( rect.topLeft() ), rect.size() );
1046TQRect LayerItem::rect()
const
1048 const int indent = listView()->treeStepSize() * ( depth() + 1 );
1049 return TQRect( listView()->header()->sectionPos( 0 ) + indent, itemPos(),
1050 listView()->header()->sectionSize( 0 ) - indent, height() );
1053TQRect LayerItem::textRect()
const
1056 static int minbearing = 1337 + 666;
1057 if( minbearing == 2003 || f != font() )
1060 minbearing = fontMetrics().minLeftBearing() + fontMetrics().minRightBearing();
1063 const int margin = listView()->itemMargin();
1064 int indent = previewRect().right() + margin;
1066 indent += pixmap( 0 )->width() + margin;
1068 const int width = ( multiline() ? rect().right() : iconsRect().left() ) - indent - margin + minbearing;
1070 return TQRect( indent, 0, width, fontMetrics().height() );
1073TQRect LayerItem::iconsRect()
const
1075 const TQValueList<LayerProperty> &lp = listView()->d->properties;
1077 for(
int i = 0, n = lp.count(); i < n; ++i )
1078 if( !lp[i].enabledIcon.isNull() && ( !multiline() || !isFolder() || lp[i].validForFolders ) )
1081 const int iconswidth = propscount * iconSize().width() + (propscount - 1) * listView()->itemMargin();
1083 const int x = multiline() ? previewRect().right() + listView()->itemMargin() : rect().width() - iconswidth;
1084 const int y = multiline() ? fontMetrics().height() : 0;
1086 return TQRect( x, y, iconswidth, iconSize().height() );
1089TQRect LayerItem::previewRect()
const
1091 return TQRect( 0, 0, listView()->previewsShown() ? height() : 0, height() );
1094void LayerItem::drawText( TQPainter *p,
const TQColorGroup &cg,
const TQRect &r )
1096 p->translate( r.left(), r.top() );
1098 p->setPen( isSelected() ? cg.highlightedText() : cg.text() );
1100 const TQString text = KStringHandler::rPixelSqueeze( displayName(), p->fontMetrics(), r.width() );
1101 p->drawText( listView()->itemMargin(), 0, r.width(), r.height(), TQt::AlignAuto | TQt::AlignTop, text );
1103 p->translate( -r.left(), -r.top() );
1106void LayerItem::drawIcons( TQPainter *p,
const TQColorGroup &,
const TQRect &r )
1108 p->translate( r.left(), r.top() );
1111 const TQValueList<LayerProperty> &lp = listView()->d->properties;
1112 for(
int i = 0, n = lp.count(); i < n; ++i )
1113 if( !lp[i].enabledIcon.isNull() && ( !multiline() || !isFolder() || lp[i].validForFolders ) )
1115 if( !isFolder() || lp[i].validForFolders )
1116 p->drawPixmap( x, 0, d->properties[i] ? lp[i].enabledIcon : lp[i].disabledIcon );
1117 x += iconSize().width() + listView()->itemMargin();
1120 p->translate( -r.left(), -r.top() );
1123void LayerItem::drawPreview( TQPainter *p,
const TQColorGroup &,
const TQRect &r )
1125 if( !showPreview() )
1128 if( d->previewChanged || r.size() != d->previewSize )
1130 const int size = kMin( r.width(), kMax( previewImage()->width(), previewImage()->height() ) );
1131 const TQImage i = previewImage()->smoothScale( size, size, TQImage::ScaleMin );
1132 d->scaledPreview.convertFromImage( i );
1133 d->previewOffset.setX( r.width()/2 - i.width()/2 );
1134 d->previewOffset.setY( r.height()/2 - i.height()/2 );
1136 d->previewChanged =
false;
1137 d->previewSize = r.size();
1140 p->drawPixmap( r.topLeft() + d->previewOffset, d->scaledPreview );
1143bool LayerItem::showPreview()
const
1145 return listView()->previewsShown() && previewImage() && !previewImage()->isNull();
1148bool LayerItem::multiline()
const
1150 return height() >= fontMetrics().height() + iconSize().height();
1153TQFont LayerItem::font()
const
1157 TQFont f = listView()->font();
1158 f.setBold( !f.bold() );
1159 f.setItalic( !f.italic() );
1163 return listView()->font();
1166TQFontMetrics LayerItem::fontMetrics()
const
1168 return TQFontMetrics( font() );
1171bool LayerItem::mousePressEvent( TQMouseEvent *e )
1173 if( e->button() == TQt::RightButton )
1175 if ( !(e->state() & TQt::ControlButton) && !(e->state() & TQt::ShiftButton) )
1177 TQTimer::singleShot( 0, listView(), TQ_SLOT( showContextMenu() ) );
1181 const TQRect ir = iconsRect(), tr = textRect();
1183 if( ir.contains( e->pos() ) )
1185 const int iconWidth = iconSize().width();
1186 int x = e->pos().x() - ir.left();
1187 if( x % ( iconWidth + listView()->itemMargin() ) < iconWidth )
1189 const TQValueList<LayerProperty> &lp = listView()->d->properties;
1191 for(
int i = 0, n = lp.count(); i < n; ++i )
1193 if( !lp[i].enabledIcon.isNull() && ( !multiline() || !isFolder() || lp[i].validForFolders ) )
1194 x -= iconWidth + listView()->itemMargin();
1199 toggleProperty( lp[p].name );
1204 else if( tr.contains( e->pos() ) && isSelected() && !listView()->renameLineEdit()->isVisible() )
1206 listView()->rename(
this, 0 );
1207 TQRect r( listView()->contentsToViewport( mapToListView( tr.topLeft() ) ), tr.size() );
1208 listView()->renameLineEdit()->setGeometry( r );
1212 if ( !(e->state() & TQt::ControlButton) && !(e->state() & TQt::ShiftButton) )
1218TQString LayerItem::tooltip()
const
1221 tip +=
"<table cellspacing=\"0\" cellpadding=\"0\">";
1222 tip += TQString(
"<tr><td colspan=\"2\" align=\"center\"><b>%1</b></td></tr>").arg( displayName() );
1223 TQString row =
"<tr><td>%1</td><td>%2</td></tr>";
1224 for(
int i = 0, n = listView()->d->properties.count(); i < n; ++i )
1225 if( !isFolder() || listView()->d->properties[i].validForFolders )
1227 if( d->properties[i] )
1228 tip += row.arg( i18n(
"%1:" ).arg( listView()->d->properties[i].displayName ) ).arg( i18n(
"Yes" ) );
1230 tip += row.arg( i18n(
"%1:" ).arg( listView()->d->properties[i].displayName ) ).arg( i18n(
"No" ) );
1236TQImage *LayerItem::previewImage()
const
1238 return d->previewImage;
1241TQImage LayerItem::tooltipPreview()
const
1243 if( previewImage() )
1244 return *previewImage();
1248int LayerItem::width(
const TQFontMetrics &fm,
const TQListView *lv,
int c )
const
1251 return super::width( fm, lv, c );
1253 const TQValueList<LayerProperty> &lp = listView()->d->properties;
1255 for(
int i = 0, n = d->properties.count(); i < n; ++i )
1256 if( !lp[i].enabledIcon.isNull() && ( !multiline() || !isFolder() || lp[i].validForFolders ) )
1259 const int iconswidth = propscount * iconSize().width() + (propscount - 1) * listView()->itemMargin();
1262 return kMax( super::width( fm, lv, 0 ), iconswidth );
1264 return super::width( fm, lv, 0 ) + iconswidth;
1267void LayerItem::paintCell( TQPainter *painter,
const TQColorGroup &cg,
int column,
int width,
int align )
1271 super::paintCell( painter, cg, column, width, align );
1275 TQPixmap buf( width, height() );
1276 TQPainter p( &buf );
1278 p.setFont( font() );
1280 const TQColorGroup cg_ = isEnabled() ? listView()->palette().active() : listView()->palette().disabled();
1282 const TQColor bg = isSelected() ? cg_.highlight()
1283 : isAlternate() ? listView()->alternateBackground()
1284 : listView()->viewport()->backgroundColor();
1289 p.drawPixmap( previewRect().right() + listView()->itemMargin(), 0, *pixmap( 0 ) );
1291 drawText( &p, cg_, textRect() );
1292 drawIcons( &p, cg_, iconsRect() );
1293 drawPreview( &p, cg_, previewRect() );
1295 painter->drawPixmap( 0, 0, buf );
1298void LayerItem::setup()
1301 setHeight( listView()->d->itemHeight );
1304void LayerItem::setSelected(
bool selected )
1306 if( !selected && ( isActive() ||
this == listView()->currentItem() ) )
1308 super::setSelected( selected );
1316LayerItem *LayerList::firstChild()
const {
return static_cast<LayerItem*
>( super::firstChild() ); }
1317LayerItem *LayerList::lastChild()
const {
return static_cast<LayerItem*
>( super::lastChild() ); }
1318LayerList *LayerItem::listView()
const {
return static_cast<LayerList*
>( super::listView() ); }
1319void LayerItem::update()
const { listView()->repaintItem(
this ); }
1320LayerItem *LayerItem::firstChild()
const {
return static_cast<LayerItem*
>( super::firstChild() ); }
1321LayerItem *LayerItem::nextSibling()
const {
return static_cast<LayerItem*
>( super::nextSibling() ); }
1322LayerItem *LayerItem::parent()
const {
return static_cast<LayerItem*
>( super::parent() ); }
1325#include "layerlist.moc"