1 /*****************************************************************************
2 * Copyright (C) 2007 by Peter Penz <peter.penz@gmx.at> *
4 * This library is free software; you can redistribute it and/or *
5 * modify it under the terms of the GNU Library General Public *
6 * License version 2 as published by the Free Software Foundation. *
8 * This library is distributed in the hope that it will be useful, *
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
11 * Library General Public License for more details. *
13 * You should have received a copy of the GNU Library General Public License *
14 * along with this library; see the file COPYING.LIB. If not, write to *
15 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
16 * Boston, MA 02110-1301, USA. *
17 *****************************************************************************/
19 #include "kdiroperatordetailview_p.h"
21 #include <kdirlister.h>
22 #include <kdirmodel.h>
25 #include <QtCore/QEvent>
26 #include <QtCore/QTimer>
27 #include <QtGui/QAbstractProxyModel>
28 #include <QtGui/QApplication>
29 #include <QtGui/QHeaderView>
30 #include <QtGui/QListView>
31 #include <QtGui/QResizeEvent>
32 #include <QtGui/QScrollBar>
34 KDirOperatorDetailView::KDirOperatorDetailView(QWidget
*parent
) :
36 m_resizeColumns(true), m_hideDetailColumns(false)
38 setRootIsDecorated(false);
39 setSortingEnabled(true);
40 setUniformRowHeights(true);
41 setDragDropMode(QListView::DragOnly
);
42 setSelectionBehavior(QAbstractItemView::SelectRows
);
43 setEditTriggers(QAbstractItemView::NoEditTriggers
);
44 setVerticalScrollMode(QListView::ScrollPerPixel
);
45 setHorizontalScrollMode(QListView::ScrollPerPixel
);
48 KDirOperatorDetailView::~KDirOperatorDetailView()
52 void KDirOperatorDetailView::setModel(QAbstractItemModel
*model
)
54 if (model
->rowCount() == 0) {
55 // The model is empty. Assure that the columns get automatically resized
56 // until the loading has been finished.
57 QAbstractProxyModel
*proxyModel
= static_cast<QAbstractProxyModel
*>(model
);
58 KDirModel
*dirModel
= static_cast<KDirModel
*>(proxyModel
->sourceModel());
59 connect(dirModel
->dirLister(), SIGNAL(completed()),
60 this, SLOT(resetResizing()));
65 connect(model
, SIGNAL(layoutChanged()), this, SLOT(slotLayoutChanged()));
67 QTreeView::setModel(model
);
70 bool KDirOperatorDetailView::setViewMode(KFile::FileView viewMode
)
74 if (KFile::isDetailView(viewMode
)) {
75 m_hideDetailColumns
= false;
76 } else if (KFile::isTreeView(viewMode
)) {
77 m_hideDetailColumns
= true;
79 } else if (KFile::isDetailTreeView(viewMode
)) {
80 m_hideDetailColumns
= false;
86 setRootIsDecorated(tree
);
87 setItemsExpandable(tree
);
92 bool KDirOperatorDetailView::event(QEvent
*event
)
94 if (event
->type() == QEvent::Polish
) {
95 QHeaderView
*headerView
= header();
96 headerView
->setResizeMode(QHeaderView::Interactive
);
97 headerView
->setStretchLastSection(true);
98 headerView
->setMovable(false);
100 setColumnHidden(KDirModel::Size
, m_hideDetailColumns
);
101 setColumnHidden(KDirModel::ModifiedTime
, m_hideDetailColumns
);
102 hideColumn(KDirModel::Type
);
103 hideColumn(KDirModel::Permissions
);
104 hideColumn(KDirModel::Owner
);
105 hideColumn(KDirModel::Group
);
107 else if (event
->type() == QEvent::UpdateRequest
) {
108 // A wheel movement will scroll 4 items
109 if (model()->rowCount())
110 verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4);
113 return QTreeView::event(event
);
116 void KDirOperatorDetailView::dragEnterEvent(QDragEnterEvent
*event
)
118 if (event
->mimeData()->hasUrls()) {
119 event
->acceptProposedAction();
123 void KDirOperatorDetailView::resizeEvent(QResizeEvent
*event
)
125 QTreeView::resizeEvent(event
);
129 void KDirOperatorDetailView::mousePressEvent(QMouseEvent
*event
)
131 QTreeView::mousePressEvent(event
);
133 const QModelIndex index
= indexAt(event
->pos());
134 if (!index
.isValid() || (index
.column() != KDirModel::Name
)) {
135 const Qt::KeyboardModifiers modifiers
= QApplication::keyboardModifiers();
136 if (!(modifiers
& Qt::ShiftModifier
) && !(modifiers
& Qt::ControlModifier
)) {
142 void KDirOperatorDetailView::currentChanged(const QModelIndex
& current
, const QModelIndex
& previous
)
144 QTreeView::currentChanged(current
, previous
);
147 void KDirOperatorDetailView::resetResizing()
149 QTimer::singleShot(300, this, SLOT(disableColumnResizing()));
152 void KDirOperatorDetailView::disableColumnResizing()
154 m_resizeColumns
= false;
157 void KDirOperatorDetailView::slotLayoutChanged()
159 if (m_resizeColumns
) {
160 QHeaderView
*headerView
= header();
161 headerView
->resizeSections(QHeaderView::ResizeToContents
);
163 // calculate the required width for all columns except the name column
164 int requiredWidth
= 0;
165 const int count
= headerView
->count();
166 for (int i
= 1; i
< count
; ++i
) {
167 requiredWidth
+= headerView
->sectionSize(i
);
170 // try to stretch the name column if enough width is available
171 int oldNameColumnWidth
= headerView
->sectionSize(KDirModel::Name
);
172 int nameColumnWidth
= viewport()->width() - requiredWidth
;
173 if (nameColumnWidth
< oldNameColumnWidth
) {
174 nameColumnWidth
= oldNameColumnWidth
;
176 headerView
->resizeSection(KDirModel::Name
, nameColumnWidth
);
180 // kate: space-indent on; indent-width 4; replace-tabs on;