diff options
Diffstat (limited to 'src/app/Panel/krbriefviewitem.cpp')
-rw-r--r-- | src/app/Panel/krbriefviewitem.cpp | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/src/app/Panel/krbriefviewitem.cpp b/src/app/Panel/krbriefviewitem.cpp new file mode 100644 index 0000000..8bcdca9 --- /dev/null +++ b/src/app/Panel/krbriefviewitem.cpp @@ -0,0 +1,225 @@ +#include "krbriefview.h" +#include "krbriefviewitem.h" +#include "../krusaderview.h" +#include "../defaults.h" +#include "../kicons.h" +#include "listpanel.h" +#include <tdeconfig.h> +#include "krcolorcache.h" + +#include <tqpainter.h> +#include <tqpointarray.h> + +#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<KrView *>(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 ); + } +} |