⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dulines.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
字号:
/***************************************************************************                         dulines.cpp  -  description                             -------------------    copyright            : (C) 2004 by Csaba Karai    e-mail               : krusader@users.sourceforge.net    web site             : http://krusader.sourceforge.net ---------------------------------------------------------------------------  Description ***************************************************************************  A     db   dD d8888b. db    db .d8888.  .d8b.  d8888b. d88888b d8888b.     88 ,8P' 88  `8D 88    88 88'  YP d8' `8b 88  `8D 88'     88  `8D     88,8P   88oobY' 88    88 `8bo.   88ooo88 88   88 88ooooo 88oobY'     88`8b   88`8b   88    88   `Y8b. 88~~~88 88   88 88~~~~~ 88`8b     88 `88. 88 `88. 88b  d88 db   8D 88   88 88  .8D 88.     88 `88.     YP   YD 88   YD ~Y8888P' `8888Y' YP   YP Y8888D' Y88888P 88   YD                                                     S o u r c e    F i l e *************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include "dulines.h"#include "../kicons.h"#include "../krusader.h"#include "../VFS/krpermhandler.h"#include <qheader.h>#include <klocale.h>#include <qpen.h>#include <qpainter.h>#include <qfontmetrics.h>#include <qtimer.h>#include <qtooltip.h>#include <kpopupmenu.h>class DULinesItem : public QListViewItem{public:  DULinesItem( DiskUsage *diskUsageIn, File *fileItem, QListView * parent, QString label1,                QString label2, QString label3, unsigned int italicPos ) : QListViewItem( parent, label1, label2, label3 ),                diskUsage( diskUsageIn ), file( fileItem ), isTruncated( false ), italicTextPos( italicPos ) {}  DULinesItem( DiskUsage *diskUsageIn, File *fileItem, QListView * parent, QListViewItem * after,                QString label1, QString label2, QString label3, unsigned int italicPos ) : QListViewItem( parent, after, label1,                label2, label3 ), diskUsage( diskUsageIn ), file( fileItem ), isTruncated( false ), italicTextPos( italicPos ) {}    virtual int compare ( QListViewItem * i, int col, bool ascending ) const   {    if( text(0) == ".." ) return ascending ? -1 : 1;    if( i->text(0) == "..") return ascending ? 1 : -1;        DULinesItem *compWith = dynamic_cast< DULinesItem * >( i );            QString buf1,buf2;        switch( col )    {    case 0:        case 1:      buf1.sprintf("%025llu",file->size());      buf2.sprintf("%025llu",compWith->file->size());      return -QString::compare( buf1, buf2 );    default:          return QListViewItem::compare( i, col, ascending );    }  }  virtual void paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align )  {    if( column == 2 )    {      if ( isSelected() )         p->fillRect( 0, 0, width, height(), cg.brush( QColorGroup::Highlight ) );      else        p->fillRect( 0, 0, width, height(), cg.brush( QColorGroup::Base ) );              QListView *lv = listView();            int pos = lv->itemMargin();                        const QPixmap *icon = pixmap( column );      if( icon )      {        int iconWidth = icon->width() + lv->itemMargin();        int xo = pos;        int yo = ( height() - icon->height() ) / 2;        p->drawPixmap( xo, yo, *icon );                pos += iconWidth;      }          QFontMetrics fm( p->fontMetrics() );            if( isSelected() )        p->setPen( cg.highlightedText() );      else        p->setPen( cg.text() );            QString t = text( column );      QString b;            if( t.length() > italicTextPos )      {        b = t.mid( italicTextPos );        t.truncate( italicTextPos );      }            isTruncated = false;      if( !t.isEmpty() )      {        int remWidth = width-pos;                if( fm.width( t ) > remWidth )        {          while( !t.isEmpty() )          {            t.truncate( t.length() - 1 );            if( fm.width( t + "..." ) <= remWidth )              break;          }                    t += "...";          isTruncated = true;        }                p->drawText( pos, 0, width, height(), align, t );        pos += fm.width( t );      }                          if( !b.isEmpty() && !isTruncated )      {        QFont font( p->font() );        font.setItalic( true );        p->setFont( font );        QFontMetrics fm2( p->fontMetrics() );                int remWidth = width-pos;                if( fm2.width( b ) > remWidth )        {          while( !b.isEmpty() )          {            b.truncate( b.length() - 1 );            if( fm2.width( b + "..." ) <= remWidth )              break;          }                    b += "...";          isTruncated = true;        }                p->drawText( pos, 0, width, height(), align, b );      }    }    else      QListViewItem::paintCell( p, cg, column, width, align );  }      inline File * getFile() { return file; }  private:  DiskUsage *diskUsage;  File *file;    bool isTruncated;  unsigned int italicTextPos;};class DULinesToolTip : public QToolTip{public:    DULinesToolTip( DiskUsage *usage, QWidget *parent, QListView *lv );    void maybeTip( const QPoint &pos );    virtual ~DULinesToolTip() {}private:    QListView *view;    DiskUsage *diskUsage;};DULinesToolTip::DULinesToolTip( DiskUsage *usage, QWidget *parent, QListView *lv )  : QToolTip( parent ), view( lv ), diskUsage( usage ){}void DULinesToolTip::maybeTip( const QPoint &pos ){  QListViewItem *item = view->itemAt( pos );  QPoint contentsPos = view->viewportToContents( pos );  if ( !item )    return;      int col = view->header()->sectionAt( contentsPos.x() );  int width = item->width( QFontMetrics( view->font() ), view, col );      QRect r = view->itemRect( item );  int headerPos = view->header()->sectionPos( col );  r.setLeft( headerPos );  r.setRight( headerPos + view->header()->sectionSize( col ) );      if( col != 0 && width > view->columnWidth( col ) )    tip( r, item->text( col ) );  else if( col == 1 && item->text( 0 ) != ".." )  {    File *fileItem = ((DULinesItem *)item)->getFile();    tip( r, diskUsage->getToolTip( fileItem ) );  }}DULines::DULines( DiskUsage *usage, const char *name )  : QListView( usage, name ), diskUsage( usage ), refreshNeeded( false ){  setAllColumnsShowFocus(true);  setVScrollBarMode(QScrollView::Auto);  setHScrollBarMode(QScrollView::Auto);  setShowSortIndicator(true);  setTreeStepSize( 10 );  int defaultSize = QFontMetrics(font()).width("W");    krConfig->setGroup( diskUsage->getConfigGroup() );   showFileSize = krConfig->readBoolEntry( "L Show File Size", true );    int lineWidth  = krConfig->readNumEntry("L Line Width",  defaultSize * 20 );      addColumn( i18n("Line View"), lineWidth );  setColumnWidthMode(0,QListView::Manual);  int precentWidth  = krConfig->readNumEntry("L Percent Width",  defaultSize * 6 );      addColumn( i18n("Percent"), precentWidth );  setColumnWidthMode(1,QListView::Manual);  int nameWidth  = krConfig->readNumEntry("L Name Width",  defaultSize * 20 );  addColumn( i18n("Name"), nameWidth );  setColumnWidthMode(2,QListView::Manual);    setColumnAlignment( 1, Qt::AlignRight );    header()->setStretchEnabled( true, 0 );    setSorting( 1 );    toolTip = new DULinesToolTip( diskUsage, viewport(), this );  connect( diskUsage, SIGNAL( enteringDirectory( Directory * ) ), this, SLOT( slotDirChanged( Directory * ) ) );  connect( diskUsage, SIGNAL( clearing() ), this, SLOT( clear() ) );    connect( header(), SIGNAL( sizeChange( int, int, int ) ), this, SLOT( sectionResized( int ) ) );  connect( this, SIGNAL(rightButtonPressed(QListViewItem *, const QPoint &, int)),           this, SLOT( slotRightClicked(QListViewItem *) ) );  connect( diskUsage, SIGNAL( changed( File * ) ), this, SLOT( slotChanged( File * ) ) );  connect( diskUsage, SIGNAL( deleted( File * ) ), this, SLOT( slotDeleted( File * ) ) );}DULines::~DULines(){  krConfig->setGroup( diskUsage->getConfigGroup() );   krConfig->writeEntry("L Line Width",      columnWidth( 0 ) );  krConfig->writeEntry("L Percent Width",   columnWidth( 1 ) );  krConfig->writeEntry("L Name Width",      columnWidth( 2 ) );  krConfig->writeEntry("L Show File Size",  showFileSize );    delete toolTip;}void DULines::slotDirChanged( Directory *dirEntry ){  clear();      QListViewItem * lastItem = 0;      if( ! ( dirEntry->parent() == 0 ) )  {    lastItem = new QListViewItem( this, ".." );    lastItem->setPixmap( 0, FL_LOADICON( "up" ) );    lastItem->setSelectable( false );  }            int maxPercent = -1;  for( Iterator<File> it = dirEntry->iterator(); it != dirEntry->end(); ++it )  {    File *item = *it;    if( !item->isExcluded() && item->intPercent() > maxPercent )      maxPercent = item->intPercent();  }    for( Iterator<File> it = dirEntry->iterator(); it != dirEntry->end(); ++it )  {     File *item = *it;        QString fileName = item->name();        unsigned int italicStart = fileName.length();        if( showFileSize )      fileName += "  [" + KIO::convertSize( item->size() ) + "]";        if( lastItem == 0 )      lastItem = new DULinesItem( diskUsage, item, this, "", item->percent() + "  ", fileName, italicStart );    else      lastItem = new DULinesItem( diskUsage, item, this, lastItem, "", item->percent() + "  ", fileName, italicStart );       if( item->isExcluded() )      lastItem->setVisible( false );                                        lastItem->setPixmap( 2, diskUsage->getIcon( item->mime() ) );    lastItem->setPixmap( 0, createPixmap( item->intPercent(), maxPercent, columnWidth( 0 ) - itemMargin() ) );  }    setCurrentItem( firstChild() );}QPixmap DULines::createPixmap( int percent, int maxPercent, int maxWidth ){  if( percent < 0 || percent > maxPercent || maxWidth < 2 || maxPercent == 0 )    return QPixmap();  maxWidth -= 2;  int actualWidth = maxWidth*percent/maxPercent;  if( actualWidth == 0 )    return QPixmap();      QPen pen;  pen.setColor( Qt::black );    QPainter painter;    int size = QFontMetrics(font()).height()-2;  QRect rect( 0, 0, actualWidth, size );  QPixmap pixmap( rect.width(), rect.height() );  painter.begin( &pixmap );  painter.setPen( pen );    for( int i = 1; i < actualWidth - 1; i++ )  {    int color = (511*i/maxWidth);    if( color < 256 )      pen.setColor( QColor( 255-color, 255, 0 ) );    else      pen.setColor( QColor( color-256, 511-color, 0 ) );        painter.setPen( pen );    painter.drawLine( i, 1, i, size-1 );  }    pen.setColor( Qt::black );    painter.setPen( pen );  painter.drawRect( rect );  painter.end();  pixmap.detach();  return pixmap;}void DULines::sectionResized( int column ){  if( childCount() == 0 || column != 0 )    return;      Directory * currentDir = diskUsage->getCurrentDir();    if( currentDir == 0 )    return;  int maxPercent = -1;    for( Iterator<File> it = currentDir->iterator(); it != currentDir->end(); ++it )  {    File *item = *it;          if( !item->isExcluded() && item->intPercent() > maxPercent )      maxPercent = item->intPercent();  }    DULinesItem *duItem = (DULinesItem *)firstChild();  while( duItem )  {    if( duItem->text( 0 ) != ".." )      duItem->setPixmap( 0, createPixmap( duItem->getFile()->intPercent(), maxPercent, columnWidth( 0 ) ) );    duItem = (DULinesItem *)duItem->nextSibling();  }}bool DULines::doubleClicked( QListViewItem * item ){  if( item )  {    if( item->text( 0 ) != ".." )    {      File *fileItem = ((DULinesItem *)item)->getFile();      if( fileItem->isDir() )        diskUsage->changeDirectory( dynamic_cast<Directory *> ( fileItem ) );      return true;    }    else    {      Directory *upDir = (Directory *)diskUsage->getCurrentDir()->parent();          if( upDir )        diskUsage->changeDirectory( upDir );      return true;    }  }  return false;}void DULines::contentsMouseDoubleClickEvent ( QMouseEvent * e ){  if ( e || e->button() == LeftButton )  {    QPoint vp = contentsToViewport(e->pos());    QListViewItem * item = itemAt( vp );    if( doubleClicked( item ) )      return;      }  QListView::contentsMouseDoubleClickEvent( e );}void DULines::keyPressEvent( QKeyEvent *e ){  switch ( e->key() )  {  case Key_Return :  case Key_Enter :    if( doubleClicked( currentItem() ) )      return;    break;  case Key_Left :  case Key_Right :  case Key_Up :  case Key_Down :    if( e->state() == ShiftButton )    {      e->ignore();      return;    }    break;  case Key_Delete :    e->ignore();    return;  }  QListView::keyPressEvent( e );} void DULines::slotRightClicked( QListViewItem *item ){  File * file = 0;    if ( item && item->text( 0 ) != ".." )    file = ((DULinesItem *)item)->getFile();  KPopupMenu linesPopup;      int lid = linesPopup.insertItem( i18n("Show file sizes"), this, SLOT( slotShowFileSizes() ) );  linesPopup.setItemChecked( lid, showFileSize );      diskUsage->rightClickMenu( file, &linesPopup, i18n( "Lines" ) );}void DULines::slotShowFileSizes(){  showFileSize = !showFileSize;  slotDirChanged( diskUsage->getCurrentDir() );}File * DULines::getCurrentFile(){  QListViewItem *item = currentItem();    if( item == 0 || item->text( 0 ) == ".." )    return 0;    return ((DULinesItem *)item)->getFile();}void DULines::slotChanged( File * item ){  QListViewItem *lvitem = firstChild();  while( lvitem )  {    if( lvitem->text( 0 ) != ".." ) {      DULinesItem *duItem = (DULinesItem *)( lvitem );      if( duItem->getFile() == item )      {        duItem->setVisible( !item->isExcluded() );        duItem->setText( 1, item->percent() );        if( !refreshNeeded )        {          refreshNeeded = true;          QTimer::singleShot( 0, this, SLOT( slotRefresh() ) );        }        break;      }    }    lvitem = lvitem->nextSibling();  }}void DULines::slotDeleted( File * item ){  QListViewItem *lvitem = firstChild();  while( lvitem )  {    if( lvitem->text( 0 ) != ".." ) {      DULinesItem *duItem = (DULinesItem *)( lvitem );      if( duItem->getFile() == item )      {        delete duItem;        break;      }    }    lvitem = lvitem->nextSibling();  }}#include "dulines.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -