KFile
kdiroperatordetailview.cpp
Go to the documentation of this file.
00001 /***************************************************************************** 00002 * Copyright (C) 2007 by Peter Penz <peter.penz@gmx.at> * 00003 * * 00004 * This library is free software; you can redistribute it and/or * 00005 * modify it under the terms of the GNU Library General Public * 00006 * License version 2 as published by the Free Software Foundation. * 00007 * * 00008 * This library is distributed in the hope that it will be useful, * 00009 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00011 * Library General Public License for more details. * 00012 * * 00013 * You should have received a copy of the GNU Library General Public License * 00014 * along with this library; see the file COPYING.LIB. If not, write to * 00015 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * 00016 * Boston, MA 02110-1301, USA. * 00017 *****************************************************************************/ 00018 00019 #include "kdiroperatordetailview_p.h" 00020 00021 #include <kdirlister.h> 00022 #include <kdirmodel.h> 00023 #include <kdebug.h> 00024 00025 #include <QtCore/QEvent> 00026 #include <QtCore/QTimer> 00027 #include <QtGui/QAbstractProxyModel> 00028 #include <QtGui/QApplication> 00029 #include <QtGui/QHeaderView> 00030 #include <QtGui/QListView> 00031 #include <QtGui/QResizeEvent> 00032 #include <QtGui/QScrollBar> 00033 00034 KDirOperatorDetailView::KDirOperatorDetailView(QWidget *parent) : 00035 QTreeView(parent), 00036 m_resizeColumns(true), m_hideDetailColumns(false) 00037 { 00038 setRootIsDecorated(false); 00039 setSortingEnabled(true); 00040 setUniformRowHeights(true); 00041 setDragDropMode(QListView::DragOnly); 00042 setSelectionBehavior(QAbstractItemView::SelectRows); 00043 setEditTriggers(QAbstractItemView::NoEditTriggers); 00044 setVerticalScrollMode(QListView::ScrollPerPixel); 00045 setHorizontalScrollMode(QListView::ScrollPerPixel); 00046 } 00047 00048 KDirOperatorDetailView::~KDirOperatorDetailView() 00049 { 00050 } 00051 00052 void KDirOperatorDetailView::setModel(QAbstractItemModel *model) 00053 { 00054 if (model->rowCount() == 0) { 00055 // The model is empty. Assure that the columns get automatically resized 00056 // until the loading has been finished. 00057 QAbstractProxyModel *proxyModel = static_cast<QAbstractProxyModel*>(model); 00058 KDirModel *dirModel = static_cast<KDirModel*>(proxyModel->sourceModel()); 00059 connect(dirModel->dirLister(), SIGNAL(completed()), 00060 this, SLOT(resetResizing())); 00061 } else { 00062 resetResizing(); 00063 } 00064 00065 connect(model, SIGNAL(layoutChanged()), this, SLOT(slotLayoutChanged())); 00066 00067 QTreeView::setModel(model); 00068 } 00069 00070 bool KDirOperatorDetailView::setViewMode(KFile::FileView viewMode) 00071 { 00072 bool tree = false; 00073 00074 if (KFile::isDetailView(viewMode)) { 00075 m_hideDetailColumns = false; 00076 } else if (KFile::isTreeView(viewMode)) { 00077 m_hideDetailColumns = true; 00078 tree = true; 00079 } else if (KFile::isDetailTreeView(viewMode)) { 00080 m_hideDetailColumns = false; 00081 tree = true; 00082 } else { 00083 return false; 00084 } 00085 00086 setRootIsDecorated(tree); 00087 setItemsExpandable(tree); 00088 // This allows to have a horizontal scrollbar in case this view is used as 00089 // a plain treeview instead of cutting off filenames, especially useful when 00090 // using KDirOperator in horizontally limited parts of an app. 00091 if( tree && m_hideDetailColumns ) { 00092 header()->setResizeMode( QHeaderView::ResizeToContents ); 00093 header()->setStretchLastSection( false ); 00094 } 00095 00096 return true; 00097 } 00098 00099 bool KDirOperatorDetailView::event(QEvent *event) 00100 { 00101 if (event->type() == QEvent::Polish) { 00102 QHeaderView *headerView = header(); 00103 headerView->setResizeMode(QHeaderView::Interactive); 00104 headerView->setStretchLastSection(true); 00105 headerView->setMovable(false); 00106 00107 setColumnHidden(KDirModel::Size, m_hideDetailColumns); 00108 setColumnHidden(KDirModel::ModifiedTime, m_hideDetailColumns); 00109 hideColumn(KDirModel::Type); 00110 hideColumn(KDirModel::Permissions); 00111 hideColumn(KDirModel::Owner); 00112 hideColumn(KDirModel::Group); 00113 } 00114 else if (event->type() == QEvent::UpdateRequest) { 00115 // A wheel movement will scroll 4 items 00116 if (model()->rowCount()) 00117 verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4); 00118 } 00119 00120 return QTreeView::event(event); 00121 } 00122 00123 void KDirOperatorDetailView::dragEnterEvent(QDragEnterEvent *event) 00124 { 00125 if (event->mimeData()->hasUrls()) { 00126 event->acceptProposedAction(); 00127 } 00128 } 00129 00130 void KDirOperatorDetailView::resizeEvent(QResizeEvent *event) 00131 { 00132 QTreeView::resizeEvent(event); 00133 slotLayoutChanged(); 00134 } 00135 00136 void KDirOperatorDetailView::mousePressEvent(QMouseEvent *event) 00137 { 00138 QTreeView::mousePressEvent(event); 00139 00140 const QModelIndex index = indexAt(event->pos()); 00141 if (!index.isValid() || (index.column() != KDirModel::Name)) { 00142 const Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers(); 00143 if (!(modifiers & Qt::ShiftModifier) && !(modifiers & Qt::ControlModifier)) { 00144 clearSelection(); 00145 } 00146 } 00147 } 00148 00149 void KDirOperatorDetailView::currentChanged(const QModelIndex& current, const QModelIndex& previous) 00150 { 00151 QTreeView::currentChanged(current, previous); 00152 } 00153 00154 void KDirOperatorDetailView::resetResizing() 00155 { 00156 QTimer::singleShot(300, this, SLOT(disableColumnResizing())); 00157 } 00158 00159 void KDirOperatorDetailView::disableColumnResizing() 00160 { 00161 m_resizeColumns = false; 00162 } 00163 00164 void KDirOperatorDetailView::slotLayoutChanged() 00165 { 00166 if (m_resizeColumns) { 00167 QHeaderView *headerView = header(); 00168 headerView->resizeSections(QHeaderView::ResizeToContents); 00169 00170 // calculate the required width for all columns except the name column 00171 int requiredWidth = 0; 00172 const int count = headerView->count(); 00173 for (int i = 1; i < count; ++i) { 00174 requiredWidth += headerView->sectionSize(i); 00175 } 00176 00177 // try to stretch the name column if enough width is available 00178 int oldNameColumnWidth = headerView->sectionSize(KDirModel::Name); 00179 int nameColumnWidth = viewport()->width() - requiredWidth; 00180 if (nameColumnWidth < oldNameColumnWidth) { 00181 nameColumnWidth = oldNameColumnWidth; 00182 } 00183 headerView->resizeSection(KDirModel::Name, nameColumnWidth); 00184 } 00185 } 00186 00187 // kate: space-indent on; indent-width 4; replace-tabs on;
KDE 4.6 API Reference