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

KFile

  • sources
  • kde-4.14
  • kdelibs
  • kfile
kdiroperatordetailview.cpp
Go to the documentation of this file.
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  *****************************************************************************/
18 
19 #include "kdiroperatordetailview_p.h"
20 
21 #include <kdirlister.h>
22 #include <kdirmodel.h>
23 #include <kdebug.h>
24 
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>
33 
34 KDirOperatorDetailView::KDirOperatorDetailView(QWidget *parent) :
35  QTreeView(parent),
36  m_resizeColumns(true), m_hideDetailColumns(false)
37 {
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);
46 }
47 
48 KDirOperatorDetailView::~KDirOperatorDetailView()
49 {
50 }
51 
52 void KDirOperatorDetailView::setModel(QAbstractItemModel *model)
53 {
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();
63  }
64 
65  connect(model, SIGNAL(layoutChanged()), this, SLOT(slotLayoutChanged()));
66 
67  QTreeView::setModel(model);
68 }
69 
70 bool KDirOperatorDetailView::setViewMode(KFile::FileView viewMode)
71 {
72  bool tree = false;
73 
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;
84  }
85 
86  setRootIsDecorated(tree);
87  setItemsExpandable(tree);
88  // This allows to have a horizontal scrollbar in case this view is used as
89  // a plain treeview instead of cutting off filenames, especially useful when
90  // using KDirOperator in horizontally limited parts of an app.
91  if( tree && m_hideDetailColumns ) {
92  header()->setResizeMode( QHeaderView::ResizeToContents );
93  header()->setStretchLastSection( false );
94  }
95 
96  return true;
97 }
98 
99 bool KDirOperatorDetailView::event(QEvent *event)
100 {
101  if (event->type() == QEvent::Polish) {
102  QHeaderView *headerView = header();
103  headerView->setResizeMode(QHeaderView::Interactive);
104  headerView->setStretchLastSection(true);
105  headerView->setMovable(false);
106 
107  setColumnHidden(KDirModel::Size, m_hideDetailColumns);
108  setColumnHidden(KDirModel::ModifiedTime, m_hideDetailColumns);
109  hideColumn(KDirModel::Type);
110  hideColumn(KDirModel::Permissions);
111  hideColumn(KDirModel::Owner);
112  hideColumn(KDirModel::Group);
113  }
114  else if (event->type() == QEvent::UpdateRequest) {
115  // A wheel movement will scroll 4 items
116  if (model()->rowCount())
117  verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4);
118  }
119 
120  return QTreeView::event(event);
121 }
122 
123 void KDirOperatorDetailView::dragEnterEvent(QDragEnterEvent *event)
124 {
125  if (event->mimeData()->hasUrls()) {
126  event->acceptProposedAction();
127  }
128 }
129 
130 void KDirOperatorDetailView::resizeEvent(QResizeEvent *event)
131 {
132  QTreeView::resizeEvent(event);
133  slotLayoutChanged();
134 }
135 
136 void KDirOperatorDetailView::mousePressEvent(QMouseEvent *event)
137 {
138  QTreeView::mousePressEvent(event);
139 
140  const QModelIndex index = indexAt(event->pos());
141  if (!index.isValid() || (index.column() != KDirModel::Name)) {
142  const Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
143  if (!(modifiers & Qt::ShiftModifier) && !(modifiers & Qt::ControlModifier)) {
144  clearSelection();
145  }
146  }
147 }
148 
149 void KDirOperatorDetailView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
150 {
151  QTreeView::currentChanged(current, previous);
152 }
153 
154 void KDirOperatorDetailView::resetResizing()
155 {
156  QTimer::singleShot(300, this, SLOT(disableColumnResizing()));
157 }
158 
159 void KDirOperatorDetailView::disableColumnResizing()
160 {
161  m_resizeColumns = false;
162 }
163 
164 void KDirOperatorDetailView::slotLayoutChanged()
165 {
166  if (m_resizeColumns) {
167  QHeaderView *headerView = header();
168  headerView->resizeSections(QHeaderView::ResizeToContents);
169 
170  // calculate the required width for all columns except the name column
171  int requiredWidth = 0;
172  const int count = headerView->count();
173  for (int i = 1; i < count; ++i) {
174  requiredWidth += headerView->sectionSize(i);
175  }
176 
177  // try to stretch the name column if enough width is available
178  int oldNameColumnWidth = headerView->sectionSize(KDirModel::Name);
179  int nameColumnWidth = viewport()->width() - requiredWidth;
180  if (nameColumnWidth < oldNameColumnWidth) {
181  nameColumnWidth = oldNameColumnWidth;
182  }
183  headerView->resizeSection(KDirModel::Name, nameColumnWidth);
184  }
185 }
186 
187 // kate: space-indent on; indent-width 4; replace-tabs on;
kdirlister.h
QHeaderView::resizeSections
void resizeSections(QHeaderView::ResizeMode mode)
QModelIndex
QEvent
QResizeEvent
QWidget
QAbstractItemModel::rowCount
virtual int rowCount(const QModelIndex &parent) const =0
QEvent::type
Type type() const
QHeaderView::setMovable
void setMovable(bool movable)
KDirModel::Group
KFile::isDetailTreeView
static bool isDetailTreeView(const FileView &view)
QTreeView::hideColumn
void hideColumn(int column)
kdebug.h
QDropEvent::mimeData
const QMimeData * mimeData() const
QApplication::keyboardModifiers
Qt::KeyboardModifiers keyboardModifiers()
KDirOperatorDetailView::currentChanged
virtual void currentChanged(const QModelIndex &current, const QModelIndex &previous)
Definition: kdiroperatordetailview.cpp:149
QAbstractProxyModel
QTreeView::currentChanged
virtual void currentChanged(const QModelIndex &current, const QModelIndex &previous)
KDirModel::Permissions
KDirOperatorDetailView::mousePressEvent
virtual void mousePressEvent(QMouseEvent *event)
Definition: kdiroperatordetailview.cpp:136
KDirOperatorDetailView::KDirOperatorDetailView
KDirOperatorDetailView(QWidget *parent=0)
Definition: kdiroperatordetailview.cpp:34
QAbstractItemView::setDragDropMode
void setDragDropMode(DragDropMode behavior)
QTreeView::setUniformRowHeights
void setUniformRowHeights(bool uniform)
QAbstractScrollArea::viewport
QWidget * viewport() const
QAbstractItemView::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
QAbstractItemView::setVerticalScrollMode
void setVerticalScrollMode(ScrollMode mode)
QMouseEvent
QAbstractItemView::setSelectionBehavior
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
KDirModel::dirLister
KDirLister * dirLister() const
kdiroperatordetailview_p.h
QHeaderView::resizeSection
void resizeSection(int logicalIndex, int size)
QWidget::width
width
QModelIndex::isValid
bool isValid() const
KDirOperatorDetailView::~KDirOperatorDetailView
virtual ~KDirOperatorDetailView()
Definition: kdiroperatordetailview.cpp:48
QAbstractItemView::setEditTriggers
void setEditTriggers(QFlags< QAbstractItemView::EditTrigger > triggers)
QAbstractScrollArea::verticalScrollBar
QScrollBar * verticalScrollBar() const
QHeaderView::sectionSize
int sectionSize(int logicalIndex) const
KDirModel::Name
QTreeView::setColumnHidden
void setColumnHidden(int column, bool hide)
KDirOperatorDetailView::dragEnterEvent
virtual void dragEnterEvent(QDragEnterEvent *event)
Definition: kdiroperatordetailview.cpp:123
KDirModel::Type
QAbstractItemView::event
virtual bool event(QEvent *event)
kdirmodel.h
QTreeView::setSortingEnabled
void setSortingEnabled(bool enable)
QAbstractProxyModel::sourceModel
QAbstractItemModel * sourceModel() const
KFile::isDetailView
static bool isDetailView(const FileView &view)
QMimeData::hasUrls
bool hasUrls() const
KFile::FileView
FileView
QDragEnterEvent
QAbstractItemView::sizeHintForRow
virtual int sizeHintForRow(int row) const
QAbstractSlider::setSingleStep
void setSingleStep(int)
QTreeView
KDirOperatorDetailView::setModel
virtual void setModel(QAbstractItemModel *model)
Definition: kdiroperatordetailview.cpp:52
QTreeView::setModel
virtual void setModel(QAbstractItemModel *model)
QHeaderView::setResizeMode
void setResizeMode(ResizeMode mode)
KDirModel::ModifiedTime
KDirOperatorDetailView::setViewMode
virtual bool setViewMode(KFile::FileView viewMode)
Displays either Detail, Tree or DetailTree modes.
Definition: kdiroperatordetailview.cpp:70
QModelIndex::column
int column() const
QAbstractItemModel
KDirOperatorDetailView::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
Definition: kdiroperatordetailview.cpp:130
QTreeView::mousePressEvent
virtual void mousePressEvent(QMouseEvent *event)
QTreeView::header
QHeaderView * header() const
QHeaderView
QMouseEvent::pos
const QPoint & pos() const
QAbstractItemView::model
QAbstractItemModel * model() const
QTreeView::setRootIsDecorated
void setRootIsDecorated(bool show)
QHeaderView::setStretchLastSection
void setStretchLastSection(bool stretch)
KDirOperatorDetailView::event
virtual bool event(QEvent *event)
Definition: kdiroperatordetailview.cpp:99
QAbstractItemView::clearSelection
void clearSelection()
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KDirModel::Size
KFile::isTreeView
static bool isTreeView(const FileView &view)
QTreeView::setItemsExpandable
void setItemsExpandable(bool enable)
KDirModel
QHeaderView::count
int count() const
QTreeView::indexAt
virtual QModelIndex indexAt(const QPoint &point) const
KDirModel::Owner
QTimer::singleShot
singleShot
QAbstractItemView::setHorizontalScrollMode
void setHorizontalScrollMode(ScrollMode mode)
Qt::KeyboardModifiers
typedef KeyboardModifiers
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:27:26 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KFile

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

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • 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

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal