• Skip to content
  • Skip to link menu
KDE 4.6 API Reference
  • KDE API Reference
  • kdelibs
  • KDE Home
  • Contact Us
 

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;

KFile

Skip menu "KFile"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.7.3
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal