summaryrefslogtreecommitdiffstats
path: root/src/app/Panel/krbriefviewitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/Panel/krbriefviewitem.cpp')
-rw-r--r--src/app/Panel/krbriefviewitem.cpp225
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 );
+ }
+}