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(view: viewMode)) {
52 m_hideDetailColumns = false;
53 setAlternatingRowColors(true);
54 } else if (KFile::isTreeView(view: viewMode)) {
55 m_hideDetailColumns = true;
56 setAlternatingRowColors(false);
57 tree = true;
58 } else if (KFile::isDetailTreeView(view: 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{
82 QTreeView::initViewItemOption(option);
83 option->textElideMode = Qt::ElideMiddle;
84}
85
86bool KDirOperatorDetailView::event(QEvent *event)
87{
88 if (event->type() == QEvent::Polish) {
89 QHeaderView *headerView = header();
90 headerView->setSectionResizeMode(logicalIndex: 0, mode: QHeaderView::Stretch);
91 headerView->setSectionResizeMode(logicalIndex: 1, mode: QHeaderView::ResizeToContents);
92 headerView->setSectionResizeMode(logicalIndex: 2, mode: QHeaderView::ResizeToContents);
93 headerView->setStretchLastSection(false);
94 headerView->setSectionsMovable(false);
95
96 setColumnHidden(column: KDirModel::Size, hide: m_hideDetailColumns);
97 setColumnHidden(column: KDirModel::ModifiedTime, hide: m_hideDetailColumns);
98 hideColumn(column: KDirModel::Type);
99 hideColumn(column: KDirModel::Permissions);
100 hideColumn(column: KDirModel::Owner);
101 hideColumn(column: 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(row: 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(p: 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(mousePos: event->pos());
124 if (m_isEmblemClicked) {
125 return;
126 }
127
128 QTreeView::mousePressEvent(event);
129
130 if (!index.isValid() || (index.column() != KDirModel::Name)) {
131 const Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
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 }
144 QTreeView::mouseMoveEvent(event);
145}
146
147void KDirOperatorDetailView::mouseReleaseEvent(QMouseEvent *event)
148{
149 // Reset the emblem selection
150 if (m_isEmblemClicked) {
151 m_isEmblemClicked = false;
152 }
153 QTreeView::mouseReleaseEvent(event);
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"
162

source code of kio/src/filewidgets/kdiroperatordetailview.cpp