From: <ck...@us...> - 2009-02-14 16:26:59
|
Revision: 6205 http://krusader.svn.sourceforge.net/krusader/?rev=6205&view=rev Author: ckarai Date: 2009-02-14 16:26:46 +0000 (Sat, 14 Feb 2009) Log Message: ----------- interview changes Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h trunk/krusader_kde4/krusader/Panel/krview.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 13:57:06 UTC (rev 6204) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 16:26:46 UTC (rev 6205) @@ -68,14 +68,13 @@ _nameInKConfig=QString( "KrInterView" ) + QString( ( left ? "Left" : "Right" ) ) ; KConfigGroup group( krConfig, "Private" ); - _model = new KrVfsModel; + _model = new KrVfsModel( this ); this->setModel(_model); this->setRootIsDecorated(false); } KrInterView::~KrInterView() { - _model->setProperties( 0 ); delete _properties; _properties = 0; delete _operator; @@ -272,12 +271,6 @@ } -void KrInterView::initProperties() -{ - KrView::initProperties(); - _model->setProperties( _properties ); -} - void KrInterView::initOperator() { _operator = new KrViewOperator(this, this); Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-14 13:57:06 UTC (rev 6204) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-14 16:26:46 UTC (rev 6205) @@ -37,12 +37,13 @@ virtual void sort(); virtual void updateView(); virtual void updateItem(KrViewItem* item); + virtual QModelIndex getCurrentIndex() { return currentIndex(); } + virtual bool isSelected( const QModelIndex &ndx ) { return selectionModel()->isSelected( ndx ); } static KrView* create( QWidget *parent, bool &left, KConfig *cfg ) { return new KrInterView( parent, left, cfg ); } protected: virtual void setup(); - virtual void initProperties(); virtual void initOperator(); private: Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 13:57:06 UTC (rev 6204) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 16:26:46 UTC (rev 6205) @@ -1,10 +1,16 @@ #include "krvfsmodel.h" #include "../VFS/vfs.h" #include "../VFS/vfile.h" -#include "krview.h" +#include <klocale.h> #include <QtDebug> +#include "../VFS/krpermhandler.h" +#include "../defaults.h" +#include "../krusader.h" +#include "../krusaderview.h" +#include "listpanel.h" +#include "krcolorcache.h" -KrVfsModel::KrVfsModel(): QAbstractListModel(0), _vfs(0) {} +KrVfsModel::KrVfsModel( KrView * view ): QAbstractListModel(0), _vfs(0), _extensionEnabled( true ), _view( view ) {} void KrVfsModel::setVfs(vfs* v) { @@ -38,7 +44,7 @@ int KrVfsModel::columnCount(const QModelIndex &parent) const { - return 3; + return KrVfsModel::MAX_COLUMNS; } QVariant KrVfsModel::data(const QModelIndex& index, int role) const @@ -54,12 +60,61 @@ switch( role ) { + case Qt::FontRole: + { + KConfigGroup grpSvr( krConfig, "Look&Feel" ); + return grpSvr.readEntry( "Filelist Font", *_FilelistFont ); + } case Qt::DisplayRole: { switch (index.column()) { - case 0: return vf->vfile_getName(); - case 1: return ("<ext>"); - case 2: return vf->vfile_getSize(); + case KrVfsModel::Name: + { + if( !_extensionEnabled ) + return vf->vfile_getName(); + // check if the file has an extension + const QString& vfName = vf->vfile_getName(); + int loc = vfName.lastIndexOf('.'); + if (loc>0) { // avoid mishandling of .bashrc and friend + // check if it has one of the predefined 'atomic extensions' + for (QStringList::const_iterator i = properties()->atomicExtensions.begin(); i != properties()->atomicExtensions.end(); ++i) { + if (vfName.endsWith(*i) && vfName != *i ) { + loc = vfName.length() - (*i).length(); + break; + } + } + } else + return vfName; + return vfName.left(loc); + } + case KrVfsModel::Extension: + { + if( !_extensionEnabled ) + return QVariant(); + // check if the file has an extension + const QString& vfName = vf->vfile_getName(); + int loc = vfName.lastIndexOf('.'); + if (loc>0) { // avoid mishandling of .bashrc and friend + // check if it has one of the predefined 'atomic extensions' + for (QStringList::const_iterator i = properties()->atomicExtensions.begin(); i != properties()->atomicExtensions.end(); ++i) { + if (vfName.endsWith(*i) && vfName != *i ) { + loc = vfName.length() - (*i).length(); + break; + } + } + } else + return QVariant(); + return vfName.mid(loc + 1); + } + case KrVfsModel::Size: + { + if (vf->vfile_isDir() && vf->vfile_getSize() <= 0) + return i18n("<DIR>"); + else + return ( properties()->humanReadableSize) ? + KIO::convertSize(vf->vfile_getSize())+" " : + KRpermHandler::parseSize(vf->vfile_getSize())+" "; + } default: return QString(); } return QVariant(); @@ -67,9 +122,9 @@ case Qt::DecorationRole: { switch (index.column() ) { - case 0: + case KrVfsModel::Name: { - if( _properties && _properties->displayIcons ) + if( properties()->displayIcons ) return KrView::getIcon( vf ); break; } @@ -78,6 +133,53 @@ } return QVariant(); } + case Qt::TextAlignmentRole: + { + switch (index.column() ) { + case KrVfsModel::Size: + return Qt::AlignRight; + default: + return Qt::AlignLeft; + } + return QVariant(); + } + case Qt::BackgroundRole: + case Qt::ForegroundRole: + { + KrColorItemType colorItemType; + colorItemType.m_activePanel = (_view == ACTIVE_PANEL->view); + colorItemType.m_alternateBackgroundColor = (index.row() & 1); + colorItemType.m_currentItem = _view->getCurrentIndex() == index; + colorItemType.m_selectedItem = _view->isSelected( index ); + 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; + + KrColorGroup cols; + KrColorCache::getColorCache().getColors(cols, colorItemType); + + if( colorItemType.m_selectedItem ) + { + if( role == Qt::ForegroundRole ) + return cols.highlightedText(); + else + return cols.highlight(); + } + if( role == Qt::ForegroundRole ) + return cols.text(); + else + return cols.background(); + } default: return QVariant(); } @@ -90,9 +192,9 @@ return QVariant(); switch (section) { - case 0: return "Name"; - case 1: return "Ext"; - case 2: return "Size"; + case KrVfsModel::Name: return i18n( "Name" ); + case KrVfsModel::Extension: return i18n( "Ext" ); + case KrVfsModel::Size: return i18n( "Size" ); } return QString(); } Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 13:57:06 UTC (rev 6204) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 16:26:46 UTC (rev 6205) @@ -3,16 +3,21 @@ #include <QAbstractListModel> #include <QVector> +#include "krview.h" class vfs; class vfile; class KrViewProperties; +class KrView; class KrVfsModel: public QAbstractListModel { Q_OBJECT public: - KrVfsModel(); + enum ColumnType { Name = 0x0, Extension = 0x1, Size = 0x2, Mime = 0x3, DateTime = 0x4, + Permissions = 0x5, KrPermissions = 0x6, Owner = 0x7, Group = 0x8, MAX_COLUMNS = 0x03 }; + + KrVfsModel( KrView * ); virtual ~KrVfsModel(); inline bool ready() const { return _vfs != 0; } @@ -22,12 +27,14 @@ int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - void setProperties( KrViewProperties * props ) { _properties = props; } + void setExtensionEnabled( bool exten ) { _extensionEnabled = exten; } + inline const KrViewProperties * properties() const { return _view->properties(); } protected: - vfs *_vfs; - QVector<vfile*> _vfiles; - KrViewProperties * _properties; + vfs * _vfs; + QVector<vfile*> _vfiles; + bool _extensionEnabled; + KrView * _view; }; #endif // __krvfsmodel__ Modified: trunk/krusader_kde4/krusader/Panel/krview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-14 13:57:06 UTC (rev 6204) +++ trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-14 16:26:46 UTC (rev 6205) @@ -35,6 +35,7 @@ #include <qhash.h> #include <QDropEvent> #include <QList> +#include <QModelIndex> #include "../krusader.h" #include "../VFS/vfile.h" #include "../VFS/vfs.h" @@ -48,6 +49,7 @@ class KrView; class KrViewItem; class KrQuickSearch; +class QModelIndex; typedef QList<KrViewItem*> KrViewItemList; // KrViewProperties @@ -189,6 +191,10 @@ // Every view must implement the following functions // /////////////////////////////////////////////////////// public: + // interview related functions + virtual QModelIndex getCurrentIndex() { return QModelIndex(); } + virtual bool isSelected( const QModelIndex & ) { return false; } + virtual KrViewItem *getFirst() = 0; virtual KrViewItem *getLast() = 0; virtual KrViewItem *getNext(KrViewItem *current) = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-14 20:18:59
|
Revision: 6206 http://krusader.svn.sourceforge.net/krusader/?rev=6206&view=rev Author: ckarai Date: 2009-02-14 20:18:44 +0000 (Sat, 14 Feb 2009) Log Message: ----------- InterView: sorting Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 16:26:46 UTC (rev 6205) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 20:18:44 UTC (rev 6206) @@ -71,6 +71,8 @@ _model = new KrVfsModel( this ); this->setModel(_model); this->setRootIsDecorated(false); + this->setSortingEnabled(true); + _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); } KrInterView::~KrInterView() Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 16:26:46 UTC (rev 6205) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 20:18:44 UTC (rev 6206) @@ -3,6 +3,7 @@ #include "../VFS/vfile.h" #include <klocale.h> #include <QtDebug> +#include <QtAlgorithms> #include "../VFS/krpermhandler.h" #include "../defaults.h" #include "../krusader.h" @@ -10,8 +11,61 @@ #include "listpanel.h" #include "krcolorcache.h" -KrVfsModel::KrVfsModel( KrView * view ): QAbstractListModel(0), _vfs(0), _extensionEnabled( true ), _view( view ) {} +class SortProps +{ +public: + SortProps( vfile *vf, int col, const KrViewProperties * props, bool isDummy, bool asc ) + { + _col = col; + _prop = props; + _isdummy = isDummy; + _ascending = asc; + _vfile = vf; + if( _col == KrVfsModel::Extension ) + { + if( vf->vfile_isDir() ) { + _ext = ""; + } else { + // check if the file has an extension + const QString& vfName = vf->vfile_getName(); + int loc = vfName.lastIndexOf('.'); + if (loc>0) { // avoid mishandling of .bashrc and friend + // check if it has one of the predefined 'atomic extensions' + for (QStringList::const_iterator i = props->atomicExtensions.begin(); i != props->atomicExtensions.end(); ++i) { + if (vfName.endsWith(*i) && vfName != *i ) { + loc = vfName.length() - (*i).length(); + break; + } + } + _ext = vfName.mid(loc); + } else + _ext = ""; + } + } + } + + inline int column() { return _col; } + inline const KrViewProperties * properties() { return _prop; } + inline bool isDummy() { return _isdummy; } + inline bool isAscending() { return _ascending; } + inline QString extension() { return _ext; } + inline vfile * vf() { return _vfile; } + +private: + int _col; + const KrViewProperties * _prop; + bool _isdummy; + vfile * _vfile; + bool _ascending; + QString _ext; +}; + +typedef bool(*LessThan)(SortProps *,SortProps *); + +KrVfsModel::KrVfsModel( KrView * view ): QAbstractListModel(0), _vfs(0), _extensionEnabled( true ), _view( view ), + _lastSortOrder( KrVfsModel::Name ), _lastSortDir(Qt::AscendingOrder) {} + void KrVfsModel::setVfs(vfs* v) { emit layoutAboutToBeChanged(); @@ -28,6 +82,7 @@ emit dataChanged(index(0, 0), index(_vfs->vfs_noOfFiles()-1, 0)); emit layoutChanged(); + sort(); } KrVfsModel::~KrVfsModel() @@ -70,7 +125,7 @@ switch (index.column()) { case KrVfsModel::Name: { - if( !_extensionEnabled ) + if( !_extensionEnabled || vf->vfile_isDir() ) return vf->vfile_getName(); // check if the file has an extension const QString& vfName = vf->vfile_getName(); @@ -89,7 +144,7 @@ } case KrVfsModel::Extension: { - if( !_extensionEnabled ) + if( !_extensionEnabled || vf->vfile_isDir() ) return QVariant(); // check if the file has an extension const QString& vfName = vf->vfile_getName(); @@ -185,6 +240,236 @@ } } +// compares numbers within two strings +bool compareNumbers(QString& aS1, int& aPos1, QString& aS2, int& aPos2) +{ + int res = 0; + int start1 = aPos1; + int start2 = aPos2; + while ( aPos1 < aS1.length() && aS1.at( aPos1 ).isDigit() ) aPos1++; + while ( aPos2 < aS2.length() && aS2.at( aPos2 ).isDigit() ) aPos2++; + // the left-most difference determines what's bigger + int i1 = aPos1 - 1; + int i2 = aPos2 - 1; + for ( ; i1 >= start1 || i2 >= start2; i1--, i2--) + { + int c1 = 0; + int c2 = 0; + if ( i1 >= start1 ) c1 = aS1.at( i1 ).digitValue(); + if ( i2 >= start2 ) c2 = aS2.at( i2 ).digitValue(); + if ( c1 < c2 ) res = -1; + else if ( c1 > c2 ) res = 1; + } + return res; +} + + +bool compareTextsAlphabetical(QString& aS1, QString& aS2, const KrViewProperties * _viewProperties, bool aNumbers) +{ + int lPositionS1 = 0; + int lPositionS2 = 0; + // sometimes, localeAwareCompare is not case sensitive. in that case, we need to fallback to a simple string compare (KDE bug #40131) + bool lUseLocaleAware = (_viewProperties->sortMode & KrViewProperties::IgnoreCase) + || _viewProperties->localeAwareCompareIsCaseSensitive; + int j = 0; + QChar lchar1; + QChar lchar2; + while(true) + { + lchar1 = aS1[lPositionS1]; + lchar2 = aS2[lPositionS2]; + // detect numbers + if(aNumbers && lchar1.isDigit() && lchar2.isDigit() ) + { + int j = compareNumbers(aS1, lPositionS1, aS2, lPositionS2); + if( j != 0 ) return (j == -1); + } + else + if( lUseLocaleAware + && + ( ( lchar1 >= 128 + && ( (lchar2 >= 'A' && lchar2 <= 'Z') || (lchar2 >= 'a' && lchar2 <= 'z') || lchar2 >= 128 ) ) + || + ( lchar2 >= 128 + && ( (lchar1 >= 'A' && lchar1 <= 'Z') || (lchar1 >= 'a' && lchar1 <= 'z') || lchar1 >= 128 ) ) + ) + ) + { + // use localeAwareCompare when a unicode character is encountered + j = QString::localeAwareCompare(lchar1, lchar2); + if(j != 0) return j < 0; + lPositionS1++; + lPositionS2++; + } + else + { + // if characters are latin or localeAwareCompare is not case sensitive then use simple characters compare is enough + if(lchar1 < lchar2) return true; + if(lchar1 > lchar2) return false; + lPositionS1++; + lPositionS2++; + } + // at this point strings are equal, check if ends of strings are reached + if(lPositionS1 == aS1.length() && lPositionS2 == aS2.length()) return false; + if(lPositionS1 == aS1.length() && lPositionS2 < aS2.length()) return true; + if(lPositionS1 < aS1.length() && lPositionS2 == aS2.length()) return false; + } +} + +bool compareTextsCharacterCode(QString& aS1, QString& aS2, const KrViewProperties * _viewProperties, bool aNumbers) +{ + int lPositionS1 = 0; + int lPositionS2 = 0; + while(true) + { + // detect numbers + if(aNumbers && aS1[lPositionS1].isDigit() && aS2[lPositionS2].isDigit()) + { + int j = compareNumbers(aS1, lPositionS1, aS2, lPositionS2); + if( j != 0 ) return (j == -1); + } + else + { + if(aS1[lPositionS1] < aS2[lPositionS2]) return true; + if(aS1[lPositionS1] > aS2[lPositionS2]) return false; + lPositionS1++; + lPositionS2++; + } + // at this point strings are equal, check if ends of strings are reached + if(lPositionS1 == aS1.length() && lPositionS2 == aS2.length()) return false; + if(lPositionS1 == aS1.length() && lPositionS2 < aS2.length()) return true; + if(lPositionS1 < aS1.length() && lPositionS2 == aS2.length()) return false; + } +} + +bool compareTextsKrusader(QString& aS1, QString& aS2, const KrViewProperties * _viewProperties, bool asc, bool isName) +{ + // ensure "hidden" before others + if( isName ) + { + if( aS1[0] == '.' && aS2[0] != '.' ) return asc; + if( aS1[0] != '.' && aS2[0] == '.' ) return !asc; + } + + // sometimes, localeAwareCompare is not case sensitive. in that case, we need to fallback to a simple string compare (KDE bug #40131) + bool lUseLocaleAware = (_viewProperties->sortMode & KrViewProperties::IgnoreCase) + || _viewProperties->localeAwareCompareIsCaseSensitive; + + if( lUseLocaleAware ) + return QString::localeAwareCompare(aS1, aS2) < 0; + else + // if localeAwareCompare is not case sensitive then use simple compare is enough + return QString::compare(aS1, aS2) < 0; +} + +bool compareTexts( QString aS1, QString aS2, const KrViewProperties * _viewProperties, bool asc, bool isName) +{ + //check empty strings + if( aS1.length() == 0 ) { + return false; + } else { + if( aS2.length() == 0 ) + return true; + } + + if( isName ) + { + if ( aS1 == ".." ) { + return !asc; + } else { + if ( aS2 == ".." ) + return asc; + } + } + + if( _viewProperties->sortMode & KrViewProperties::IgnoreCase ) + { + aS1 = aS1.toLower(); + aS2 = aS2.toLower(); + } + + switch(_viewProperties->sortMethod) + { + case KrViewProperties::Alphabetical: + return compareTextsAlphabetical(aS1, aS2, _viewProperties, false); + case KrViewProperties::AlphabeticalNumbers: + return compareTextsAlphabetical(aS1, aS2, _viewProperties, true); + case KrViewProperties::CharacterCode: + return compareTextsCharacterCode(aS1, aS2, _viewProperties, false); + case KrViewProperties::CharacterCodeNumbers: + return compareTextsCharacterCode(aS1, aS2, _viewProperties, true); + case KrViewProperties::Krusader: + default: + return compareTextsKrusader(aS1, aS2, _viewProperties, asc, isName); + } +} + +bool itemLessThan( SortProps *sp, SortProps *sp2 ) +{ + vfile * file1 = sp->vf(); + vfile * file2 = sp2->vf(); + bool isdir1 = file1->vfile_isDir(); + bool isdir2 = file2->vfile_isDir(); + + if( isdir1 && !isdir2 ) + return sp->isAscending(); + if( isdir2 && !isdir1 ) + return !sp->isAscending(); + + if( sp->isDummy() ) + return sp->isAscending(); + if( sp2->isDummy() ) + return !sp->isAscending(); + + bool alwaysSortDirsByName = (sp->properties()->sortMode & KrViewProperties::AlwaysSortDirsByName); + int column = sp->column(); + if( alwaysSortDirsByName ) + column = KrVfsModel::Name; + + switch( sp->column() ) + { + case KrVfsModel::Name: + return compareTexts(file1->vfile_getName(), file2->vfile_getName(), sp->properties(), sp->isAscending(), true); + case KrVfsModel::Extension: + if( sp->extension() == sp2->extension() ) + return compareTexts(file1->vfile_getName(), file2->vfile_getName(), sp->properties(), sp->isAscending(), true); + return compareTexts(sp->extension(), sp2->extension(), sp->properties(), sp->isAscending(), true); + case KrVfsModel::Size: + if( file1->vfile_getSize() == file2->vfile_getSize() ) + return compareTexts(file1->vfile_getName(), file2->vfile_getName(), sp->properties(), sp->isAscending(), true); + return file1->vfile_getSize() < file2->vfile_getSize(); + } + file1->vfile_getName() < file2->vfile_getName(); +} + +bool itemGreaterThan( SortProps *sp, SortProps *sp2 ) +{ + return !itemLessThan( sp, sp2 ); +} + +void KrVfsModel::sort ( int column, Qt::SortOrder order ) +{ + _lastSortOrder = column; + _lastSortDir = order; + emit layoutAboutToBeChanged(); + + + QVector < SortProps * > sorting (_vfiles.count()); + for (int i = 0; i < _vfiles.count(); ++i) + sorting[ i ] = new SortProps( _vfiles[ i ], column, properties(), false, order == Qt::AscendingOrder ); + + LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + qSort(sorting.begin(), sorting.end(), compare); + + _vfiles.clear(); + for (int i = 0; i < sorting.count(); ++i) { + _vfiles.append( sorting[ i ]->vf() ); + delete sorting[ i ]; + } + + emit layoutChanged(); +} + QVariant KrVfsModel::headerData(int section, Qt::Orientation orientation, int role) const { // ignore anything that's not display, and not horizontal Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 16:26:46 UTC (rev 6205) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 20:18:44 UTC (rev 6206) @@ -29,12 +29,16 @@ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; void setExtensionEnabled( bool exten ) { _extensionEnabled = exten; } inline const KrViewProperties * properties() const { return _view->properties(); } - + void sort() { sort( _lastSortOrder, _lastSortDir ); } + virtual void sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ); + protected: vfs * _vfs; QVector<vfile*> _vfiles; bool _extensionEnabled; KrView * _view; + int _lastSortOrder; + Qt::SortOrder _lastSortDir; }; #endif // __krvfsmodel__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-14 21:08:34
|
Revision: 6207 http://krusader.svn.sourceforge.net/krusader/?rev=6207&view=rev Author: ckarai Date: 2009-02-14 21:08:24 +0000 (Sat, 14 Feb 2009) Log Message: ----------- interview: minor fixes Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/CMakeLists.txt trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h trunk/krusader_kde4/krusader/Panel/krview.h Added Paths: ----------- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.h Modified: trunk/krusader_kde4/krusader/Panel/CMakeLists.txt =================================================================== --- trunk/krusader_kde4/krusader/Panel/CMakeLists.txt 2009-02-14 20:18:44 UTC (rev 6206) +++ trunk/krusader_kde4/krusader/Panel/CMakeLists.txt 2009-02-14 21:08:24 UTC (rev 6207) @@ -21,7 +21,8 @@ krbriefviewitem.cpp krvfsmodel.cpp krinterview.cpp - krviewfactory.cpp ) + krviewfactory.cpp + krmousehandler.cpp ) kde4_add_library(Panel STATIC ${Panel_SRCS} ) Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 20:18:44 UTC (rev 6206) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 21:08:24 UTC (rev 6207) @@ -4,6 +4,7 @@ #include "krvfsmodel.h" #include "../VFS/krpermhandler.h" #include "../defaults.h" +#include "krmousehandler.h" #include <klocale.h> #include <kdirlister.h> #include <QDir> @@ -73,6 +74,8 @@ this->setRootIsDecorated(false); this->setSortingEnabled(true); _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); + + _mouseHandler = new KrMouseHandler( this ); } KrInterView::~KrInterView() @@ -82,6 +85,7 @@ delete _operator; _operator = 0; delete _model; + delete _mouseHandler; } KrViewItem* KrInterView::findItemByName(const QString &name) @@ -189,6 +193,12 @@ { } +void KrInterView::clear() +{ + _model->clear(); + KrView::clear(); +} + void KrInterView::addItems(vfs* v, bool addUpDir) { _model->setVfs(v); @@ -279,3 +289,9 @@ // klistview emits selection changed, so chain them to operator connect(this, SIGNAL(selectionChanged()), _operator, SLOT(emitSelectionChanged())); } + +void KrInterView::mousePressEvent ( QMouseEvent * ev ) +{ + if( _mouseHandler->mousePressEvent( ev ) ) + QTreeView::mousePressEvent( ev ); +} Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-14 20:18:44 UTC (rev 6206) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-14 21:08:24 UTC (rev 6207) @@ -8,6 +8,8 @@ class KrVfsModel; class KrInterViewItem; +class QMouseEvent; +class KrMouseHandler; class KrInterView : public KrView, public QTreeView { @@ -15,7 +17,6 @@ KrInterView( QWidget *parent, bool &left, KConfig *cfg = krConfig ); virtual ~KrInterView(); -public: virtual void addItems(vfs* v, bool addUpDir = true); virtual KrViewItem* findItemByName(const QString &name); virtual QString getCurrentItem() const; @@ -35,6 +36,7 @@ virtual void setCurrentItem(const QString& name); virtual void setCurrentKrViewItem(KrViewItem *current); virtual void sort(); + virtual void clear(); virtual void updateView(); virtual void updateItem(KrViewItem* item); virtual QModelIndex getCurrentIndex() { return currentIndex(); } @@ -46,8 +48,11 @@ virtual void setup(); virtual void initOperator(); + virtual void mousePressEvent ( QMouseEvent * ); + private: KrVfsModel *_model; + KrMouseHandler *_mouseHandler; QVector<KrInterViewItem*> _items; }; #endif // __krinterview__ Added: trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-14 21:08:24 UTC (rev 6207) @@ -0,0 +1,26 @@ +/*************************************************************************** + krmousehandler.cpp - description + ------------------- + begin : Sat Feb 14 2009 + copyright : (C) 2009+ by Csaba Karai + email : + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "krmousehandler.h" +#include "krview.h" + +bool KrMouseHandler::mousePressEvent( QMouseEvent *e ) +{ + if( !_view->isFocused() ) + _view->op()->emitNeedFocus(); + return true; +} \ No newline at end of file Added: trunk/krusader_kde4/krusader/Panel/krmousehandler.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.h (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-14 21:08:24 UTC (rev 6207) @@ -0,0 +1,35 @@ +/*************************************************************************** + krmousehandler.h - description + ------------------- + begin : Sat Feb 14 2009 + copyright : (C) 2009+ by Csaba Karai + email : + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef __KR_MOUSE_HANDLER__ +#define __KR_MOUSE_HANDLER__ + +class QMouseEvent; +class KrView; + +class KrMouseHandler +{ +public: + KrMouseHandler( KrView * view ) : _view( view ) {} + + bool mousePressEvent( QMouseEvent *e ); + +protected: + KrView * _view; +}; + +#endif /* __KR_MOUSE_HANDLER */ \ No newline at end of file Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 20:18:44 UTC (rev 6206) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 21:08:24 UTC (rev 6207) @@ -89,6 +89,13 @@ { } +void KrVfsModel::clear() +{ + emit layoutAboutToBeChanged(); + _vfiles.clear(); + emit layoutChanged(); +} + int KrVfsModel::rowCount(const QModelIndex& parent) const { if (!_vfs) return 0; Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 20:18:44 UTC (rev 6206) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 21:08:24 UTC (rev 6207) @@ -30,6 +30,7 @@ void setExtensionEnabled( bool exten ) { _extensionEnabled = exten; } inline const KrViewProperties * properties() const { return _view->properties(); } void sort() { sort( _lastSortOrder, _lastSortDir ); } + void clear(); virtual void sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ); Modified: trunk/krusader_kde4/krusader/Panel/krview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-14 20:18:44 UTC (rev 6206) +++ trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-14 21:08:24 UTC (rev 6207) @@ -255,6 +255,7 @@ virtual QString statistics(); virtual const KrViewProperties* properties() const { return _properties; } virtual KrViewOperator* op() const { return _operator; } + virtual bool isFocused() const { return _focused; } ///////////////////////////////////////////////////////////// // the following functions have a default and minimalistic // This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-14 23:22:37
|
Revision: 6208 http://krusader.svn.sourceforge.net/krusader/?rev=6208&view=rev Author: ckarai Date: 2009-02-14 22:12:32 +0000 (Sat, 14 Feb 2009) Log Message: ----------- Added: interview, updir + filters Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 21:08:24 UTC (rev 6207) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 22:12:32 UTC (rev 6208) @@ -201,81 +201,8 @@ void KrInterView::addItems(vfs* v, bool addUpDir) { - _model->setVfs(v); + _model->setVfs(v, addUpDir); this->setCurrentIndex(_model->index(0, 0)); - -#if 0 - Q3ListViewItem * item = firstChild(); - Q3ListViewItem *currentItem = item; - QString size, name; - - // add the up-dir arrow if needed - if ( addUpDir ) { - new KrDetailedViewItem( this, ( Q3ListViewItem* ) 0L, ( vfile* ) 0L ); - } - - // text for updating the status bar - QString statusText = QString("%1/ ").arg( v->vfs_getOrigin().fileName() ) + i18n("Directory"); - - int cnt = 0; - int cl = columnSorted(); - bool as = ascendingSort(); - setSorting( -1 ); // disable sorting - - for ( vfile * vf = v->vfs_getFirstFile(); vf != 0 ; vf = v->vfs_getNextFile() ) { - size = KRpermHandler::parseSize( vf->vfile_getSize() ); - name = vf->vfile_getName(); - bool isDir = vf->vfile_isDir(); - if ( !isDir || ( isDir && ( _properties->filter & KrViewProperties::ApplyToDirs ) ) ) { - switch ( _properties->filter ) { - case KrViewProperties::All : - break; - case KrViewProperties::Custom : - if ( !_properties->filterMask.match( vf ) ) - continue; - break; - case KrViewProperties::Dirs: - if ( !vf->vfile_isDir() ) - continue; - break; - case KrViewProperties::Files: - if ( vf->vfile_isDir() ) - continue; - break; - - case KrViewProperties::ApplyToDirs : - break; // no-op, stop compiler complaints - } - } - - KrDetailedViewItem *dvitem = new KrDetailedViewItem( this, item, vf ); - _dict.insert( vf->vfile_getName(), dvitem ); - if ( isDir ) - ++_numDirs; - else - _countSize += dvitem->VF->vfile_getSize(); - ++_count; - // if the item should be current - make it so - if ( dvitem->name() == nameToMakeCurrent() ) { - currentItem = static_cast<Q3ListViewItem*>(dvitem); - statusText = dvitem->description(); - } - - cnt++; - } - - - // re-enable sorting - setSorting( cl, as ); - sort(); - - if ( !currentItem ) - currentItem = firstChild(); - K3ListView::setCurrentItem( currentItem ); - ensureItemVisible( currentItem ); - - op()->emitItemDescription( statusText ); -#endif } void KrInterView::setup() Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 21:08:24 UTC (rev 6207) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 22:12:32 UTC (rev 6208) @@ -63,24 +63,54 @@ typedef bool(*LessThan)(SortProps *,SortProps *); -KrVfsModel::KrVfsModel( KrView * view ): QAbstractListModel(0), _vfs(0), _extensionEnabled( true ), _view( view ), - _lastSortOrder( KrVfsModel::Name ), _lastSortDir(Qt::AscendingOrder) {} +KrVfsModel::KrVfsModel( KrView * view ): QAbstractListModel(0), _extensionEnabled( true ), _view( view ), + _lastSortOrder( KrVfsModel::Name ), _lastSortDir(Qt::AscendingOrder), + _dummyVfile( 0 ), _ready( false ) {} -void KrVfsModel::setVfs(vfs* v) +void KrVfsModel::setVfs(vfs* v, bool upDir) { emit layoutAboutToBeChanged(); - _vfs = v; - - vfile *vf = _vfs->vfs_getFirstFile(); + _dummyVfile = 0; + if( upDir ) { + _dummyVfile = new vfile( "..", 0, "drwxrwxrwx", 0, false, 0, 0, "", "", 0, -1); + _dummyVfile->vfile_setIcon( "go-up" ); + _vfiles.append(_dummyVfile); + } + + vfile *vf = v->vfs_getFirstFile(); while (vf) { - _vfiles.append(vf); - vf = _vfs->vfs_getNextFile(); + bool add = true; + bool isDir = vf->vfile_isDir(); + if ( !isDir || ( isDir && ( properties()->filter & KrViewProperties::ApplyToDirs ) ) ) { + switch ( properties()->filter ) { + case KrViewProperties::All : + break; + case KrViewProperties::Custom : + if ( !properties()->filterMask.match( vf ) ) + add = false; + break; + case KrViewProperties::Dirs: + if ( !isDir ) + add = false; + break; + case KrViewProperties::Files: + if ( isDir ) + add = false; + break; + default: + break; + } + } + if( add ) + _vfiles.append(vf); + vf = v->vfs_getNextFile(); } + _ready = true; // TODO: connect all addedVfile/deleteVfile and friends signals // TODO: make a more efficient implementation that this dummy one :-) - emit dataChanged(index(0, 0), index(_vfs->vfs_noOfFiles()-1, 0)); + emit dataChanged(index(0, 0), index(_vfiles.count()-1, 0)); emit layoutChanged(); sort(); } @@ -98,10 +128,7 @@ int KrVfsModel::rowCount(const QModelIndex& parent) const { - if (!_vfs) return 0; - - // simply return the number of items in the vfs - return _vfs->vfs_noOfFiles(); + return _vfiles.count(); } @@ -111,7 +138,7 @@ QVariant KrVfsModel::data(const QModelIndex& index, int role) const { - if (!index.isValid() || !_vfs) + if (!index.isValid()) return QVariant(); if (index.row() >= rowCount()) @@ -463,7 +490,7 @@ QVector < SortProps * > sorting (_vfiles.count()); for (int i = 0; i < _vfiles.count(); ++i) - sorting[ i ] = new SortProps( _vfiles[ i ], column, properties(), false, order == Qt::AscendingOrder ); + sorting[ i ] = new SortProps( _vfiles[ i ], column, properties(), _vfiles[ i ] == _dummyVfile, order == Qt::AscendingOrder ); LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); qSort(sorting.begin(), sorting.end(), compare); Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 21:08:24 UTC (rev 6207) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 22:12:32 UTC (rev 6208) @@ -20,8 +20,8 @@ KrVfsModel( KrView * ); virtual ~KrVfsModel(); - inline bool ready() const { return _vfs != 0; } - void setVfs(vfs* v); + inline bool ready() const { return _ready; } + void setVfs(vfs* v, bool upDir); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; @@ -35,11 +35,12 @@ protected: - vfs * _vfs; QVector<vfile*> _vfiles; bool _extensionEnabled; KrView * _view; int _lastSortOrder; Qt::SortOrder _lastSortDir; + vfile * _dummyVfile; + bool _ready; }; #endif // __krvfsmodel__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-15 08:32:41
|
Revision: 6209 http://krusader.svn.sourceforge.net/krusader/?rev=6209&view=rev Author: ckarai Date: 2009-02-15 08:32:26 +0000 (Sun, 15 Feb 2009) Log Message: ----------- Implemented: KrInterViewItem + keyboard handling Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-14 22:12:32 UTC (rev 6208) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-15 08:32:26 UTC (rev 6209) @@ -9,50 +9,38 @@ #include <kdirlister.h> #include <QDir> #include <QDirModel> +#include <QHashIterator> // dummy. remove this class when no longer needed class KrInterViewItem: public KrViewItem { public: - KrInterViewItem(KrInterView *parent, QModelIndex index): KrViewItem(NULL, parent->properties()), _pIndex(index) { - // create a vfile from our persistent index - _vfile = new vfile( - _pIndex.data().toString(), - 0, - "rwxrwxrwx", - 0, - false, - 0, - 0, - "", - "", - 0, - -1); - - setVfile(_vfile); + KrInterViewItem(KrInterView *parent, vfile *vf): KrViewItem(vf, parent->properties()) { + _view = parent; + if( parent->_model->dummyVfile() == vf ) + dummyVfile = true; } - - const QString& name(bool withExtension=true) const { - return _vfile->vfile_getName(); - } - //virtual inline bool hasExtension() const { return _hasExtension; } - //virtual inline const QString& extension() const { return _extension; } - //virtual QString dateTime() const; - //virtual QString description() const; + bool isSelected() const { - return false; + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + return _view->selectionModel()->isSelected( ndx ); } - void setSelected( bool s ) {} - //virtual QPixmap icon(); + void setSelected( bool s ) { + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + _view->selectionModel()->select( ndx, s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ); + } QRect itemRect() const { - return QRect(); + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + return _view->visualRect( ndx ); } - static void itemHeightChanged() {} // force the items to resize when icon/font size change + static void itemHeightChanged() + { + } // force the items to resize when icon/font size change void redraw() {} private: - QPersistentModelIndex _pIndex; vfile *_vfile; + KrInterView * _view; }; // code used to register the view @@ -86,6 +74,10 @@ _operator = 0; delete _model; delete _mouseHandler; + QHashIterator< vfile *, KrInterViewItem *> it( _itemHash ); + while( it.hasNext() ) + delete it.next().value(); + _itemHash.clear(); } KrViewItem* KrInterView::findItemByName(const QString &name) @@ -100,8 +92,11 @@ { if (!_model->ready()) return QString(); - - return currentIndex().data().toString(); + + vfile * vf = _model->vfileAt( currentIndex() ); + if( vf == 0 ) + return QString(); + return vf->vfile_getName(); } KrViewItem* KrInterView::getCurrentKrViewItem() @@ -109,7 +104,7 @@ if (!_model->ready()) return 0; - return new KrInterViewItem(this, currentIndex()); + return getKrInterViewItem( currentIndex() ); } KrViewItem* KrInterView::getFirst() @@ -117,12 +112,15 @@ if (!_model->ready()) return 0; - return new KrInterViewItem(this, _model->index(0, 0, QModelIndex())); + return getKrInterViewItem( _model->index(0, 0, QModelIndex())); } KrViewItem* KrInterView::getKrViewItemAt(const QPoint &vp) { - return 0; + if (!_model->ready()) + return 0; + + return getKrInterViewItem( indexAt( vp ) ); } KrViewItem* KrInterView::getLast() @@ -130,17 +128,25 @@ if (!_model->ready()) return 0; - return new KrInterViewItem(this, _model->index(_model->rowCount()-1, 0, QModelIndex())); + return getKrInterViewItem(_model->index(_model->rowCount()-1, 0, QModelIndex())); } KrViewItem* KrInterView::getNext(KrViewItem *current) { - return 0; + vfile* vf = (vfile *)current->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.row() >= _model->rowCount()-1 ) + return 0; + return getKrInterViewItem( _model->index(ndx.row() + 1, 0, QModelIndex())); } KrViewItem* KrInterView::getPrev(KrViewItem *current) { - return 0; + vfile* vf = (vfile *)current->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.row() <= 0 ) + return 0; + return getKrInterViewItem( _model->index(ndx.row() - 1, 0, QModelIndex())); } void KrInterView::makeItemVisible(const KrViewItem *item) @@ -149,6 +155,10 @@ void KrInterView::setCurrentKrViewItem(KrViewItem *item) { + vfile* vf = (vfile *)item->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.isValid() ) + setCurrentIndex( ndx ); } KrViewItem* KrInterView::preAddItem(vfile *vf) @@ -179,8 +189,24 @@ void KrInterView::setCurrentItem(const QString& name) { + QModelIndex ndx = _model->nameIndex( name ); + if( ndx.isValid() ) + setCurrentIndex( ndx ); } +void KrInterView::prepareForActive() { + KrView::prepareForActive(); + setFocus(); + //slotItemDescription( currentItem() ); +} + +void KrInterView::prepareForPassive() { + KrView::prepareForPassive(); + //CANCEL_TWO_CLICK_RENAME; + //if ( renameLineEdit() ->isVisible() ) + //renameLineEdit() ->clearFocus(); +} + void KrInterView::sort() { } @@ -196,13 +222,20 @@ void KrInterView::clear() { _model->clear(); + QHashIterator< vfile *, KrInterViewItem *> it( _itemHash ); + while( it.hasNext() ) + delete it.next().value(); + _itemHash.clear(); KrView::clear(); } void KrInterView::addItems(vfs* v, bool addUpDir) { _model->setVfs(v, addUpDir); + this->setCurrentIndex(_model->index(0, 0)); + if( !nameToMakeCurrent().isEmpty() ) + setCurrentItem( nameToMakeCurrent() ); } void KrInterView::setup() @@ -217,8 +250,25 @@ connect(this, SIGNAL(selectionChanged()), _operator, SLOT(emitSelectionChanged())); } +void KrInterView::keyPressEvent( QKeyEvent *e ) +{ + if ( !e || !_model->ready() ) + return ; // subclass bug + if( handleKeyEvent( e ) ) // did the view class handled the event? + return; + QTreeView::keyPressEvent( e ); +} + void KrInterView::mousePressEvent ( QMouseEvent * ev ) { if( _mouseHandler->mousePressEvent( ev ) ) QTreeView::mousePressEvent( ev ); } + +KrInterViewItem * KrInterView::getKrInterViewItem( const QModelIndex & ndx ) +{ + vfile * vf = _model->vfileAt( ndx ); + if( !_itemHash.contains( vf ) ) + _itemHash[ vf ] = new KrInterViewItem( this, vf ); + return _itemHash[ vf ]; +} Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-14 22:12:32 UTC (rev 6208) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-15 08:32:26 UTC (rev 6209) @@ -9,9 +9,11 @@ class KrVfsModel; class KrInterViewItem; class QMouseEvent; +class QKeyEvent; class KrMouseHandler; class KrInterView : public KrView, public QTreeView { + friend class KrInterViewItem; public: KrInterView( QWidget *parent, bool &left, KConfig *cfg = krConfig ); @@ -41,18 +43,23 @@ virtual void updateItem(KrViewItem* item); virtual QModelIndex getCurrentIndex() { return currentIndex(); } virtual bool isSelected( const QModelIndex &ndx ) { return selectionModel()->isSelected( ndx ); } + KrInterViewItem * getKrInterViewItem( const QModelIndex & ); static KrView* create( QWidget *parent, bool &left, KConfig *cfg ) { return new KrInterView( parent, left, cfg ); } + virtual void prepareForActive(); + virtual void prepareForPassive(); + protected: virtual void setup(); virtual void initOperator(); + virtual void keyPressEvent( QKeyEvent *e ); virtual void mousePressEvent ( QMouseEvent * ); private: KrVfsModel *_model; KrMouseHandler *_mouseHandler; - QVector<KrInterViewItem*> _items; + QHash<vfile *,KrInterViewItem*> _itemHash; }; #endif // __krinterview__ Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-14 22:12:32 UTC (rev 6208) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-15 08:32:26 UTC (rev 6209) @@ -496,8 +496,11 @@ qSort(sorting.begin(), sorting.end(), compare); _vfiles.clear(); + _vfileNdx.clear(); for (int i = 0; i < sorting.count(); ++i) { _vfiles.append( sorting[ i ]->vf() ); + _vfileNdx[ sorting[ i ]->vf() ] = index( i, 0 ); + _nameNdx[ sorting[ i ]->vf()->vfile_getName() ] = index( i, 0 ); delete sorting[ i ]; } @@ -517,3 +520,19 @@ } return QString(); } + +vfile * KrVfsModel::vfileAt( const QModelIndex &index ) +{ + return _vfiles[ index.row() ]; +} + +const QModelIndex & KrVfsModel::vfileIndex( vfile * vf ) +{ + return _vfileNdx[ vf ]; +} + +const QModelIndex & KrVfsModel::nameIndex( const QString & st ) +{ + return _nameNdx[ st ]; +} + Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-14 22:12:32 UTC (rev 6208) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-15 08:32:26 UTC (rev 6209) @@ -32,15 +32,21 @@ void sort() { sort( _lastSortOrder, _lastSortDir ); } void clear(); virtual void sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ); + vfile * vfileAt( const QModelIndex &index ); + vfile *dummyVfile() const { return _dummyVfile; } + const QModelIndex & vfileIndex( vfile * ); + const QModelIndex & nameIndex( const QString & ); protected: - QVector<vfile*> _vfiles; - bool _extensionEnabled; - KrView * _view; - int _lastSortOrder; - Qt::SortOrder _lastSortDir; - vfile * _dummyVfile; - bool _ready; + QVector<vfile*> _vfiles; + QHash<vfile *, QModelIndex> _vfileNdx; + QHash<QString, QModelIndex> _nameNdx; + bool _extensionEnabled; + KrView * _view; + int _lastSortOrder; + Qt::SortOrder _lastSortDir; + vfile * _dummyVfile; + bool _ready; }; #endif // __krvfsmodel__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-15 17:33:50
|
Revision: 6210 http://krusader.svn.sourceforge.net/krusader/?rev=6210&view=rev Author: ckarai Date: 2009-02-15 17:33:30 +0000 (Sun, 15 Feb 2009) Log Message: ----------- InterView: selection + colors + minor fixes Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-15 08:32:26 UTC (rev 6209) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-15 17:33:30 UTC (rev 6210) @@ -10,6 +10,10 @@ #include <QDir> #include <QDirModel> #include <QHashIterator> +#include <QHeaderView> +#include "../GUI/krstyleproxy.h" +#include <QItemDelegate> +#include <QPainter> // dummy. remove this class when no longer needed class KrInterViewItem: public KrViewItem @@ -17,6 +21,7 @@ public: KrInterViewItem(KrInterView *parent, vfile *vf): KrViewItem(vf, parent->properties()) { _view = parent; + _vfile = vf; if( parent->_model->dummyVfile() == vf ) dummyVfile = true; } @@ -27,7 +32,8 @@ } void setSelected( bool s ) { const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); - _view->selectionModel()->select( ndx, s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ); + _view->selectionModel()->select( ndx, ( s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) + | QItemSelectionModel::Rows ); } QRect itemRect() const { const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); @@ -43,6 +49,20 @@ KrInterView * _view; }; +class KrInterViewItemDelegate : public QItemDelegate +{ +public: + KrInterViewItemDelegate( QObject *parent = 0 ) : QItemDelegate( parent ) {} + + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const + { + QStyleOptionViewItemV4 opt = option; + opt.state &= ~QStyle::State_Selected; + QItemDelegate::paint( painter, opt, index ); + } +}; + + // code used to register the view #define INTERVIEW_ID 2 KrViewInstance interView( INTERVIEW_ID, i18n( "&Experimental View" ), 0 /*Qt::ALT + Qt::SHIFT + Qt::Key_D*/, @@ -61,9 +81,16 @@ this->setModel(_model); this->setRootIsDecorated(false); this->setSortingEnabled(true); + this->sortByColumn( KrVfsModel::Name, Qt::AscendingOrder ); _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); + connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); _mouseHandler = new KrMouseHandler( this ); + setSelectionMode( QAbstractItemView::NoSelection ); + setAllColumnsShowFocus( true ); + + setStyle( new KrStyleProxy() ); + setItemDelegate( new KrInterViewItemDelegate() ); } KrInterView::~KrInterView() @@ -85,7 +112,10 @@ if (!_model->ready()) return 0; - return 0; // TODO + QModelIndex ndx = _model->nameIndex( name ); + if( !ndx.isValid() ) + return 0; + return getKrInterViewItem( ndx ); } QString KrInterView::getCurrentItem() const @@ -149,8 +179,17 @@ return getKrInterViewItem( _model->index(ndx.row() - 1, 0, QModelIndex())); } +void KrInterView::slotMakeCurrentVisible() +{ + scrollTo( currentIndex() ); +} + void KrInterView::makeItemVisible(const KrViewItem *item) { + vfile* vf = (vfile *)item->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.isValid() ) + scrollTo( ndx ); } void KrInterView::setCurrentKrViewItem(KrViewItem *item) @@ -207,8 +246,28 @@ //renameLineEdit() ->clearFocus(); } +int KrInterView::itemsPerPage() { + QRect rect = visualRect( currentIndex() ); + if( !rect.isValid() ) + { + for( int i=0; i != _model->rowCount(); i++ ) + { + rect = visualRect( _model->index( i, 0 ) ); + if( rect.isValid() ) + break; + } + } + if( !rect.isValid() ) + return 0; + int size = (height() - header()->height() ) / rect.height(); + if( size < 0 ) + size = 0; + return size; +} + void KrInterView::sort() { + _model->sort(); } void KrInterView::updateView() @@ -247,7 +306,7 @@ { _operator = new KrViewOperator(this, this); // klistview emits selection changed, so chain them to operator - connect(this, SIGNAL(selectionChanged()), _operator, SLOT(emitSelectionChanged())); + connect(selectionModel(), SIGNAL(selectionChanged( const QItemSelection &, const QItemSelection &)), _operator, SLOT(emitSelectionChanged())); } void KrInterView::keyPressEvent( QKeyEvent *e ) Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-15 08:32:26 UTC (rev 6209) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-15 17:33:30 UTC (rev 6210) @@ -12,8 +12,9 @@ class QKeyEvent; class KrMouseHandler; -class KrInterView : public KrView, public QTreeView { +class KrInterView : public QTreeView, public KrView { friend class KrInterViewItem; + Q_OBJECT public: KrInterView( QWidget *parent, bool &left, KConfig *cfg = krConfig ); @@ -49,7 +50,11 @@ virtual void prepareForActive(); virtual void prepareForPassive(); + virtual int itemsPerPage(); +protected slots: + void slotMakeCurrentVisible(); + protected: virtual void setup(); virtual void initOperator(); Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-15 08:32:26 UTC (rev 6209) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-15 17:33:30 UTC (rev 6210) @@ -15,13 +15,14 @@ class SortProps { public: - SortProps( vfile *vf, int col, const KrViewProperties * props, bool isDummy, bool asc ) + SortProps( vfile *vf, int col, const KrViewProperties * props, bool isDummy, bool asc, int origNdx ) { _col = col; _prop = props; _isdummy = isDummy; _ascending = asc; _vfile = vf; + _index = origNdx; if( _col == KrVfsModel::Extension ) { if( vf->vfile_isDir() ) { @@ -51,6 +52,7 @@ inline bool isAscending() { return _ascending; } inline QString extension() { return _ext; } inline vfile * vf() { return _vfile; } + inline int originalIndex() { return _index; } private: int _col; @@ -59,6 +61,7 @@ vfile * _vfile; bool _ascending; QString _ext; + int _index; }; typedef bool(*LessThan)(SortProps *,SortProps *); @@ -487,23 +490,33 @@ _lastSortDir = order; emit layoutAboutToBeChanged(); + QModelIndexList oldPersistentList = persistentIndexList(); QVector < SortProps * > sorting (_vfiles.count()); for (int i = 0; i < _vfiles.count(); ++i) - sorting[ i ] = new SortProps( _vfiles[ i ], column, properties(), _vfiles[ i ] == _dummyVfile, order == Qt::AscendingOrder ); + sorting[ i ] = new SortProps( _vfiles[ i ], column, properties(), _vfiles[ i ] == _dummyVfile, order == Qt::AscendingOrder, i ); LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); qSort(sorting.begin(), sorting.end(), compare); _vfiles.clear(); _vfileNdx.clear(); + + QHash<int, int> changeMap; for (int i = 0; i < sorting.count(); ++i) { _vfiles.append( sorting[ i ]->vf() ); + changeMap[ sorting[ i ]->originalIndex() ] = i; _vfileNdx[ sorting[ i ]->vf() ] = index( i, 0 ); _nameNdx[ sorting[ i ]->vf()->vfile_getName() ] = index( i, 0 ); delete sorting[ i ]; } + QModelIndexList newPersistentList; + foreach( QModelIndex mndx, oldPersistentList ) + newPersistentList << index( changeMap[ mndx.row() ], mndx.column() ); + + changePersistentIndexList(oldPersistentList, newPersistentList); + emit layoutChanged(); } @@ -536,3 +549,20 @@ return _nameNdx[ st ]; } +Qt::ItemFlags KrVfsModel::flags ( const QModelIndex & index ) const +{ + Qt::ItemFlags flags = QAbstractListModel::flags( index ); + + if (!index.isValid()) + return flags; + + if (index.row() >= rowCount()) + return flags; + vfile *vf = _vfiles.at(index.row()); + if( vf == _dummyVfile ) + { + flags = flags & (~Qt::ItemIsSelectable); + } + return flags; +} + Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-15 08:32:26 UTC (rev 6209) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-15 17:33:30 UTC (rev 6210) @@ -36,8 +36,8 @@ vfile *dummyVfile() const { return _dummyVfile; } const QModelIndex & vfileIndex( vfile * ); const QModelIndex & nameIndex( const QString & ); + virtual Qt::ItemFlags flags ( const QModelIndex & index ) const; - protected: QVector<vfile*> _vfiles; QHash<vfile *, QModelIndex> _vfileNdx; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-16 22:28:16
|
Revision: 6212 http://krusader.svn.sourceforge.net/krusader/?rev=6212&view=rev Author: ckarai Date: 2009-02-16 22:24:31 +0000 (Mon, 16 Feb 2009) Log Message: ----------- InterView: minor fixes Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.h trunk/krusader_kde4/krusader/Panel/krview.cpp trunk/krusader_kde4/krusader/Panel/krview.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-15 18:05:40 UTC (rev 6211) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-16 22:24:31 UTC (rev 6212) @@ -91,6 +91,7 @@ setStyle( new KrStyleProxy() ); setItemDelegate( new KrInterViewItemDelegate() ); + setMouseTracking( true ); } KrInterView::~KrInterView() @@ -321,12 +322,38 @@ void KrInterView::mousePressEvent ( QMouseEvent * ev ) { - if( _mouseHandler->mousePressEvent( ev ) ) + if( !_mouseHandler->mousePressEvent( ev ) ) QTreeView::mousePressEvent( ev ); } +void KrInterView::mouseReleaseEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mouseReleaseEvent( ev ) ) + QTreeView::mouseReleaseEvent( ev ); +} + +void KrInterView::mouseDoubleClickEvent ( QMouseEvent *ev ) +{ + if( !_mouseHandler->mouseDoubleClickEvent( ev ) ) + QTreeView::mouseDoubleClickEvent( ev ); +} + +void KrInterView::mouseMoveEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mouseMoveEvent( ev ) ) + QTreeView::mouseMoveEvent( ev ); +} + +void KrInterView::wheelEvent ( QWheelEvent *ev ) +{ + if( !_mouseHandler->wheelEvent( ev ) ) + QTreeView::wheelEvent( ev ); +} + KrInterViewItem * KrInterView::getKrInterViewItem( const QModelIndex & ndx ) { + if( !ndx.isValid() ) + return 0; vfile * vf = _model->vfileAt( ndx ); if( !_itemHash.contains( vf ) ) _itemHash[ vf ] = new KrInterViewItem( this, vf ); Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-15 18:05:40 UTC (rev 6211) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-16 22:24:31 UTC (rev 6212) @@ -50,6 +50,7 @@ virtual void prepareForActive(); virtual void prepareForPassive(); + virtual bool ensureVisibilityAfterSelect() { return false; } virtual int itemsPerPage(); protected slots: @@ -61,6 +62,10 @@ virtual void keyPressEvent( QKeyEvent *e ); virtual void mousePressEvent ( QMouseEvent * ); + virtual void mouseReleaseEvent ( QMouseEvent * ); + virtual void mouseDoubleClickEvent ( QMouseEvent *ev ); + virtual void mouseMoveEvent ( QMouseEvent * ); + virtual void wheelEvent ( QWheelEvent * ); private: KrVfsModel *_model; Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-15 18:05:40 UTC (rev 6211) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-16 22:24:31 UTC (rev 6212) @@ -17,10 +17,117 @@ #include "krmousehandler.h" #include "krview.h" +#include "krviewitem.h" +#include "krselectionmode.h" +#include "../krusader.h" +#include "../defaults.h" +KrMouseHandler::KrMouseHandler( KrView * view ) : _view( view ) { + KConfigGroup grpSvr( krConfig, "Look&Feel" ); + // decide on single click/double click selection + _singleClick = grpSvr.readEntry( "Single Click Selects", _SingleClickSelects ) && KGlobalSettings::singleClick(); +} + bool KrMouseHandler::mousePressEvent( QMouseEvent *e ) { + KrViewItem * item = _view->getKrViewItemAt( e->pos() ); if( !_view->isFocused() ) _view->op()->emitNeedFocus(); - return true; -} \ No newline at end of file + if (e->button() == Qt::LeftButton) + { + KrViewItem * oldCurrent = _view->getCurrentKrViewItem(); + //dragStartPos = e->pos(); + if( e->modifiers() == Qt::NoModifier ) + { + if( item ) + { + if( KrSelectionMode::getSelectionHandler()->leftButtonSelects() ) + { + if( KrSelectionMode::getSelectionHandler()->leftButtonPreservesSelection() ) + item->setSelected(!item->isSelected()); + else { + // clear the current selection + _view->changeSelection( KRQuery( "*" ), false, true); + item->setSelected( true ); + } + } + _view->setCurrentKrViewItem( item ); + } + e->accept(); + return true; + // KrSelectionMode::getSelectionHandler()->shiftCtrlLeftButtonSelects() + } + } + return false; +} + +bool KrMouseHandler::mouseReleaseEvent( QMouseEvent *e ) +{ + KrViewItem * item = _view->getKrViewItemAt( e->pos() ); + + if( _singleClick && e->button() == Qt::LeftButton ) + { + e->accept(); + if( item == 0 ) + return true; + QString tmp = item->name(); + _view->op()->emitExecuted(tmp); + return true; + } + if ( e->button() == Qt::MidButton && item != 0 ) + { + e->accept(); + if( item == 0 ) + return true; + _view->op()->emitMiddleButtonClicked( item ); + return true; + } + return false; +} + +bool KrMouseHandler::mouseDoubleClickEvent( QMouseEvent *e ) +{ + KrViewItem * i = _view->getKrViewItemAt( e->pos() ); + if( _singleClick ) + return false; + if( e->button() == Qt::LeftButton ) + { + e->accept(); + QString tmp = i->name(); + _view->op()->emitExecuted(tmp); + return true; + } + return false; +} + +bool KrMouseHandler::mouseMoveEvent( QMouseEvent *e ) +{ + return false; +} + +bool KrMouseHandler::wheelEvent ( QWheelEvent * ) +{ + if( !_view->isFocused() ) + _view->op()->emitNeedFocus(); + return false; +} + +void KrMouseHandler::handleContextMenu( KrViewItem * it, const QPoint & pos ) { + if ( !_view->isFocused() ) + _view->op()->emitNeedFocus(); + if ( !it ) + return; + if( it->isDummy() ) + return; + int i = KrSelectionMode::getSelectionHandler()->showContextMenu(); + _contextMenuPoint = QPoint( pos.x(), pos.y() /*TODO: - header() ->height() */ ); + if (i < 0) { + _view->setCurrentKrViewItem( it ); + _view->op()->emitContextMenu( _contextMenuPoint ); + } + else if (i > 0) { + contextMenuTimer.setSingleShot( true ); + contextMenuTimer.start(i); + } +} + Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-15 18:05:40 UTC (rev 6211) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-16 22:24:31 UTC (rev 6212) @@ -18,18 +18,33 @@ #ifndef __KR_MOUSE_HANDLER__ #define __KR_MOUSE_HANDLER__ +#include <QPoint> +#include <QTimer> + class QMouseEvent; +class QWheelEvent; class KrView; +class KrViewItem; -class KrMouseHandler +class KrMouseHandler : QObject { + Q_OBJECT + public: - KrMouseHandler( KrView * view ) : _view( view ) {} + KrMouseHandler( KrView * view ); bool mousePressEvent( QMouseEvent *e ); + bool mouseReleaseEvent( QMouseEvent *e ); + bool mouseDoubleClickEvent( QMouseEvent *e ); + bool mouseMoveEvent ( QMouseEvent *e ); + bool wheelEvent ( QWheelEvent * ); + void handleContextMenu( KrViewItem * it, const QPoint & pos ); protected: KrView * _view; + bool _singleClick; + QPoint _contextMenuPoint; + QTimer contextMenuTimer; }; -#endif /* __KR_MOUSE_HANDLER */ \ No newline at end of file +#endif /* __KR_MOUSE_HANDLER */ Modified: trunk/krusader_kde4/krusader/Panel/krview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krview.cpp 2009-02-15 18:05:40 UTC (rev 6211) +++ trunk/krusader_kde4/krusader/Panel/krview.cpp 2009-02-16 22:24:31 UTC (rev 6212) @@ -378,7 +378,8 @@ if( op() ) op()->setMassSelectionUpdate( false ); updateView(); - makeItemVisible( temp ); + if( ensureVisibilityAfterSelect() ) + makeItemVisible( temp ); } void KrView::invertSelection() @@ -402,7 +403,8 @@ } if( op() ) op()->setMassSelectionUpdate( false ); updateView(); - makeItemVisible( temp ); + if( ensureVisibilityAfterSelect() ) + makeItemVisible( temp ); } QString KrView::firstUnmarkedBelowCurrent() Modified: trunk/krusader_kde4/krusader/Panel/krview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-15 18:05:40 UTC (rev 6211) +++ trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-16 22:24:31 UTC (rev 6212) @@ -194,6 +194,7 @@ // interview related functions virtual QModelIndex getCurrentIndex() { return QModelIndex(); } virtual bool isSelected( const QModelIndex & ) { return false; } + virtual bool ensureVisibilityAfterSelect() { return true; } virtual KrViewItem *getFirst() = 0; virtual KrViewItem *getLast() = 0; @@ -256,6 +257,7 @@ virtual const KrViewProperties* properties() const { return _properties; } virtual KrViewOperator* op() const { return _operator; } virtual bool isFocused() const { return _focused; } + void changeSelection(const KRQuery& filter, bool select, bool includeDirs = false); ///////////////////////////////////////////////////////////// // the following functions have a default and minimalistic // @@ -276,7 +278,6 @@ protected: KrView(KConfig *cfg = krConfig); - void changeSelection(const KRQuery& filter, bool select, bool includeDirs = false); bool handleKeyEventInt (QKeyEvent *e); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-17 21:23:27
|
Revision: 6213 http://krusader.svn.sourceforge.net/krusader/?rev=6213&view=rev Author: ckarai Date: 2009-02-17 21:23:14 +0000 (Tue, 17 Feb 2009) Log Message: ----------- InterView: mouse handling Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krbriefview.h trunk/krusader_kde4/krusader/Panel/krdetailedview.h trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.h trunk/krusader_kde4/krusader/Panel/krview.h Modified: trunk/krusader_kde4/krusader/Panel/krbriefview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krbriefview.h 2009-02-16 22:24:31 UTC (rev 6212) +++ trunk/krusader_kde4/krusader/Panel/krbriefview.h 2009-02-17 21:23:14 UTC (rev 6213) @@ -92,6 +92,7 @@ virtual QString nameInKConfig() {return _nameInKConfig;} virtual void redraw() { ((QWidget *)parent())->show(); header->show(); viewport()->show(); show(); } virtual int itemsPerPage(); + virtual void selectRegion( KrViewItem *, KrViewItem *, bool ) {} // not used static KrView* create( QWidget *parent, bool &left, KConfig *cfg ); Modified: trunk/krusader_kde4/krusader/Panel/krdetailedview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krdetailedview.h 2009-02-16 22:24:31 UTC (rev 6212) +++ trunk/krusader_kde4/krusader/Panel/krdetailedview.h 2009-02-17 21:23:14 UTC (rev 6213) @@ -109,8 +109,8 @@ virtual inline void restoreSettings() { K3ListView::restoreLayout( _config, nameInKConfig() ); } virtual void redraw() { viewport()->show(); header()->show(); show(); } virtual int itemsPerPage(); + virtual void selectRegion( KrViewItem *, KrViewItem *, bool ) {} // not used - static KrView* create( QWidget *parent, bool &left, KConfig *cfg ) { return new KrDetailedView( parent, left, cfg ); } protected: Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-16 22:24:31 UTC (rev 6212) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-17 21:23:14 UTC (rev 6213) @@ -85,7 +85,9 @@ _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); - _mouseHandler = new KrMouseHandler( this ); + // fix the context menu problem + int j = QFontMetrics( font() ).height() * 2; + _mouseHandler = new KrMouseHandler( this, j ); setSelectionMode( QAbstractItemView::NoSelection ); setAllColumnsShowFocus( true ); @@ -359,3 +361,34 @@ _itemHash[ vf ] = new KrInterViewItem( this, vf ); return _itemHash[ vf ]; } + +void KrInterView::selectRegion( KrViewItem *i1, KrViewItem *i2, bool select) +{ + vfile* vf1 = (vfile *)i1->getVfile(); + QModelIndex mi1 = _model->vfileIndex( vf1 ); + vfile* vf2 = (vfile *)i2->getVfile(); + QModelIndex mi2 = _model->vfileIndex( vf2 ); + + if( mi1.isValid() && mi2.isValid() ) + { + int r1 = mi1.row(); + int r2 = mi2.row(); + + if( r1 > r2 ) { + int t = r1; + r1 = r2; + r2 = t; + } + + for( int row = r1; row <= r2; row++ ) + { + const QModelIndex & ndx = _model->index( row, 0 ); + selectionModel()->select( ndx, ( select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) + | QItemSelectionModel::Rows ); + } + } + else if( mi1.isValid() && !mi2.isValid() ) + i1->setSelected( select ); + else if( mi2.isValid() && !mi1.isValid() ) + i2->setSelected( select ); +} Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-16 22:24:31 UTC (rev 6212) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-17 21:23:14 UTC (rev 6213) @@ -44,6 +44,7 @@ virtual void updateItem(KrViewItem* item); virtual QModelIndex getCurrentIndex() { return currentIndex(); } virtual bool isSelected( const QModelIndex &ndx ) { return selectionModel()->isSelected( ndx ); } + virtual void selectRegion( KrViewItem *, KrViewItem *, bool ); KrInterViewItem * getKrInterViewItem( const QModelIndex & ); static KrView* create( QWidget *parent, bool &left, KConfig *cfg ) { return new KrInterView( parent, left, cfg ); } Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-16 22:24:31 UTC (rev 6212) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-17 21:23:14 UTC (rev 6213) @@ -22,10 +22,13 @@ #include "../krusader.h" #include "../defaults.h" -KrMouseHandler::KrMouseHandler( KrView * view ) : _view( view ) { +KrMouseHandler::KrMouseHandler( KrView * view, int contextMenuShift ) : _view( view ), _rightClickedItem( 0 ), + _contextMenuShift( contextMenuShift ) +{ KConfigGroup grpSvr( krConfig, "Look&Feel" ); // decide on single click/double click selection _singleClick = grpSvr.readEntry( "Single Click Selects", _SingleClickSelects ) && KGlobalSettings::singleClick(); + connect( &_contextMenuTimer, SIGNAL (timeout()), this, SLOT (showContextMenu())); } bool KrMouseHandler::mousePressEvent( QMouseEvent *e ) @@ -55,9 +58,90 @@ } e->accept(); return true; - // KrSelectionMode::getSelectionHandler()->shiftCtrlLeftButtonSelects() } + else if( e->modifiers() == Qt::ControlModifier ) + { + if( item && (KrSelectionMode::getSelectionHandler()->shiftCtrlLeftButtonSelects() || + KrSelectionMode::getSelectionHandler()->leftButtonSelects() ) ) + { + item->setSelected(!item->isSelected()); + } + if( item ) + _view->setCurrentKrViewItem( item ); + e->accept(); + return true; + } + else if( e->modifiers() == Qt::ShiftModifier ) + { + if( item && (KrSelectionMode::getSelectionHandler()->shiftCtrlLeftButtonSelects() || + KrSelectionMode::getSelectionHandler()->leftButtonSelects() ) ) + { + KrViewItem * current = _view->getCurrentKrViewItem(); + if( current != 0 ) + _view->selectRegion( item, current, true ); + } + if( item ) + _view->setCurrentKrViewItem( item ); + e->accept(); + return true; + } } + if (e->button() == Qt::RightButton) + { + KrViewItem * oldCurrent = _view->getCurrentKrViewItem(); + //dragStartPos = e->pos(); + if( e->modifiers() == Qt::NoModifier ) + { + if( item ) + { + if( KrSelectionMode::getSelectionHandler()->rightButtonSelects() ) + { + if( KrSelectionMode::getSelectionHandler()->rightButtonPreservesSelection() ) { + if (KrSelectionMode::getSelectionHandler()->showContextMenu() >= 0) + { + _rightClickSelects = !item->isSelected(); + _rightClickedItem = item; + } + item->setSelected(!item->isSelected()); + } else { + // clear the current selection + _view->changeSelection( KRQuery( "*" ), false, true); + item->setSelected( true ); + } + } + _view->setCurrentKrViewItem( item ); + handleContextMenu( item, e->globalPos() ); + } + e->accept(); + return true; + } + else if( e->modifiers() == Qt::ControlModifier ) + { + if( item && (KrSelectionMode::getSelectionHandler()->shiftCtrlRightButtonSelects() || + KrSelectionMode::getSelectionHandler()->rightButtonSelects() ) ) + { + item->setSelected(!item->isSelected()); + } + if( item ) + _view->setCurrentKrViewItem( item ); + e->accept(); + return true; + } + else if( e->modifiers() == Qt::ShiftModifier ) + { + if( item && (KrSelectionMode::getSelectionHandler()->shiftCtrlRightButtonSelects() || + KrSelectionMode::getSelectionHandler()->rightButtonSelects() ) ) + { + KrViewItem * current = _view->getCurrentKrViewItem(); + if( current != 0 ) + _view->selectRegion( item, current, true ); + } + if( item ) + _view->setCurrentKrViewItem( item ); + e->accept(); + return true; + } + } return false; } @@ -65,6 +149,10 @@ { KrViewItem * item = _view->getKrViewItemAt( e->pos() ); + if( e->button() == Qt::RightButton ) { + _rightClickedItem = 0; + _contextMenuTimer.stop(); + } if( _singleClick && e->button() == Qt::LeftButton ) { e->accept(); @@ -87,13 +175,13 @@ bool KrMouseHandler::mouseDoubleClickEvent( QMouseEvent *e ) { - KrViewItem * i = _view->getKrViewItemAt( e->pos() ); + KrViewItem * item = _view->getKrViewItemAt( e->pos() ); if( _singleClick ) return false; - if( e->button() == Qt::LeftButton ) + if( e->button() == Qt::LeftButton && item != 0 ) { e->accept(); - QString tmp = i->name(); + QString tmp = item->name(); _view->op()->emitExecuted(tmp); return true; } @@ -102,6 +190,26 @@ bool KrMouseHandler::mouseMoveEvent( QMouseEvent *e ) { + KrViewItem * item = _view->getKrViewItemAt( e->pos() ); + if ( !item ) + return false; + QString desc = item->description(); + _view->op()->emitItemDescription(desc); + + if (KrSelectionMode::getSelectionHandler()->rightButtonPreservesSelection() + && KrSelectionMode::getSelectionHandler()->rightButtonSelects() + && KrSelectionMode::getSelectionHandler()->showContextMenu() >= 0 && e->buttons() == Qt::RightButton) + { + e->accept(); + if (item != _rightClickedItem && item && _rightClickedItem) + { + _view->selectRegion( item, _rightClickedItem, _rightClickSelects ); + _rightClickedItem = item; + _view->setCurrentKrViewItem( item ); + _contextMenuTimer.stop(); + } + return true; + } return false; } @@ -112,6 +220,13 @@ return false; } +void KrMouseHandler::showContextMenu() +{ + if (_rightClickedItem) + _rightClickedItem->setSelected(true); + _view->op()->emitContextMenu( _contextMenuPoint ); +} + void KrMouseHandler::handleContextMenu( KrViewItem * it, const QPoint & pos ) { if ( !_view->isFocused() ) _view->op()->emitNeedFocus(); @@ -120,14 +235,14 @@ if( it->isDummy() ) return; int i = KrSelectionMode::getSelectionHandler()->showContextMenu(); - _contextMenuPoint = QPoint( pos.x(), pos.y() /*TODO: - header() ->height() */ ); + _contextMenuPoint = QPoint( pos.x(), pos.y() - _contextMenuShift ); if (i < 0) { _view->setCurrentKrViewItem( it ); _view->op()->emitContextMenu( _contextMenuPoint ); } else if (i > 0) { - contextMenuTimer.setSingleShot( true ); - contextMenuTimer.start(i); + _contextMenuTimer.setSingleShot( true ); + _contextMenuTimer.start(i); } } Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-16 22:24:31 UTC (rev 6212) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-17 21:23:14 UTC (rev 6213) @@ -31,7 +31,7 @@ Q_OBJECT public: - KrMouseHandler( KrView * view ); + KrMouseHandler( KrView * view, int contextMenuShift ); bool mousePressEvent( QMouseEvent *e ); bool mouseReleaseEvent( QMouseEvent *e ); @@ -40,11 +40,17 @@ bool wheelEvent ( QWheelEvent * ); void handleContextMenu( KrViewItem * it, const QPoint & pos ); +public slots: + void showContextMenu(); + protected: - KrView * _view; - bool _singleClick; - QPoint _contextMenuPoint; - QTimer contextMenuTimer; + KrView * _view; + KrViewItem * _rightClickedItem; + bool _rightClickSelects; + bool _singleClick; + QPoint _contextMenuPoint; + QTimer _contextMenuTimer; + int _contextMenuShift; }; #endif /* __KR_MOUSE_HANDLER */ Modified: trunk/krusader_kde4/krusader/Panel/krview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-16 22:24:31 UTC (rev 6212) +++ trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-17 21:23:14 UTC (rev 6213) @@ -195,6 +195,7 @@ virtual QModelIndex getCurrentIndex() { return QModelIndex(); } virtual bool isSelected( const QModelIndex & ) { return false; } virtual bool ensureVisibilityAfterSelect() { return true; } + virtual void selectRegion( KrViewItem *, KrViewItem *, bool ) = 0; virtual KrViewItem *getFirst() = 0; virtual KrViewItem *getLast() = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-19 20:50:45
|
Revision: 6214 http://krusader.svn.sourceforge.net/krusader/?rev=6214&view=rev Author: ckarai Date: 2009-02-19 20:50:30 +0000 (Thu, 19 Feb 2009) Log Message: ----------- InterView: inplace rename Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-17 21:23:14 UTC (rev 6213) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-19 20:50:30 UTC (rev 6214) @@ -14,6 +14,8 @@ #include "../GUI/krstyleproxy.h" #include <QItemDelegate> #include <QPainter> +#include <QLineEdit> +#include <QDialog> // dummy. remove this class when no longer needed class KrInterViewItem: public KrViewItem @@ -51,15 +53,111 @@ class KrInterViewItemDelegate : public QItemDelegate { +private: + mutable int _currentlyEdited; + mutable bool _dontDraw; + public: - KrInterViewItemDelegate( QObject *parent = 0 ) : QItemDelegate( parent ) {} + KrInterViewItemDelegate( QObject *parent = 0 ) : QItemDelegate( parent ), _currentlyEdited( -1 ) {} void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItemV4 opt = option; opt.state &= ~QStyle::State_Selected; + _dontDraw = ( _currentlyEdited == index.row() ) && (index.column() == KrVfsModel::Extension ); QItemDelegate::paint( painter, opt, index ); } + + void drawDisplay ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QString & text ) const + { + if( !_dontDraw ) + QItemDelegate::drawDisplay( painter, option, rect, text ); + } + + QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &sovi, const QModelIndex &index) const + { + _currentlyEdited = index.row(); + return QItemDelegate::createEditor( parent, sovi, index ); + } + + void setEditorData(QWidget *editor, const QModelIndex &index) const + { + QItemDelegate::setEditorData( editor, index ); + if( editor->inherits( "QLineEdit" ) ) + { + QLineEdit *lineEdit = qobject_cast<QLineEdit *> ( editor ); + if( lineEdit ) { + QString nameWithoutExt = index.data( Qt::UserRole ).toString(); + lineEdit->deselect(); + lineEdit->setSelection( 0, nameWithoutExt.length() ); + } + } + } + + bool eventFilter(QObject *object, QEvent *event) + { + QWidget *editor = qobject_cast<QWidget*>(object); + if (!editor) + return false; + if (event->type() == QEvent::KeyPress) + { + switch (static_cast<QKeyEvent *>(event)->key()) { + case Qt::Key_Tab: + case Qt::Key_Backtab: + _currentlyEdited = -1; + emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); + return true; + case Qt::Key_Enter: + case Qt::Key_Return: + if (QLineEdit *e = qobject_cast<QLineEdit*>(editor)) + { + if (!e->hasAcceptableInput()) + return true; + event->accept(); + emit commitData(editor); + emit closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); + _currentlyEdited = -1; + return true; + } + return false; + case Qt::Key_Escape: + event->accept(); + // don't commit data + _currentlyEdited = -1; + emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); + break; + default: + return false; + } + + if (editor->parentWidget()) + editor->parentWidget()->setFocus(); + return true; + } else if (event->type() == QEvent::FocusOut) { + if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) { + QWidget *w = QApplication::focusWidget(); + while (w) { // don't worry about focus changes internally in the editor + if (w == editor) + return false; + w = w->parentWidget(); + } + // Opening a modal dialog will start a new eventloop + // that will process the deleteLater event. + if (QApplication::activeModalWidget() + && !QApplication::activeModalWidget()->isAncestorOf(editor) + && qobject_cast<QDialog*>(QApplication::activeModalWidget())) + return false; + _currentlyEdited = -1; + emit closeEditor(editor, RevertModelCache); + } + } else if (event->type() == QEvent::ShortcutOverride) { + if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) { + event->accept(); + return true; + } + } + return false; + } }; @@ -73,6 +171,10 @@ KrView(cfg), QTreeView(parent) { + // fix the context menu problem + int j = QFontMetrics( font() ).height() * 2; + _mouseHandler = new KrMouseHandler( this, j ); + connect( _mouseHandler, SIGNAL( renameCurrentItem() ), this, SLOT( renameCurrentItem() ) ); setWidget( this ); _nameInKConfig=QString( "KrInterView" ) + QString( ( left ? "Left" : "Right" ) ) ; KConfigGroup group( krConfig, "Private" ); @@ -85,9 +187,6 @@ _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); - // fix the context menu problem - int j = QFontMetrics( font() ).height() * 2; - _mouseHandler = new KrMouseHandler( this, j ); setSelectionMode( QAbstractItemView::NoSelection ); setAllColumnsShowFocus( true ); @@ -199,8 +298,10 @@ { vfile* vf = (vfile *)item->getVfile(); QModelIndex ndx = _model->vfileIndex( vf ); - if( ndx.isValid() ) + if( ndx.isValid() && ndx.row() != currentIndex().row() ) { + _mouseHandler->cancelTwoClickRename(); setCurrentIndex( ndx ); + } } KrViewItem* KrInterView::preAddItem(vfile *vf) @@ -239,12 +340,16 @@ void KrInterView::prepareForActive() { KrView::prepareForActive(); setFocus(); - //slotItemDescription( currentItem() ); + KrViewItem * current = getCurrentKrViewItem(); + if( current != 0 ) { + QString desc = current->description(); + op()->emitItemDescription( desc ); + } } void KrInterView::prepareForPassive() { KrView::prepareForPassive(); - //CANCEL_TWO_CLICK_RENAME; + _mouseHandler->cancelTwoClickRename(); //if ( renameLineEdit() ->isVisible() ) //renameLineEdit() ->clearFocus(); } @@ -352,11 +457,19 @@ QTreeView::wheelEvent( ev ); } +bool KrInterView::event( QEvent * e ) +{ + _mouseHandler->otherEvent( e ); + return QTreeView::event( e ); +} + KrInterViewItem * KrInterView::getKrInterViewItem( const QModelIndex & ndx ) { if( !ndx.isValid() ) return 0; vfile * vf = _model->vfileAt( ndx ); + if( vf == 0 ) + return 0; if( !_itemHash.contains( vf ) ) _itemHash[ vf ] = new KrInterViewItem( this, vf ); return _itemHash[ vf ]; @@ -392,3 +505,11 @@ else if( mi2.isValid() && !mi1.isValid() ) i2->setSelected( select ); } + +void KrInterView::renameCurrentItem() { + QModelIndex cIndex = currentIndex(); + QModelIndex nameIndex = _model->index( cIndex.row(), KrVfsModel::Name ); + edit( nameIndex ); + updateEditorData(); + update( nameIndex ); +} Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-17 21:23:14 UTC (rev 6213) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-19 20:50:30 UTC (rev 6214) @@ -56,6 +56,7 @@ protected slots: void slotMakeCurrentVisible(); + virtual void renameCurrentItem(); protected: virtual void setup(); @@ -67,6 +68,7 @@ virtual void mouseDoubleClickEvent ( QMouseEvent *ev ); virtual void mouseMoveEvent ( QMouseEvent * ); virtual void wheelEvent ( QWheelEvent * ); + virtual bool event( QEvent * e ); private: KrVfsModel *_model; Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-17 21:23:14 UTC (rev 6213) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-19 20:50:30 UTC (rev 6214) @@ -22,13 +22,16 @@ #include "../krusader.h" #include "../defaults.h" +#define CANCEL_TWO_CLICK_RENAME {_singleClicked = false;_renameTimer.stop();} + KrMouseHandler::KrMouseHandler( KrView * view, int contextMenuShift ) : _view( view ), _rightClickedItem( 0 ), - _contextMenuShift( contextMenuShift ) + _contextMenuTimer(), _contextMenuShift( contextMenuShift ), _singleClicked( false ), _singleClickTime(), _renameTimer() { KConfigGroup grpSvr( krConfig, "Look&Feel" ); // decide on single click/double click selection _singleClick = grpSvr.readEntry( "Single Click Selects", _SingleClickSelects ) && KGlobalSettings::singleClick(); connect( &_contextMenuTimer, SIGNAL (timeout()), this, SLOT (showContextMenu())); + connect( &_renameTimer, SIGNAL( timeout() ), this, SIGNAL( renameCurrentItem() ) ); } bool KrMouseHandler::mousePressEvent( QMouseEvent *e ) @@ -38,7 +41,6 @@ _view->op()->emitNeedFocus(); if (e->button() == Qt::LeftButton) { - KrViewItem * oldCurrent = _view->getCurrentKrViewItem(); //dragStartPos = e->pos(); if( e->modifiers() == Qt::NoModifier ) { @@ -88,7 +90,6 @@ } if (e->button() == Qt::RightButton) { - KrViewItem * oldCurrent = _view->getCurrentKrViewItem(); //dragStartPos = e->pos(); if( e->modifiers() == Qt::NoModifier ) { @@ -155,13 +156,43 @@ } if( _singleClick && e->button() == Qt::LeftButton ) { + CANCEL_TWO_CLICK_RENAME; e->accept(); if( item == 0 ) return true; QString tmp = item->name(); _view->op()->emitExecuted(tmp); return true; + } else if( !_singleClick && e->button() == Qt::LeftButton ) + { + if( item && e->modifiers() == Qt::NoModifier ) + { + if ( _singleClicked && !_renameTimer.isActive() && _singleClickedItem == item ) { + KSharedConfigPtr config = KGlobal::config(); + KConfigGroup group( krConfig, "KDE" ); + int doubleClickInterval = group.readEntry( "DoubleClickInterval", 400 ); + + int msecsFromLastClick = _singleClickTime.msecsTo( QTime::currentTime() ); + + if ( msecsFromLastClick > doubleClickInterval && msecsFromLastClick < 5 * doubleClickInterval ) { + _singleClicked = false; + _renameTimer.setSingleShot( true ); + _renameTimer.start( doubleClickInterval ); + return true; + } + } + + CANCEL_TWO_CLICK_RENAME; + _singleClicked = true; + _singleClickedItem = item; + _singleClickTime = QTime::currentTime(); + + return true; + } } + + CANCEL_TWO_CLICK_RENAME; + if ( e->button() == Qt::MidButton && item != 0 ) { e->accept(); @@ -175,6 +206,8 @@ bool KrMouseHandler::mouseDoubleClickEvent( QMouseEvent *e ) { + CANCEL_TWO_CLICK_RENAME; + KrViewItem * item = _view->getKrViewItemAt( e->pos() ); if( _singleClick ) return false; @@ -191,6 +224,9 @@ bool KrMouseHandler::mouseMoveEvent( QMouseEvent *e ) { KrViewItem * item = _view->getKrViewItemAt( e->pos() ); + if ( ( _singleClicked || _renameTimer.isActive() ) && item != _singleClickedItem ) + CANCEL_TWO_CLICK_RENAME; + if ( !item ) return false; QString desc = item->description(); @@ -246,3 +282,19 @@ } } +void KrMouseHandler::otherEvent( QEvent * e ) { + switch ( e->type() ) { + case QEvent::Timer: + case QEvent::MouseMove: + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + break; + default: + CANCEL_TWO_CLICK_RENAME; + } +} + +void KrMouseHandler::cancelTwoClickRename() +{ + CANCEL_TWO_CLICK_RENAME; +} Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-17 21:23:14 UTC (rev 6213) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-19 20:50:30 UTC (rev 6214) @@ -20,13 +20,14 @@ #include <QPoint> #include <QTimer> +#include <QTime> class QMouseEvent; class QWheelEvent; class KrView; class KrViewItem; -class KrMouseHandler : QObject +class KrMouseHandler : public QObject { Q_OBJECT @@ -39,10 +40,15 @@ bool mouseMoveEvent ( QMouseEvent *e ); bool wheelEvent ( QWheelEvent * ); void handleContextMenu( KrViewItem * it, const QPoint & pos ); + void otherEvent( QEvent * e ); + void cancelTwoClickRename(); public slots: void showContextMenu(); +signals: + void renameCurrentItem(); + protected: KrView * _view; KrViewItem * _rightClickedItem; @@ -51,6 +57,10 @@ QPoint _contextMenuPoint; QTimer _contextMenuTimer; int _contextMenuShift; + bool _singleClicked; + KrViewItem * _singleClickedItem; + QTime _singleClickTime; + QTimer _renameTimer; }; #endif /* __KR_MOUSE_HANDLER */ Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-17 21:23:14 UTC (rev 6213) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-19 20:50:30 UTC (rev 6214) @@ -157,46 +157,34 @@ KConfigGroup grpSvr( krConfig, "Look&Feel" ); return grpSvr.readEntry( "Filelist Font", *_FilelistFont ); } + case Qt::EditRole: + { + if( index.column() == 0 ) + { + return vf->vfile_getName(); + } + return QVariant(); + } + case Qt::UserRole: + { + if( index.column() == 0 ) + { + return nameWithoutExtension( vf, false ); + } + return QVariant(); + } case Qt::DisplayRole: { switch (index.column()) { case KrVfsModel::Name: { - if( !_extensionEnabled || vf->vfile_isDir() ) - return vf->vfile_getName(); - // check if the file has an extension - const QString& vfName = vf->vfile_getName(); - int loc = vfName.lastIndexOf('.'); - if (loc>0) { // avoid mishandling of .bashrc and friend - // check if it has one of the predefined 'atomic extensions' - for (QStringList::const_iterator i = properties()->atomicExtensions.begin(); i != properties()->atomicExtensions.end(); ++i) { - if (vfName.endsWith(*i) && vfName != *i ) { - loc = vfName.length() - (*i).length(); - break; - } - } - } else - return vfName; - return vfName.left(loc); + return nameWithoutExtension( vf ); } case KrVfsModel::Extension: { - if( !_extensionEnabled || vf->vfile_isDir() ) - return QVariant(); - // check if the file has an extension + QString nameOnly = nameWithoutExtension( vf ); const QString& vfName = vf->vfile_getName(); - int loc = vfName.lastIndexOf('.'); - if (loc>0) { // avoid mishandling of .bashrc and friend - // check if it has one of the predefined 'atomic extensions' - for (QStringList::const_iterator i = properties()->atomicExtensions.begin(); i != properties()->atomicExtensions.end(); ++i) { - if (vfName.endsWith(*i) && vfName != *i ) { - loc = vfName.length() - (*i).length(); - break; - } - } - } else - return QVariant(); - return vfName.mid(loc + 1); + return vfName.mid(nameOnly.length() + 1); } case KrVfsModel::Size: { @@ -277,6 +265,21 @@ } } +bool KrVfsModel::setData ( const QModelIndex & index, const QVariant & value, int role ) +{ + if( role == Qt::EditRole && index.isValid() ) + { + if (index.row() < rowCount() && index.row() > 0 ) + { + vfile *vf = _vfiles.at(index.row()); + if( vf == 0 ) + return false; + _view->op()->emitRenameItem( vf->vfile_getName(), value.toString() ); + } + } + return QAbstractListModel::setData( index, value, role ); +} + // compares numbers within two strings bool compareNumbers(QString& aS1, int& aPos1, QString& aS2, int& aPos2) { @@ -536,6 +539,8 @@ vfile * KrVfsModel::vfileAt( const QModelIndex &index ) { + if( index.row() < 0 || index.row() >= _vfiles.count() ) + return 0; return _vfiles[ index.row() ]; } @@ -562,7 +567,27 @@ if( vf == _dummyVfile ) { flags = flags & (~Qt::ItemIsSelectable); - } + } else + flags = flags | Qt::ItemIsEditable; return flags; } +QString KrVfsModel::nameWithoutExtension( const vfile * vf, bool checkEnabled ) const +{ + if( (checkEnabled && !_extensionEnabled ) || vf->vfile_isDir() ) + return vf->vfile_getName(); + // check if the file has an extension + const QString& vfName = vf->vfile_getName(); + int loc = vfName.lastIndexOf('.'); + if (loc>0) { // avoid mishandling of .bashrc and friend + // check if it has one of the predefined 'atomic extensions' + for (QStringList::const_iterator i = properties()->atomicExtensions.begin(); i != properties()->atomicExtensions.end(); ++i) { + if (vfName.endsWith(*i) && vfName != *i ) { + loc = vfName.length() - (*i).length(); + break; + } + } + } else + return vfName; + return vfName.left(loc); +} Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-17 21:23:14 UTC (rev 6213) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-19 20:50:30 UTC (rev 6214) @@ -26,6 +26,7 @@ int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; + bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; void setExtensionEnabled( bool exten ) { _extensionEnabled = exten; } inline const KrViewProperties * properties() const { return _view->properties(); } @@ -39,6 +40,8 @@ virtual Qt::ItemFlags flags ( const QModelIndex & index ) const; protected: + QString nameWithoutExtension( const vfile * vf, bool checkEnabled = true ) const; + QVector<vfile*> _vfiles; QHash<vfile *, QModelIndex> _vfileNdx; QHash<QString, QModelIndex> _nameNdx; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-19 23:27:24
|
Revision: 6215 http://krusader.svn.sourceforge.net/krusader/?rev=6215&view=rev Author: ckarai Date: 2009-02-19 22:42:21 +0000 (Thu, 19 Feb 2009) Log Message: ----------- InterView: add/delete/update file events Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-19 20:50:30 UTC (rev 6214) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-19 22:42:21 UTC (rev 6215) @@ -306,12 +306,18 @@ KrViewItem* KrInterView::preAddItem(vfile *vf) { - return 0; + return getKrInterViewItem( _model->addItem( vf ) ); } bool KrInterView::preDelItem(KrViewItem *item) { - return false; + if( item == 0 ) + return true; + QModelIndex ndx = _model->removeItem( (vfile *)item->getVfile() ); + if( ndx.isValid() ) + setCurrentIndex( ndx ); + _itemHash.remove( (vfile *)item->getVfile() ); + return true; } void KrInterView::redraw() @@ -384,6 +390,9 @@ void KrInterView::updateItem(KrViewItem* item) { + if( item == 0 ) + return; + _model->updateItem( (vfile *)item->getVfile() ); } void KrInterView::clear() @@ -470,8 +479,11 @@ vfile * vf = _model->vfileAt( ndx ); if( vf == 0 ) return 0; - if( !_itemHash.contains( vf ) ) - _itemHash[ vf ] = new KrInterViewItem( this, vf ); + if( !_itemHash.contains( vf ) ) { + KrInterViewItem * newItem = new KrInterViewItem( this, vf ); + _itemHash[ vf ] = newItem; + _dict.insert( vf->vfile_getName(), newItem ); + } return _itemHash[ vf ]; } Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-19 20:50:30 UTC (rev 6214) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-19 22:42:21 UTC (rev 6215) @@ -523,6 +523,115 @@ emit layoutChanged(); } +QModelIndex KrVfsModel::addItem( vfile * vf ) +{ + bool isDir = vf->vfile_isDir(); + if ( !isDir || ( isDir && ( properties()->filter & KrViewProperties::ApplyToDirs ) ) ) { + switch ( properties()->filter ) { + case KrViewProperties::All : + break; + case KrViewProperties::Custom : + if ( !properties()->filterMask.match( vf ) ) + return QModelIndex(); + break; + case KrViewProperties::Dirs: + if ( !isDir ) + return QModelIndex(); + break; + case KrViewProperties::Files: + if ( isDir ) + return QModelIndex(); + break; + default: + break; + } + } + emit layoutAboutToBeChanged(); + + QModelIndexList oldPersistentList = persistentIndexList(); + + SortProps insSort( vf, _lastSortOrder, properties(), vf == _dummyVfile, _lastSortDir == Qt::AscendingOrder, -1 ); + + QVector < SortProps * > sorting (_vfiles.count()); + for (int i = 0; i < _vfiles.count(); ++i) + sorting[ i ] = new SortProps( _vfiles[ i ], _lastSortOrder, properties(), _vfiles[ i ] == _dummyVfile, _lastSortDir == Qt::AscendingOrder, i ); + + LessThan compare = (_lastSortDir == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); + QVector<SortProps *>::iterator it = qLowerBound(sorting.begin(), sorting.end(), &insSort, compare); + + int insertIndex = _vfiles.count(); + if( it != sorting.end() ) { + insertIndex = (*it)->originalIndex(); + _vfiles.insert( insertIndex, vf ); + } else + _vfiles.append( vf ); + + for (int di = 0; di != sorting.count(); di++ ) + delete sorting[ di ]; + + for (int i = insertIndex; i < _vfiles.count(); ++i) { + _vfileNdx[ _vfiles[ i ] ] = index( i, 0 ); + _nameNdx[ _vfiles[ i ]->vfile_getName() ] = index( i, 0 ); + } + + QModelIndexList newPersistentList; + foreach( QModelIndex mndx, oldPersistentList ) { + int newRow = mndx.row(); + if( newRow >= insertIndex ) + newRow++; + newPersistentList << index( newRow, mndx.column() ); + } + + changePersistentIndexList(oldPersistentList, newPersistentList); + emit layoutChanged(); + + return index( insertIndex, 0 ); +} + +QModelIndex KrVfsModel::removeItem( vfile * vf ) +{ + for( int i=0; i != _vfiles.count(); i++ ) + { + if( _vfiles[ i ] == vf ) + { + emit layoutAboutToBeChanged(); + QModelIndexList oldPersistentList = persistentIndexList(); + QModelIndexList newPersistentList; + + _vfiles.remove( i ); + + for (int ri = i; ri < _vfiles.count(); ++ri) { + _vfileNdx[ _vfiles[ ri ] ] = index( ri, 0 ); + _nameNdx[ _vfiles[ ri ]->vfile_getName() ] = index( ri, 0 ); + } + + foreach( QModelIndex mndx, oldPersistentList ) { + int newRow = mndx.row(); + if( newRow > i ) + newRow--; + if( newRow != i ) + newPersistentList << index( newRow, mndx.column() ); + else + newPersistentList << QModelIndex(); + } + changePersistentIndexList(oldPersistentList, newPersistentList); + emit layoutChanged(); + if( _vfiles.count() == 0 ) + return QModelIndex(); + if( i >= _vfiles.count() ) + i = _vfiles.count() - 1; + return index( i, 0 ); + } + } + return QModelIndex(); +} + +void KrVfsModel::updateItem( vfile * vf ) +{ + // TODO: make it faster + sort(); +} + QVariant KrVfsModel::headerData(int section, Qt::Orientation orientation, int role) const { // ignore anything that's not display, and not horizontal Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-19 20:50:30 UTC (rev 6214) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-19 22:42:21 UTC (rev 6215) @@ -22,6 +22,9 @@ inline bool ready() const { return _ready; } void setVfs(vfs* v, bool upDir); + QModelIndex addItem( vfile * ); + QModelIndex removeItem( vfile * ); + void updateItem( vfile * ); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-21 07:39:31
|
Revision: 6216 http://krusader.svn.sourceforge.net/krusader/?rev=6216&view=rev Author: ckarai Date: 2009-02-21 07:39:16 +0000 (Sat, 21 Feb 2009) Log Message: ----------- InterView: drag & drop Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-19 22:42:21 UTC (rev 6215) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 07:39:16 UTC (rev 6216) @@ -193,6 +193,8 @@ setStyle( new KrStyleProxy() ); setItemDelegate( new KrInterViewItemDelegate() ); setMouseTracking( true ); + setAcceptDrops( true ); + setDropIndicatorShown( true ); } KrInterView::~KrInterView() @@ -466,6 +468,30 @@ QTreeView::wheelEvent( ev ); } +void KrInterView::dragEnterEvent ( QDragEnterEvent *ev ) +{ + if( !_mouseHandler->dragEnterEvent( ev ) ) + QTreeView::dragEnterEvent( ev ); +} + +void KrInterView::dragMoveEvent ( QDragMoveEvent *ev ) +{ + QTreeView::dragMoveEvent( ev ); + _mouseHandler->dragMoveEvent( ev ); +} + +void KrInterView::dragLeaveEvent ( QDragLeaveEvent *ev ) +{ + if( !_mouseHandler->dragLeaveEvent( ev ) ) + QTreeView::dragLeaveEvent( ev ); +} + +void KrInterView::dropEvent ( QDropEvent *ev ) +{ + if( !_mouseHandler->dropEvent( ev ) ) + QTreeView::dropEvent( ev ); +} + bool KrInterView::event( QEvent * e ) { _mouseHandler->otherEvent( e ); Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-19 22:42:21 UTC (rev 6215) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-21 07:39:16 UTC (rev 6216) @@ -10,6 +10,7 @@ class KrInterViewItem; class QMouseEvent; class QKeyEvent; +class QDragEnterEvent; class KrMouseHandler; class KrInterView : public QTreeView, public KrView { @@ -69,6 +70,10 @@ virtual void mouseMoveEvent ( QMouseEvent * ); virtual void wheelEvent ( QWheelEvent * ); virtual bool event( QEvent * e ); + virtual void dragEnterEvent(QDragEnterEvent *e); + virtual void dragMoveEvent(QDragMoveEvent *e); + virtual void dragLeaveEvent(QDragLeaveEvent *e); + virtual void dropEvent ( QDropEvent * ); private: KrVfsModel *_model; Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-19 22:42:21 UTC (rev 6215) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-21 07:39:16 UTC (rev 6216) @@ -25,7 +25,8 @@ #define CANCEL_TWO_CLICK_RENAME {_singleClicked = false;_renameTimer.stop();} KrMouseHandler::KrMouseHandler( KrView * view, int contextMenuShift ) : _view( view ), _rightClickedItem( 0 ), - _contextMenuTimer(), _contextMenuShift( contextMenuShift ), _singleClicked( false ), _singleClickTime(), _renameTimer() + _contextMenuTimer(), _contextMenuShift( contextMenuShift ), _singleClicked( false ), _singleClickTime(), + _renameTimer(), _dragStartPos( -1, -1 ) { KConfigGroup grpSvr( krConfig, "Look&Feel" ); // decide on single click/double click selection @@ -41,7 +42,7 @@ _view->op()->emitNeedFocus(); if (e->button() == Qt::LeftButton) { - //dragStartPos = e->pos(); + _dragStartPos = e->pos(); if( e->modifiers() == Qt::NoModifier ) { if( item ) @@ -148,6 +149,8 @@ bool KrMouseHandler::mouseReleaseEvent( QMouseEvent *e ) { + if( e->button() == Qt::LeftButton ) + _dragStartPos = QPoint( -1, -1 ); KrViewItem * item = _view->getKrViewItemAt( e->pos() ); if( e->button() == Qt::RightButton ) { @@ -227,6 +230,12 @@ if ( ( _singleClicked || _renameTimer.isActive() ) && item != _singleClickedItem ) CANCEL_TWO_CLICK_RENAME; + if ( _dragStartPos != QPoint( -1, -1 ) && + ( e->buttons() & Qt::LeftButton ) && ( _dragStartPos - e->pos() ).manhattanLength() > QApplication::startDragDistance() ) + { + _view->op()->startDrag(); + } + if ( !item ) return false; QString desc = item->description(); @@ -298,3 +307,28 @@ { CANCEL_TWO_CLICK_RENAME; } + +bool KrMouseHandler::dragEnterEvent(QDragEnterEvent *e) +{ + KUrl::List URLs = KUrl::List::fromMimeData( e->mimeData() ); + e->setAccepted( !URLs.isEmpty() ); + return true; +} + +bool KrMouseHandler::dragMoveEvent(QDragMoveEvent *e) +{ + KUrl::List URLs = KUrl::List::fromMimeData( e->mimeData() ); + e->setAccepted( !URLs.isEmpty() ); + return true; +} + +bool KrMouseHandler::dragLeaveEvent(QDragLeaveEvent *e) +{ + return false; +} + +bool KrMouseHandler::dropEvent ( QDropEvent *e ) +{ + _view->op()->emitGotDrop( e ); + return true; +} Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-19 22:42:21 UTC (rev 6215) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-21 07:39:16 UTC (rev 6216) @@ -26,6 +26,10 @@ class QWheelEvent; class KrView; class KrViewItem; +class QDragEnterEvent; +class QDragMoveEvent; +class QDragLeaveEvent; +class QDropEvent; class KrMouseHandler : public QObject { @@ -39,6 +43,10 @@ bool mouseDoubleClickEvent( QMouseEvent *e ); bool mouseMoveEvent ( QMouseEvent *e ); bool wheelEvent ( QWheelEvent * ); + bool dragEnterEvent(QDragEnterEvent *e); + bool dragMoveEvent(QDragMoveEvent *e); + bool dragLeaveEvent(QDragLeaveEvent *e); + bool dropEvent ( QDropEvent *e ); void handleContextMenu( KrViewItem * it, const QPoint & pos ); void otherEvent( QEvent * e ); void cancelTwoClickRename(); @@ -61,6 +69,7 @@ KrViewItem * _singleClickedItem; QTime _singleClickTime; QTimer _renameTimer; + QPoint _dragStartPos; }; #endif /* __KR_MOUSE_HANDLER */ Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-19 22:42:21 UTC (rev 6215) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 07:39:16 UTC (rev 6216) @@ -675,9 +675,9 @@ vfile *vf = _vfiles.at(index.row()); if( vf == _dummyVfile ) { - flags = flags & (~Qt::ItemIsSelectable); + flags = (flags & (~Qt::ItemIsSelectable)) | Qt::ItemIsDropEnabled; } else - flags = flags | Qt::ItemIsEditable; + flags = flags | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; return flags; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-21 11:07:54
|
Revision: 6218 http://krusader.svn.sourceforge.net/krusader/?rev=6218&view=rev Author: ckarai Date: 2009-02-21 11:07:49 +0000 (Sat, 21 Feb 2009) Log Message: ----------- InterView: missing columns Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 08:10:23 UTC (rev 6217) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 11:07:49 UTC (rev 6218) @@ -411,6 +411,9 @@ void KrInterView::addItems(vfs* v, bool addUpDir) { _model->setVfs(v, addUpDir); + _count = _model->rowCount(); + if( addUpDir ) + _count--; this->setCurrentIndex(_model->index(0, 0)); if( !nameToMakeCurrent().isEmpty() ) Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 08:10:23 UTC (rev 6217) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 11:07:49 UTC (rev 6218) @@ -11,6 +11,7 @@ #include "listpanel.h" #include "krcolorcache.h" +#define PERM_BITMASK (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) class SortProps { @@ -23,8 +24,11 @@ _ascending = asc; _vfile = vf; _index = origNdx; - if( _col == KrVfsModel::Extension ) + + switch( _col ) { + case KrVfsModel::Extension: + { if( vf->vfile_isDir() ) { _ext = ""; } else { @@ -43,7 +47,61 @@ } else _ext = ""; } + break; } + case KrVfsModel::Mime: + { + if( isDummy ) + _data = ""; + else + { + KMimeType::Ptr mt = KMimeType::mimeType(vf->vfile_getMime()); + if( mt ) + _data = mt->comment(); + } + break; + } + case KrVfsModel::Permissions: + { + if( isDummy ) + _data = ""; + else + { + if (properties()->numericPermissions) { + QString perm; + _data = perm.sprintf("%.4o", vf->vfile_getMode() & PERM_BITMASK); + } else + _data = vf->vfile_getPerm(); + } + break; + } + case KrVfsModel::KrPermissions: + { + if( isDummy ) + _data = ""; + else + { + _data = KrVfsModel::krPermissionString( vf ); + } + break; + } + case KrVfsModel::Owner: + { + if( isDummy ) + _data = ""; + else + _data = vf->vfile_getOwner(); + } + case KrVfsModel::Group: + { + if( isDummy ) + _data = ""; + else + _data = vf->vfile_getGroup(); + } + default: + break; + } } inline int column() { return _col; } @@ -53,7 +111,8 @@ inline QString extension() { return _ext; } inline vfile * vf() { return _vfile; } inline int originalIndex() { return _index; } - + inline QString data() { return _data; } + private: int _col; const KrViewProperties * _prop; @@ -62,6 +121,7 @@ bool _ascending; QString _ext; int _index; + QString _data; }; typedef bool(*LessThan)(SortProps *,SortProps *); @@ -195,6 +255,53 @@ KIO::convertSize(vf->vfile_getSize())+" " : KRpermHandler::parseSize(vf->vfile_getSize())+" "; } + case KrVfsModel::Mime: + { + if( vf == _dummyVfile ) + return QVariant(); + KMimeType::Ptr mt = KMimeType::mimeType(vf->vfile_getMime()); + if( mt ) + return mt->comment(); + return QVariant(); + } + case KrVfsModel::DateTime: + { + if( vf == _dummyVfile ) + return QVariant(); + time_t time = vf->vfile_getTime_t(); + struct tm* t=localtime((time_t *)&time); + + QDateTime tmp(QDate(t->tm_year+1900, t->tm_mon+1, t->tm_mday), QTime(t->tm_hour, t->tm_min)); + return KGlobal::locale()->formatDateTime(tmp); + } + case KrVfsModel::Permissions: + { + if( vf == _dummyVfile ) + return QVariant(); + if (properties()->numericPermissions) { + QString perm; + return perm.sprintf("%.4o", vf->vfile_getMode() & PERM_BITMASK); + } + return vf->vfile_getPerm(); + } + case KrVfsModel::KrPermissions: + { + if( vf == _dummyVfile ) + return QVariant(); + return krPermissionString( vf ); + } + case KrVfsModel::Owner: + { + if( vf == _dummyVfile ) + return QVariant(); + return vf->vfile_getOwner(); + } + case KrVfsModel::Group: + { + if( vf == _dummyVfile ) + return QVariant(); + return vf->vfile_getGroup(); + } default: return QString(); } return QVariant(); @@ -322,7 +429,7 @@ if(aNumbers && lchar1.isDigit() && lchar2.isDigit() ) { int j = compareNumbers(aS1, lPositionS1, aS2, lPositionS2); - if( j != 0 ) return (j == -1); + if( j != 0 ) return j < 0; } else if( lUseLocaleAware @@ -366,7 +473,7 @@ if(aNumbers && aS1[lPositionS1].isDigit() && aS2[lPositionS2].isDigit()) { int j = compareNumbers(aS1, lPositionS1, aS2, lPositionS2); - if( j != 0 ) return (j == -1); + if( j != 0 ) return j < 0; } else { @@ -478,6 +585,18 @@ if( file1->vfile_getSize() == file2->vfile_getSize() ) return compareTexts(file1->vfile_getName(), file2->vfile_getName(), sp->properties(), sp->isAscending(), true); return file1->vfile_getSize() < file2->vfile_getSize(); + case KrVfsModel::DateTime: + if( file1->vfile_getTime_t() == file2->vfile_getTime_t() ) + return compareTexts(file1->vfile_getName(), file2->vfile_getName(), sp->properties(), sp->isAscending(), true); + return file1->vfile_getTime_t() < file2->vfile_getTime_t(); + case KrVfsModel::Mime: + case KrVfsModel::Permissions: + case KrVfsModel::KrPermissions: + case KrVfsModel::Owner: + case KrVfsModel::Group: + if( sp->data() == sp2->data() ) + return compareTexts(file1->vfile_getName(), file2->vfile_getName(), sp->properties(), sp->isAscending(), true); + return compareTexts( sp->data(), sp2->data(), sp->properties(), sp->isAscending(), true ); } file1->vfile_getName() < file2->vfile_getName(); } @@ -642,6 +761,12 @@ case KrVfsModel::Name: return i18n( "Name" ); case KrVfsModel::Extension: return i18n( "Ext" ); case KrVfsModel::Size: return i18n( "Size" ); + case KrVfsModel::Mime: return i18n( "Type" ); + case KrVfsModel::DateTime: return i18n( "Modified" ); + case KrVfsModel::Permissions: return i18n( "Perms" ); + case KrVfsModel::KrPermissions: return i18n( "rwx" ); + case KrVfsModel::Owner: return i18n( "Owner" ); + case KrVfsModel::Group: return i18n( "Group" ); } return QString(); } @@ -700,3 +825,24 @@ return vfName; return vfName.left(loc); } + +QString KrVfsModel::krPermissionString( const vfile * vf ) +{ + QString tmp; + switch ( vf->vfile_isReadable() ){ + case ALLOWED_PERM: tmp+='r'; break; + case UNKNOWN_PERM: tmp+='?'; break; + case NO_PERM: tmp+='-'; break; + } + switch ( vf->vfile_isWriteable()){ + case ALLOWED_PERM: tmp+='w'; break; + case UNKNOWN_PERM: tmp+='?'; break; + case NO_PERM: tmp+='-'; break; + } + switch ( vf->vfile_isExecutable()){ + case ALLOWED_PERM: tmp+='x'; break; + case UNKNOWN_PERM: tmp+='?'; break; + case NO_PERM: tmp+='-'; break; + } + return tmp; +} \ No newline at end of file Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-21 08:10:23 UTC (rev 6217) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-21 11:07:49 UTC (rev 6218) @@ -15,7 +15,7 @@ public: enum ColumnType { Name = 0x0, Extension = 0x1, Size = 0x2, Mime = 0x3, DateTime = 0x4, - Permissions = 0x5, KrPermissions = 0x6, Owner = 0x7, Group = 0x8, MAX_COLUMNS = 0x03 }; + Permissions = 0x5, KrPermissions = 0x6, Owner = 0x7, Group = 0x8, MAX_COLUMNS = 0x09 }; KrVfsModel( KrView * ); virtual ~KrVfsModel(); @@ -41,6 +41,7 @@ const QModelIndex & vfileIndex( vfile * ); const QModelIndex & nameIndex( const QString & ); virtual Qt::ItemFlags flags ( const QModelIndex & index ) const; + static QString krPermissionString( const vfile * vf ); protected: QString nameWithoutExtension( const vfile * vf, bool checkEnabled = true ) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-21 14:03:28
|
Revision: 6219 http://krusader.svn.sourceforge.net/krusader/?rev=6219&view=rev Author: ckarai Date: 2009-02-21 14:03:16 +0000 (Sat, 21 Feb 2009) Log Message: ----------- InterView: performance fixes I. Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 11:07:49 UTC (rev 6218) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 14:03:16 UTC (rev 6219) @@ -508,12 +508,14 @@ vfile * vf = _model->vfileAt( ndx ); if( vf == 0 ) return 0; - if( !_itemHash.contains( vf ) ) { + QHash<vfile *,KrInterViewItem*>::iterator it = _itemHash.find( vf ); + if( it == _itemHash.end() ) { KrInterViewItem * newItem = new KrInterViewItem( this, vf ); _itemHash[ vf ] = newItem; _dict.insert( vf->vfile_getName(), newItem ); + return newItem; } - return _itemHash[ vf ]; + return *it; } void KrInterView::selectRegion( KrViewItem *i1, KrViewItem *i2, bool select) Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 11:07:49 UTC (rev 6218) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 14:03:16 UTC (rev 6219) @@ -132,8 +132,6 @@ void KrVfsModel::setVfs(vfs* v, bool upDir) { - emit layoutAboutToBeChanged(); - _dummyVfile = 0; if( upDir ) { _dummyVfile = new vfile( "..", 0, "drwxrwxrwx", 0, false, 0, 0, "", "", 0, -1); @@ -173,8 +171,6 @@ // TODO: connect all addedVfile/deleteVfile and friends signals // TODO: make a more efficient implementation that this dummy one :-) - emit dataChanged(index(0, 0), index(_vfiles.count()-1, 0)); - emit layoutChanged(); sort(); } @@ -184,9 +180,7 @@ void KrVfsModel::clear() { - emit layoutAboutToBeChanged(); _vfiles.clear(); - emit layoutChanged(); } int KrVfsModel::rowCount(const QModelIndex& parent) const This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-21 17:45:55
|
Revision: 6220 http://krusader.svn.sourceforge.net/krusader/?rev=6220&view=rev Author: ckarai Date: 2009-02-21 17:45:45 +0000 (Sat, 21 Feb 2009) Log Message: ----------- InterView: performance problems II. Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 14:03:16 UTC (rev 6219) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 17:45:45 UTC (rev 6220) @@ -94,6 +94,14 @@ } } + QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const + { + ((QAbstractItemModel*)index.model())->setData( index, QVariant( true ), Qt::UserRole ); + QSize size = QItemDelegate::sizeHint( option, index ); + ((QAbstractItemModel*)index.model())->setData( index, QVariant( false ), Qt::UserRole ); + return size; + } + bool eventFilter(QObject *object, QEvent *event) { QWidget *editor = qobject_cast<QWidget*>(object); @@ -195,6 +203,11 @@ setMouseTracking( true ); setAcceptDrops( true ); setDropIndicatorShown( true ); + + hideColumn( KrVfsModel::Mime ); + hideColumn( KrVfsModel::Permissions ); + hideColumn( KrVfsModel::Owner ); + hideColumn( KrVfsModel::Group ); } KrInterView::~KrInterView() Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 14:03:16 UTC (rev 6219) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 17:45:45 UTC (rev 6220) @@ -128,7 +128,12 @@ KrVfsModel::KrVfsModel( KrView * view ): QAbstractListModel(0), _extensionEnabled( true ), _view( view ), _lastSortOrder( KrVfsModel::Name ), _lastSortDir(Qt::AscendingOrder), - _dummyVfile( 0 ), _ready( false ) {} + _dummyVfile( 0 ), _ready( false ), _justForSizeHint( false ) +{ + KConfigGroup grpSvr( krConfig, "Look&Feel" ); + _defaultFont = grpSvr.readEntry( "Filelist Font", *_FilelistFont ); + _fileIconSize = (grpSvr.readEntry("Filelist Icon Size",_FilelistIconSize)).toInt(); +} void KrVfsModel::setVfs(vfs* v, bool upDir) { @@ -195,11 +200,8 @@ QVariant KrVfsModel::data(const QModelIndex& index, int role) const { - if (!index.isValid()) + if (!index.isValid() || index.row() >= rowCount()) return QVariant(); - - if (index.row() >= rowCount()) - return QVariant(); vfile *vf = _vfiles.at(index.row()); if( vf == 0 ) return QVariant(); @@ -207,10 +209,7 @@ switch( role ) { case Qt::FontRole: - { - KConfigGroup grpSvr( krConfig, "Look&Feel" ); - return grpSvr.readEntry( "Filelist Font", *_FilelistFont ); - } + return _defaultFont; case Qt::EditRole: { if( index.column() == 0 ) @@ -305,8 +304,11 @@ switch (index.column() ) { case KrVfsModel::Name: { - if( properties()->displayIcons ) + if( properties()->displayIcons ) { + if( _justForSizeHint ) + return QPixmap( _fileIconSize, _fileIconSize ); return KrView::getIcon( vf ); + } break; } default: @@ -378,6 +380,10 @@ _view->op()->emitRenameItem( vf->vfile_getName(), value.toString() ); } } + if( role == Qt::UserRole && index.isValid() ) + { + _justForSizeHint = value.toBool(); + } return QAbstractListModel::setData( index, value, role ); } Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-21 14:03:16 UTC (rev 6219) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-21 17:45:45 UTC (rev 6220) @@ -3,6 +3,7 @@ #include <QAbstractListModel> #include <QVector> +#include <QFont> #include "krview.h" class vfs; @@ -46,6 +47,7 @@ protected: QString nameWithoutExtension( const vfile * vf, bool checkEnabled = true ) const; + QVector<vfile*> _vfiles; QHash<vfile *, QModelIndex> _vfileNdx; QHash<QString, QModelIndex> _nameNdx; @@ -55,5 +57,8 @@ Qt::SortOrder _lastSortDir; vfile * _dummyVfile; bool _ready; + QFont _defaultFont; + bool _justForSizeHint; + int _fileIconSize; }; #endif // __krvfsmodel__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-22 09:13:02
|
Revision: 6221 http://krusader.svn.sourceforge.net/krusader/?rev=6221&view=rev Author: ckarai Date: 2009-02-22 09:12:48 +0000 (Sun, 22 Feb 2009) Log Message: ----------- InterView: section size + tooltips + show/hide columns Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp Modified: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-21 17:45:45 UTC (rev 6220) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-22 09:12:48 UTC (rev 6221) @@ -16,6 +16,7 @@ #include <QPainter> #include <QLineEdit> #include <QDialog> +#include <KMenu> // dummy. remove this class when no longer needed class KrInterViewItem: public KrViewItem @@ -187,6 +188,9 @@ _nameInKConfig=QString( "KrInterView" ) + QString( ( left ? "Left" : "Right" ) ) ; KConfigGroup group( krConfig, "Private" ); + KConfigGroup grpSvr( _config, "Look&Feel" ); + _viewFont = grpSvr.readEntry( "Filelist Font", *_FilelistFont ); + _model = new KrVfsModel( this ); this->setModel(_model); this->setRootIsDecorated(false); @@ -194,6 +198,7 @@ this->sortByColumn( KrVfsModel::Name, Qt::AscendingOrder ); _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); + header()->installEventFilter( this ); setSelectionMode( QAbstractItemView::NoSelection ); setAllColumnsShowFocus( true ); @@ -204,10 +209,12 @@ setAcceptDrops( true ); setDropIndicatorShown( true ); - hideColumn( KrVfsModel::Mime ); - hideColumn( KrVfsModel::Permissions ); - hideColumn( KrVfsModel::Owner ); - hideColumn( KrVfsModel::Group ); + for( int i=0; i != KrVfsModel::MAX_COLUMNS; i++) + header()->setResizeMode( i, QHeaderView::Interactive ); + header()->setStretchLastSection( false ); + + restoreSettings(); + connect( header(), SIGNAL( sectionResized( int, int, int ) ), this, SLOT( sectionResized( int, int, int ) ) ); } KrInterView::~KrInterView() @@ -345,6 +352,18 @@ void KrInterView::restoreSettings() { + hideColumn( KrVfsModel::Mime ); + hideColumn( KrVfsModel::Permissions ); + hideColumn( KrVfsModel::Owner ); + hideColumn( KrVfsModel::Group ); + header()->resizeSection( KrVfsModel::Extension, QFontMetrics( _viewFont ).width( "tar.bz2 " ) ); + header()->resizeSection( KrVfsModel::KrPermissions, QFontMetrics( _viewFont ).width( "rwx " ) ); + header()->resizeSection( KrVfsModel::Size, QFontMetrics( _viewFont ).width( "9" ) * 10 ); + + QDateTime tmp(QDate(2099, 12, 29), QTime(23, 59)); + QString desc = KGlobal::locale()->formatDateTime(tmp) + " "; + + header()->resizeSection( KrVfsModel::DateTime, QFontMetrics( _viewFont ).width( desc ) ); } void KrInterView::saveSettings() @@ -569,3 +588,181 @@ updateEditorData(); update( nameIndex ); } + +bool KrInterView::eventFilter(QObject *object, QEvent *event) +{ + if( object == header() ) + { + if( event->type() == QEvent::ContextMenu ) + { + QContextMenuEvent *me = (QContextMenuEvent *)event; + showContextMenu( me->globalPos() ); + return true; + } else if( event->type() == QEvent::Resize ) + { + recalculateColumnSizes(); + return false; + } + } + return false; +} + +void KrInterView::showContextMenu( const QPoint & p ) +{ + KMenu popup( this ); + popup.setTitle( i18n("Columns")); +// +// bool refresh = false; + bool hasExtension = !isColumnHidden( KrVfsModel::Extension ); + bool hasMime = !isColumnHidden( KrVfsModel::Mime ); + bool hasSize = !isColumnHidden( KrVfsModel::Size ); + bool hasDate = !isColumnHidden( KrVfsModel::DateTime ); + bool hasPerms = !isColumnHidden( KrVfsModel::Permissions ); + bool hasKrPerms = !isColumnHidden( KrVfsModel::KrPermissions ); + bool hasOwner = !isColumnHidden( KrVfsModel::Owner ); + bool hasGroup = !isColumnHidden( KrVfsModel::Group ); + + QAction *extAct = popup.addAction( i18n( "Ext" ) ); + extAct->setCheckable( true ); + extAct->setChecked( hasExtension ); + + QAction *typeAct = popup.addAction( i18n( "Type" ) ); + typeAct->setCheckable( true ); + typeAct->setChecked( hasMime ); + + QAction *sizeAct = popup.addAction( i18n( "Size" ) ); + sizeAct->setCheckable( true ); + sizeAct->setChecked( hasSize ); + + QAction *modifAct = popup.addAction( i18n( "Modified" ) ); + modifAct->setCheckable( true ); + modifAct->setChecked( hasDate ); + + QAction *permAct = popup.addAction( i18n( "Perms" ) ); + permAct->setCheckable( true ); + permAct->setChecked( hasPerms ); + + QAction *rwxAct = popup.addAction( i18n( "rwx" ) ); + rwxAct->setCheckable( true ); + rwxAct->setChecked( hasKrPerms ); + + QAction *ownerAct = popup.addAction( i18n( "Owner" ) ); + ownerAct->setCheckable( true ); + ownerAct->setChecked( hasOwner ); + + QAction *groupAct = popup.addAction( i18n( "Group" ) ); + groupAct->setCheckable( true ); + groupAct->setChecked( hasGroup ); + + QAction *res = popup.exec( p ); + if( res == extAct ) + { + _model->setExtensionEnabled( !hasExtension ); + if( hasExtension ) + hideColumn( KrVfsModel::Extension ); + else + showColumn( KrVfsModel::Extension ); + } else if( res == typeAct ) { + _model->setExtensionEnabled( !hasMime ); + if( hasMime ) + hideColumn( KrVfsModel::Mime ); + else + showColumn( KrVfsModel::Mime ); + } else if( res == sizeAct ) { + _model->setExtensionEnabled( !hasSize ); + if( hasSize ) + hideColumn( KrVfsModel::Size ); + else + showColumn( KrVfsModel::Size ); + } else if( res == modifAct ) { + _model->setExtensionEnabled( !hasDate ); + if( hasDate ) + hideColumn( KrVfsModel::DateTime ); + else + showColumn( KrVfsModel::DateTime ); + } else if( res == permAct ) { + _model->setExtensionEnabled( !hasPerms ); + if( hasPerms ) + hideColumn( KrVfsModel::Permissions ); + else + showColumn( KrVfsModel::Permissions ); + } else if( res == rwxAct ) { + _model->setExtensionEnabled( !hasKrPerms ); + if( hasKrPerms ) + hideColumn( KrVfsModel::KrPermissions ); + else + showColumn( KrVfsModel::KrPermissions ); + } else if( res == ownerAct ) { + _model->setExtensionEnabled( !hasOwner ); + if( hasOwner ) + hideColumn( KrVfsModel::Owner ); + else + showColumn( KrVfsModel::Owner ); + } else if( res == groupAct ) { + _model->setExtensionEnabled( !hasGroup ); + if( hasGroup ) + hideColumn( KrVfsModel::Group ); + else + showColumn( KrVfsModel::Group ); + } +} + +void KrInterView::sectionResized( int column, int oldSize, int newSize ) +{ + if( oldSize == newSize || !_model->ready() ) + return; + + recalculateColumnSizes(); +} + +void KrInterView::recalculateColumnSizes() +{ + int sum = 0; + for( int i=0; i != KrVfsModel::MAX_COLUMNS; i++ ) + { + if( !isColumnHidden( i ) ) + sum += header()->sectionSize( i ); + } + + if( sum != header()->width() ) + { + int delta = sum - header()->width(); + int nameSize = header()->sectionSize( KrVfsModel::Name ); + if( nameSize - delta > 20 ) + header()->resizeSection( KrVfsModel::Name, nameSize - delta ); + } +} + +bool KrInterView::viewportEvent ( QEvent * event ) +{ + if( event->type() == QEvent::ToolTip ) + { + QHelpEvent *he = static_cast<QHelpEvent*>(event); + const QModelIndex index = indexAt(he->pos()); + + if( index.isValid() ) + { + int width = header()->sectionSize( index.column() ); + QString text = index.data( Qt::DisplayRole ).toString(); + + int textWidth = QFontMetrics( _viewFont ).width( text ); + + const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; + textWidth += 2 * textMargin; + + QVariant decor = index.data( Qt::DecorationRole ); + if( decor.isValid() && decor.type() == QVariant::Pixmap ) + { + QPixmap p = decor.value<QPixmap>(); + textWidth += p.width() + 2 * textMargin; + } + + if( textWidth <= width ) + { + event->accept(); + return true; + } + } + } + return QTreeView::viewportEvent( event ); +} Modified: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-21 17:45:45 UTC (rev 6220) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-22 09:12:48 UTC (rev 6221) @@ -5,12 +5,14 @@ #include <QTreeView> #include <QVector> +#include <QFont> class KrVfsModel; class KrInterViewItem; class QMouseEvent; class QKeyEvent; class QDragEnterEvent; +class QContextMenuEvent; class KrMouseHandler; class KrInterView : public QTreeView, public KrView { @@ -58,6 +60,7 @@ protected slots: void slotMakeCurrentVisible(); virtual void renameCurrentItem(); + void sectionResized( int, int, int ); protected: virtual void setup(); @@ -74,10 +77,16 @@ virtual void dragMoveEvent(QDragMoveEvent *e); virtual void dragLeaveEvent(QDragLeaveEvent *e); virtual void dropEvent ( QDropEvent * ); + virtual bool eventFilter(QObject *object, QEvent *event); + virtual bool viewportEvent ( QEvent * event ); + void showContextMenu( const QPoint & p ); + void recalculateColumnSizes(); + private: KrVfsModel *_model; KrMouseHandler *_mouseHandler; QHash<vfile *,KrInterViewItem*> _itemHash; + QFont _viewFont; }; #endif // __krinterview__ Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-21 17:45:45 UTC (rev 6220) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-22 09:12:48 UTC (rev 6221) @@ -226,6 +226,7 @@ } return QVariant(); } + case Qt::ToolTipRole: case Qt::DisplayRole: { switch (index.column()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-22 11:08:52
|
Revision: 6223 http://krusader.svn.sourceforge.net/krusader/?rev=6223&view=rev Author: ckarai Date: 2009-02-22 11:08:45 +0000 (Sun, 22 Feb 2009) Log Message: ----------- InterView: restructuring Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/CMakeLists.txt trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Added Paths: ----------- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.cpp trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.h Removed Paths: ------------- trunk/krusader_kde4/krusader/Panel/krinterview.cpp trunk/krusader_kde4/krusader/Panel/krinterview.h Modified: trunk/krusader_kde4/krusader/Panel/CMakeLists.txt =================================================================== --- trunk/krusader_kde4/krusader/Panel/CMakeLists.txt 2009-02-22 10:03:33 UTC (rev 6222) +++ trunk/krusader_kde4/krusader/Panel/CMakeLists.txt 2009-02-22 11:08:45 UTC (rev 6223) @@ -20,7 +20,8 @@ krbriefview.cpp krbriefviewitem.cpp krvfsmodel.cpp - krinterview.cpp + krinterdetailedview.cpp + krinterviewitemdelegate.cpp krviewfactory.cpp krmousehandler.cpp ) Added: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-22 11:08:45 UTC (rev 6223) @@ -0,0 +1,662 @@ +#include "krviewfactory.h" +#include "krinterdetailedview.h" +#include "krinterviewitemdelegate.h" +#include "krviewitem.h" +#include "krvfsmodel.h" +#include "../VFS/krpermhandler.h" +#include "../defaults.h" +#include "krmousehandler.h" +#include "krcolorcache.h" +#include <klocale.h> +#include <kdirlister.h> +#include <QDir> +#include <QDirModel> +#include <QHashIterator> +#include <QHeaderView> +#include "../GUI/krstyleproxy.h" +#include <KMenu> + +// dummy. remove this class when no longer needed +class KrInterDetailedViewItem: public KrViewItem +{ +public: + KrInterDetailedViewItem(KrInterDetailedView *parent, vfile *vf): KrViewItem(vf, parent->properties()) { + _view = parent; + _vfile = vf; + if( parent->_model->dummyVfile() == vf ) + dummyVfile = true; + } + + bool isSelected() const { + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + return _view->selectionModel()->isSelected( ndx ); + } + void setSelected( bool s ) { + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + _view->selectionModel()->select( ndx, ( s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) + | QItemSelectionModel::Rows ); + } + QRect itemRect() const { + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + return _view->visualRect( ndx ); + } + static void itemHeightChanged() + { + } // force the items to resize when icon/font size change + void redraw() {} + +private: + vfile *_vfile; + KrInterDetailedView * _view; +}; + + +// code used to register the view +#define INTERVIEW_ID 2 +KrViewInstance interView( INTERVIEW_ID, i18n( "&Experimental View" ), 0 /*Qt::ALT + Qt::SHIFT + Qt::Key_D*/, + KrInterDetailedView::create, KrInterDetailedViewItem::itemHeightChanged ); +// end of register code + +KrInterDetailedView::KrInterDetailedView( QWidget *parent, bool &left, KConfig *cfg ): + KrView(cfg), + QTreeView(parent) +{ + // fix the context menu problem + int j = QFontMetrics( font() ).height() * 2; + _mouseHandler = new KrMouseHandler( this, j ); + connect( _mouseHandler, SIGNAL( renameCurrentItem() ), this, SLOT( renameCurrentItem() ) ); + setWidget( this ); + _nameInKConfig=QString( "KrInterDetailedView" ) + QString( ( left ? "Left" : "Right" ) ) ; + KConfigGroup group( krConfig, "Private" ); + + KConfigGroup grpSvr( _config, "Look&Feel" ); + _viewFont = grpSvr.readEntry( "Filelist Font", *_FilelistFont ); + + _model = new KrVfsModel( this ); + this->setModel(_model); + this->setRootIsDecorated(false); + this->setSortingEnabled(true); + this->sortByColumn( KrVfsModel::Name, Qt::AscendingOrder ); + _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); + connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); + header()->installEventFilter( this ); + + setSelectionMode( QAbstractItemView::NoSelection ); + setAllColumnsShowFocus( true ); + + setStyle( new KrStyleProxy() ); + setItemDelegate( new KrInterViewItemDelegate() ); + setMouseTracking( true ); + setAcceptDrops( true ); + setDropIndicatorShown( true ); + + for( int i=0; i != KrVfsModel::MAX_COLUMNS; i++) + header()->setResizeMode( i, QHeaderView::Interactive ); + header()->setStretchLastSection( false ); + + restoreSettings(); + connect( header(), SIGNAL( sectionResized( int, int, int ) ), this, SLOT( sectionResized( int, int, int ) ) ); + connect( &KrColorCache::getColorCache(), SIGNAL( colorsRefreshed() ), this, SLOT( refreshColors() ) ); +} + +KrInterDetailedView::~KrInterDetailedView() +{ + delete _properties; + _properties = 0; + delete _operator; + _operator = 0; + delete _model; + delete _mouseHandler; + QHashIterator< vfile *, KrInterDetailedViewItem *> it( _itemHash ); + while( it.hasNext() ) + delete it.next().value(); + _itemHash.clear(); +} + +KrViewItem* KrInterDetailedView::findItemByName(const QString &name) +{ + if (!_model->ready()) + return 0; + + QModelIndex ndx = _model->nameIndex( name ); + if( !ndx.isValid() ) + return 0; + return getKrInterViewItem( ndx ); +} + +QString KrInterDetailedView::getCurrentItem() const +{ + if (!_model->ready()) + return QString(); + + vfile * vf = _model->vfileAt( currentIndex() ); + if( vf == 0 ) + return QString(); + return vf->vfile_getName(); +} + +KrViewItem* KrInterDetailedView::getCurrentKrViewItem() +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem( currentIndex() ); +} + +KrViewItem* KrInterDetailedView::getFirst() +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem( _model->index(0, 0, QModelIndex())); +} + +KrViewItem* KrInterDetailedView::getKrViewItemAt(const QPoint &vp) +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem( indexAt( vp ) ); +} + +KrViewItem* KrInterDetailedView::getLast() +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem(_model->index(_model->rowCount()-1, 0, QModelIndex())); +} + +KrViewItem* KrInterDetailedView::getNext(KrViewItem *current) +{ + vfile* vf = (vfile *)current->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.row() >= _model->rowCount()-1 ) + return 0; + return getKrInterViewItem( _model->index(ndx.row() + 1, 0, QModelIndex())); +} + +KrViewItem* KrInterDetailedView::getPrev(KrViewItem *current) +{ + vfile* vf = (vfile *)current->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.row() <= 0 ) + return 0; + return getKrInterViewItem( _model->index(ndx.row() - 1, 0, QModelIndex())); +} + +void KrInterDetailedView::slotMakeCurrentVisible() +{ + scrollTo( currentIndex() ); +} + +void KrInterDetailedView::makeItemVisible(const KrViewItem *item) +{ + vfile* vf = (vfile *)item->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.isValid() ) + scrollTo( ndx ); +} + +void KrInterDetailedView::setCurrentKrViewItem(KrViewItem *item) +{ + vfile* vf = (vfile *)item->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.isValid() && ndx.row() != currentIndex().row() ) { + _mouseHandler->cancelTwoClickRename(); + setCurrentIndex( ndx ); + } +} + +KrViewItem* KrInterDetailedView::preAddItem(vfile *vf) +{ + return getKrInterViewItem( _model->addItem( vf ) ); +} + +bool KrInterDetailedView::preDelItem(KrViewItem *item) +{ + if( item == 0 ) + return true; + QModelIndex ndx = _model->removeItem( (vfile *)item->getVfile() ); + if( ndx.isValid() ) + setCurrentIndex( ndx ); + _itemHash.remove( (vfile *)item->getVfile() ); + return true; +} + +void KrInterDetailedView::redraw() +{ +} + +void KrInterDetailedView::refreshColors() +{ + _model->emitChanged(); +} + +void KrInterDetailedView::restoreSettings() +{ + KConfigGroup grpSvr( krConfig, _nameInKConfig ); + QByteArray savedState = grpSvr.readEntry( "Saved State", QByteArray() ); + + if( savedState.isEmpty() ) + { + hideColumn( KrVfsModel::Mime ); + hideColumn( KrVfsModel::Permissions ); + hideColumn( KrVfsModel::Owner ); + hideColumn( KrVfsModel::Group ); + header()->resizeSection( KrVfsModel::Extension, QFontMetrics( _viewFont ).width( "tar.bz2 " ) ); + header()->resizeSection( KrVfsModel::KrPermissions, QFontMetrics( _viewFont ).width( "rwx " ) ); + header()->resizeSection( KrVfsModel::Size, QFontMetrics( _viewFont ).width( "9" ) * 10 ); + + QDateTime tmp(QDate(2099, 12, 29), QTime(23, 59)); + QString desc = KGlobal::locale()->formatDateTime(tmp) + " "; + + header()->resizeSection( KrVfsModel::DateTime, QFontMetrics( _viewFont ).width( desc ) ); + } else { + header()->restoreState( savedState ); + } +} + +void KrInterDetailedView::saveSettings() +{ + QByteArray state = header()->saveState(); + KConfigGroup grpSvr( krConfig, _nameInKConfig ); + grpSvr.writeEntry( "Saved State", state ); +} + +void KrInterDetailedView::setCurrentItem(const QString& name) +{ + QModelIndex ndx = _model->nameIndex( name ); + if( ndx.isValid() ) + setCurrentIndex( ndx ); +} + +void KrInterDetailedView::prepareForActive() { + KrView::prepareForActive(); + setFocus(); + KrViewItem * current = getCurrentKrViewItem(); + if( current != 0 ) { + QString desc = current->description(); + op()->emitItemDescription( desc ); + } +} + +void KrInterDetailedView::prepareForPassive() { + KrView::prepareForPassive(); + _mouseHandler->cancelTwoClickRename(); + //if ( renameLineEdit() ->isVisible() ) + //renameLineEdit() ->clearFocus(); +} + +int KrInterDetailedView::itemsPerPage() { + QRect rect = visualRect( currentIndex() ); + if( !rect.isValid() ) + { + for( int i=0; i != _model->rowCount(); i++ ) + { + rect = visualRect( _model->index( i, 0 ) ); + if( rect.isValid() ) + break; + } + } + if( !rect.isValid() ) + return 0; + int size = (height() - header()->height() ) / rect.height(); + if( size < 0 ) + size = 0; + return size; +} + +void KrInterDetailedView::sort() +{ + _model->sort(); +} + +void KrInterDetailedView::updateView() +{ +} + +void KrInterDetailedView::updateItem(KrViewItem* item) +{ + if( item == 0 ) + return; + _model->updateItem( (vfile *)item->getVfile() ); +} + +void KrInterDetailedView::clear() +{ + clearSelection(); + _model->clear(); + QHashIterator< vfile *, KrInterDetailedViewItem *> it( _itemHash ); + while( it.hasNext() ) + delete it.next().value(); + _itemHash.clear(); + KrView::clear(); +} + +void KrInterDetailedView::addItems(vfs* v, bool addUpDir) +{ + _model->setVfs(v, addUpDir); + _count = _model->rowCount(); + if( addUpDir ) + _count--; + + this->setCurrentIndex(_model->index(0, 0)); + if( !nameToMakeCurrent().isEmpty() ) + setCurrentItem( nameToMakeCurrent() ); +} + +void KrInterDetailedView::setup() +{ + +} + +void KrInterDetailedView::initOperator() +{ + _operator = new KrViewOperator(this, this); + // klistview emits selection changed, so chain them to operator + connect(selectionModel(), SIGNAL(selectionChanged( const QItemSelection &, const QItemSelection &)), _operator, SLOT(emitSelectionChanged())); +} + +void KrInterDetailedView::keyPressEvent( QKeyEvent *e ) +{ + if ( !e || !_model->ready() ) + return ; // subclass bug + if( handleKeyEvent( e ) ) // did the view class handled the event? + return; + QTreeView::keyPressEvent( e ); +} + +void KrInterDetailedView::mousePressEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mousePressEvent( ev ) ) + QTreeView::mousePressEvent( ev ); +} + +void KrInterDetailedView::mouseReleaseEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mouseReleaseEvent( ev ) ) + QTreeView::mouseReleaseEvent( ev ); +} + +void KrInterDetailedView::mouseDoubleClickEvent ( QMouseEvent *ev ) +{ + if( !_mouseHandler->mouseDoubleClickEvent( ev ) ) + QTreeView::mouseDoubleClickEvent( ev ); +} + +void KrInterDetailedView::mouseMoveEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mouseMoveEvent( ev ) ) + QTreeView::mouseMoveEvent( ev ); +} + +void KrInterDetailedView::wheelEvent ( QWheelEvent *ev ) +{ + if( !_mouseHandler->wheelEvent( ev ) ) + QTreeView::wheelEvent( ev ); +} + +void KrInterDetailedView::dragEnterEvent ( QDragEnterEvent *ev ) +{ + if( !_mouseHandler->dragEnterEvent( ev ) ) + QTreeView::dragEnterEvent( ev ); +} + +void KrInterDetailedView::dragMoveEvent ( QDragMoveEvent *ev ) +{ + QTreeView::dragMoveEvent( ev ); + _mouseHandler->dragMoveEvent( ev ); +} + +void KrInterDetailedView::dragLeaveEvent ( QDragLeaveEvent *ev ) +{ + if( !_mouseHandler->dragLeaveEvent( ev ) ) + QTreeView::dragLeaveEvent( ev ); +} + +void KrInterDetailedView::dropEvent ( QDropEvent *ev ) +{ + if( !_mouseHandler->dropEvent( ev ) ) + QTreeView::dropEvent( ev ); +} + +bool KrInterDetailedView::event( QEvent * e ) +{ + _mouseHandler->otherEvent( e ); + return QTreeView::event( e ); +} + +KrInterDetailedViewItem * KrInterDetailedView::getKrInterViewItem( const QModelIndex & ndx ) +{ + if( !ndx.isValid() ) + return 0; + vfile * vf = _model->vfileAt( ndx ); + if( vf == 0 ) + return 0; + QHash<vfile *,KrInterDetailedViewItem*>::iterator it = _itemHash.find( vf ); + if( it == _itemHash.end() ) { + KrInterDetailedViewItem * newItem = new KrInterDetailedViewItem( this, vf ); + _itemHash[ vf ] = newItem; + _dict.insert( vf->vfile_getName(), newItem ); + return newItem; + } + return *it; +} + +void KrInterDetailedView::selectRegion( KrViewItem *i1, KrViewItem *i2, bool select) +{ + vfile* vf1 = (vfile *)i1->getVfile(); + QModelIndex mi1 = _model->vfileIndex( vf1 ); + vfile* vf2 = (vfile *)i2->getVfile(); + QModelIndex mi2 = _model->vfileIndex( vf2 ); + + if( mi1.isValid() && mi2.isValid() ) + { + int r1 = mi1.row(); + int r2 = mi2.row(); + + if( r1 > r2 ) { + int t = r1; + r1 = r2; + r2 = t; + } + + for( int row = r1; row <= r2; row++ ) + { + const QModelIndex & ndx = _model->index( row, 0 ); + selectionModel()->select( ndx, ( select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) + | QItemSelectionModel::Rows ); + } + } + else if( mi1.isValid() && !mi2.isValid() ) + i1->setSelected( select ); + else if( mi2.isValid() && !mi1.isValid() ) + i2->setSelected( select ); +} + +void KrInterDetailedView::renameCurrentItem() { + QModelIndex cIndex = currentIndex(); + QModelIndex nameIndex = _model->index( cIndex.row(), KrVfsModel::Name ); + edit( nameIndex ); + updateEditorData(); + update( nameIndex ); +} + +bool KrInterDetailedView::eventFilter(QObject *object, QEvent *event) +{ + if( object == header() ) + { + if( event->type() == QEvent::ContextMenu ) + { + QContextMenuEvent *me = (QContextMenuEvent *)event; + showContextMenu( me->globalPos() ); + return true; + } else if( event->type() == QEvent::Resize ) + { + recalculateColumnSizes(); + return false; + } + } + return false; +} + +void KrInterDetailedView::showContextMenu( const QPoint & p ) +{ + KMenu popup( this ); + popup.setTitle( i18n("Columns")); +// +// bool refresh = false; + bool hasExtension = !isColumnHidden( KrVfsModel::Extension ); + bool hasMime = !isColumnHidden( KrVfsModel::Mime ); + bool hasSize = !isColumnHidden( KrVfsModel::Size ); + bool hasDate = !isColumnHidden( KrVfsModel::DateTime ); + bool hasPerms = !isColumnHidden( KrVfsModel::Permissions ); + bool hasKrPerms = !isColumnHidden( KrVfsModel::KrPermissions ); + bool hasOwner = !isColumnHidden( KrVfsModel::Owner ); + bool hasGroup = !isColumnHidden( KrVfsModel::Group ); + + QAction *extAct = popup.addAction( i18n( "Ext" ) ); + extAct->setCheckable( true ); + extAct->setChecked( hasExtension ); + + QAction *typeAct = popup.addAction( i18n( "Type" ) ); + typeAct->setCheckable( true ); + typeAct->setChecked( hasMime ); + + QAction *sizeAct = popup.addAction( i18n( "Size" ) ); + sizeAct->setCheckable( true ); + sizeAct->setChecked( hasSize ); + + QAction *modifAct = popup.addAction( i18n( "Modified" ) ); + modifAct->setCheckable( true ); + modifAct->setChecked( hasDate ); + + QAction *permAct = popup.addAction( i18n( "Perms" ) ); + permAct->setCheckable( true ); + permAct->setChecked( hasPerms ); + + QAction *rwxAct = popup.addAction( i18n( "rwx" ) ); + rwxAct->setCheckable( true ); + rwxAct->setChecked( hasKrPerms ); + + QAction *ownerAct = popup.addAction( i18n( "Owner" ) ); + ownerAct->setCheckable( true ); + ownerAct->setChecked( hasOwner ); + + QAction *groupAct = popup.addAction( i18n( "Group" ) ); + groupAct->setCheckable( true ); + groupAct->setChecked( hasGroup ); + + QAction *res = popup.exec( p ); + if( res == extAct ) + { + _model->setExtensionEnabled( !hasExtension ); + if( hasExtension ) + hideColumn( KrVfsModel::Extension ); + else + showColumn( KrVfsModel::Extension ); + } else if( res == typeAct ) { + _model->setExtensionEnabled( !hasMime ); + if( hasMime ) + hideColumn( KrVfsModel::Mime ); + else + showColumn( KrVfsModel::Mime ); + } else if( res == sizeAct ) { + _model->setExtensionEnabled( !hasSize ); + if( hasSize ) + hideColumn( KrVfsModel::Size ); + else + showColumn( KrVfsModel::Size ); + } else if( res == modifAct ) { + _model->setExtensionEnabled( !hasDate ); + if( hasDate ) + hideColumn( KrVfsModel::DateTime ); + else + showColumn( KrVfsModel::DateTime ); + } else if( res == permAct ) { + _model->setExtensionEnabled( !hasPerms ); + if( hasPerms ) + hideColumn( KrVfsModel::Permissions ); + else + showColumn( KrVfsModel::Permissions ); + } else if( res == rwxAct ) { + _model->setExtensionEnabled( !hasKrPerms ); + if( hasKrPerms ) + hideColumn( KrVfsModel::KrPermissions ); + else + showColumn( KrVfsModel::KrPermissions ); + } else if( res == ownerAct ) { + _model->setExtensionEnabled( !hasOwner ); + if( hasOwner ) + hideColumn( KrVfsModel::Owner ); + else + showColumn( KrVfsModel::Owner ); + } else if( res == groupAct ) { + _model->setExtensionEnabled( !hasGroup ); + if( hasGroup ) + hideColumn( KrVfsModel::Group ); + else + showColumn( KrVfsModel::Group ); + } +} + +void KrInterDetailedView::sectionResized( int column, int oldSize, int newSize ) +{ + if( oldSize == newSize || !_model->ready() ) + return; + + recalculateColumnSizes(); +} + +void KrInterDetailedView::recalculateColumnSizes() +{ + int sum = 0; + for( int i=0; i != KrVfsModel::MAX_COLUMNS; i++ ) + { + if( !isColumnHidden( i ) ) + sum += header()->sectionSize( i ); + } + + if( sum != header()->width() ) + { + int delta = sum - header()->width(); + int nameSize = header()->sectionSize( KrVfsModel::Name ); + if( nameSize - delta > 20 ) + header()->resizeSection( KrVfsModel::Name, nameSize - delta ); + } +} + +bool KrInterDetailedView::viewportEvent ( QEvent * event ) +{ + if( event->type() == QEvent::ToolTip ) + { + QHelpEvent *he = static_cast<QHelpEvent*>(event); + const QModelIndex index = indexAt(he->pos()); + + if( index.isValid() ) + { + int width = header()->sectionSize( index.column() ); + QString text = index.data( Qt::DisplayRole ).toString(); + + int textWidth = QFontMetrics( _viewFont ).width( text ); + + const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; + textWidth += 2 * textMargin; + + QVariant decor = index.data( Qt::DecorationRole ); + if( decor.isValid() && decor.type() == QVariant::Pixmap ) + { + QPixmap p = decor.value<QPixmap>(); + textWidth += p.width() + 2 * textMargin; + } + + if( textWidth <= width ) + { + event->accept(); + return true; + } + } + } + return QTreeView::viewportEvent( event ); +} Added: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h 2009-02-22 11:08:45 UTC (rev 6223) @@ -0,0 +1,94 @@ +#ifndef __krinterdetailedview__ +#define __krinterdetailedview__ + +#include "krview.h" + +#include <QTreeView> +#include <QVector> +#include <QFont> + +class KrVfsModel; +class KrInterDetailedViewItem; +class QMouseEvent; +class QKeyEvent; +class QDragEnterEvent; +class QContextMenuEvent; +class KrMouseHandler; + +class KrInterDetailedView : public QTreeView, public KrView { + friend class KrInterDetailedViewItem; + Q_OBJECT + +public: + KrInterDetailedView( QWidget *parent, bool &left, KConfig *cfg = krConfig ); + virtual ~KrInterDetailedView(); + + virtual void addItems(vfs* v, bool addUpDir = true); + virtual KrViewItem* findItemByName(const QString &name); + virtual QString getCurrentItem() const; + virtual KrViewItem* getCurrentKrViewItem(); + virtual KrViewItem* getFirst(); + virtual KrViewItem* getKrViewItemAt(const QPoint &vp); + virtual KrViewItem* getLast(); + virtual KrViewItem* getNext(KrViewItem *current); + virtual KrViewItem* getPrev(KrViewItem *current); + virtual void makeItemVisible(const KrViewItem *item); + virtual KrViewItem* preAddItem(vfile *vf); + virtual bool preDelItem(KrViewItem *item); + virtual void redraw(); + virtual void restoreSettings(); + virtual void saveSettings(); + virtual void setCurrentItem(const QString& name); + virtual void setCurrentKrViewItem(KrViewItem *current); + virtual void sort(); + virtual void clear(); + virtual void updateView(); + virtual void updateItem(KrViewItem* item); + virtual QModelIndex getCurrentIndex() { return currentIndex(); } + virtual bool isSelected( const QModelIndex &ndx ) { return selectionModel()->isSelected( ndx ); } + virtual void selectRegion( KrViewItem *, KrViewItem *, bool ); + KrInterDetailedViewItem * getKrInterViewItem( const QModelIndex & ); + + static KrView* create( QWidget *parent, bool &left, KConfig *cfg ) { return new KrInterDetailedView( parent, left, cfg ); } + + virtual void prepareForActive(); + virtual void prepareForPassive(); + virtual bool ensureVisibilityAfterSelect() { return false; } + virtual int itemsPerPage(); + +public slots: + virtual void refreshColors(); + +protected slots: + void slotMakeCurrentVisible(); + virtual void renameCurrentItem(); + void sectionResized( int, int, int ); + +protected: + virtual void setup(); + virtual void initOperator(); + + virtual void keyPressEvent( QKeyEvent *e ); + virtual void mousePressEvent ( QMouseEvent * ); + virtual void mouseReleaseEvent ( QMouseEvent * ); + virtual void mouseDoubleClickEvent ( QMouseEvent *ev ); + virtual void mouseMoveEvent ( QMouseEvent * ); + virtual void wheelEvent ( QWheelEvent * ); + virtual bool event( QEvent * e ); + virtual void dragEnterEvent(QDragEnterEvent *e); + virtual void dragMoveEvent(QDragMoveEvent *e); + virtual void dragLeaveEvent(QDragLeaveEvent *e); + virtual void dropEvent ( QDropEvent * ); + virtual bool eventFilter(QObject *object, QEvent *event); + virtual bool viewportEvent ( QEvent * event ); + + void showContextMenu( const QPoint & p ); + void recalculateColumnSizes(); + +private: + KrVfsModel *_model; + KrMouseHandler *_mouseHandler; + QHash<vfile *,KrInterDetailedViewItem*> _itemHash; + QFont _viewFont; +}; +#endif // __krinterview__ Deleted: trunk/krusader_kde4/krusader/Panel/krinterview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-22 10:03:33 UTC (rev 6222) +++ trunk/krusader_kde4/krusader/Panel/krinterview.cpp 2009-02-22 11:08:45 UTC (rev 6223) @@ -1,779 +0,0 @@ -#include "krviewfactory.h" -#include "krinterview.h" -#include "krviewitem.h" -#include "krvfsmodel.h" -#include "../VFS/krpermhandler.h" -#include "../defaults.h" -#include "krmousehandler.h" -#include <klocale.h> -#include <kdirlister.h> -#include <QDir> -#include <QDirModel> -#include <QHashIterator> -#include <QHeaderView> -#include "../GUI/krstyleproxy.h" -#include <QItemDelegate> -#include <QPainter> -#include <QLineEdit> -#include <QDialog> -#include <KMenu> - -// dummy. remove this class when no longer needed -class KrInterViewItem: public KrViewItem -{ -public: - KrInterViewItem(KrInterView *parent, vfile *vf): KrViewItem(vf, parent->properties()) { - _view = parent; - _vfile = vf; - if( parent->_model->dummyVfile() == vf ) - dummyVfile = true; - } - - bool isSelected() const { - const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); - return _view->selectionModel()->isSelected( ndx ); - } - void setSelected( bool s ) { - const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); - _view->selectionModel()->select( ndx, ( s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) - | QItemSelectionModel::Rows ); - } - QRect itemRect() const { - const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); - return _view->visualRect( ndx ); - } - static void itemHeightChanged() - { - } // force the items to resize when icon/font size change - void redraw() {} - -private: - vfile *_vfile; - KrInterView * _view; -}; - -class KrInterViewItemDelegate : public QItemDelegate -{ -private: - mutable int _currentlyEdited; - mutable bool _dontDraw; - -public: - KrInterViewItemDelegate( QObject *parent = 0 ) : QItemDelegate( parent ), _currentlyEdited( -1 ) {} - - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const - { - QStyleOptionViewItemV4 opt = option; - opt.state &= ~QStyle::State_Selected; - _dontDraw = ( _currentlyEdited == index.row() ) && (index.column() == KrVfsModel::Extension ); - QItemDelegate::paint( painter, opt, index ); - } - - void drawDisplay ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QString & text ) const - { - if( !_dontDraw ) - QItemDelegate::drawDisplay( painter, option, rect, text ); - } - - QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &sovi, const QModelIndex &index) const - { - _currentlyEdited = index.row(); - return QItemDelegate::createEditor( parent, sovi, index ); - } - - void setEditorData(QWidget *editor, const QModelIndex &index) const - { - QItemDelegate::setEditorData( editor, index ); - if( editor->inherits( "QLineEdit" ) ) - { - QLineEdit *lineEdit = qobject_cast<QLineEdit *> ( editor ); - if( lineEdit ) { - QString nameWithoutExt = index.data( Qt::UserRole ).toString(); - lineEdit->deselect(); - lineEdit->setSelection( 0, nameWithoutExt.length() ); - } - } - } - - QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const - { - ((QAbstractItemModel*)index.model())->setData( index, QVariant( true ), Qt::UserRole ); - QSize size = QItemDelegate::sizeHint( option, index ); - ((QAbstractItemModel*)index.model())->setData( index, QVariant( false ), Qt::UserRole ); - return size; - } - - bool eventFilter(QObject *object, QEvent *event) - { - QWidget *editor = qobject_cast<QWidget*>(object); - if (!editor) - return false; - if (event->type() == QEvent::KeyPress) - { - switch (static_cast<QKeyEvent *>(event)->key()) { - case Qt::Key_Tab: - case Qt::Key_Backtab: - _currentlyEdited = -1; - emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); - return true; - case Qt::Key_Enter: - case Qt::Key_Return: - if (QLineEdit *e = qobject_cast<QLineEdit*>(editor)) - { - if (!e->hasAcceptableInput()) - return true; - event->accept(); - emit commitData(editor); - emit closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); - _currentlyEdited = -1; - return true; - } - return false; - case Qt::Key_Escape: - event->accept(); - // don't commit data - _currentlyEdited = -1; - emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); - break; - default: - return false; - } - - if (editor->parentWidget()) - editor->parentWidget()->setFocus(); - return true; - } else if (event->type() == QEvent::FocusOut) { - if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) { - QWidget *w = QApplication::focusWidget(); - while (w) { // don't worry about focus changes internally in the editor - if (w == editor) - return false; - w = w->parentWidget(); - } - // Opening a modal dialog will start a new eventloop - // that will process the deleteLater event. - if (QApplication::activeModalWidget() - && !QApplication::activeModalWidget()->isAncestorOf(editor) - && qobject_cast<QDialog*>(QApplication::activeModalWidget())) - return false; - _currentlyEdited = -1; - emit closeEditor(editor, RevertModelCache); - } - } else if (event->type() == QEvent::ShortcutOverride) { - if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) { - event->accept(); - return true; - } - } - return false; - } -}; - - -// code used to register the view -#define INTERVIEW_ID 2 -KrViewInstance interView( INTERVIEW_ID, i18n( "&Experimental View" ), 0 /*Qt::ALT + Qt::SHIFT + Qt::Key_D*/, - KrInterView::create, KrInterViewItem::itemHeightChanged ); -// end of register code - -KrInterView::KrInterView( QWidget *parent, bool &left, KConfig *cfg ): - KrView(cfg), - QTreeView(parent) -{ - // fix the context menu problem - int j = QFontMetrics( font() ).height() * 2; - _mouseHandler = new KrMouseHandler( this, j ); - connect( _mouseHandler, SIGNAL( renameCurrentItem() ), this, SLOT( renameCurrentItem() ) ); - setWidget( this ); - _nameInKConfig=QString( "KrInterView" ) + QString( ( left ? "Left" : "Right" ) ) ; - KConfigGroup group( krConfig, "Private" ); - - KConfigGroup grpSvr( _config, "Look&Feel" ); - _viewFont = grpSvr.readEntry( "Filelist Font", *_FilelistFont ); - - _model = new KrVfsModel( this ); - this->setModel(_model); - this->setRootIsDecorated(false); - this->setSortingEnabled(true); - this->sortByColumn( KrVfsModel::Name, Qt::AscendingOrder ); - _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); - connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); - header()->installEventFilter( this ); - - setSelectionMode( QAbstractItemView::NoSelection ); - setAllColumnsShowFocus( true ); - - setStyle( new KrStyleProxy() ); - setItemDelegate( new KrInterViewItemDelegate() ); - setMouseTracking( true ); - setAcceptDrops( true ); - setDropIndicatorShown( true ); - - for( int i=0; i != KrVfsModel::MAX_COLUMNS; i++) - header()->setResizeMode( i, QHeaderView::Interactive ); - header()->setStretchLastSection( false ); - - restoreSettings(); - connect( header(), SIGNAL( sectionResized( int, int, int ) ), this, SLOT( sectionResized( int, int, int ) ) ); -} - -KrInterView::~KrInterView() -{ - delete _properties; - _properties = 0; - delete _operator; - _operator = 0; - delete _model; - delete _mouseHandler; - QHashIterator< vfile *, KrInterViewItem *> it( _itemHash ); - while( it.hasNext() ) - delete it.next().value(); - _itemHash.clear(); -} - -KrViewItem* KrInterView::findItemByName(const QString &name) -{ - if (!_model->ready()) - return 0; - - QModelIndex ndx = _model->nameIndex( name ); - if( !ndx.isValid() ) - return 0; - return getKrInterViewItem( ndx ); -} - -QString KrInterView::getCurrentItem() const -{ - if (!_model->ready()) - return QString(); - - vfile * vf = _model->vfileAt( currentIndex() ); - if( vf == 0 ) - return QString(); - return vf->vfile_getName(); -} - -KrViewItem* KrInterView::getCurrentKrViewItem() -{ - if (!_model->ready()) - return 0; - - return getKrInterViewItem( currentIndex() ); -} - -KrViewItem* KrInterView::getFirst() -{ - if (!_model->ready()) - return 0; - - return getKrInterViewItem( _model->index(0, 0, QModelIndex())); -} - -KrViewItem* KrInterView::getKrViewItemAt(const QPoint &vp) -{ - if (!_model->ready()) - return 0; - - return getKrInterViewItem( indexAt( vp ) ); -} - -KrViewItem* KrInterView::getLast() -{ - if (!_model->ready()) - return 0; - - return getKrInterViewItem(_model->index(_model->rowCount()-1, 0, QModelIndex())); -} - -KrViewItem* KrInterView::getNext(KrViewItem *current) -{ - vfile* vf = (vfile *)current->getVfile(); - QModelIndex ndx = _model->vfileIndex( vf ); - if( ndx.row() >= _model->rowCount()-1 ) - return 0; - return getKrInterViewItem( _model->index(ndx.row() + 1, 0, QModelIndex())); -} - -KrViewItem* KrInterView::getPrev(KrViewItem *current) -{ - vfile* vf = (vfile *)current->getVfile(); - QModelIndex ndx = _model->vfileIndex( vf ); - if( ndx.row() <= 0 ) - return 0; - return getKrInterViewItem( _model->index(ndx.row() - 1, 0, QModelIndex())); -} - -void KrInterView::slotMakeCurrentVisible() -{ - scrollTo( currentIndex() ); -} - -void KrInterView::makeItemVisible(const KrViewItem *item) -{ - vfile* vf = (vfile *)item->getVfile(); - QModelIndex ndx = _model->vfileIndex( vf ); - if( ndx.isValid() ) - scrollTo( ndx ); -} - -void KrInterView::setCurrentKrViewItem(KrViewItem *item) -{ - vfile* vf = (vfile *)item->getVfile(); - QModelIndex ndx = _model->vfileIndex( vf ); - if( ndx.isValid() && ndx.row() != currentIndex().row() ) { - _mouseHandler->cancelTwoClickRename(); - setCurrentIndex( ndx ); - } -} - -KrViewItem* KrInterView::preAddItem(vfile *vf) -{ - return getKrInterViewItem( _model->addItem( vf ) ); -} - -bool KrInterView::preDelItem(KrViewItem *item) -{ - if( item == 0 ) - return true; - QModelIndex ndx = _model->removeItem( (vfile *)item->getVfile() ); - if( ndx.isValid() ) - setCurrentIndex( ndx ); - _itemHash.remove( (vfile *)item->getVfile() ); - return true; -} - -void KrInterView::redraw() -{ -} - -void KrInterView::refreshColors() -{ -} - -void KrInterView::restoreSettings() -{ - KConfigGroup grpSvr( krConfig, _nameInKConfig ); - QByteArray savedState = grpSvr.readEntry( "Saved State", QByteArray() ); - - if( savedState.isEmpty() ) - { - hideColumn( KrVfsModel::Mime ); - hideColumn( KrVfsModel::Permissions ); - hideColumn( KrVfsModel::Owner ); - hideColumn( KrVfsModel::Group ); - header()->resizeSection( KrVfsModel::Extension, QFontMetrics( _viewFont ).width( "tar.bz2 " ) ); - header()->resizeSection( KrVfsModel::KrPermissions, QFontMetrics( _viewFont ).width( "rwx " ) ); - header()->resizeSection( KrVfsModel::Size, QFontMetrics( _viewFont ).width( "9" ) * 10 ); - - QDateTime tmp(QDate(2099, 12, 29), QTime(23, 59)); - QString desc = KGlobal::locale()->formatDateTime(tmp) + " "; - - header()->resizeSection( KrVfsModel::DateTime, QFontMetrics( _viewFont ).width( desc ) ); - } else { - header()->restoreState( savedState ); - } -} - -void KrInterView::saveSettings() -{ - QByteArray state = header()->saveState(); - KConfigGroup grpSvr( krConfig, _nameInKConfig ); - grpSvr.writeEntry( "Saved State", state ); -} - -void KrInterView::setCurrentItem(const QString& name) -{ - QModelIndex ndx = _model->nameIndex( name ); - if( ndx.isValid() ) - setCurrentIndex( ndx ); -} - -void KrInterView::prepareForActive() { - KrView::prepareForActive(); - setFocus(); - KrViewItem * current = getCurrentKrViewItem(); - if( current != 0 ) { - QString desc = current->description(); - op()->emitItemDescription( desc ); - } -} - -void KrInterView::prepareForPassive() { - KrView::prepareForPassive(); - _mouseHandler->cancelTwoClickRename(); - //if ( renameLineEdit() ->isVisible() ) - //renameLineEdit() ->clearFocus(); -} - -int KrInterView::itemsPerPage() { - QRect rect = visualRect( currentIndex() ); - if( !rect.isValid() ) - { - for( int i=0; i != _model->rowCount(); i++ ) - { - rect = visualRect( _model->index( i, 0 ) ); - if( rect.isValid() ) - break; - } - } - if( !rect.isValid() ) - return 0; - int size = (height() - header()->height() ) / rect.height(); - if( size < 0 ) - size = 0; - return size; -} - -void KrInterView::sort() -{ - _model->sort(); -} - -void KrInterView::updateView() -{ -} - -void KrInterView::updateItem(KrViewItem* item) -{ - if( item == 0 ) - return; - _model->updateItem( (vfile *)item->getVfile() ); -} - -void KrInterView::clear() -{ - clearSelection(); - _model->clear(); - QHashIterator< vfile *, KrInterViewItem *> it( _itemHash ); - while( it.hasNext() ) - delete it.next().value(); - _itemHash.clear(); - KrView::clear(); -} - -void KrInterView::addItems(vfs* v, bool addUpDir) -{ - _model->setVfs(v, addUpDir); - _count = _model->rowCount(); - if( addUpDir ) - _count--; - - this->setCurrentIndex(_model->index(0, 0)); - if( !nameToMakeCurrent().isEmpty() ) - setCurrentItem( nameToMakeCurrent() ); -} - -void KrInterView::setup() -{ - -} - -void KrInterView::initOperator() -{ - _operator = new KrViewOperator(this, this); - // klistview emits selection changed, so chain them to operator - connect(selectionModel(), SIGNAL(selectionChanged( const QItemSelection &, const QItemSelection &)), _operator, SLOT(emitSelectionChanged())); -} - -void KrInterView::keyPressEvent( QKeyEvent *e ) -{ - if ( !e || !_model->ready() ) - return ; // subclass bug - if( handleKeyEvent( e ) ) // did the view class handled the event? - return; - QTreeView::keyPressEvent( e ); -} - -void KrInterView::mousePressEvent ( QMouseEvent * ev ) -{ - if( !_mouseHandler->mousePressEvent( ev ) ) - QTreeView::mousePressEvent( ev ); -} - -void KrInterView::mouseReleaseEvent ( QMouseEvent * ev ) -{ - if( !_mouseHandler->mouseReleaseEvent( ev ) ) - QTreeView::mouseReleaseEvent( ev ); -} - -void KrInterView::mouseDoubleClickEvent ( QMouseEvent *ev ) -{ - if( !_mouseHandler->mouseDoubleClickEvent( ev ) ) - QTreeView::mouseDoubleClickEvent( ev ); -} - -void KrInterView::mouseMoveEvent ( QMouseEvent * ev ) -{ - if( !_mouseHandler->mouseMoveEvent( ev ) ) - QTreeView::mouseMoveEvent( ev ); -} - -void KrInterView::wheelEvent ( QWheelEvent *ev ) -{ - if( !_mouseHandler->wheelEvent( ev ) ) - QTreeView::wheelEvent( ev ); -} - -void KrInterView::dragEnterEvent ( QDragEnterEvent *ev ) -{ - if( !_mouseHandler->dragEnterEvent( ev ) ) - QTreeView::dragEnterEvent( ev ); -} - -void KrInterView::dragMoveEvent ( QDragMoveEvent *ev ) -{ - QTreeView::dragMoveEvent( ev ); - _mouseHandler->dragMoveEvent( ev ); -} - -void KrInterView::dragLeaveEvent ( QDragLeaveEvent *ev ) -{ - if( !_mouseHandler->dragLeaveEvent( ev ) ) - QTreeView::dragLeaveEvent( ev ); -} - -void KrInterView::dropEvent ( QDropEvent *ev ) -{ - if( !_mouseHandler->dropEvent( ev ) ) - QTreeView::dropEvent( ev ); -} - -bool KrInterView::event( QEvent * e ) -{ - _mouseHandler->otherEvent( e ); - return QTreeView::event( e ); -} - -KrInterViewItem * KrInterView::getKrInterViewItem( const QModelIndex & ndx ) -{ - if( !ndx.isValid() ) - return 0; - vfile * vf = _model->vfileAt( ndx ); - if( vf == 0 ) - return 0; - QHash<vfile *,KrInterViewItem*>::iterator it = _itemHash.find( vf ); - if( it == _itemHash.end() ) { - KrInterViewItem * newItem = new KrInterViewItem( this, vf ); - _itemHash[ vf ] = newItem; - _dict.insert( vf->vfile_getName(), newItem ); - return newItem; - } - return *it; -} - -void KrInterView::selectRegion( KrViewItem *i1, KrViewItem *i2, bool select) -{ - vfile* vf1 = (vfile *)i1->getVfile(); - QModelIndex mi1 = _model->vfileIndex( vf1 ); - vfile* vf2 = (vfile *)i2->getVfile(); - QModelIndex mi2 = _model->vfileIndex( vf2 ); - - if( mi1.isValid() && mi2.isValid() ) - { - int r1 = mi1.row(); - int r2 = mi2.row(); - - if( r1 > r2 ) { - int t = r1; - r1 = r2; - r2 = t; - } - - for( int row = r1; row <= r2; row++ ) - { - const QModelIndex & ndx = _model->index( row, 0 ); - selectionModel()->select( ndx, ( select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) - | QItemSelectionModel::Rows ); - } - } - else if( mi1.isValid() && !mi2.isValid() ) - i1->setSelected( select ); - else if( mi2.isValid() && !mi1.isValid() ) - i2->setSelected( select ); -} - -void KrInterView::renameCurrentItem() { - QModelIndex cIndex = currentIndex(); - QModelIndex nameIndex = _model->index( cIndex.row(), KrVfsModel::Name ); - edit( nameIndex ); - updateEditorData(); - update( nameIndex ); -} - -bool KrInterView::eventFilter(QObject *object, QEvent *event) -{ - if( object == header() ) - { - if( event->type() == QEvent::ContextMenu ) - { - QContextMenuEvent *me = (QContextMenuEvent *)event; - showContextMenu( me->globalPos() ); - return true; - } else if( event->type() == QEvent::Resize ) - { - recalculateColumnSizes(); - return false; - } - } - return false; -} - -void KrInterView::showContextMenu( const QPoint & p ) -{ - KMenu popup( this ); - popup.setTitle( i18n("Columns")); -// -// bool refresh = false; - bool hasExtension = !isColumnHidden( KrVfsModel::Extension ); - bool hasMime = !isColumnHidden( KrVfsModel::Mime ); - bool hasSize = !isColumnHidden( KrVfsModel::Size ); - bool hasDate = !isColumnHidden( KrVfsModel::DateTime ); - bool hasPerms = !isColumnHidden( KrVfsModel::Permissions ); - bool hasKrPerms = !isColumnHidden( KrVfsModel::KrPermissions ); - bool hasOwner = !isColumnHidden( KrVfsModel::Owner ); - bool hasGroup = !isColumnHidden( KrVfsModel::Group ); - - QAction *extAct = popup.addAction( i18n( "Ext" ) ); - extAct->setCheckable( true ); - extAct->setChecked( hasExtension ); - - QAction *typeAct = popup.addAction( i18n( "Type" ) ); - typeAct->setCheckable( true ); - typeAct->setChecked( hasMime ); - - QAction *sizeAct = popup.addAction( i18n( "Size" ) ); - sizeAct->setCheckable( true ); - sizeAct->setChecked( hasSize ); - - QAction *modifAct = popup.addAction( i18n( "Modified" ) ); - modifAct->setCheckable( true ); - modifAct->setChecked( hasDate ); - - QAction *permAct = popup.addAction( i18n( "Perms" ) ); - permAct->setCheckable( true ); - permAct->setChecked( hasPerms ); - - QAction *rwxAct = popup.addAction( i18n( "rwx" ) ); - rwxAct->setCheckable( true ); - rwxAct->setChecked( hasKrPerms ); - - QAction *ownerAct = popup.addAction( i18n( "Owner" ) ); - ownerAct->setCheckable( true ); - ownerAct->setChecked( hasOwner ); - - QAction *groupAct = popup.addAction( i18n( "Group" ) ); - groupAct->setCheckable( true ); - groupAct->setChecked( hasGroup ); - - QAction *res = popup.exec( p ); - if( res == extAct ) - { - _model->setExtensionEnabled( !hasExtension ); - if( hasExtension ) - hideColumn( KrVfsModel::Extension ); - else - showColumn( KrVfsModel::Extension ); - } else if( res == typeAct ) { - _model->setExtensionEnabled( !hasMime ); - if( hasMime ) - hideColumn( KrVfsModel::Mime ); - else - showColumn( KrVfsModel::Mime ); - } else if( res == sizeAct ) { - _model->setExtensionEnabled( !hasSize ); - if( hasSize ) - hideColumn( KrVfsModel::Size ); - else - showColumn( KrVfsModel::Size ); - } else if( res == modifAct ) { - _model->setExtensionEnabled( !hasDate ); - if( hasDate ) - hideColumn( KrVfsModel::DateTime ); - else - showColumn( KrVfsModel::DateTime ); - } else if( res == permAct ) { - _model->setExtensionEnabled( !hasPerms ); - if( hasPerms ) - hideColumn( KrVfsModel::Permissions ); - else - showColumn( KrVfsModel::Permissions ); - } else if( res == rwxAct ) { - _model->setExtensionEnabled( !hasKrPerms ); - if( hasKrPerms ) - hideColumn( KrVfsModel::KrPermissions ); - else - showColumn( KrVfsModel::KrPermissions ); - } else if( res == ownerAct ) { - _model->setExtensionEnabled( !hasOwner ); - if( hasOwner ) - hideColumn( KrVfsModel::Owner ); - else - showColumn( KrVfsModel::Owner ); - } else if( res == groupAct ) { - _model->setExtensionEnabled( !hasGroup ); - if( hasGroup ) - hideColumn( KrVfsModel::Group ); - else - showColumn( KrVfsModel::Group ); - } -} - -void KrInterView::sectionResized( int column, int oldSize, int newSize ) -{ - if( oldSize == newSize || !_model->ready() ) - return; - - recalculateColumnSizes(); -} - -void KrInterView::recalculateColumnSizes() -{ - int sum = 0; - for( int i=0; i != KrVfsModel::MAX_COLUMNS; i++ ) - { - if( !isColumnHidden( i ) ) - sum += header()->sectionSize( i ); - } - - if( sum != header()->width() ) - { - int delta = sum - header()->width(); - int nameSize = header()->sectionSize( KrVfsModel::Name ); - if( nameSize - delta > 20 ) - header()->resizeSection( KrVfsModel::Name, nameSize - delta ); - } -} - -bool KrInterView::viewportEvent ( QEvent * event ) -{ - if( event->type() == QEvent::ToolTip ) - { - QHelpEvent *he = static_cast<QHelpEvent*>(event); - const QModelIndex index = indexAt(he->pos()); - - if( index.isValid() ) - { - int width = header()->sectionSize( index.column() ); - QString text = index.data( Qt::DisplayRole ).toString(); - - int textWidth = QFontMetrics( _viewFont ).width( text ); - - const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; - textWidth += 2 * textMargin; - - QVariant decor = index.data( Qt::DecorationRole ); - if( decor.isValid() && decor.type() == QVariant::Pixmap ) - { - QPixmap p = decor.value<QPixmap>(); - textWidth += p.width() + 2 * textMargin; - } - - if( textWidth <= width ) - { - event->accept(); - return true; - } - } - } - return QTreeView::viewportEvent( event ); -} Deleted: trunk/krusader_kde4/krusader/Panel/krinterview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-22 10:03:33 UTC (rev 6222) +++ trunk/krusader_kde4/krusader/Panel/krinterview.h 2009-02-22 11:08:45 UTC (rev 6223) @@ -1,92 +0,0 @@ -#ifndef __krinterview__ -#define __krinterview__ - -#include "krview.h" - -#include <QTreeView> -#include <QVector> -#include <QFont> - -class KrVfsModel; -class KrInterViewItem; -class QMouseEvent; -class QKeyEvent; -class QDragEnterEvent; -class QContextMenuEvent; -class KrMouseHandler; - -class KrInterView : public QTreeView, public KrView { - friend class KrInterViewItem; - Q_OBJECT - -public: - KrInterView( QWidget *parent, bool &left, KConfig *cfg = krConfig ); - virtual ~KrInterView(); - - virtual void addItems(vfs* v, bool addUpDir = true); - virtual KrViewItem* findItemByName(const QString &name); - virtual QString getCurrentItem() const; - virtual KrViewItem* getCurrentKrViewItem(); - virtual KrViewItem* getFirst(); - virtual KrViewItem* getKrViewItemAt(const QPoint &vp); - virtual KrViewItem* getLast(); - virtual KrViewItem* getNext(KrViewItem *current); - virtual KrViewItem* getPrev(KrViewItem *current); - virtual void makeItemVisible(const KrViewItem *item); - virtual KrViewItem* preAddItem(vfile *vf); - virtual bool preDelItem(KrViewItem *item); - virtual void redraw(); - virtual void refreshColors(); - virtual void restoreSettings(); - virtual void saveSettings(); - virtual void setCurrentItem(const QString& name); - virtual void setCurrentKrViewItem(KrViewItem *current); - virtual void sort(); - virtual void clear(); - virtual void updateView(); - virtual void updateItem(KrViewItem* item); - virtual QModelIndex getCurrentIndex() { return currentIndex(); } - virtual bool isSelected( const QModelIndex &ndx ) { return selectionModel()->isSelected( ndx ); } - virtual void selectRegion( KrViewItem *, KrViewItem *, bool ); - KrInterViewItem * getKrInterViewItem( const QModelIndex & ); - - static KrView* create( QWidget *parent, bool &left, KConfig *cfg ) { return new KrInterView( parent, left, cfg ); } - - virtual void prepareForActive(); - virtual void prepareForPassive(); - virtual bool ensureVisibilityAfterSelect() { return false; } - virtual int itemsPerPage(); - -protected slots: - void slotMakeCurrentVisible(); - virtual void renameCurrentItem(); - void sectionResized( int, int, int ); - -protected: - virtual void setup(); - virtual void initOperator(); - - virtual void keyPressEvent( QKeyEvent *e ); - virtual void mousePressEvent ( QMouseEvent * ); - virtual void mouseReleaseEvent ( QMouseEvent * ); - virtual void mouseDoubleClickEvent ( QMouseEvent *ev ); - virtual void mouseMoveEvent ( QMouseEvent * ); - virtual void wheelEvent ( QWheelEvent * ); - virtual bool event( QEvent * e ); - virtual void dragEnterEvent(QDragEnterEvent *e); - virtual void dragMoveEvent(QDragMoveEvent *e); - virtual void dragLeaveEvent(QDragLeaveEvent *e); - virtual void dropEvent ( QDropEvent * ); - virtual bool eventFilter(QObject *object, QEvent *event); - virtual bool viewportEvent ( QEvent * event ); - - void showContextMenu( const QPoint & p ); - void recalculateColumnSizes(); - -private: - KrVfsModel *_model; - KrMouseHandler *_mouseHandler; - QHash<vfile *,KrInterViewItem*> _itemHash; - QFont _viewFont; -}; -#endif // __krinterview__ Added: trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.cpp (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.cpp 2009-02-22 11:08:45 UTC (rev 6223) @@ -0,0 +1,133 @@ +/*************************************************************************** + krinterviewitemdelegate.cpp - description + ------------------- + begin : Sat Feb 14 2009 + copyright : (C) 2009+ by Csaba Karai + email : + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "krinterviewitemdelegate.h" +#include "krvfsmodel.h" + +#include <QDialog> +#include <QPainter> +#include <QLineEdit> + +KrInterViewItemDelegate::KrInterViewItemDelegate( QObject *parent ) : + QItemDelegate( parent ), _currentlyEdited( -1 ) {} + +void KrInterViewItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QStyleOptionViewItemV4 opt = option; + opt.state &= ~QStyle::State_Selected; + _dontDraw = ( _currentlyEdited == index.row() ) && (index.column() == KrVfsModel::Extension ); + QItemDelegate::paint( painter, opt, index ); +} + +void KrInterViewItemDelegate::drawDisplay ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QString & text ) const +{ + if( !_dontDraw ) + QItemDelegate::drawDisplay( painter, option, rect, text ); +} + +QWidget * KrInterViewItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &sovi, const QModelIndex &index) const +{ + _currentlyEdited = index.row(); + return QItemDelegate::createEditor( parent, sovi, index ); +} + +void KrInterViewItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + QItemDelegate::setEditorData( editor, index ); + if( editor->inherits( "QLineEdit" ) ) + { + QLineEdit *lineEdit = qobject_cast<QLineEdit *> ( editor ); + if( lineEdit ) { + QString nameWithoutExt = index.data( Qt::UserRole ).toString(); + lineEdit->deselect(); + lineEdit->setSelection( 0, nameWithoutExt.length() ); + } + } +} + +QSize KrInterViewItemDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const +{ + ((QAbstractItemModel*)index.model())->setData( index, QVariant( true ), Qt::UserRole ); + QSize size = QItemDelegate::sizeHint( option, index ); + ((QAbstractItemModel*)index.model())->setData( index, QVariant( false ), Qt::UserRole ); + return size; +} + +bool KrInterViewItemDelegate::eventFilter(QObject *object, QEvent *event) +{ + QWidget *editor = qobject_cast<QWidget*>(object); + if (!editor) + return false; + if (event->type() == QEvent::KeyPress) + { + switch (static_cast<QKeyEvent *>(event)->key()) { + case Qt::Key_Tab: + case Qt::Key_Backtab: + _currentlyEdited = -1; + emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); + return true; + case Qt::Key_Enter: + case Qt::Key_Return: + if (QLineEdit *e = qobject_cast<QLineEdit*>(editor)) + { + if (!e->hasAcceptableInput()) + return true; + event->accept(); + emit commitData(editor); + emit closeEditor(editor, QAbstractItemDelegate::SubmitModelCache); + _currentlyEdited = -1; + return true; + } + return false; + case Qt::Key_Escape: + event->accept(); + // don't commit data + _currentlyEdited = -1; + emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); + break; + default: + return false; + } + + if (editor->parentWidget()) + editor->parentWidget()->setFocus(); + return true; + } else if (event->type() == QEvent::FocusOut) { + if (!editor->isActiveWindow() || (QApplication::focusWidget() != editor)) { + QWidget *w = QApplication::focusWidget(); + while (w) { // don't worry about focus changes internally in the editor + if (w == editor) + return false; + w = w->parentWidget(); + } + // Opening a modal dialog will start a new eventloop + // that will process the deleteLater event. + if (QApplication::activeModalWidget() + && !QApplication::activeModalWidget()->isAncestorOf(editor) + && qobject_cast<QDialog*>(QApplication::activeModalWidget())) + return false; + _currentlyEdited = -1; + emit closeEditor(editor, RevertModelCache); + } + } else if (event->type() == QEvent::ShortcutOverride) { + if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape) { + event->accept(); + return true; + } + } + return false; +} Added: trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.h (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krinterviewitemdelegate.h 2009-02-22 11:08:45 UTC (rev 6223) @@ -0,0 +1,40 @@ +/*************************************************************************** + krinterviewitemdelegate.h - description + ------------------- + begin : Sat Feb 14 2009 + copyright : (C) 2009+ by Csaba Karai + email : + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef __KR_INTERVIEW_ITEM_DELEGATE__ +#define __KR_INTERVIEW_ITEM_DELEGATE__ + +#include <QItemDelegate> + +class KrInterViewItemDelegate : public QItemDelegate +{ +public: + KrInterViewItemDelegate( QObject *parent = 0 ); + + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + void drawDisplay ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QString & text ) const; + QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &sovi, const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; + bool eventFilter(QObject *object, QEvent *event); + +private: + mutable int _currentlyEdited; + mutable bool _dontDraw; +}; + +#endif // __KR_INTERVIEW_ITEM_DELEGATE__ Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-22 10:03:33 UTC (rev 6222) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-22 11:08:45 UTC (rev 6223) @@ -43,6 +43,7 @@ const QModelIndex & nameIndex( const QString & ); virtual Qt::ItemFlags flags ( const QModelIndex & index ) const; static QString krPermissionString( const vfile * vf ); + void emitChanged() { emit layoutChanged(); } protected: QString nameWithoutExtension( const vfile * vf, bool checkEnabled = true ) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-22 13:01:14
|
Revision: 6224 http://krusader.svn.sourceforge.net/krusader/?rev=6224&view=rev Author: ckarai Date: 2009-02-22 11:46:55 +0000 (Sun, 22 Feb 2009) Log Message: ----------- compile fix Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp Modified: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-22 11:08:45 UTC (rev 6223) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-22 11:46:55 UTC (rev 6224) @@ -53,8 +53,8 @@ // code used to register the view #define INTERVIEW_ID 2 -KrViewInstance interView( INTERVIEW_ID, i18n( "&Experimental View" ), 0 /*Qt::ALT + Qt::SHIFT + Qt::Key_D*/, - KrInterDetailedView::create, KrInterDetailedViewItem::itemHeightChanged ); +KrViewInstance interDetailedView( INTERVIEW_ID, i18n( "&Experimental View" ), 0 /*Qt::ALT + Qt::SHIFT + Qt::Key_D*/, + KrInterDetailedView::create, KrInterDetailedViewItem::itemHeightChanged ); // end of register code KrInterDetailedView::KrInterDetailedView( QWidget *parent, bool &left, KConfig *cfg ): Modified: trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp 2009-02-22 11:08:45 UTC (rev 6223) +++ trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp 2009-02-22 11:46:55 UTC (rev 6224) @@ -30,13 +30,13 @@ #include "krdetailedview.h" #include "krbriefview.h" -#include "krinterview.h" +#include "krinterdetailedview.h" #include "krviewfactory.h" #include <cstdio> extern KrViewInstance detailedView; // hold reference for linking extern KrViewInstance briefView; // hold reference for linking -extern KrViewInstance interView; // hold reference for linking +extern KrViewInstance interDetailedView; // hold reference for linking KrViewInstance::KrViewInstance( int id, QString desc, QKeySequence shortcut, KrViewFactoryFunction fun, KrViewItemHeightChange fun2 ) : m_id( id ), m_description( desc ), m_shortcut( shortcut ), m_factoryfun( fun ), m_ihchangefun( fun2 ) @@ -85,5 +85,5 @@ { KrViewFactory::registerView( &detailedView ); KrViewFactory::registerView( &briefView ); - KrViewFactory::registerView( &interView ); + KrViewFactory::registerView( &interDetailedView ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-23 20:38:53
|
Revision: 6226 http://krusader.svn.sourceforge.net/krusader/?rev=6226&view=rev Author: ckarai Date: 2009-02-23 20:38:37 +0000 (Mon, 23 Feb 2009) Log Message: ----------- InterBriefView: alpha Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/CMakeLists.txt trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp Added Paths: ----------- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp trunk/krusader_kde4/krusader/Panel/krinterbriefview.h Modified: trunk/krusader_kde4/krusader/Panel/CMakeLists.txt =================================================================== --- trunk/krusader_kde4/krusader/Panel/CMakeLists.txt 2009-02-22 12:04:14 UTC (rev 6225) +++ trunk/krusader_kde4/krusader/Panel/CMakeLists.txt 2009-02-23 20:38:37 UTC (rev 6226) @@ -20,6 +20,7 @@ krbriefview.cpp krbriefviewitem.cpp krvfsmodel.cpp + krinterbriefview.cpp krinterdetailedview.cpp krinterviewitemdelegate.cpp krviewfactory.cpp Added: trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-23 20:38:37 UTC (rev 6226) @@ -0,0 +1,620 @@ +/*************************************************************************** + krinterbriefview.cpp - description + ------------------- + begin : Sat Feb 14 2009 + copyright : (C) 2009+ by Csaba Karai + email : + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 "krinterbriefview.h" +#include "krviewfactory.h" +#include "krinterviewitemdelegate.h" +#include "krviewitem.h" +#include "krvfsmodel.h" +#include "../VFS/krpermhandler.h" +#include "../defaults.h" +#include "krmousehandler.h" +#include "krcolorcache.h" +#include <klocale.h> +#include <kdirlister.h> +#include <QDir> +#include <QDirModel> +#include <QHashIterator> +#include <QHeaderView> +#include "../GUI/krstyleproxy.h" +#include <KMenu> +#include <QPainter> +#include <QScrollBar> + +// dummy. remove this class when no longer needed +class KrInterBriefViewItem: public KrViewItem +{ +public: + KrInterBriefViewItem(KrInterBriefView *parent, vfile *vf): KrViewItem(vf, parent->properties()) { + _view = parent; + _vfile = vf; + if( parent->_model->dummyVfile() == vf ) + dummyVfile = true; + } + + bool isSelected() const { + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + return _view->selectionModel()->isSelected( ndx ); + } + void setSelected( bool s ) { + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + _view->selectionModel()->select( ndx, ( s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) + | QItemSelectionModel::Rows ); + } + QRect itemRect() const { + const QModelIndex & ndx = _view->_model->vfileIndex( _vfile ); + return _view->visualRect( ndx ); + } + static void itemHeightChanged() + { + } // force the items to resize when icon/font size change + void redraw() {} + +private: + vfile *_vfile; + KrInterBriefView * _view; +}; + + +// code used to register the view +#define INTERBRIEFVIEW_ID 3 +KrViewInstance interBriefView( INTERBRIEFVIEW_ID, i18n( "&Experimental View" ), 0 /*Qt::ALT + Qt::SHIFT + Qt::Key_D*/, + KrInterBriefView::create, KrInterBriefViewItem::itemHeightChanged ); +// end of register code + +KrInterBriefView::KrInterBriefView( QWidget *parent, bool &left, KConfig *cfg ): + KrView(cfg), + QAbstractItemView(parent) +{ + // fix the context menu problem + int j = QFontMetrics( font() ).height() * 2; + _mouseHandler = new KrMouseHandler( this, j ); + connect( _mouseHandler, SIGNAL( renameCurrentItem() ), this, SLOT( renameCurrentItem() ) ); + setWidget( this ); + _nameInKConfig=QString( "KrInterBriefView" ) + QString( ( left ? "Left" : "Right" ) ) ; + KConfigGroup group( krConfig, "Private" ); + + KConfigGroup grpSvr( _config, "Look&Feel" ); + _viewFont = grpSvr.readEntry( "Filelist Font", *_FilelistFont ); + _fileIconSize = (grpSvr.readEntry("Filelist Icon Size",_FilelistIconSize)).toInt(); + + _model = new KrVfsModel( this ); + this->setModel(_model); + _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); + _model->setExtensionEnabled( false ); + connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); + //header()->installEventFilter( this ); + + setSelectionMode( QAbstractItemView::NoSelection ); + + setStyle( new KrStyleProxy() ); + setItemDelegate( new KrInterViewItemDelegate() ); + setMouseTracking( true ); + setAcceptDrops( true ); + setDropIndicatorShown( true ); + + restoreSettings(); + connect( &KrColorCache::getColorCache(), SIGNAL( colorsRefreshed() ), this, SLOT( refreshColors() ) ); +} + +KrInterBriefView::~KrInterBriefView() +{ + delete _properties; + _properties = 0; + delete _operator; + _operator = 0; + delete _model; + delete _mouseHandler; + QHashIterator< vfile *, KrInterBriefViewItem *> it( _itemHash ); + while( it.hasNext() ) + delete it.next().value(); + _itemHash.clear(); +} + +KrViewItem* KrInterBriefView::findItemByName(const QString &name) +{ + if (!_model->ready()) + return 0; + + QModelIndex ndx = _model->nameIndex( name ); + if( !ndx.isValid() ) + return 0; + return getKrInterViewItem( ndx ); +} + +QString KrInterBriefView::getCurrentItem() const +{ + if (!_model->ready()) + return QString(); + + vfile * vf = _model->vfileAt( currentIndex() ); + if( vf == 0 ) + return QString(); + return vf->vfile_getName(); +} + +KrViewItem* KrInterBriefView::getCurrentKrViewItem() +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem( currentIndex() ); +} + +KrViewItem* KrInterBriefView::getFirst() +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem( _model->index(0, 0, QModelIndex())); +} + +KrViewItem* KrInterBriefView::getKrViewItemAt(const QPoint &vp) +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem( indexAt( vp ) ); +} + +KrViewItem* KrInterBriefView::getLast() +{ + if (!_model->ready()) + return 0; + + return getKrInterViewItem(_model->index(_model->rowCount()-1, 0, QModelIndex())); +} + +KrViewItem* KrInterBriefView::getNext(KrViewItem *current) +{ + vfile* vf = (vfile *)current->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.row() >= _model->rowCount()-1 ) + return 0; + return getKrInterViewItem( _model->index(ndx.row() + 1, 0, QModelIndex())); +} + +KrViewItem* KrInterBriefView::getPrev(KrViewItem *current) +{ + vfile* vf = (vfile *)current->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.row() <= 0 ) + return 0; + return getKrInterViewItem( _model->index(ndx.row() - 1, 0, QModelIndex())); +} + +void KrInterBriefView::slotMakeCurrentVisible() +{ + scrollTo( currentIndex() ); +} + +void KrInterBriefView::makeItemVisible(const KrViewItem *item) +{ + vfile* vf = (vfile *)item->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.isValid() ) + scrollTo( ndx ); +} + +void KrInterBriefView::setCurrentKrViewItem(KrViewItem *item) +{ + vfile* vf = (vfile *)item->getVfile(); + QModelIndex ndx = _model->vfileIndex( vf ); + if( ndx.isValid() && ndx.row() != currentIndex().row() ) { + _mouseHandler->cancelTwoClickRename(); + setCurrentIndex( ndx ); + } +} + +KrViewItem* KrInterBriefView::preAddItem(vfile *vf) +{ + return getKrInterViewItem( _model->addItem( vf ) ); +} + +bool KrInterBriefView::preDelItem(KrViewItem *item) +{ + if( item == 0 ) + return true; + QModelIndex ndx = _model->removeItem( (vfile *)item->getVfile() ); + if( ndx.isValid() ) + setCurrentIndex( ndx ); + _itemHash.remove( (vfile *)item->getVfile() ); + return true; +} + +void KrInterBriefView::redraw() +{ +} + +void KrInterBriefView::refreshColors() +{ + if( _model->rowCount() != 0 ) + _model->emitChanged(); +} + +void KrInterBriefView::restoreSettings() +{ + /* TODO */ + _numOfColumns = 3; +} + +void KrInterBriefView::saveSettings() +{ + /* TODO */ +} + +void KrInterBriefView::setCurrentItem(const QString& name) +{ + QModelIndex ndx = _model->nameIndex( name ); + if( ndx.isValid() ) + setCurrentIndex( ndx ); +} + +void KrInterBriefView::prepareForActive() { + KrView::prepareForActive(); + setFocus(); + KrViewItem * current = getCurrentKrViewItem(); + if( current != 0 ) { + QString desc = current->description(); + op()->emitItemDescription( desc ); + } +} + +void KrInterBriefView::prepareForPassive() { + KrView::prepareForPassive(); + _mouseHandler->cancelTwoClickRename(); + //if ( renameLineEdit() ->isVisible() ) + //renameLineEdit() ->clearFocus(); +} + +int KrInterBriefView::itemsPerPage() { + /* TODO */ + return 0; +} + +void KrInterBriefView::sort() +{ + _model->sort(); +} + +void KrInterBriefView::updateView() +{ +} + +void KrInterBriefView::updateItem(KrViewItem* item) +{ + if( item == 0 ) + return; + _model->updateItem( (vfile *)item->getVfile() ); +} + +void KrInterBriefView::clear() +{ + clearSelection(); + _model->clear(); + QHashIterator< vfile *, KrInterBriefViewItem *> it( _itemHash ); + while( it.hasNext() ) + delete it.next().value(); + _itemHash.clear(); + KrView::clear(); +} + +void KrInterBriefView::addItems(vfs* v, bool addUpDir) +{ + _model->setVfs(v, addUpDir); + _count = _model->rowCount(); + if( addUpDir ) + _count--; + + this->setCurrentIndex(_model->index(0, 0)); + if( !nameToMakeCurrent().isEmpty() ) + setCurrentItem( nameToMakeCurrent() ); +} + +void KrInterBriefView::setup() +{ + +} + +void KrInterBriefView::initOperator() +{ + _operator = new KrViewOperator(this, this); + // klistview emits selection changed, so chain them to operator + connect(selectionModel(), SIGNAL(selectionChanged( const QItemSelection &, const QItemSelection &)), _operator, SLOT(emitSelectionChanged())); +} + +void KrInterBriefView::keyPressEvent( QKeyEvent *e ) +{ + if ( !e || !_model->ready() ) + return ; // subclass bug + if( handleKeyEvent( e ) ) // did the view class handled the event? + return; + QAbstractItemView::keyPressEvent( e ); +} + +void KrInterBriefView::mousePressEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mousePressEvent( ev ) ) + QAbstractItemView::mousePressEvent( ev ); +} + +void KrInterBriefView::mouseReleaseEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mouseReleaseEvent( ev ) ) + QAbstractItemView::mouseReleaseEvent( ev ); +} + +void KrInterBriefView::mouseDoubleClickEvent ( QMouseEvent *ev ) +{ + if( !_mouseHandler->mouseDoubleClickEvent( ev ) ) + QAbstractItemView::mouseDoubleClickEvent( ev ); +} + +void KrInterBriefView::mouseMoveEvent ( QMouseEvent * ev ) +{ + if( !_mouseHandler->mouseMoveEvent( ev ) ) + QAbstractItemView::mouseMoveEvent( ev ); +} + +void KrInterBriefView::wheelEvent ( QWheelEvent *ev ) +{ + if( !_mouseHandler->wheelEvent( ev ) ) + QAbstractItemView::wheelEvent( ev ); +} + +void KrInterBriefView::dragEnterEvent ( QDragEnterEvent *ev ) +{ + if( !_mouseHandler->dragEnterEvent( ev ) ) + QAbstractItemView::dragEnterEvent( ev ); +} + +void KrInterBriefView::dragMoveEvent ( QDragMoveEvent *ev ) +{ + QAbstractItemView::dragMoveEvent( ev ); + _mouseHandler->dragMoveEvent( ev ); +} + +void KrInterBriefView::dragLeaveEvent ( QDragLeaveEvent *ev ) +{ + if( !_mouseHandler->dragLeaveEvent( ev ) ) + QAbstractItemView::dragLeaveEvent( ev ); +} + +void KrInterBriefView::dropEvent ( QDropEvent *ev ) +{ + if( !_mouseHandler->dropEvent( ev ) ) + QAbstractItemView::dropEvent( ev ); +} + +bool KrInterBriefView::event( QEvent * e ) +{ + _mouseHandler->otherEvent( e ); + return QAbstractItemView::event( e ); +} + +KrInterBriefViewItem * KrInterBriefView::getKrInterViewItem( const QModelIndex & ndx ) +{ + if( !ndx.isValid() ) + return 0; + vfile * vf = _model->vfileAt( ndx ); + if( vf == 0 ) + return 0; + QHash<vfile *,KrInterBriefViewItem*>::iterator it = _itemHash.find( vf ); + if( it == _itemHash.end() ) { + KrInterBriefViewItem * newItem = new KrInterBriefViewItem( this, vf ); + _itemHash[ vf ] = newItem; + _dict.insert( vf->vfile_getName(), newItem ); + return newItem; + } + return *it; +} + +void KrInterBriefView::selectRegion( KrViewItem *i1, KrViewItem *i2, bool select) +{ + vfile* vf1 = (vfile *)i1->getVfile(); + QModelIndex mi1 = _model->vfileIndex( vf1 ); + vfile* vf2 = (vfile *)i2->getVfile(); + QModelIndex mi2 = _model->vfileIndex( vf2 ); + + if( mi1.isValid() && mi2.isValid() ) + { + int r1 = mi1.row(); + int r2 = mi2.row(); + + if( r1 > r2 ) { + int t = r1; + r1 = r2; + r2 = t; + } + + for( int row = r1; row <= r2; row++ ) + { + const QModelIndex & ndx = _model->index( row, 0 ); + selectionModel()->select( ndx, ( select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect ) + | QItemSelectionModel::Rows ); + } + } + else if( mi1.isValid() && !mi2.isValid() ) + i1->setSelected( select ); + else if( mi2.isValid() && !mi1.isValid() ) + i2->setSelected( select ); +} + +void KrInterBriefView::renameCurrentItem() { + QModelIndex cIndex = currentIndex(); + QModelIndex nameIndex = _model->index( cIndex.row(), KrVfsModel::Name ); + edit( nameIndex ); + updateEditorData(); + update( nameIndex ); +} + +bool KrInterBriefView::eventFilter(QObject *object, QEvent *event) +{ + /* TODO */ + return false; +} + +void KrInterBriefView::showContextMenu( const QPoint & p ) +{ + /* TODO */ +} + +bool KrInterBriefView::viewportEvent ( QEvent * event ) +{ + /* TODO */ + return QAbstractItemView::viewportEvent( event ); +} + + +QRect KrInterBriefView::visualRect(const QModelIndex&ndx) const +{ + /* TODO */ + int width = (viewport()->width())/_numOfColumns; + if( (viewport()->width())%_numOfColumns ) + width++; + int height = getItemHeight(); + int numRows = viewport()->height() / height; + if( numRows == 0 ) + numRows++; + int x = width * (ndx.row()/numRows); + int y = height * (ndx.row() % numRows ); + return mapToViewport(QRect( x, y, width, height )); +} + +void KrInterBriefView::scrollTo(const QModelIndex&, QAbstractItemView::ScrollHint) +{ + /* TODO */ +} + +QModelIndex KrInterBriefView::indexAt(const QPoint& p) const +{ + int x = p.x() + horizontalOffset(); + int y = p.y() + verticalOffset(); + + int width = (viewport()->width())/_numOfColumns; + if( (viewport()->width())%_numOfColumns ) + width++; + int height = getItemHeight(); + int numRows = viewport()->height() / height; + if( numRows == 0 ) + numRows++; + int ys = y / height; + int xs = (x / width) * numRows; + + return _model->index( xs + ys, 0 ); +} + +QModelIndex KrInterBriefView::moveCursor(QAbstractItemView::CursorAction, Qt::KeyboardModifiers) +{ + /* TODO */ + return QModelIndex(); +} + +int KrInterBriefView::horizontalOffset() const +{ + return horizontalScrollBar()->value(); +} + +int KrInterBriefView::verticalOffset() const +{ + return 0; +} + +bool KrInterBriefView::isIndexHidden(const QModelIndex&ndx) const +{ + return ndx.column() != 0; +} + +void KrInterBriefView::setSelection(const QRect&, QFlags<QItemSelectionModel::SelectionFlag>) +{ + /* TODO */ +} + +QRegion KrInterBriefView::visualRegionForSelection(const QItemSelection&) const +{ + /* TODO */ + return QRegion(); +} + +void KrInterBriefView::paintEvent(QPaintEvent *e) +{ + /* TODO */ + QStyleOptionViewItemV4 option; + option.widget = this; + QPainter painter( viewport() ); + + for( int i=0; i != _model->rowCount(); i++ ) + { + option.rect = visualRect( _model->index( i, 0 ) ); + painter.save(); + itemDelegate()->paint(&painter, option, _model->index( i, 0 ) ); + painter.restore(); + } +} + +int KrInterBriefView::getItemHeight() const { + int textHeight = QFontMetrics( _viewFont ).height(); + int height = textHeight; + int iconSize = 0; + if( properties()->displayIcons ) + iconSize = _fileIconSize; + if( iconSize > textHeight ) + height = iconSize; + return height; +} + +void KrInterBriefView::updateGeometries() +{ + if (_model->rowCount() <= 0 ) + horizontalScrollBar()->setRange(0, 0); + else + { + int itemsPerColumn = viewport()->height() / getItemHeight(); + if( itemsPerColumn <= 0 ) + itemsPerColumn = 1; + int columnWidth = (viewport()->width())/_numOfColumns; + if( (viewport()->width())%_numOfColumns ) + columnWidth++; + int maxWidth = _model->rowCount() / itemsPerColumn; + if( _model->rowCount() % itemsPerColumn ) + maxWidth++; + maxWidth *= columnWidth; + if( maxWidth > viewport()->width() ) + { + horizontalScrollBar()->setSingleStep(columnWidth); + horizontalScrollBar()->setPageStep(columnWidth * _numOfColumns); + horizontalScrollBar()->setRange(0, maxWidth - viewport()->width()); + } else { + horizontalScrollBar()->setRange(0, 0); + } + } + + QAbstractItemView::updateGeometries(); +} + +QRect KrInterBriefView::mapToViewport(const QRect &rect) const +{ + if (!rect.isValid()) + return rect; + + QRect result = rect; + + int dx = -horizontalOffset(); + int dy = -verticalOffset(); + result.adjust(dx, dy, dx, dy); + return result; +} Added: trunk/krusader_kde4/krusader/Panel/krinterbriefview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.h (rev 0) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.h 2009-02-23 20:38:37 UTC (rev 6226) @@ -0,0 +1,122 @@ +/*************************************************************************** + krinterbriefview.h - description + ------------------- + begin : Sat Feb 14 2009 + copyright : (C) 2009+ by Csaba Karai + email : + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef __krinterbriefview__ +#define __krinterbriefview__ + +#include "krview.h" + +#include <QAbstractItemView> +#include <QVector> +#include <QFont> + +class KrInterBriefViewItem; +class KrMouseHandler; +class KrVfsModel; + +class KrInterBriefView : public QAbstractItemView, public KrView { + friend class KrInterBriefViewItem; + Q_OBJECT + +public: + KrInterBriefView( QWidget *parent, bool &left, KConfig *cfg = krConfig ); + virtual ~KrInterBriefView(); + + virtual void addItems(vfs* v, bool addUpDir = true); + virtual KrViewItem* findItemByName(const QString &name); + virtual QString getCurrentItem() const; + virtual KrViewItem* getCurrentKrViewItem(); + virtual KrViewItem* getFirst(); + virtual KrViewItem* getKrViewItemAt(const QPoint &vp); + virtual KrViewItem* getLast(); + virtual KrViewItem* getNext(KrViewItem *current); + virtual KrViewItem* getPrev(KrViewItem *current); + virtual void makeItemVisible(const KrViewItem *item); + virtual KrViewItem* preAddItem(vfile *vf); + virtual bool preDelItem(KrViewItem *item); + virtual void redraw(); + virtual void restoreSettings(); + virtual void saveSettings(); + virtual void setCurrentItem(const QString& name); + virtual void setCurrentKrViewItem(KrViewItem *current); + virtual void sort(); + virtual void clear(); + virtual void updateView(); + virtual void updateItem(KrViewItem* item); + virtual QModelIndex getCurrentIndex() { return currentIndex(); } + virtual bool isSelected( const QModelIndex &ndx ) { return selectionModel()->isSelected( ndx ); } + virtual void selectRegion( KrViewItem *, KrViewItem *, bool ); + KrInterBriefViewItem * getKrInterViewItem( const QModelIndex & ); + + static KrView* create( QWidget *parent, bool &left, KConfig *cfg ) { return new KrInterBriefView( parent, left, cfg ); } + + virtual void prepareForActive(); + virtual void prepareForPassive(); + virtual bool ensureVisibilityAfterSelect() { return false; } + virtual int itemsPerPage(); + + // abstract item view classes + virtual QRect visualRect(const QModelIndex&) const; + virtual void scrollTo(const QModelIndex&, QAbstractItemView::ScrollHint = QAbstractItemView::EnsureVisible); + virtual QModelIndex indexAt(const QPoint&) const; + virtual QModelIndex moveCursor(QAbstractItemView::CursorAction, Qt::KeyboardModifiers); + virtual int horizontalOffset() const; + virtual int verticalOffset() const; + virtual bool isIndexHidden(const QModelIndex&) const; + virtual void setSelection(const QRect&, QFlags<QItemSelectionModel::SelectionFlag>); + virtual QRegion visualRegionForSelection(const QItemSelection&) const; + virtual void updateGeometries(); + virtual QRect mapToViewport(const QRect &rect) const; + +public slots: + virtual void refreshColors(); + +protected slots: + void slotMakeCurrentVisible(); + virtual void renameCurrentItem(); + +protected: + virtual void setup(); + virtual void initOperator(); + + virtual void keyPressEvent( QKeyEvent *e ); + virtual void mousePressEvent ( QMouseEvent * ); + virtual void mouseReleaseEvent ( QMouseEvent * ); + virtual void mouseDoubleClickEvent ( QMouseEvent *ev ); + virtual void mouseMoveEvent ( QMouseEvent * ); + virtual void wheelEvent ( QWheelEvent * ); + virtual bool event( QEvent * e ); + virtual void dragEnterEvent(QDragEnterEvent *e); + virtual void dragMoveEvent(QDragMoveEvent *e); + virtual void dragLeaveEvent(QDragLeaveEvent *e); + virtual void dropEvent ( QDropEvent * ); + virtual bool eventFilter(QObject *object, QEvent *event); + virtual bool viewportEvent ( QEvent * event ); + virtual void paintEvent(QPaintEvent *e); + + void showContextMenu( const QPoint & p ); + int getItemHeight() const; + +private: + KrVfsModel *_model; + KrMouseHandler *_mouseHandler; + QHash<vfile *,KrInterBriefViewItem*> _itemHash; + QFont _viewFont; + int _numOfColumns; + int _fileIconSize; +}; +#endif // __krinterbriefview__ Modified: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-22 12:04:14 UTC (rev 6225) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-23 20:38:37 UTC (rev 6226) @@ -255,6 +255,7 @@ header()->resizeSection( KrVfsModel::DateTime, QFontMetrics( _viewFont ).width( desc ) ); } else { header()->restoreState( savedState ); + _model->setExtensionEnabled( !isColumnHidden( KrVfsModel::Extension ) ); } } Modified: trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp 2009-02-22 12:04:14 UTC (rev 6225) +++ trunk/krusader_kde4/krusader/Panel/krviewfactory.cpp 2009-02-23 20:38:37 UTC (rev 6226) @@ -31,12 +31,14 @@ #include "krdetailedview.h" #include "krbriefview.h" #include "krinterdetailedview.h" +#include "krinterbriefview.h" #include "krviewfactory.h" #include <cstdio> extern KrViewInstance detailedView; // hold reference for linking extern KrViewInstance briefView; // hold reference for linking extern KrViewInstance interDetailedView; // hold reference for linking +extern KrViewInstance interBriefView; // hold reference for linking KrViewInstance::KrViewInstance( int id, QString desc, QKeySequence shortcut, KrViewFactoryFunction fun, KrViewItemHeightChange fun2 ) : m_id( id ), m_description( desc ), m_shortcut( shortcut ), m_factoryfun( fun ), m_ihchangefun( fun2 ) @@ -86,4 +88,5 @@ KrViewFactory::registerView( &detailedView ); KrViewFactory::registerView( &briefView ); KrViewFactory::registerView( &interDetailedView ); + KrViewFactory::registerView( &interBriefView ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-25 23:24:06
|
Revision: 6227 http://krusader.svn.sourceforge.net/krusader/?rev=6227&view=rev Author: ckarai Date: 2009-02-25 21:52:24 +0000 (Wed, 25 Feb 2009) Log Message: ----------- InterView: sort order can't be changed from UserActions Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp trunk/krusader_kde4/krusader/Panel/krinterbriefview.h trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h trunk/krusader_kde4/krusader/Panel/krview.h Modified: trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-23 20:38:37 UTC (rev 6226) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-25 21:52:24 UTC (rev 6227) @@ -618,3 +618,13 @@ result.adjust(dx, dy, dx, dy); return result; } + + +void KrInterBriefView::setSortMode(KrViewProperties::SortSpec mode) +{ + Qt::SortOrder sortDir; + int column = _model->convertSortOrderFromKrViewProperties( mode, sortDir ); + if( column == _model->getLastSortOrder() && sortDir == _model->getLastSortDir() ) + sortDir = (sortDir == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder; + _model->sort( column, sortDir ); +} Modified: trunk/krusader_kde4/krusader/Panel/krinterbriefview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.h 2009-02-23 20:38:37 UTC (rev 6226) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.h 2009-02-25 21:52:24 UTC (rev 6227) @@ -68,6 +68,7 @@ virtual void prepareForPassive(); virtual bool ensureVisibilityAfterSelect() { return false; } virtual int itemsPerPage(); + virtual void setSortMode(KrViewProperties::SortSpec mode); // abstract item view classes virtual QRect visualRect(const QModelIndex&) const; Modified: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-23 20:38:37 UTC (rev 6226) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-25 21:52:24 UTC (rev 6227) @@ -662,3 +662,12 @@ } return QTreeView::viewportEvent( event ); } + +void KrInterDetailedView::setSortMode(KrViewProperties::SortSpec mode) +{ + Qt::SortOrder sortDir; + int column = _model->convertSortOrderFromKrViewProperties( mode, sortDir ); + if( column == _model->getLastSortOrder() && sortDir == _model->getLastSortDir() ) + sortDir = (sortDir == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder; + this->sortByColumn( column, sortDir ); +} Modified: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h 2009-02-23 20:38:37 UTC (rev 6226) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.h 2009-02-25 21:52:24 UTC (rev 6227) @@ -55,6 +55,7 @@ virtual void prepareForPassive(); virtual bool ensureVisibilityAfterSelect() { return false; } virtual int itemsPerPage(); + virtual void setSortMode(KrViewProperties::SortSpec mode); public slots: virtual void refreshColors(); Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-23 20:38:37 UTC (rev 6226) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-25 21:52:24 UTC (rev 6227) @@ -611,6 +611,10 @@ { _lastSortOrder = column; _lastSortDir = order; + + if( _view->properties() != 0 ) + _view->sortModeUpdated( convertSortOrderToKrViewProperties( _lastSortOrder, _lastSortDir ) ); + emit layoutAboutToBeChanged(); QModelIndexList oldPersistentList = persistentIndexList(); @@ -846,4 +850,66 @@ case NO_PERM: tmp+='-'; break; } return tmp; -} \ No newline at end of file +} + +int KrVfsModel::convertSortOrderFromKrViewProperties( KrViewProperties::SortSpec sortOrder, Qt::SortOrder & sortDir ) +{ + sortDir = ( sortDir & KrViewProperties::Descending ) ? Qt::DescendingOrder : Qt::AscendingOrder; + if ( sortOrder & KrViewProperties::Name ) + return KrVfsModel::Name; + if ( sortOrder & KrViewProperties::Ext ) + return KrVfsModel::Extension; + if ( sortOrder & KrViewProperties::Size ) + return KrVfsModel::Size; + if ( sortOrder & KrViewProperties::Type ) + return KrVfsModel::Mime; + if ( sortOrder & KrViewProperties::Modified ) + return KrVfsModel::DateTime; + if ( sortOrder & KrViewProperties::Permissions ) + return KrVfsModel::Permissions; + if ( sortOrder & KrViewProperties::KrPermissions ) + return KrVfsModel::KrPermissions; + if ( sortOrder & KrViewProperties::Owner ) + return KrVfsModel::Owner; + if ( sortOrder & KrViewProperties::Group ) + return KrVfsModel::Group; + return -1; +} + +KrViewProperties::SortSpec KrVfsModel::convertSortOrderToKrViewProperties( int sortOrder, Qt::SortOrder sortDir ) +{ + KrViewProperties::SortSpec sp = KrViewProperties::Name; + switch( sortOrder ) + { + case KrVfsModel::Name: + sp = KrViewProperties::Name; + case KrVfsModel::Extension: + sp = KrViewProperties::Ext; + case KrVfsModel::Mime: + sp = KrViewProperties::Type; + case KrVfsModel::Size: + sp = KrViewProperties::Size; + case KrVfsModel::DateTime: + sp = KrViewProperties::Modified; + case KrVfsModel::Permissions: + sp = KrViewProperties::Permissions; + case KrVfsModel::KrPermissions: + sp = KrViewProperties::KrPermissions; + case KrVfsModel::Owner: + sp = KrViewProperties::Owner; + case KrVfsModel::Group: + sp = KrViewProperties::Group; + } + + int sortMode = _view->sortMode(); + + if (sortMode & KrViewProperties::DirsFirst) + sp = static_cast<KrViewProperties::SortSpec>(sp | KrViewProperties::DirsFirst); + if (sortMode & KrViewProperties::IgnoreCase) + sp = static_cast<KrViewProperties::SortSpec>(sp | KrViewProperties::IgnoreCase); + if (sortMode & KrViewProperties::AlwaysSortDirsByName) + sp = static_cast<KrViewProperties::SortSpec>(sp | KrViewProperties::AlwaysSortDirsByName); + if (sortMode & KrViewProperties::Descending) + sp = static_cast<KrViewProperties::SortSpec>(sp | KrViewProperties::Descending); + return sp; +} Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-23 20:38:37 UTC (rev 6226) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-25 21:52:24 UTC (rev 6227) @@ -44,7 +44,12 @@ virtual Qt::ItemFlags flags ( const QModelIndex & index ) const; static QString krPermissionString( const vfile * vf ); void emitChanged() { emit layoutChanged(); } + int convertSortOrderFromKrViewProperties( KrViewProperties::SortSpec, Qt::SortOrder & ); + KrViewProperties::SortSpec convertSortOrderToKrViewProperties( int, Qt::SortOrder ); + Qt::SortOrder getLastSortDir() { return _lastSortDir; } + int getLastSortOrder() { return _lastSortOrder; } + protected: QString nameWithoutExtension( const vfile * vf, bool checkEnabled = true ) const; Modified: trunk/krusader_kde4/krusader/Panel/krview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-23 20:38:37 UTC (rev 6226) +++ trunk/krusader_kde4/krusader/Panel/krview.h 2009-02-25 21:52:24 UTC (rev 6227) @@ -265,6 +265,7 @@ // implementation, and may be re-implemented if needed // ///////////////////////////////////////////////////////////// virtual void setSortMode(KrViewProperties::SortSpec mode) { _properties->sortMode = mode; } + virtual void sortModeUpdated(KrViewProperties::SortSpec mode) { _properties->sortMode = mode; } virtual KrViewProperties::SortSpec sortMode() const { return _properties->sortMode; } virtual void setFilter(KrViewProperties::FilterSpec filter) { _properties->filter = filter; } virtual KrViewProperties::FilterSpec filter() const { return _properties->filter; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-27 20:26:20
|
Revision: 6233 http://krusader.svn.sourceforge.net/krusader/?rev=6233&view=rev Author: ckarai Date: 2009-02-27 20:26:09 +0000 (Fri, 27 Feb 2009) Log Message: ----------- InterBriefView: focus rectangle + scrollTo Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp trunk/krusader_kde4/krusader/Panel/krinterbriefview.h Modified: trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-27 18:50:12 UTC (rev 6232) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-27 20:26:09 UTC (rev 6233) @@ -495,9 +495,27 @@ return mapToViewport(QRect( x, y, width, height )); } -void KrInterBriefView::scrollTo(const QModelIndex&, QAbstractItemView::ScrollHint) +void KrInterBriefView::scrollTo(const QModelIndex &ndx, QAbstractItemView::ScrollHint hint) { - /* TODO */ + const QRect rect = visualRect( ndx ); + if (hint == EnsureVisible && viewport()->rect().contains(rect)) { + setDirtyRegion(rect); + return; + } + + const QRect area = viewport()->rect(); + + const bool leftOf = rect.left() < area.left(); + const bool rightOf = rect.right() > area.right(); + + int horizontalValue = horizontalScrollBar()->value(); + + if (leftOf) + horizontalValue -= area.left() - rect.left(); + else if (rightOf) + horizontalValue += rect.right() - area.right(); + + horizontalScrollBar()->setValue( horizontalValue ); } QModelIndex KrInterBriefView::indexAt(const QPoint& p) const @@ -553,15 +571,33 @@ void KrInterBriefView::paintEvent(QPaintEvent *e) { /* TODO */ - QStyleOptionViewItemV4 option; + QStyleOptionViewItemV4 option = viewOptions(); option.widget = this; + option.decorationSize = QSize( _fileIconSize, _fileIconSize ); + option.decorationPosition = QStyleOptionViewItem::Left; QPainter painter( viewport() ); + QModelIndex curr = currentIndex(); + + for( int i=0; i != _model->rowCount(); i++ ) { + option.state = QStyle::State_None; option.rect = visualRect( _model->index( i, 0 ) ); painter.save(); + + bool focus = curr.isValid() && curr.row() == i && hasFocus(); + itemDelegate()->paint(&painter, option, _model->index( i, 0 ) ); + + if( focus ) { + QStyleOptionFocusRect o; + o.QStyleOption::operator=(option); + QPalette::ColorGroup cg = QPalette::Normal; + o.backgroundColor = option.palette.color(cg, QPalette::Background); + style()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, &painter); + } + painter.restore(); } } @@ -628,3 +664,22 @@ sortDir = (sortDir == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder; _model->sort( column, sortDir ); } + +int KrInterBriefView::elementWidth( const QModelIndex & index ) +{ + QString text = index.data( Qt::DisplayRole ).toString(); + + int textWidth = QFontMetrics( _viewFont ).width( text ); + + const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; + textWidth += 2 * textMargin; + + QVariant decor = index.data( Qt::DecorationRole ); + if( decor.isValid() && decor.type() == QVariant::Pixmap ) + { + QPixmap p = decor.value<QPixmap>(); + textWidth += p.width() + 2 * textMargin; + } + + return textWidth; +} \ No newline at end of file Modified: trunk/krusader_kde4/krusader/Panel/krinterbriefview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.h 2009-02-27 18:50:12 UTC (rev 6232) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.h 2009-02-27 20:26:09 UTC (rev 6233) @@ -111,6 +111,7 @@ void showContextMenu( const QPoint & p ); int getItemHeight() const; + int elementWidth( const QModelIndex & index ); private: KrVfsModel *_model; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-02-27 21:58:21
|
Revision: 6234 http://krusader.svn.sourceforge.net/krusader/?rev=6234&view=rev Author: ckarai Date: 2009-02-27 21:58:10 +0000 (Fri, 27 Feb 2009) Log Message: ----------- InterBriefView: page up, page down, left, right Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp Modified: trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-27 20:26:09 UTC (rev 6233) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-27 21:58:10 UTC (rev 6234) @@ -212,6 +212,10 @@ void KrInterBriefView::setCurrentKrViewItem(KrViewItem *item) { + if( item == 0 ) { + setCurrentIndex( QModelIndex() ); + return; + } vfile* vf = (vfile *)item->getVfile(); QModelIndex ndx = _model->vfileIndex( vf ); if( ndx.isValid() && ndx.row() != currentIndex().row() ) { @@ -282,8 +286,11 @@ } int KrInterBriefView::itemsPerPage() { - /* TODO */ - return 0; + int height = getItemHeight(); + if( height == 0 ) + height ++; + int numRows = viewport()->height() / height; + return numRows; } void KrInterBriefView::sort() @@ -341,9 +348,77 @@ { if ( !e || !_model->ready() ) return ; // subclass bug - if( handleKeyEvent( e ) ) // did the view class handled the event? - return; - QAbstractItemView::keyPressEvent( e ); + if(( e->key() != Qt::Key_Left && e->key() != Qt::Key_Right ) && + ( handleKeyEvent( e ) ) ) // did the view class handled the event? + return; + switch ( e->key() ) { + case Qt::Key_Right : + { + if ( e->modifiers() == Qt::ControlModifier ) { // let the panel handle it + e->ignore(); + break; + } + KrViewItem *i = getCurrentKrViewItem(); + KrViewItem *newCurrent = i; + + if ( !i ) + break; + + int num = itemsPerPage() + 1; + + if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() ); + + while( i && num > 0 ) + { + if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() ); + newCurrent = i; + i = getNext( i ); + num--; + } + + if( newCurrent ) { + setCurrentKrViewItem( newCurrent ); + slotMakeCurrentVisible(); + } + if ( e->modifiers() & Qt::ShiftModifier ) + op()->emitSelectionChanged(); + break; + } + case Qt::Key_Left : + { + if ( e->modifiers() == Qt::ControlModifier ) { // let the panel handle it + e->ignore(); + break; + } + KrViewItem *i = getCurrentKrViewItem(); + KrViewItem *newCurrent = i; + + if ( !i ) + break; + + int num = itemsPerPage() + 1; + + if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() ); + + while( i && num > 0 ) + { + if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() ); + newCurrent = i; + i = getPrev( i ); + num--; + } + + if( newCurrent ) { + setCurrentKrViewItem( newCurrent ); + slotMakeCurrentVisible(); + } + if ( e->modifiers() & Qt::ShiftModifier ) + op()->emitSelectionChanged(); + break; + } + default: + QAbstractItemView::keyPressEvent( e ); + } } void KrInterBriefView::mousePressEvent ( QMouseEvent * ev ) @@ -475,14 +550,12 @@ bool KrInterBriefView::viewportEvent ( QEvent * event ) { - /* TODO */ return QAbstractItemView::viewportEvent( event ); } QRect KrInterBriefView::visualRect(const QModelIndex&ndx) const { - /* TODO */ int width = (viewport()->width())/_numOfColumns; if( (viewport()->width())%_numOfColumns ) width++; Modified: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-27 20:26:09 UTC (rev 6233) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-27 21:58:10 UTC (rev 6234) @@ -200,6 +200,10 @@ void KrInterDetailedView::setCurrentKrViewItem(KrViewItem *item) { + if( item == 0 ) { + setCurrentIndex( QModelIndex() ); + return; + } vfile* vf = (vfile *)item->getVfile(); QModelIndex ndx = _model->vfileIndex( vf ); if( ndx.isValid() && ndx.row() != currentIndex().row() ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-03-02 19:34:33
|
Revision: 6235 http://krusader.svn.sourceforge.net/krusader/?rev=6235&view=rev Author: ckarai Date: 2009-03-02 19:34:12 +0000 (Mon, 02 Mar 2009) Log Message: ----------- InterView: final Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp trunk/krusader_kde4/krusader/Panel/krinterbriefview.h trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.h trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp trunk/krusader_kde4/krusader/Panel/krvfsmodel.h Modified: trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-02-27 21:58:10 UTC (rev 6234) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.cpp 2009-03-02 19:34:12 UTC (rev 6235) @@ -34,6 +34,11 @@ #include <KMenu> #include <QPainter> #include <QScrollBar> +#include <QHeaderView> +#include <QRegion> +#include <QItemSelection> +#include <QItemSelectionRange> +#include <KMenu> // dummy. remove this class when no longer needed class KrInterBriefViewItem: public KrViewItem @@ -80,6 +85,8 @@ KrView(cfg), QAbstractItemView(parent) { + _header = 0; + // fix the context menu problem int j = QFontMetrics( font() ).height() * 2; _mouseHandler = new KrMouseHandler( this, j ); @@ -96,6 +103,7 @@ this->setModel(_model); _model->sort( KrVfsModel::Name, Qt::AscendingOrder ); _model->setExtensionEnabled( false ); + _model->setAlternatingTable( true ); connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) ); //header()->installEventFilter( this ); @@ -107,7 +115,6 @@ setAcceptDrops( true ); setDropIndicatorShown( true ); - restoreSettings(); connect( &KrColorCache::getColorCache(), SIGNAL( colorsRefreshed() ), this, SLOT( refreshColors() ) ); } @@ -252,13 +259,24 @@ void KrInterBriefView::restoreSettings() { - /* TODO */ - _numOfColumns = 3; + _numOfColumns = _properties->numberOfColumns; + + KConfigGroup group( krConfig, nameInKConfig() ); + + int column = group.readEntry( "Sort Indicator Column", (int)KrVfsModel::Name ); + bool isAscending = group.readEntry( "Ascending Sort Order", true ); + Qt::SortOrder sortDir = isAscending ? Qt::AscendingOrder : Qt::DescendingOrder; + + _header->setSortIndicator(column, sortDir); + _model->sort( column, sortDir ); } void KrInterBriefView::saveSettings() { - /* TODO */ + KConfigGroup group( krConfig, nameInKConfig() ); + + group.writeEntry( "Sort Indicator Column", (int)_model->getLastSortOrder() ); + group.writeEntry( "Ascending Sort Order", (_model->getLastSortDir() == Qt::AscendingOrder ) ); } void KrInterBriefView::setCurrentItem(const QString& name) @@ -334,7 +352,25 @@ void KrInterBriefView::setup() { - + _header = new QHeaderView(Qt::Horizontal, this); + _header->setDefaultAlignment(Qt::AlignLeft|Qt::AlignVCenter); + _header->setParent( this ); + _header->setModel( _model ); + _header->hideSection( KrVfsModel::Mime ); + _header->hideSection( KrVfsModel::Permissions ); + _header->hideSection( KrVfsModel::KrPermissions ); + _header->hideSection( KrVfsModel::Owner ); + _header->hideSection( KrVfsModel::Group ); + _header->setStretchLastSection( true ); + _header->setResizeMode( QHeaderView::Fixed ); + _header->setClickable( true ); + _header->setSortIndicatorShown( true ); + _header->setSortIndicator(KrVfsModel::Name, Qt::AscendingOrder); + connect(_header, SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), + _model, SLOT(sort(int,Qt::SortOrder))); + _header->installEventFilter( this ); + + restoreSettings(); } void KrInterBriefView::initOperator() @@ -539,17 +575,68 @@ bool KrInterBriefView::eventFilter(QObject *object, QEvent *event) { - /* TODO */ + if( object == _header ) + { + if( event->type() == QEvent::ContextMenu ) + { + QContextMenuEvent *me = (QContextMenuEvent *)event; + showContextMenu( me->globalPos() ); + return true; + } + } return false; } void KrInterBriefView::showContextMenu( const QPoint & p ) { - /* TODO */ + KMenu popup( this ); + popup.setTitle( i18n("Columns")); + + int COL_ID = 14700; + + for( int i=1; i <= MAX_BRIEF_COLS; i++ ) + { + QAction *act = popup.addAction( QString( "%1" ).arg( i ) ); + act->setData( QVariant( COL_ID + i ) ); + act->setCheckable( true ); + act->setChecked( properties()->numberOfColumns == i ); + } + + QAction * res = popup.exec( p ); + int result= -1; + if( res && res->data().canConvert<int>() ) + result = res->data().toInt(); + + KConfigGroup group( krConfig, nameInKConfig() ); + + if( result > COL_ID && result <= COL_ID + MAX_BRIEF_COLS ) + { + group.writeEntry( "Number Of Brief Columns", result - COL_ID ); + _properties->numberOfColumns = result - COL_ID; + _numOfColumns = result - COL_ID; + updateGeometries(); + } } bool KrInterBriefView::viewportEvent ( QEvent * event ) { + if( event->type() == QEvent::ToolTip ) + { + QHelpEvent *he = static_cast<QHelpEvent*>(event); + const QModelIndex index = indexAt(he->pos()); + + if( index.isValid() ) + { + int width = visualRect( index ).width(); + int textWidth = elementWidth( index ); + + if( textWidth <= width ) + { + event->accept(); + return true; + } + } + } return QAbstractItemView::viewportEvent( event ); } @@ -609,10 +696,55 @@ return _model->index( xs + ys, 0 ); } -QModelIndex KrInterBriefView::moveCursor(QAbstractItemView::CursorAction, Qt::KeyboardModifiers) +QModelIndex KrInterBriefView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers) { - /* TODO */ - return QModelIndex(); + if( _model->rowCount() == 0 ) + return QModelIndex(); + + QModelIndex current = currentIndex(); + if (!current.isValid()) + return _model->index( 0, 0 ); + + switch (cursorAction) { + case MoveLeft: + case MovePageDown: + { + int newRow = current.row() - itemsPerPage(); + if( newRow < 0 ) + newRow = 0; + return _model->index( newRow, 0 ); + } + case MoveRight: + case MovePageUp: + { + int newRow = current.row() + itemsPerPage(); + if( newRow >= _model->rowCount() ) + newRow = _model->rowCount() - 1; + return _model->index( newRow, 0 ); + } + case MovePrevious: + case MoveUp: + { + int newRow = current.row() - 1; + if( newRow < 0 ) + newRow = 0; + return _model->index( newRow, 0 ); + } + case MoveNext: + case MoveDown: + { + int newRow = current.row() + 1; + if( newRow >= _model->rowCount() ) + newRow = _model->rowCount() - 1; + return _model->index( newRow, 0 ); + } + case MoveHome: + return _model->index(0, 0); + case MoveEnd: + return _model->index(_model->rowCount() - 1, 0); + } + + return current; } int KrInterBriefView::horizontalOffset() const @@ -632,18 +764,41 @@ void KrInterBriefView::setSelection(const QRect&, QFlags<QItemSelectionModel::SelectionFlag>) { - /* TODO */ + /* Don't do anything, selections are handled by the mouse handler and not by QAbstractItemView */ } -QRegion KrInterBriefView::visualRegionForSelection(const QItemSelection&) const +QRegion KrInterBriefView::visualRegionForSelection(const QItemSelection &selection) const { - /* TODO */ - return QRegion(); + if (selection.isEmpty()) + return QRegion(); + + QRegion selectionRegion; + for (int i = 0; i < selection.count(); ++i) { + QItemSelectionRange range = selection.at(i); + if (!range.isValid()) + continue; + QModelIndex leftIndex = range.topLeft(); + if (!leftIndex.isValid()) + continue; + const QRect leftRect = visualRect(leftIndex); + int top = leftRect.top(); + QModelIndex rightIndex = range.bottomRight(); + if (!rightIndex.isValid()) + continue; + const QRect rightRect = visualRect(rightIndex); + int bottom = rightRect.bottom(); + if (top > bottom) + qSwap<int>(top, bottom); + int height = bottom - top + 1; + QRect combined = leftRect|rightRect; + combined.setX(range.left()); + selectionRegion += combined; + } + return selectionRegion; } void KrInterBriefView::paintEvent(QPaintEvent *e) { - /* TODO */ QStyleOptionViewItemV4 option = viewOptions(); option.widget = this; option.decorationSize = QSize( _fileIconSize, _fileIconSize ); @@ -652,16 +807,20 @@ QModelIndex curr = currentIndex(); + QVector<QModelIndex> intersectVector; + QRect area = e->rect(); + area.adjust( horizontalOffset(), verticalOffset(), horizontalOffset(), verticalOffset() ); + intersectionSet( area, intersectVector ); - for( int i=0; i != _model->rowCount(); i++ ) + foreach( QModelIndex mndx, intersectVector ) { option.state = QStyle::State_None; - option.rect = visualRect( _model->index( i, 0 ) ); + option.rect = visualRect( mndx ); painter.save(); - bool focus = curr.isValid() && curr.row() == i && hasFocus(); + bool focus = curr.isValid() && curr.row() == mndx.row() && hasFocus(); - itemDelegate()->paint(&painter, option, _model->index( i, 0 ) ); + itemDelegate()->paint(&painter, option, mndx ); if( focus ) { QStyleOptionFocusRect o; @@ -683,11 +842,38 @@ iconSize = _fileIconSize; if( iconSize > textHeight ) height = iconSize; + if( height == 0 ) + height++; return height; } void KrInterBriefView::updateGeometries() { + if( _header ) + { + QSize hint = _header->sizeHint(); + setViewportMargins(0, hint.height(), 0, 0); + QRect vg = viewport()->geometry(); + QRect geometryRect(vg.left(), vg.top() - hint.height(), vg.width(), hint.height()); + _header->setGeometry(geometryRect); + + int items = 0; + for( int i=0; i!= _header->count(); i++ ) + if( !_header->isSectionHidden( i ) ) + items++; + if( items == 0 ) + items++; + + int sectWidth = viewport()->width() / items; + for( int i=0; i!= _header->count(); i++ ) + if( !_header->isSectionHidden( i ) ) + _header->resizeSection( i, sectWidth ); + + QMetaObject::invokeMethod(_header, "updateGeometries"); + } + + + if (_model->rowCount() <= 0 ) horizontalScrollBar()->setRange(0, 0); else @@ -735,6 +921,8 @@ int column = _model->convertSortOrderFromKrViewProperties( mode, sortDir ); if( column == _model->getLastSortOrder() && sortDir == _model->getLastSortDir() ) sortDir = (sortDir == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder; + + _header->setSortIndicator(column, sortDir); _model->sort( column, sortDir ); } @@ -755,4 +943,39 @@ } return textWidth; -} \ No newline at end of file +} + +void KrInterBriefView::intersectionSet( const QRect &rect, QVector<QModelIndex> &ndxList ) +{ + int maxNdx = _model->rowCount(); + int width = (viewport()->width())/_numOfColumns; + if( (viewport()->width())%_numOfColumns ) + width++; + + int height = getItemHeight(); + int items = viewport()->height() / height; + if( items == 0 ) + items++; + + int xmin = -1; + int ymin = -1; + int xmax = -1; + int ymax = -1; + + xmin = rect.x() / width; + ymin = rect.y() / height; + xmax = ( rect.x() + rect.width() ) / width; + if(( rect.x() + rect.width() ) % width ) + xmax++; + ymax = ( rect.y() + rect.height() ) / height; + if(( rect.y() + rect.height() ) % height ) + ymax++; + + for( int i=ymin; i < ymax; i++ ) + for( int j=xmin; j < xmax; j++ ) + { + int ndx = j * items + i; + if( ndx < maxNdx ) + ndxList.append( _model->index( ndx, 0 ) ); + } +} Modified: trunk/krusader_kde4/krusader/Panel/krinterbriefview.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterbriefview.h 2009-02-27 21:58:10 UTC (rev 6234) +++ trunk/krusader_kde4/krusader/Panel/krinterbriefview.h 2009-03-02 19:34:12 UTC (rev 6235) @@ -27,6 +27,7 @@ class KrInterBriefViewItem; class KrMouseHandler; class KrVfsModel; +class QHeaderView; class KrInterBriefView : public QAbstractItemView, public KrView { friend class KrInterBriefViewItem; @@ -113,6 +114,8 @@ int getItemHeight() const; int elementWidth( const QModelIndex & index ); + void intersectionSet( const QRect &, QVector<QModelIndex> & ); + private: KrVfsModel *_model; KrMouseHandler *_mouseHandler; @@ -120,5 +123,6 @@ QFont _viewFont; int _numOfColumns; int _fileIconSize; + QHeaderView * _header; }; #endif // __krinterbriefview__ Modified: trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-02-27 21:58:10 UTC (rev 6234) +++ trunk/krusader_kde4/krusader/Panel/krinterdetailedview.cpp 2009-03-02 19:34:12 UTC (rev 6235) @@ -511,8 +511,7 @@ { KMenu popup( this ); popup.setTitle( i18n("Columns")); -// -// bool refresh = false; + bool hasExtension = !isColumnHidden( KrVfsModel::Extension ); bool hasMime = !isColumnHidden( KrVfsModel::Mime ); bool hasSize = !isColumnHidden( KrVfsModel::Size ); Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-02-27 21:58:10 UTC (rev 6234) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-03-02 19:34:12 UTC (rev 6235) @@ -26,7 +26,7 @@ KrMouseHandler::KrMouseHandler( KrView * view, int contextMenuShift ) : _view( view ), _rightClickedItem( 0 ), _contextMenuTimer(), _contextMenuShift( contextMenuShift ), _singleClicked( false ), _singleClickTime(), - _renameTimer(), _dragStartPos( -1, -1 ) + _renameTimer(), _dragStartPos( -1, -1 ), _emptyContextMenu( false ) { KConfigGroup grpSvr( krConfig, "Look&Feel" ); // decide on single click/double click selection @@ -37,6 +37,7 @@ bool KrMouseHandler::mousePressEvent( QMouseEvent *e ) { + _rightClickedItem = 0; KrViewItem * item = _view->getKrViewItemAt( e->pos() ); if( !_view->isFocused() ) _view->op()->emitNeedFocus(); @@ -112,8 +113,8 @@ } } _view->setCurrentKrViewItem( item ); - handleContextMenu( item, e->globalPos() ); } + handleContextMenu( item, e->globalPos() ); e->accept(); return true; } @@ -271,23 +272,27 @@ { if (_rightClickedItem) _rightClickedItem->setSelected(true); - _view->op()->emitContextMenu( _contextMenuPoint ); + if( _emptyContextMenu ) + _view->op()->emitEmptyContextMenu( _contextMenuPoint ); + else + _view->op()->emitContextMenu( _contextMenuPoint ); } void KrMouseHandler::handleContextMenu( KrViewItem * it, const QPoint & pos ) { if ( !_view->isFocused() ) _view->op()->emitNeedFocus(); - if ( !it ) - return; - if( it->isDummy() ) - return; int i = KrSelectionMode::getSelectionHandler()->showContextMenu(); _contextMenuPoint = QPoint( pos.x(), pos.y() - _contextMenuShift ); if (i < 0) { - _view->setCurrentKrViewItem( it ); - _view->op()->emitContextMenu( _contextMenuPoint ); + if ( !it || it->isDummy() ) + _view->op()->emitEmptyContextMenu( _contextMenuPoint ); + else { + _view->setCurrentKrViewItem( it ); + _view->op()->emitContextMenu( _contextMenuPoint ); + } } else if (i > 0) { + _emptyContextMenu = !it || it->isDummy(); _contextMenuTimer.setSingleShot( true ); _contextMenuTimer.start(i); } Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-02-27 21:58:10 UTC (rev 6234) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-03-02 19:34:12 UTC (rev 6235) @@ -70,6 +70,7 @@ QTime _singleClickTime; QTimer _renameTimer; QPoint _dragStartPos; + bool _emptyContextMenu; }; #endif /* __KR_MOUSE_HANDLER */ Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-02-27 21:58:10 UTC (rev 6234) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.cpp 2009-03-02 19:34:12 UTC (rev 6235) @@ -128,7 +128,8 @@ KrVfsModel::KrVfsModel( KrView * view ): QAbstractListModel(0), _extensionEnabled( true ), _view( view ), _lastSortOrder( KrVfsModel::Name ), _lastSortDir(Qt::AscendingOrder), - _dummyVfile( 0 ), _ready( false ), _justForSizeHint( false ) + _dummyVfile( 0 ), _ready( false ), _justForSizeHint( false ), + _alternatingTable( false ) { KConfigGroup grpSvr( krConfig, "Look&Feel" ); _defaultFont = grpSvr.readEntry( "Filelist Font", *_FilelistFont ); @@ -332,7 +333,16 @@ { KrColorItemType colorItemType; colorItemType.m_activePanel = (_view == ACTIVE_PANEL->view); - colorItemType.m_alternateBackgroundColor = (index.row() & 1); + int actRow = index.row(); + if( _alternatingTable ) + { + int itemNum = _view->itemsPerPage(); + if( itemNum == 0 ) + itemNum++; + if( ( itemNum & 1 ) == 0 ) + actRow += (actRow / itemNum ); + } + colorItemType.m_alternateBackgroundColor = (actRow & 1); colorItemType.m_currentItem = _view->getCurrentIndex() == index; colorItemType.m_selectedItem = _view->isSelected( index ); if (vf->vfile_isSymLink()) Modified: trunk/krusader_kde4/krusader/Panel/krvfsmodel.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-02-27 21:58:10 UTC (rev 6234) +++ trunk/krusader_kde4/krusader/Panel/krvfsmodel.h 2009-03-02 19:34:12 UTC (rev 6235) @@ -36,7 +36,6 @@ inline const KrViewProperties * properties() const { return _view->properties(); } void sort() { sort( _lastSortOrder, _lastSortDir ); } void clear(); - virtual void sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ); vfile * vfileAt( const QModelIndex &index ); vfile *dummyVfile() const { return _dummyVfile; } const QModelIndex & vfileIndex( vfile * ); @@ -49,7 +48,11 @@ Qt::SortOrder getLastSortDir() { return _lastSortDir; } int getLastSortOrder() { return _lastSortOrder; } + void setAlternatingTable( bool altTable ) { _alternatingTable = altTable; } +public slots: + virtual void sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ); + protected: QString nameWithoutExtension( const vfile * vf, bool checkEnabled = true ) const; @@ -66,5 +69,6 @@ QFont _defaultFont; bool _justForSizeHint; int _fileIconSize; + bool _alternatingTable; }; #endif // __krvfsmodel__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ck...@us...> - 2009-04-10 05:18:22
|
Revision: 6287 http://krusader.svn.sourceforge.net/krusader/?rev=6287&view=rev Author: ckarai Date: 2009-04-10 05:18:10 +0000 (Fri, 10 Apr 2009) Log Message: ----------- Fixed: mouse handling problem in the new views Modified Paths: -------------- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp trunk/krusader_kde4/krusader/Panel/krmousehandler.h Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-04-09 08:19:09 UTC (rev 6286) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.cpp 2009-04-10 05:18:10 UTC (rev 6287) @@ -37,7 +37,7 @@ bool KrMouseHandler::mousePressEvent( QMouseEvent *e ) { - _rightClickedItem = 0; + _rightClickedItem = _clickedItem = 0; KrViewItem * item = _view->getKrViewItemAt( e->pos() ); if( !_view->isFocused() ) _view->op()->emitNeedFocus(); @@ -53,9 +53,14 @@ if( KrSelectionMode::getSelectionHandler()->leftButtonPreservesSelection() ) item->setSelected(!item->isSelected()); else { - // clear the current selection - _view->changeSelection( KRQuery( "*" ), false, true); - item->setSelected( true ); + if( item->isSelected() ) + _clickedItem = item; + else + { + // clear the current selection + _view->changeSelection( KRQuery( "*" ), false, true); + item->setSelected( true ); + } } } _view->setCurrentKrViewItem( item ); @@ -107,9 +112,13 @@ } item->setSelected(!item->isSelected()); } else { - // clear the current selection - _view->changeSelection( KRQuery( "*" ), false, true); - item->setSelected( true ); + if( item->isSelected() ) { + _clickedItem = item; + } else { + // clear the current selection + _view->changeSelection( KRQuery( "*" ), false, true); + item->setSelected( true ); + } } } _view->setCurrentKrViewItem( item ); @@ -154,6 +163,21 @@ _dragStartPos = QPoint( -1, -1 ); KrViewItem * item = _view->getKrViewItemAt( e->pos() ); + if( item && item == _clickedItem ) + { + if(((e->button() == Qt::LeftButton) && ( e->modifiers() == Qt::NoModifier ) && + ( KrSelectionMode::getSelectionHandler()->leftButtonSelects() ) && + !( KrSelectionMode::getSelectionHandler()->leftButtonPreservesSelection() ) ) || + ((e->button() == Qt::RightButton) && ( e->modifiers() == Qt::NoModifier ) && + ( KrSelectionMode::getSelectionHandler()->rightButtonSelects() ) && + !( KrSelectionMode::getSelectionHandler()->rightButtonPreservesSelection() ))) + { + // clear the current selection + _view->changeSelection( KRQuery( "*" ), false, true); + item->setSelected( true ); + } + } + if( e->button() == Qt::RightButton ) { _rightClickedItem = 0; _contextMenuTimer.stop(); Modified: trunk/krusader_kde4/krusader/Panel/krmousehandler.h =================================================================== --- trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-04-09 08:19:09 UTC (rev 6286) +++ trunk/krusader_kde4/krusader/Panel/krmousehandler.h 2009-04-10 05:18:10 UTC (rev 6287) @@ -60,6 +60,7 @@ protected: KrView * _view; KrViewItem * _rightClickedItem; + KrViewItem * _clickedItem; bool _rightClickSelects; bool _singleClick; QPoint _contextMenuPoint; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |