• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • 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     QTreeView::setModel(model);
00066 }
00067 
00068 bool KDirOperatorDetailView::setViewMode(KFile::FileView viewMode)
00069 {
00070     bool tree = false;
00071     
00072     if (KFile::isDetailView(viewMode)) {
00073         m_hideDetailColumns = false;
00074     } else if (KFile::isTreeView(viewMode)) {
00075         m_hideDetailColumns = true;
00076         tree = true;
00077     } else if (KFile::isDetailTreeView(viewMode)) {
00078         m_hideDetailColumns = false;
00079         tree = true;
00080     } else {
00081         return false;
00082     }
00083     
00084     setRootIsDecorated(tree);
00085     setItemsExpandable(tree);
00086     
00087     return true;
00088 }
00089 
00090 bool KDirOperatorDetailView::event(QEvent *event)
00091 {
00092     if (event->type() == QEvent::Polish) {
00093         QHeaderView *headerView = header();
00094         headerView->setResizeMode(QHeaderView::Interactive);
00095         headerView->setStretchLastSection(true);
00096         headerView->setMovable(false);
00097 
00098         setColumnHidden(KDirModel::Size, m_hideDetailColumns);
00099         setColumnHidden(KDirModel::ModifiedTime, m_hideDetailColumns);
00100         setColumnHidden(KDirModel::Type, m_hideDetailColumns);
00101 
00102         hideColumn(KDirModel::Permissions);
00103         hideColumn(KDirModel::Owner);
00104         hideColumn(KDirModel::Group);
00105     }
00106     else if (event->type() == QEvent::UpdateRequest) {
00107         // A wheel movement will scroll 4 items
00108         if (model()->rowCount())
00109             verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4);
00110     }
00111 
00112     return QTreeView::event(event);
00113 }
00114 
00115 void KDirOperatorDetailView::dragEnterEvent(QDragEnterEvent *event)
00116 {
00117     if (event->mimeData()->hasUrls()) {
00118         event->acceptProposedAction();
00119     }
00120 }
00121 
00122 void KDirOperatorDetailView::resizeEvent(QResizeEvent *event)
00123 {
00124     QTreeView::resizeEvent(event);
00125 
00126     if (m_resizeColumns) {
00127         QHeaderView *headerView = header();
00128         headerView->resizeSections(QHeaderView::ResizeToContents);
00129 
00130         // calculate the required width for all columns except the name column
00131         int requiredWidth = 0;
00132         const int count = headerView->count();
00133         for (int i = 1; i < count; ++i) {
00134             requiredWidth += headerView->sectionSize(i);
00135         }
00136 
00137         // try to stretch the name column if enough width is available
00138         const int oldNameColumnWidth = headerView->sectionSize(KDirModel::Name);
00139         int nameColumnWidth = viewport()->width() - requiredWidth;
00140         if (nameColumnWidth < oldNameColumnWidth) {
00141             nameColumnWidth = oldNameColumnWidth;
00142         }
00143         headerView->resizeSection(KDirModel::Name, nameColumnWidth);
00144     }
00145 }
00146 
00147 void KDirOperatorDetailView::mousePressEvent(QMouseEvent *event)
00148 {
00149     QTreeView::mousePressEvent(event);
00150 
00151     const QModelIndex index = indexAt(event->pos());
00152     if (!index.isValid() || (index.column() != KDirModel::Name)) {
00153         const Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
00154         if (!(modifiers & Qt::ShiftModifier) && !(modifiers & Qt::ControlModifier)) {
00155             clearSelection();
00156         }
00157     }
00158 }
00159 
00160 void KDirOperatorDetailView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
00161 {
00162     QTreeView::currentChanged(current, previous);
00163 }
00164 
00165 void KDirOperatorDetailView::resetResizing()
00166 {
00167     QTimer::singleShot(300, this, SLOT(disableColumnResizing()));
00168 }
00169 
00170 void KDirOperatorDetailView::disableColumnResizing()
00171 {
00172     m_resizeColumns = false;
00173 }
00174 
00175 // kate: space-indent on; indent-width 4; replace-tabs on;

KFile

Skip menu "KFile"
  • Main Page
  • 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
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • KIO
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.4
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