• Skip to content
  • Skip to link menu
KDE 4.3 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     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     
00089     return true;
00090 }
00091 
00092 bool KDirOperatorDetailView::event(QEvent *event)
00093 {
00094     if (event->type() == QEvent::Polish) {
00095         QHeaderView *headerView = header();
00096         headerView->setResizeMode(QHeaderView::Interactive);
00097         headerView->setStretchLastSection(true);
00098         headerView->setMovable(false);
00099 
00100         setColumnHidden(KDirModel::Size, m_hideDetailColumns);
00101         setColumnHidden(KDirModel::ModifiedTime, m_hideDetailColumns);
00102         hideColumn(KDirModel::Type);
00103         hideColumn(KDirModel::Permissions);
00104         hideColumn(KDirModel::Owner);
00105         hideColumn(KDirModel::Group);
00106     }
00107     else if (event->type() == QEvent::UpdateRequest) {
00108         // A wheel movement will scroll 4 items
00109         if (model()->rowCount())
00110             verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4);
00111     }
00112 
00113     return QTreeView::event(event);
00114 }
00115 
00116 void KDirOperatorDetailView::dragEnterEvent(QDragEnterEvent *event)
00117 {
00118     if (event->mimeData()->hasUrls()) {
00119         event->acceptProposedAction();
00120     }
00121 }
00122 
00123 void KDirOperatorDetailView::resizeEvent(QResizeEvent *event)
00124 {
00125     QTreeView::resizeEvent(event);
00126     slotLayoutChanged();
00127 }
00128 
00129 void KDirOperatorDetailView::mousePressEvent(QMouseEvent *event)
00130 {
00131     QTreeView::mousePressEvent(event);
00132 
00133     const QModelIndex index = indexAt(event->pos());
00134     if (!index.isValid() || (index.column() != KDirModel::Name)) {
00135         const Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
00136         if (!(modifiers & Qt::ShiftModifier) && !(modifiers & Qt::ControlModifier)) {
00137             clearSelection();
00138         }
00139     }
00140 }
00141 
00142 void KDirOperatorDetailView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
00143 {
00144     QTreeView::currentChanged(current, previous);
00145 }
00146 
00147 void KDirOperatorDetailView::resetResizing()
00148 {
00149     QTimer::singleShot(300, this, SLOT(disableColumnResizing()));
00150 }
00151 
00152 void KDirOperatorDetailView::disableColumnResizing()
00153 {
00154     m_resizeColumns = false;
00155 }
00156 
00157 void KDirOperatorDetailView::slotLayoutChanged()
00158 {
00159     if (m_resizeColumns) {
00160         QHeaderView *headerView = header();
00161         headerView->resizeSections(QHeaderView::ResizeToContents);
00162 
00163         // calculate the required width for all columns except the name column
00164         int requiredWidth = 0;
00165         const int count = headerView->count();
00166         for (int i = 1; i < count; ++i) {
00167             requiredWidth += headerView->sectionSize(i);
00168         }
00169 
00170         // try to stretch the name column if enough width is available
00171         int oldNameColumnWidth = headerView->sectionSize(KDirModel::Name);
00172         int nameColumnWidth = viewport()->width() - requiredWidth;
00173         if (nameColumnWidth < oldNameColumnWidth) {
00174             nameColumnWidth = oldNameColumnWidth;
00175         }
00176         headerView->resizeSection(KDirModel::Name, nameColumnWidth);
00177     }
00178 }
00179 
00180 // 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
  • KPty
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.6.1
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