KIO

kdiroperatordetailview.cpp
1/*
2 SPDX-FileCopyrightText: 2007 Peter Penz <peter.penz@gmx.at>
3
4 SPDX-License-Identifier: LGPL-2.0-only
5*/
6
7#include "kdiroperatordetailview_p.h"
8#include "kfileitemselectionemblem.h"
9
10#include <kdirlister.h>
11#include <kdirmodel.h>
12
13#include <QApplication>
14#include <QDragEnterEvent>
15#include <QEvent>
16#include <QHeaderView>
17#include <QListView>
18#include <QMimeData>
19#include <QScrollBar>
20
21KDirOperatorDetailView::KDirOperatorDetailView(KDirOperator *dirOperator, QWidget *parent)
22 : QTreeView(parent)
23 , m_hideDetailColumns(false)
24 , m_isEmblemClicked(false)
25 , m_dirOperator(dirOperator)
26{
27 setRootIsDecorated(false);
28 setSortingEnabled(true);
29 setUniformRowHeights(true);
30 setDragDropMode(QListView::DragOnly);
31 setSelectionBehavior(QAbstractItemView::SelectRows);
32 setEditTriggers(QAbstractItemView::NoEditTriggers);
33 setVerticalScrollMode(QListView::ScrollPerPixel);
34 setHorizontalScrollMode(QListView::ScrollPerPixel);
35
36 const QFontMetrics metrics(viewport()->font());
37 const int singleStep = metrics.height() * QApplication::wheelScrollLines();
38
39 verticalScrollBar()->setSingleStep(singleStep);
40 horizontalScrollBar()->setSingleStep(singleStep);
41}
42
43KDirOperatorDetailView::~KDirOperatorDetailView()
44{
45}
46
47bool KDirOperatorDetailView::setViewMode(KFile::FileView viewMode)
48{
49 bool tree = false;
50
51 if (KFile::isDetailView(viewMode)) {
52 m_hideDetailColumns = false;
53 setAlternatingRowColors(true);
54 } else if (KFile::isTreeView(viewMode)) {
55 m_hideDetailColumns = true;
56 setAlternatingRowColors(false);
57 tree = true;
58 } else if (KFile::isDetailTreeView(viewMode)) {
59 m_hideDetailColumns = false;
60 setAlternatingRowColors(true);
61 tree = true;
62 } else {
63 return false;
64 }
65
66 setRootIsDecorated(tree);
67 setItemsExpandable(tree);
68 // This allows to have a horizontal scrollbar in case this view is used as
69 // a plain treeview instead of cutting off filenames, especially useful when
70 // using KDirOperator in horizontally limited parts of an app.
71 if (tree && m_hideDetailColumns) {
72 header()->setSectionResizeMode(QHeaderView::ResizeToContents);
73 } else {
74 header()->setSectionResizeMode(QHeaderView::Interactive);
75 }
76
77 return true;
78}
79
80void KDirOperatorDetailView::initViewItemOption(QStyleOptionViewItem *option) const
81{
83 option->textElideMode = Qt::ElideMiddle;
84}
85
86bool KDirOperatorDetailView::event(QEvent *event)
87{
88 if (event->type() == QEvent::Polish) {
89 QHeaderView *headerView = header();
93 headerView->setStretchLastSection(false);
94 headerView->setSectionsMovable(false);
95
96 setColumnHidden(KDirModel::Size, m_hideDetailColumns);
97 setColumnHidden(KDirModel::ModifiedTime, m_hideDetailColumns);
98 hideColumn(KDirModel::Type);
99 hideColumn(KDirModel::Permissions);
100 hideColumn(KDirModel::Owner);
101 hideColumn(KDirModel::Group);
102 } else if (event->type() == QEvent::UpdateRequest) {
103 // A wheel movement will scroll 4 items
104 if (model()->rowCount()) {
105 verticalScrollBar()->setSingleStep((sizeHintForRow(0) / 3) * 4);
106 }
107 }
108
109 return QTreeView::event(event);
110}
111
112void KDirOperatorDetailView::dragEnterEvent(QDragEnterEvent *event)
113{
114 if (event->mimeData()->hasUrls()) {
115 event->acceptProposedAction();
116 }
117}
118
119void KDirOperatorDetailView::mousePressEvent(QMouseEvent *event)
120{
121 const QModelIndex index = indexAt(event->pos());
122 // When selection emblem is clicked, select it and don't do anything else
123 m_isEmblemClicked = KFileItemSelectionEmblem(this, index, m_dirOperator).handleMousePressEvent(event->pos());
124 if (m_isEmblemClicked) {
125 return;
126 }
127
129
130 if (!index.isValid() || (index.column() != KDirModel::Name)) {
132 if (!(modifiers & Qt::ShiftModifier) && !(modifiers & Qt::ControlModifier)) {
133 clearSelection();
134 }
135 }
136}
137
138void KDirOperatorDetailView::mouseMoveEvent(QMouseEvent *event)
139{
140 // Disallow selection dragging when emblem is clicked
141 if (m_isEmblemClicked) {
142 return;
143 }
145}
146
147void KDirOperatorDetailView::mouseReleaseEvent(QMouseEvent *event)
148{
149 // Reset the emblem selection
150 if (m_isEmblemClicked) {
151 m_isEmblemClicked = false;
152 }
154}
155
156void KDirOperatorDetailView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
157{
158 QTreeView::currentChanged(current, previous);
159}
160
161#include "moc_kdiroperatordetailview_p.cpp"
This widget works as a network transparent filebrowser.
AKONADI_CALENDAR_EXPORT KCalendarCore::Event::Ptr event(const Akonadi::Item &item)
virtual void initViewItemOption(QStyleOptionViewItem *option) const const
Qt::KeyboardModifiers keyboardModifiers()
void setSectionResizeMode(ResizeMode mode)
void setSectionsMovable(bool movable)
void setStretchLastSection(bool stretch)
int column() const const
bool isValid() const const
virtual bool event(QEvent *e)
typedef KeyboardModifiers
ElideMiddle
virtual void currentChanged(const QModelIndex &current, const QModelIndex &previous) override
virtual void mouseMoveEvent(QMouseEvent *event) override
virtual void mousePressEvent(QMouseEvent *event) override
virtual void mouseReleaseEvent(QMouseEvent *event) override
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 11 2025 11:51:43 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.