1
/***************************************************************************
2
krinterbriefview.cpp - description
4
begin : Sat Feb 14 2009
5
copyright : (C) 2009+ by Csaba Karai
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
1
/*****************************************************************************
2
* Copyright (C) 2009 Csaba Karai <cskarai@freemail.hu> *
4
* This program is free software; you can redistribute it and/or modify *
5
* it under the terms of the GNU General Public License as published by *
6
* the Free Software Foundation; either version 2 of the License, or *
7
* (at your option) any later version. *
9
* This package is distributed in the hope that it will be useful, *
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12
* GNU General Public License for more details. *
14
* You should have received a copy of the GNU General Public License *
15
* along with this package; if not, write to the Free Software *
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
17
*****************************************************************************/
18
19
#include "krinterbriefview.h"
19
#include "krviewfactory.h"
20
#include "krinterviewitemdelegate.h"
21
#include "krviewitem.h"
22
#include "krvfsmodel.h"
23
#include "../VFS/krpermhandler.h"
24
#include "../defaults.h"
25
#include "krmousehandler.h"
26
#include "krcolorcache.h"
28
#include <kdirlister.h>
30
22
#include <QDirModel>
31
23
#include <QHashIterator>
32
24
#include <QHeaderView>
33
#include "../GUI/krstyleproxy.h"
35
25
#include <QPainter>
36
26
#include <QScrollBar>
37
#include <QHeaderView>
39
28
#include <QItemSelection>
40
29
#include <QItemSelectionRange>
33
#include <kdirlister.h>
35
#include "krviewfactory.h"
36
#include "krinterviewitemdelegate.h"
37
#include "krviewitem.h"
38
#include "krvfsmodel.h"
39
#include "krmousehandler.h"
40
#include "krcolorcache.h"
41
#include "../VFS/krpermhandler.h"
42
#include "../defaults.h"
43
#include "../GUI/krstyleproxy.h"
43
45
// dummy. remove this class when no longer needed
44
46
class KrInterBriefViewItem: public KrViewItem
47
KrInterBriefViewItem(KrInterBriefView *parent, vfile *vf): KrViewItem(vf, parent->properties()) {
50
if( parent->_model->dummyVfile() == vf )
54
bool isSelected() const {
55
const QModelIndex & ndx = _view->_model->vfileIndex( _vfile );
56
return _view->selectionModel()->isSelected( ndx );
58
void setSelected( bool s ) {
59
const QModelIndex & ndx = _view->_model->vfileIndex( _vfile );
60
_view->selectionModel()->select( ndx, ( s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect )
61
| QItemSelectionModel::Rows );
63
QRect itemRect() const {
64
const QModelIndex & ndx = _view->_model->vfileIndex( _vfile );
65
return _view->visualRect( ndx );
67
static void itemHeightChanged()
69
} // force the items to resize when icon/font size change
49
KrInterBriefViewItem(KrInterBriefView *parent, vfile *vf): KrViewItem(vf, parent->properties()) {
52
if (parent->_model->dummyVfile() == vf)
56
bool isSelected() const {
57
const QModelIndex & ndx = _view->_model->vfileIndex(_vfile);
58
return _view->selectionModel()->isSelected(ndx);
60
void setSelected(bool s) {
61
const QModelIndex & ndx = _view->_model->vfileIndex(_vfile);
62
_view->selectionModel()->select(ndx, (s ? QItemSelectionModel::Select : QItemSelectionModel::Deselect)
63
| QItemSelectionModel::Rows);
65
QRect itemRect() const {
66
const QModelIndex & ndx = _view->_model->vfileIndex(_vfile);
67
return _view->visualRect(ndx);
69
static void itemHeightChanged() {
70
} // force the items to resize when icon/font size change
74
KrInterBriefView * _view;
75
KrInterBriefView * _view;
78
79
// code used to register the view
79
#define INTERBRIEFVIEW_ID 3
80
KrViewInstance interBriefView( INTERBRIEFVIEW_ID, i18n( "&Experimental View" ), 0 /*Qt::ALT + Qt::SHIFT + Qt::Key_D*/,
81
KrInterBriefView::create, KrInterBriefViewItem::itemHeightChanged );
80
#define INTERBRIEFVIEW_ID 1
81
KrViewInstance interBriefView(INTERBRIEFVIEW_ID, i18n("&Brief View"), Qt::ALT + Qt::SHIFT + Qt::Key_B,
82
KrInterBriefView::create, KrInterBriefViewItem::itemHeightChanged);
82
83
// end of register code
84
KrInterBriefView::KrInterBriefView( QWidget *parent, bool &left, KConfig *cfg ):
86
QAbstractItemView(parent)
85
KrInterBriefView::KrInterBriefView(QWidget *parent, bool &left, KConfig *cfg):
87
QAbstractItemView(parent)
90
// fix the context menu problem
91
int j = QFontMetrics( font() ).height() * 2;
92
_mouseHandler = new KrMouseHandler( this, j );
93
connect( _mouseHandler, SIGNAL( renameCurrentItem() ), this, SLOT( renameCurrentItem() ) );
95
_nameInKConfig=QString( "KrInterBriefView" ) + QString( ( left ? "Left" : "Right" ) ) ;
96
KConfigGroup group( krConfig, "Private" );
98
KConfigGroup grpSvr( _config, "Look&Feel" );
99
_viewFont = grpSvr.readEntry( "Filelist Font", *_FilelistFont );
100
_fileIconSize = (grpSvr.readEntry("Filelist Icon Size",_FilelistIconSize)).toInt();
102
_model = new KrVfsModel( this );
103
this->setModel(_model);
104
_model->sort( KrVfsModel::Name, Qt::AscendingOrder );
105
_model->setExtensionEnabled( false );
106
_model->setAlternatingTable( true );
107
connect( _model, SIGNAL( layoutChanged() ), this, SLOT( slotMakeCurrentVisible() ) );
108
//header()->installEventFilter( this );
110
setSelectionMode( QAbstractItemView::NoSelection );
112
setStyle( new KrStyleProxy() );
113
setItemDelegate( new KrInterViewItemDelegate() );
114
setMouseTracking( true );
115
setAcceptDrops( true );
116
setDropIndicatorShown( true );
118
connect( &KrColorCache::getColorCache(), SIGNAL( colorsRefreshed() ), this, SLOT( refreshColors() ) );
91
// fix the context menu problem
92
int j = QFontMetrics(font()).height() * 2;
93
_mouseHandler = new KrMouseHandler(this, j);
94
connect(_mouseHandler, SIGNAL(renameCurrentItem()), this, SLOT(renameCurrentItem()));
96
_nameInKConfig = QString("KrInterBriefView") + QString((left ? "Left" : "Right")) ;
97
KConfigGroup group(krConfig, "Private");
99
KConfigGroup grpSvr(_config, "Look&Feel");
100
_viewFont = grpSvr.readEntry("Filelist Font", *_FilelistFont);
101
_fileIconSize = (grpSvr.readEntry("Filelist Icon Size", _FilelistIconSize)).toInt();
103
_model = new KrVfsModel(this);
104
this->setModel(_model);
105
_model->sort(KrVfsModel::Name, Qt::AscendingOrder);
106
_model->setExtensionEnabled(false);
107
_model->setAlternatingTable(true);
108
//header()->installEventFilter( this );
110
setSelectionMode(QAbstractItemView::NoSelection);
112
setStyle(new KrStyleProxy());
113
setItemDelegate(new KrInterViewItemDelegate());
114
setMouseTracking(true);
115
setAcceptDrops(true);
116
setDropIndicatorShown(true);
118
connect(&KrColorCache::getColorCache(), SIGNAL(colorsRefreshed()), this, SLOT(refreshColors()));
121
121
KrInterBriefView::~KrInterBriefView()
128
delete _mouseHandler;
129
QHashIterator< vfile *, KrInterBriefViewItem *> it( _itemHash );
130
while( it.hasNext() )
131
delete it.next().value();
128
delete _mouseHandler;
129
QHashIterator< vfile *, KrInterBriefViewItem *> it(_itemHash);
131
delete it.next().value();
135
135
KrViewItem* KrInterBriefView::findItemByName(const QString &name)
137
if (!_model->ready())
140
QModelIndex ndx = _model->nameIndex( name );
143
return getKrInterViewItem( ndx );
137
if (!_model->ready())
140
QModelIndex ndx = _model->nameIndex(name);
143
return getKrInterViewItem(ndx);
146
void KrInterBriefView::currentChanged(const QModelIndex & current, const QModelIndex & previous)
148
if (_model->ready()) {
149
KrViewItem * item = getKrInterViewItem(currentIndex());
150
op()->emitCurrentChanged(item);
152
QAbstractItemView::currentChanged(current, previous);
146
155
QString KrInterBriefView::getCurrentItem() const
148
if (!_model->ready())
151
vfile * vf = _model->vfileAt( currentIndex() );
154
return vf->vfile_getName();
157
if (!_model->ready())
160
vfile * vf = _model->vfileAt(currentIndex());
163
return vf->vfile_getName();
157
166
KrViewItem* KrInterBriefView::getCurrentKrViewItem()
159
if (!_model->ready())
168
if (!_model->ready())
162
return getKrInterViewItem( currentIndex() );
171
return getKrInterViewItem(currentIndex());
165
174
KrViewItem* KrInterBriefView::getFirst()
167
if (!_model->ready())
170
return getKrInterViewItem( _model->index(0, 0, QModelIndex()));
176
if (!_model->ready())
179
return getKrInterViewItem(_model->index(0, 0, QModelIndex()));
173
182
KrViewItem* KrInterBriefView::getKrViewItemAt(const QPoint &vp)
175
if (!_model->ready())
178
return getKrInterViewItem( indexAt( vp ) );
184
if (!_model->ready())
187
return getKrInterViewItem(indexAt(vp));
181
190
KrViewItem* KrInterBriefView::getLast()
183
if (!_model->ready())
186
return getKrInterViewItem(_model->index(_model->rowCount()-1, 0, QModelIndex()));
192
if (!_model->ready())
195
return getKrInterViewItem(_model->index(_model->rowCount() - 1, 0, QModelIndex()));
189
198
KrViewItem* KrInterBriefView::getNext(KrViewItem *current)
191
vfile* vf = (vfile *)current->getVfile();
192
QModelIndex ndx = _model->vfileIndex( vf );
193
if( ndx.row() >= _model->rowCount()-1 )
195
return getKrInterViewItem( _model->index(ndx.row() + 1, 0, QModelIndex()));
200
vfile* vf = (vfile *)current->getVfile();
201
QModelIndex ndx = _model->vfileIndex(vf);
202
if (ndx.row() >= _model->rowCount() - 1)
204
return getKrInterViewItem(_model->index(ndx.row() + 1, 0, QModelIndex()));
198
207
KrViewItem* KrInterBriefView::getPrev(KrViewItem *current)
200
vfile* vf = (vfile *)current->getVfile();
201
QModelIndex ndx = _model->vfileIndex( vf );
204
return getKrInterViewItem( _model->index(ndx.row() - 1, 0, QModelIndex()));
209
vfile* vf = (vfile *)current->getVfile();
210
QModelIndex ndx = _model->vfileIndex(vf);
213
return getKrInterViewItem(_model->index(ndx.row() - 1, 0, QModelIndex()));
207
216
void KrInterBriefView::slotMakeCurrentVisible()
209
scrollTo( currentIndex() );
218
scrollTo(currentIndex());
212
221
void KrInterBriefView::makeItemVisible(const KrViewItem *item)
214
vfile* vf = (vfile *)item->getVfile();
215
QModelIndex ndx = _model->vfileIndex( vf );
225
vfile* vf = (vfile *)item->getVfile();
226
QModelIndex ndx = _model->vfileIndex(vf);
220
231
void KrInterBriefView::setCurrentKrViewItem(KrViewItem *item)
223
setCurrentIndex( QModelIndex() );
226
vfile* vf = (vfile *)item->getVfile();
227
QModelIndex ndx = _model->vfileIndex( vf );
228
if( ndx.isValid() && ndx.row() != currentIndex().row() ) {
229
_mouseHandler->cancelTwoClickRename();
230
setCurrentIndex( ndx );
234
setCurrentIndex(QModelIndex());
237
vfile* vf = (vfile *)item->getVfile();
238
QModelIndex ndx = _model->vfileIndex(vf);
239
if (ndx.isValid() && ndx.row() != currentIndex().row()) {
240
_mouseHandler->cancelTwoClickRename();
241
setCurrentIndex(ndx);
234
245
KrViewItem* KrInterBriefView::preAddItem(vfile *vf)
236
return getKrInterViewItem( _model->addItem( vf ) );
247
return getKrInterViewItem(_model->addItem(vf));
239
250
bool KrInterBriefView::preDelItem(KrViewItem *item)
243
QModelIndex ndx = _model->removeItem( (vfile *)item->getVfile() );
245
setCurrentIndex( ndx );
246
_itemHash.remove( (vfile *)item->getVfile() );
254
QModelIndex ndx = _model->removeItem((vfile *)item->getVfile());
256
setCurrentIndex(ndx);
257
_itemHash.remove((vfile *)item->getVfile());
250
261
void KrInterBriefView::redraw()
254
265
void KrInterBriefView::refreshColors()
256
if( _model->rowCount() != 0 )
257
_model->emitChanged();
267
if (_model->rowCount() != 0)
268
_model->emitChanged();
260
271
void KrInterBriefView::restoreSettings()
262
_numOfColumns = _properties->numberOfColumns;
264
KConfigGroup group( krConfig, nameInKConfig() );
266
int column = group.readEntry( "Sort Indicator Column", (int)KrVfsModel::Name );
267
bool isAscending = group.readEntry( "Ascending Sort Order", true );
268
Qt::SortOrder sortDir = isAscending ? Qt::AscendingOrder : Qt::DescendingOrder;
270
_header->setSortIndicator(column, sortDir);
271
_model->sort( column, sortDir );
273
_numOfColumns = _properties->numberOfColumns;
275
KConfigGroup group(krConfig, nameInKConfig());
277
int column = group.readEntry("Sort Indicator Column", (int)KrVfsModel::Name);
278
bool isAscending = group.readEntry("Ascending Sort Order", true);
279
Qt::SortOrder sortDir = isAscending ? Qt::AscendingOrder : Qt::DescendingOrder;
281
_header->setSortIndicator(column, sortDir);
282
_model->sort(column, sortDir);
274
285
void KrInterBriefView::saveSettings()
276
KConfigGroup group( krConfig, nameInKConfig() );
278
group.writeEntry( "Sort Indicator Column", (int)_model->getLastSortOrder() );
279
group.writeEntry( "Ascending Sort Order", (_model->getLastSortDir() == Qt::AscendingOrder ) );
287
KConfigGroup group(krConfig, nameInKConfig());
289
group.writeEntry("Sort Indicator Column", (int)_model->getLastSortOrder());
290
group.writeEntry("Ascending Sort Order", (_model->getLastSortDir() == Qt::AscendingOrder));
282
293
void KrInterBriefView::setCurrentItem(const QString& name)
284
QModelIndex ndx = _model->nameIndex( name );
286
setCurrentIndex( ndx );
289
void KrInterBriefView::prepareForActive() {
290
KrView::prepareForActive();
292
KrViewItem * current = getCurrentKrViewItem();
294
QString desc = current->description();
295
op()->emitItemDescription( desc );
299
void KrInterBriefView::prepareForPassive() {
300
KrView::prepareForPassive();
301
_mouseHandler->cancelTwoClickRename();
302
//if ( renameLineEdit() ->isVisible() )
303
//renameLineEdit() ->clearFocus();
306
int KrInterBriefView::itemsPerPage() {
307
int height = getItemHeight();
310
int numRows = viewport()->height() / height;
295
QModelIndex ndx = _model->nameIndex(name);
297
setCurrentIndex(ndx);
300
void KrInterBriefView::prepareForActive()
302
KrView::prepareForActive();
304
KrViewItem * current = getCurrentKrViewItem();
306
QString desc = current->description();
307
op()->emitItemDescription(desc);
311
void KrInterBriefView::prepareForPassive()
313
KrView::prepareForPassive();
314
_mouseHandler->cancelTwoClickRename();
315
//if ( renameLineEdit() ->isVisible() )
316
//renameLineEdit() ->clearFocus();
319
int KrInterBriefView::itemsPerPage()
321
int height = getItemHeight();
324
int numRows = viewport()->height() / height;
314
328
void KrInterBriefView::sort()
319
333
void KrInterBriefView::updateView()
337
void KrInterBriefView::updateItem(vfile * item)
341
_model->updateItem(item);
342
op()->emitSelectionChanged();
323
345
void KrInterBriefView::updateItem(KrViewItem* item)
327
_model->updateItem( (vfile *)item->getVfile() );
349
updateItem((vfile *)item->getVfile());
330
352
void KrInterBriefView::clear()
334
QHashIterator< vfile *, KrInterBriefViewItem *> it( _itemHash );
335
while( it.hasNext() )
336
delete it.next().value();
356
QHashIterator< vfile *, KrInterBriefViewItem *> it(_itemHash);
358
delete it.next().value();
341
363
void KrInterBriefView::addItems(vfs* v, bool addUpDir)
343
_model->setVfs(v, addUpDir);
344
_count = _model->rowCount();
348
this->setCurrentIndex(_model->index(0, 0));
349
if( !nameToMakeCurrent().isEmpty() )
350
setCurrentItem( nameToMakeCurrent() );
365
_model->setVfs(v, addUpDir);
366
_count = _model->rowCount();
370
this->setCurrentIndex(_model->index(0, 0));
371
if (!nameToMakeCurrent().isEmpty())
372
setCurrentItem(nameToMakeCurrent());
353
375
void KrInterBriefView::setup()
355
_header = new QHeaderView(Qt::Horizontal, this);
356
_header->setDefaultAlignment(Qt::AlignLeft|Qt::AlignVCenter);
357
_header->setParent( this );
358
_header->setModel( _model );
359
_header->hideSection( KrVfsModel::Mime );
360
_header->hideSection( KrVfsModel::Permissions );
361
_header->hideSection( KrVfsModel::KrPermissions );
362
_header->hideSection( KrVfsModel::Owner );
363
_header->hideSection( KrVfsModel::Group );
364
_header->setStretchLastSection( true );
365
_header->setResizeMode( QHeaderView::Fixed );
366
_header->setClickable( true );
367
_header->setSortIndicatorShown( true );
368
_header->setSortIndicator(KrVfsModel::Name, Qt::AscendingOrder);
369
connect(_header, SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
370
_model, SLOT(sort(int,Qt::SortOrder)));
371
_header->installEventFilter( this );
377
_header = new QHeaderView(Qt::Horizontal, this);
378
_header->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
379
_header->setParent(this);
380
_header->setModel(_model);
381
_header->hideSection(KrVfsModel::Mime);
382
_header->hideSection(KrVfsModel::Permissions);
383
_header->hideSection(KrVfsModel::KrPermissions);
384
_header->hideSection(KrVfsModel::Owner);
385
_header->hideSection(KrVfsModel::Group);
386
_header->setStretchLastSection(true);
387
_header->setResizeMode(QHeaderView::Fixed);
388
_header->setClickable(true);
389
_header->setSortIndicatorShown(true);
390
_header->setSortIndicator(KrVfsModel::Name, Qt::AscendingOrder);
391
connect(_header, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
392
_model, SLOT(sort(int, Qt::SortOrder)));
393
_header->installEventFilter(this);
376
398
void KrInterBriefView::initOperator()
378
_operator = new KrViewOperator(this, this);
379
// klistview emits selection changed, so chain them to operator
380
connect(selectionModel(), SIGNAL(selectionChanged( const QItemSelection &, const QItemSelection &)), _operator, SLOT(emitSelectionChanged()));
383
void KrInterBriefView::keyPressEvent( QKeyEvent *e )
385
if ( !e || !_model->ready() )
386
return ; // subclass bug
387
if(( e->key() != Qt::Key_Left && e->key() != Qt::Key_Right ) &&
388
( handleKeyEvent( e ) ) ) // did the view class handled the event?
390
switch ( e->key() ) {
393
if ( e->modifiers() == Qt::ControlModifier ) { // let the panel handle it
397
KrViewItem *i = getCurrentKrViewItem();
398
KrViewItem *newCurrent = i;
403
int num = itemsPerPage() + 1;
405
if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() );
407
while( i && num > 0 )
409
if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() );
416
setCurrentKrViewItem( newCurrent );
417
slotMakeCurrentVisible();
419
if ( e->modifiers() & Qt::ShiftModifier )
420
op()->emitSelectionChanged();
425
if ( e->modifiers() == Qt::ControlModifier ) { // let the panel handle it
429
KrViewItem *i = getCurrentKrViewItem();
430
KrViewItem *newCurrent = i;
435
int num = itemsPerPage() + 1;
437
if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() );
439
while( i && num > 0 )
441
if ( e->modifiers() & Qt::ShiftModifier ) i->setSelected( !i->isSelected() );
448
setCurrentKrViewItem( newCurrent );
449
slotMakeCurrentVisible();
451
if ( e->modifiers() & Qt::ShiftModifier )
452
op()->emitSelectionChanged();
456
QAbstractItemView::keyPressEvent( e );
460
void KrInterBriefView::mousePressEvent ( QMouseEvent * ev )
462
if( !_mouseHandler->mousePressEvent( ev ) )
463
QAbstractItemView::mousePressEvent( ev );
466
void KrInterBriefView::mouseReleaseEvent ( QMouseEvent * ev )
468
if( !_mouseHandler->mouseReleaseEvent( ev ) )
469
QAbstractItemView::mouseReleaseEvent( ev );
472
void KrInterBriefView::mouseDoubleClickEvent ( QMouseEvent *ev )
474
if( !_mouseHandler->mouseDoubleClickEvent( ev ) )
475
QAbstractItemView::mouseDoubleClickEvent( ev );
478
void KrInterBriefView::mouseMoveEvent ( QMouseEvent * ev )
480
if( !_mouseHandler->mouseMoveEvent( ev ) )
481
QAbstractItemView::mouseMoveEvent( ev );
484
void KrInterBriefView::wheelEvent ( QWheelEvent *ev )
486
if( !_mouseHandler->wheelEvent( ev ) )
487
QAbstractItemView::wheelEvent( ev );
490
void KrInterBriefView::dragEnterEvent ( QDragEnterEvent *ev )
492
if( !_mouseHandler->dragEnterEvent( ev ) )
493
QAbstractItemView::dragEnterEvent( ev );
496
void KrInterBriefView::dragMoveEvent ( QDragMoveEvent *ev )
498
QAbstractItemView::dragMoveEvent( ev );
499
_mouseHandler->dragMoveEvent( ev );
502
void KrInterBriefView::dragLeaveEvent ( QDragLeaveEvent *ev )
504
if( !_mouseHandler->dragLeaveEvent( ev ) )
505
QAbstractItemView::dragLeaveEvent( ev );
508
void KrInterBriefView::dropEvent ( QDropEvent *ev )
510
if( !_mouseHandler->dropEvent( ev ) )
511
QAbstractItemView::dropEvent( ev );
514
bool KrInterBriefView::event( QEvent * e )
516
_mouseHandler->otherEvent( e );
517
return QAbstractItemView::event( e );
520
KrInterBriefViewItem * KrInterBriefView::getKrInterViewItem( const QModelIndex & ndx )
524
vfile * vf = _model->vfileAt( ndx );
527
QHash<vfile *,KrInterBriefViewItem*>::iterator it = _itemHash.find( vf );
528
if( it == _itemHash.end() ) {
529
KrInterBriefViewItem * newItem = new KrInterBriefViewItem( this, vf );
530
_itemHash[ vf ] = newItem;
531
_dict.insert( vf->vfile_getName(), newItem );
537
void KrInterBriefView::selectRegion( KrViewItem *i1, KrViewItem *i2, bool select)
539
vfile* vf1 = (vfile *)i1->getVfile();
540
QModelIndex mi1 = _model->vfileIndex( vf1 );
541
vfile* vf2 = (vfile *)i2->getVfile();
542
QModelIndex mi2 = _model->vfileIndex( vf2 );
544
if( mi1.isValid() && mi2.isValid() )
555
for( int row = r1; row <= r2; row++ )
557
const QModelIndex & ndx = _model->index( row, 0 );
558
selectionModel()->select( ndx, ( select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect )
559
| QItemSelectionModel::Rows );
562
else if( mi1.isValid() && !mi2.isValid() )
563
i1->setSelected( select );
564
else if( mi2.isValid() && !mi1.isValid() )
565
i2->setSelected( select );
568
void KrInterBriefView::renameCurrentItem() {
569
QModelIndex cIndex = currentIndex();
570
QModelIndex nameIndex = _model->index( cIndex.row(), KrVfsModel::Name );
400
_operator = new KrViewOperator(this, this);
401
// klistview emits selection changed, so chain them to operator
402
connect(selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), _operator, SLOT(emitSelectionChanged()));
405
void KrInterBriefView::keyPressEvent(QKeyEvent *e)
407
if (!e || !_model->ready())
408
return ; // subclass bug
409
if ((e->key() != Qt::Key_Left && e->key() != Qt::Key_Right) &&
410
(handleKeyEvent(e))) // did the view class handled the event?
413
case Qt::Key_Right : {
414
if (e->modifiers() == Qt::ControlModifier) { // let the panel handle it
418
KrViewItem *i = getCurrentKrViewItem();
419
KrViewItem *newCurrent = i;
424
int num = itemsPerPage() + 1;
426
if (e->modifiers() & Qt::ShiftModifier) i->setSelected(!i->isSelected());
428
while (i && num > 0) {
429
if (e->modifiers() & Qt::ShiftModifier) i->setSelected(!i->isSelected());
436
setCurrentKrViewItem(newCurrent);
437
slotMakeCurrentVisible();
439
if (e->modifiers() & Qt::ShiftModifier)
440
op()->emitSelectionChanged();
443
case Qt::Key_Left : {
444
if (e->modifiers() == Qt::ControlModifier) { // let the panel handle it
448
KrViewItem *i = getCurrentKrViewItem();
449
KrViewItem *newCurrent = i;
454
int num = itemsPerPage() + 1;
456
if (e->modifiers() & Qt::ShiftModifier) i->setSelected(!i->isSelected());
458
while (i && num > 0) {
459
if (e->modifiers() & Qt::ShiftModifier) i->setSelected(!i->isSelected());
466
setCurrentKrViewItem(newCurrent);
467
slotMakeCurrentVisible();
469
if (e->modifiers() & Qt::ShiftModifier)
470
op()->emitSelectionChanged();
474
QAbstractItemView::keyPressEvent(e);
478
void KrInterBriefView::mousePressEvent(QMouseEvent * ev)
480
if (!_mouseHandler->mousePressEvent(ev))
481
QAbstractItemView::mousePressEvent(ev);
484
void KrInterBriefView::mouseReleaseEvent(QMouseEvent * ev)
486
if (!_mouseHandler->mouseReleaseEvent(ev))
487
QAbstractItemView::mouseReleaseEvent(ev);
490
void KrInterBriefView::mouseDoubleClickEvent(QMouseEvent *ev)
492
if (!_mouseHandler->mouseDoubleClickEvent(ev))
493
QAbstractItemView::mouseDoubleClickEvent(ev);
496
void KrInterBriefView::mouseMoveEvent(QMouseEvent * ev)
498
if (!_mouseHandler->mouseMoveEvent(ev))
499
QAbstractItemView::mouseMoveEvent(ev);
502
void KrInterBriefView::wheelEvent(QWheelEvent *ev)
504
if (!_mouseHandler->wheelEvent(ev))
505
QAbstractItemView::wheelEvent(ev);
508
void KrInterBriefView::dragEnterEvent(QDragEnterEvent *ev)
510
if (!_mouseHandler->dragEnterEvent(ev))
511
QAbstractItemView::dragEnterEvent(ev);
514
void KrInterBriefView::dragMoveEvent(QDragMoveEvent *ev)
516
QAbstractItemView::dragMoveEvent(ev);
517
_mouseHandler->dragMoveEvent(ev);
520
void KrInterBriefView::dragLeaveEvent(QDragLeaveEvent *ev)
522
if (!_mouseHandler->dragLeaveEvent(ev))
523
QAbstractItemView::dragLeaveEvent(ev);
526
void KrInterBriefView::dropEvent(QDropEvent *ev)
528
if (!_mouseHandler->dropEvent(ev))
529
QAbstractItemView::dropEvent(ev);
532
bool KrInterBriefView::event(QEvent * e)
534
_mouseHandler->otherEvent(e);
535
return QAbstractItemView::event(e);
538
KrInterBriefViewItem * KrInterBriefView::getKrInterViewItem(const QModelIndex & ndx)
542
vfile * vf = _model->vfileAt(ndx);
545
QHash<vfile *, KrInterBriefViewItem*>::iterator it = _itemHash.find(vf);
546
if (it == _itemHash.end()) {
547
KrInterBriefViewItem * newItem = new KrInterBriefViewItem(this, vf);
548
_itemHash[ vf ] = newItem;
549
_dict.insert(vf->vfile_getName(), newItem);
555
void KrInterBriefView::selectRegion(KrViewItem *i1, KrViewItem *i2, bool select)
557
vfile* vf1 = (vfile *)i1->getVfile();
558
QModelIndex mi1 = _model->vfileIndex(vf1);
559
vfile* vf2 = (vfile *)i2->getVfile();
560
QModelIndex mi2 = _model->vfileIndex(vf2);
562
if (mi1.isValid() && mi2.isValid()) {
572
for (int row = r1; row <= r2; row++) {
573
const QModelIndex & ndx = _model->index(row, 0);
574
selectionModel()->select(ndx, (select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect)
575
| QItemSelectionModel::Rows);
577
} else if (mi1.isValid() && !mi2.isValid())
578
i1->setSelected(select);
579
else if (mi2.isValid() && !mi1.isValid())
580
i2->setSelected(select);
583
void KrInterBriefView::renameCurrentItem()
585
QModelIndex cIndex = currentIndex();
586
QModelIndex nameIndex = _model->index(cIndex.row(), KrVfsModel::Name);
576
592
bool KrInterBriefView::eventFilter(QObject *object, QEvent *event)
578
if( object == _header )
580
if( event->type() == QEvent::ContextMenu )
582
QContextMenuEvent *me = (QContextMenuEvent *)event;
583
showContextMenu( me->globalPos() );
590
void KrInterBriefView::showContextMenu( const QPoint & p )
593
popup.setTitle( i18n("Columns"));
597
for( int i=1; i <= MAX_BRIEF_COLS; i++ )
599
QAction *act = popup.addAction( QString( "%1" ).arg( i ) );
600
act->setData( QVariant( COL_ID + i ) );
601
act->setCheckable( true );
602
act->setChecked( properties()->numberOfColumns == i );
605
QAction * res = popup.exec( p );
607
if( res && res->data().canConvert<int>() )
608
result = res->data().toInt();
610
KConfigGroup group( krConfig, nameInKConfig() );
612
if( result > COL_ID && result <= COL_ID + MAX_BRIEF_COLS )
614
group.writeEntry( "Number Of Brief Columns", result - COL_ID );
615
_properties->numberOfColumns = result - COL_ID;
616
_numOfColumns = result - COL_ID;
621
bool KrInterBriefView::viewportEvent ( QEvent * event )
623
if( event->type() == QEvent::ToolTip )
625
QHelpEvent *he = static_cast<QHelpEvent*>(event);
626
const QModelIndex index = indexAt(he->pos());
628
if( index.isValid() )
630
int width = visualRect( index ).width();
631
int textWidth = elementWidth( index );
633
if( textWidth <= width )
640
return QAbstractItemView::viewportEvent( event );
594
if (object == _header) {
595
if (event->type() == QEvent::ContextMenu) {
596
QContextMenuEvent *me = (QContextMenuEvent *)event;
597
showContextMenu(me->globalPos());
604
void KrInterBriefView::showContextMenu(const QPoint & p)
607
popup.setTitle(i18n("Columns"));
611
for (int i = 1; i <= MAX_BRIEF_COLS; i++) {
612
QAction *act = popup.addAction(QString("%1").arg(i));
613
act->setData(QVariant(COL_ID + i));
614
act->setCheckable(true);
615
act->setChecked(properties()->numberOfColumns == i);
618
QAction * res = popup.exec(p);
620
if (res && res->data().canConvert<int>())
621
result = res->data().toInt();
623
KConfigGroup group(krConfig, nameInKConfig());
625
if (result > COL_ID && result <= COL_ID + MAX_BRIEF_COLS) {
626
group.writeEntry("Number Of Brief Columns", result - COL_ID);
627
_properties->numberOfColumns = result - COL_ID;
628
_numOfColumns = result - COL_ID;
633
bool KrInterBriefView::viewportEvent(QEvent * event)
635
if (event->type() == QEvent::ToolTip) {
636
QHelpEvent *he = static_cast<QHelpEvent*>(event);
637
const QModelIndex index = indexAt(he->pos());
639
if (index.isValid()) {
640
int width = visualRect(index).width();
641
int textWidth = elementWidth(index);
643
if (textWidth <= width) {
649
return QAbstractItemView::viewportEvent(event);
644
653
QRect KrInterBriefView::visualRect(const QModelIndex&ndx) const
646
int width = (viewport()->width())/_numOfColumns;
647
if( (viewport()->width())%_numOfColumns )
649
int height = getItemHeight();
650
int numRows = viewport()->height() / height;
653
int x = width * (ndx.row()/numRows);
654
int y = height * (ndx.row() % numRows );
655
return mapToViewport(QRect( x, y, width, height ));
655
int width = (viewport()->width()) / _numOfColumns;
656
if ((viewport()->width()) % _numOfColumns)
658
int height = getItemHeight();
659
int numRows = viewport()->height() / height;
662
int x = width * (ndx.row() / numRows);
663
int y = height * (ndx.row() % numRows);
664
return mapToViewport(QRect(x, y, width, height));
658
667
void KrInterBriefView::scrollTo(const QModelIndex &ndx, QAbstractItemView::ScrollHint hint)
660
const QRect rect = visualRect( ndx );
661
if (hint == EnsureVisible && viewport()->rect().contains(rect)) {
662
setDirtyRegion(rect);
666
const QRect area = viewport()->rect();
668
const bool leftOf = rect.left() < area.left();
669
const bool rightOf = rect.right() > area.right();
671
int horizontalValue = horizontalScrollBar()->value();
674
horizontalValue -= area.left() - rect.left();
676
horizontalValue += rect.right() - area.right();
678
horizontalScrollBar()->setValue( horizontalValue );
669
const QRect rect = visualRect(ndx);
670
if (hint == EnsureVisible && viewport()->rect().contains(rect)) {
671
setDirtyRegion(rect);
675
const QRect area = viewport()->rect();
677
const bool leftOf = rect.left() < area.left();
678
const bool rightOf = rect.right() > area.right();
680
int horizontalValue = horizontalScrollBar()->value();
683
horizontalValue -= area.left() - rect.left();
685
horizontalValue += rect.right() - area.right();
687
horizontalScrollBar()->setValue(horizontalValue);
681
690
QModelIndex KrInterBriefView::indexAt(const QPoint& p) const
683
int x = p.x() + horizontalOffset();
684
int y = p.y() + verticalOffset();
686
int width = (viewport()->width())/_numOfColumns;
687
if( (viewport()->width())%_numOfColumns )
689
int height = getItemHeight();
690
int numRows = viewport()->height() / height;
694
int xs = (x / width) * numRows;
696
return _model->index( xs + ys, 0 );
692
int x = p.x() + horizontalOffset();
693
int y = p.y() + verticalOffset();
695
int width = (viewport()->width()) / _numOfColumns;
696
if ((viewport()->width()) % _numOfColumns)
698
int height = getItemHeight();
699
int numRows = viewport()->height() / height;
703
int xs = (x / width) * numRows;
705
return _model->index(xs + ys, 0);
699
708
QModelIndex KrInterBriefView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers)
701
if( _model->rowCount() == 0 )
702
return QModelIndex();
704
QModelIndex current = currentIndex();
705
if (!current.isValid())
706
return _model->index( 0, 0 );
708
switch (cursorAction) {
712
int newRow = current.row() - itemsPerPage();
715
return _model->index( newRow, 0 );
720
int newRow = current.row() + itemsPerPage();
721
if( newRow >= _model->rowCount() )
722
newRow = _model->rowCount() - 1;
723
return _model->index( newRow, 0 );
728
int newRow = current.row() - 1;
731
return _model->index( newRow, 0 );
736
int newRow = current.row() + 1;
737
if( newRow >= _model->rowCount() )
738
newRow = _model->rowCount() - 1;
739
return _model->index( newRow, 0 );
742
return _model->index(0, 0);
744
return _model->index(_model->rowCount() - 1, 0);
710
if (_model->rowCount() == 0)
711
return QModelIndex();
713
QModelIndex current = currentIndex();
714
if (!current.isValid())
715
return _model->index(0, 0);
717
switch (cursorAction) {
720
int newRow = current.row() - itemsPerPage();
723
return _model->index(newRow, 0);
727
int newRow = current.row() + itemsPerPage();
728
if (newRow >= _model->rowCount())
729
newRow = _model->rowCount() - 1;
730
return _model->index(newRow, 0);
734
int newRow = current.row() - 1;
737
return _model->index(newRow, 0);
741
int newRow = current.row() + 1;
742
if (newRow >= _model->rowCount())
743
newRow = _model->rowCount() - 1;
744
return _model->index(newRow, 0);
747
return _model->index(0, 0);
749
return _model->index(_model->rowCount() - 1, 0);
750
755
int KrInterBriefView::horizontalOffset() const
752
return horizontalScrollBar()->value();
757
return horizontalScrollBar()->value();
755
760
int KrInterBriefView::verticalOffset() const
760
765
bool KrInterBriefView::isIndexHidden(const QModelIndex&ndx) const
762
return ndx.column() != 0;
767
return ndx.column() != 0;
765
770
void KrInterBriefView::setSelection(const QRect&, QFlags<QItemSelectionModel::SelectionFlag>)
767
/* Don't do anything, selections are handled by the mouse handler and not by QAbstractItemView */
772
/* Don't do anything, selections are handled by the mouse handler and not by QAbstractItemView */
770
775
QRegion KrInterBriefView::visualRegionForSelection(const QItemSelection &selection) const
772
if (selection.isEmpty())
775
QRegion selectionRegion;
776
for (int i = 0; i < selection.count(); ++i) {
777
QItemSelectionRange range = selection.at(i);
778
if (!range.isValid())
780
QModelIndex leftIndex = range.topLeft();
781
if (!leftIndex.isValid())
783
const QRect leftRect = visualRect(leftIndex);
784
int top = leftRect.top();
785
QModelIndex rightIndex = range.bottomRight();
786
if (!rightIndex.isValid())
788
const QRect rightRect = visualRect(rightIndex);
789
int bottom = rightRect.bottom();
791
qSwap<int>(top, bottom);
792
int height = bottom - top + 1;
793
QRect combined = leftRect|rightRect;
794
combined.setX(range.left());
795
selectionRegion += combined;
797
return selectionRegion;
777
if (selection.isEmpty())
780
QRegion selectionRegion;
781
for (int i = 0; i < selection.count(); ++i) {
782
QItemSelectionRange range = selection.at(i);
783
if (!range.isValid())
785
QModelIndex leftIndex = range.topLeft();
786
if (!leftIndex.isValid())
788
const QRect leftRect = visualRect(leftIndex);
789
int top = leftRect.top();
790
QModelIndex rightIndex = range.bottomRight();
791
if (!rightIndex.isValid())
793
const QRect rightRect = visualRect(rightIndex);
794
int bottom = rightRect.bottom();
796
qSwap<int>(top, bottom);
797
int height = bottom - top + 1;
798
QRect combined = leftRect | rightRect;
799
combined.setX(range.left());
800
selectionRegion += combined;
802
return selectionRegion;
800
805
void KrInterBriefView::paintEvent(QPaintEvent *e)
802
QStyleOptionViewItemV4 option = viewOptions();
803
option.widget = this;
804
option.decorationSize = QSize( _fileIconSize, _fileIconSize );
805
option.decorationPosition = QStyleOptionViewItem::Left;
806
QPainter painter( viewport() );
808
QModelIndex curr = currentIndex();
810
QVector<QModelIndex> intersectVector;
811
QRect area = e->rect();
812
area.adjust( horizontalOffset(), verticalOffset(), horizontalOffset(), verticalOffset() );
813
intersectionSet( area, intersectVector );
815
foreach( QModelIndex mndx, intersectVector )
817
option.state = QStyle::State_None;
818
option.rect = visualRect( mndx );
821
bool focus = curr.isValid() && curr.row() == mndx.row() && hasFocus();
823
itemDelegate()->paint(&painter, option, mndx );
826
QStyleOptionFocusRect o;
827
o.QStyleOption::operator=(option);
828
QPalette::ColorGroup cg = QPalette::Normal;
829
o.backgroundColor = option.palette.color(cg, QPalette::Background);
830
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, &painter);
807
QStyleOptionViewItemV4 option = viewOptions();
808
option.widget = this;
809
option.decorationSize = QSize(_fileIconSize, _fileIconSize);
810
option.decorationPosition = QStyleOptionViewItem::Left;
811
QPainter painter(viewport());
813
QModelIndex curr = currentIndex();
815
QVector<QModelIndex> intersectVector;
816
QRect area = e->rect();
817
area.adjust(horizontalOffset(), verticalOffset(), horizontalOffset(), verticalOffset());
818
intersectionSet(area, intersectVector);
820
foreach(const QModelIndex &mndx, intersectVector) {
821
option.state = QStyle::State_None;
822
option.rect = visualRect(mndx);
825
bool focus = curr.isValid() && curr.row() == mndx.row() && hasFocus();
827
itemDelegate()->paint(&painter, option, mndx);
830
QStyleOptionFocusRect o;
831
o.QStyleOption::operator=(option);
832
QPalette::ColorGroup cg = QPalette::Normal;
833
o.backgroundColor = option.palette.color(cg, QPalette::Background);
834
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, &painter);
837
int KrInterBriefView::getItemHeight() const {
838
int textHeight = QFontMetrics( _viewFont ).height();
839
int height = textHeight;
841
if( properties()->displayIcons )
842
iconSize = _fileIconSize;
843
if( iconSize > textHeight )
841
int KrInterBriefView::getItemHeight() const
843
int textHeight = QFontMetrics(_viewFont).height();
844
int height = textHeight;
846
if (properties()->displayIcons)
847
iconSize = _fileIconSize;
848
if (iconSize > textHeight)
850
855
void KrInterBriefView::updateGeometries()
854
QSize hint = _header->sizeHint();
855
setViewportMargins(0, hint.height(), 0, 0);
856
QRect vg = viewport()->geometry();
857
QRect geometryRect(vg.left(), vg.top() - hint.height(), vg.width(), hint.height());
858
_header->setGeometry(geometryRect);
861
for( int i=0; i!= _header->count(); i++ )
862
if( !_header->isSectionHidden( i ) )
867
int sectWidth = viewport()->width() / items;
868
for( int i=0; i!= _header->count(); i++ )
869
if( !_header->isSectionHidden( i ) )
870
_header->resizeSection( i, sectWidth );
872
QMetaObject::invokeMethod(_header, "updateGeometries");
877
if (_model->rowCount() <= 0 )
878
horizontalScrollBar()->setRange(0, 0);
881
int itemsPerColumn = viewport()->height() / getItemHeight();
882
if( itemsPerColumn <= 0 )
884
int columnWidth = (viewport()->width())/_numOfColumns;
885
if( (viewport()->width())%_numOfColumns )
887
int maxWidth = _model->rowCount() / itemsPerColumn;
888
if( _model->rowCount() % itemsPerColumn )
890
maxWidth *= columnWidth;
891
if( maxWidth > viewport()->width() )
893
horizontalScrollBar()->setSingleStep(columnWidth);
894
horizontalScrollBar()->setPageStep(columnWidth * _numOfColumns);
895
horizontalScrollBar()->setRange(0, maxWidth - viewport()->width());
897
horizontalScrollBar()->setRange(0, 0);
901
QAbstractItemView::updateGeometries();
858
QSize hint = _header->sizeHint();
859
setViewportMargins(0, hint.height(), 0, 0);
860
QRect vg = viewport()->geometry();
861
QRect geometryRect(vg.left(), vg.top() - hint.height(), vg.width(), hint.height());
862
_header->setGeometry(geometryRect);
865
for (int i = 0; i != _header->count(); i++)
866
if (!_header->isSectionHidden(i))
871
int sectWidth = viewport()->width() / items;
872
for (int i = 0; i != _header->count(); i++)
873
if (!_header->isSectionHidden(i))
874
_header->resizeSection(i, sectWidth);
876
QMetaObject::invokeMethod(_header, "updateGeometries");
881
if (_model->rowCount() <= 0)
882
horizontalScrollBar()->setRange(0, 0);
884
int itemsPerColumn = viewport()->height() / getItemHeight();
885
if (itemsPerColumn <= 0)
887
int columnWidth = (viewport()->width()) / _numOfColumns;
888
if ((viewport()->width()) % _numOfColumns)
890
int maxWidth = _model->rowCount() / itemsPerColumn;
891
if (_model->rowCount() % itemsPerColumn)
893
maxWidth *= columnWidth;
894
if (maxWidth > viewport()->width()) {
895
horizontalScrollBar()->setSingleStep(columnWidth);
896
horizontalScrollBar()->setPageStep(columnWidth * _numOfColumns);
897
horizontalScrollBar()->setRange(0, maxWidth - viewport()->width());
899
horizontalScrollBar()->setRange(0, 0);
903
QAbstractItemView::updateGeometries();
904
906
QRect KrInterBriefView::mapToViewport(const QRect &rect) const