KFile
kdiroperatordetailview.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00056
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
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
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
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