#include "krbriefview.h" #include "krbriefviewitem.h" #include "../krusaderview.h" #include "../defaults.h" #include "../kicons.h" #include "listpanel.h" #include #include "krcolorcache.h" #include #include #define PROPS _viewProperties #define VF getVfile() #ifdef FASTER int KrBriefViewItem::expHeight = 0; #endif // FASTER KrBriefViewItem::KrBriefViewItem(KrBriefView *parent, TQIconViewItem *after, vfile *vf): TDEIconViewItem(parent, after), KrViewItem(vf, parent->properties()) { #ifdef FASTER initiated = false; // get the expected height of an item - should be done only once if (expHeight == 0) { TDEConfigGroupSaver svr(krConfig, "Look&Feel"); expHeight = 2 + (krConfig->readEntry("Filelist Icon Size",_FilelistIconSize)).toInt(); } if( PROPS->displayIcons ) itemIcon = TQPixmap( expHeight, expHeight ); #endif // FASTER // there's a special case, where if _vf is null, then we've got the ".." (updir) item // in that case, create a special vfile for that item, and delete it, if needed if (!_vf) { dummyVfile = true; _vf = new vfile("..", 0, "drw-r--r--", 0, false, 0, 0, TQString(), TQString(), 0); setText(".."); if ( PROPS->displayIcons ) setPixmap( FL_LOADICON( "go-up" ) ); setSelectable( false ); setDragEnabled( false ); setDropEnabled( false ); #ifdef FASTER initiated = true; #endif // FASTER } setRenameEnabled( false ); setDragEnabled( true ); setDropEnabled( true ); repaintItem(); } int KrBriefViewItem::compare(TQIconViewItem *i ) const { bool ignoreCase = (PROPS->sortMode & KrViewProperties::IgnoreCase); KrBriefViewItem *other = (KrBriefViewItem *)i; int asc = iconView()->sortDirection() ? -1 : 1; bool thisDir = VF->vfile_isDir(); bool otherDir = other->VF->vfile_isDir(); // handle directory sorting if ( thisDir ){ if ( !otherDir ) return 1*asc; } else if( otherDir ) return -1*asc; if ( isDummy() ) return 1*asc; if ( other->isDummy() ) return -1*asc; TQString text0 = name(); if (text0 == "..") return 1*asc; TQString itext0 = other->name(); if (itext0 == "..") return -1*asc; if( ignoreCase ) { text0 = text0.lower(); itext0 = itext0.lower(); } if ( isHidden() ) { if ( !other->isHidden() ) return 1*asc; } else if ( other->isHidden() ) return -1*asc; if (!ignoreCase && !PROPS->localeAwareCompareIsCaseSensitive) { // sometimes, localeAwareCompare is not case sensative. in that case, // we need to fallback to a simple string compare (KDE bug #40131) return TQString::compare(text0, itext0); } else return TQString::localeAwareCompare(text0,itext0); } void KrBriefViewItem::paintItem(TQPainter *p, const TQColorGroup &cg) { #ifdef FASTER if (!initiated && !dummyVfile) { // display an icon if needed initiated = true; if (PROPS->displayIcons) itemIcon =KrView::getIcon(_vf); } #endif TQColorGroup _cg(cg); KrColorItemType colorItemType; colorItemType.m_activePanel = (dynamic_cast(iconView()) == ACTIVE_PANEL->view); int gridX = iconView()->gridX(); int xpos = x() / gridX; int ypos = y() / height(); colorItemType.m_alternateBackgroundColor = (xpos & 1) ^ (ypos & 1) ; colorItemType.m_currentItem = (iconView()->currentItem() == this); colorItemType.m_selectedItem = isSelected(); if (VF->vfile_isSymLink()) { if (_vf->vfile_getMime() == "Broken Link !" ) colorItemType.m_fileType = KrColorItemType::InvalidSymlink; else colorItemType.m_fileType = KrColorItemType::Symlink; } else if (VF->vfile_isDir()) colorItemType.m_fileType = KrColorItemType::Directory; else if (VF->vfile_isExecutable()) colorItemType.m_fileType = KrColorItemType::Executable; else colorItemType.m_fileType = KrColorItemType::File; KrColorCache::getColorCache().getColors(_cg, colorItemType); if( _cg.background() != iconView()->paletteBackgroundColor() ) { p->save(); p->setPen( TQt::NoPen ); p->setBrush( TQBrush( _cg.background() ) ); p->drawRect( rect() ); p->restore(); } TQIconViewItem::paintItem(p, _cg); paintFocus( p, cg ); } void KrBriefViewItem::paintFocus(TQPainter *p, const TQColorGroup &cg) { if ( ( iconView()->hasFocus() && this == iconView()->currentItem() ) || ((KrBriefView *)iconView())->_currDragItem == this ) { p->save(); TQPen pen( cg.shadow(), 0, TQt::DotLine ); p->setPen( pen ); // we manually draw the focus rect by points TQRect rec = rect(); TQPointArray points( rec.right() - rec.left() + rec.bottom() - rec.top() + 4 ); int ndx = 0; for( int x=rec.left(); x <= rec.right(); x+=2 ) { points.setPoint( ndx++, x, rec.top() ); points.setPoint( ndx++, x, rec.bottom() ); } for( int y=rec.top(); y <= rec.bottom(); y+=2 ) { points.setPoint( ndx++, rec.left(), y ); points.setPoint( ndx++, rec.right(), y ); } p->drawPoints( points ); p->restore(); // --- That didn't work with all themes // iconView()->style().drawPrimitive(TQStyle::PE_FocusRect, p, // TQRect( rect().x(), rect().y(), rect().width(), rect().height() ), cg, // TQStyle::Style_Default, cg.base() ); } } void KrBriefViewItem::itemHeightChanged() { #ifdef FASTER expHeight = 0; #endif // FASTER } void KrBriefViewItem::repaintItem() { if ( dummyVfile ) return; #ifndef FASTER if (PROPS->displayIcons) setPixmap(KrView::getIcon(_vf)); #endif // FASTER setText( _vf->vfile_getName() ); } // for keeping the exact item heights... void KrBriefViewItem::calcRect ( const TQString & text_ ) { TDEIconViewItem::calcRect( text_ ); TQRect rec = rect(); int gridX = iconView()->gridX(); int minX = ( rec.x() / gridX ) * gridX; rec.setX( minX ); rec.setWidth( gridX ); rec.setHeight( expHeight ); setItemRect( rec ); rec = pixmapRect(); if( rec.height() > expHeight ) { rec.setHeight( expHeight ); setPixmapRect( rec ); } rec = textRect(); if( rec.height() > expHeight ) { rec.setHeight( expHeight ); setTextRect( rec ); } }