fix logic
[personal-kdelibs.git] / kfile / kdiroperatordetailview.cpp
blobaa19ba02dd0a7c27053fd06d5711e30c82646afe
1 /*****************************************************************************
2 * Copyright (C) 2007 by Peter Penz <peter.penz@gmx.at> *
3 * *
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. *
7 * *
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. *
12 * *
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>
23 #include <kdebug.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) :
35 QTreeView(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()));
61 } else {
62 resetResizing();
65 connect(model, SIGNAL(layoutChanged()), this, SLOT(slotLayoutChanged()));
67 QTreeView::setModel(model);
70 bool KDirOperatorDetailView::setViewMode(KFile::FileView viewMode)
72 bool tree = false;
74 if (KFile::isDetailView(viewMode)) {
75 m_hideDetailColumns = false;
76 } else if (KFile::isTreeView(viewMode)) {
77 m_hideDetailColumns = true;
78 tree = true;
79 } else if (KFile::isDetailTreeView(viewMode)) {
80 m_hideDetailColumns = false;
81 tree = true;
82 } else {
83 return false;
86 setRootIsDecorated(tree);
87 setItemsExpandable(tree);
89 return true;
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);
126 slotLayoutChanged();
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)) {
137 clearSelection();
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;