]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/private/kitemlistroleeditor.cpp
Add clang-format and format code as in Frameworks
[dolphin.git] / src / kitemviews / private / kitemlistroleeditor.cpp
1 /*
2 * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "kitemlistroleeditor.h"
8
9 #include <KIO/Global>
10
11 KItemListRoleEditor::KItemListRoleEditor(QWidget *parent)
12 : KTextEdit(parent)
13 , m_role()
14 , m_blockFinishedSignal(false)
15 {
16 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
17 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
18 setAcceptRichText(false);
19 enableFindReplace(false);
20 document()->setDocumentMargin(0);
21
22 if (parent) {
23 parent->installEventFilter(this);
24 }
25
26 connect(this, &KItemListRoleEditor::textChanged, this, &KItemListRoleEditor::autoAdjustSize);
27 }
28
29 KItemListRoleEditor::~KItemListRoleEditor()
30 {
31 }
32
33 void KItemListRoleEditor::setRole(const QByteArray &role)
34 {
35 m_role = role;
36 }
37
38 QByteArray KItemListRoleEditor::role() const
39 {
40 return m_role;
41 }
42
43 void KItemListRoleEditor::setAllowUpDownKeyChainEdit(bool allowChainEdit)
44 {
45 m_allowUpDownKeyChainEdit = allowChainEdit;
46 }
47
48 bool KItemListRoleEditor::eventFilter(QObject *watched, QEvent *event)
49 {
50 if (watched == parentWidget() && event->type() == QEvent::Resize) {
51 emitRoleEditingFinished();
52 }
53
54 return KTextEdit::eventFilter(watched, event);
55 }
56
57 bool KItemListRoleEditor::event(QEvent *event)
58 {
59 if (event->type() == QEvent::FocusOut) {
60 QFocusEvent *focusEvent = static_cast<QFocusEvent *>(event);
61 if (focusEvent->reason() != Qt::PopupFocusReason) {
62 emitRoleEditingFinished();
63 }
64 }
65 return KTextEdit::event(event);
66 }
67
68 void KItemListRoleEditor::keyPressEvent(QKeyEvent *event)
69 {
70 switch (event->key()) {
71 case Qt::Key_Escape:
72 // Emitting the signal roleEditingCanceled might result
73 // in losing the focus. Per default losing the focus emits
74 // a roleEditingFinished signal (see KItemListRoleEditor::event),
75 // which is not wanted in this case.
76 m_blockFinishedSignal = true;
77 Q_EMIT roleEditingCanceled(m_role, KIO::encodeFileName(toPlainText()));
78 m_blockFinishedSignal = false;
79 event->accept();
80 return;
81 case Qt::Key_Enter:
82 case Qt::Key_Return:
83 emitRoleEditingFinished();
84 event->accept();
85 return;
86 case Qt::Key_Tab:
87 case Qt::Key_Down:
88 if (m_allowUpDownKeyChainEdit || event->key() == Qt::Key_Tab) {
89 emitRoleEditingFinished(EditNext);
90 event->accept();
91 return;
92 }
93 break;
94 case Qt::Key_Backtab:
95 case Qt::Key_Up:
96 if (m_allowUpDownKeyChainEdit || event->key() == Qt::Key_Backtab) {
97 emitRoleEditingFinished(EditPrevious);
98 event->accept();
99 return;
100 }
101 break;
102 case Qt::Key_Left:
103 case Qt::Key_Right: {
104 QTextCursor cursor = textCursor();
105 if (event->modifiers() == Qt::NoModifier && cursor.hasSelection()) {
106 if (event->key() == Qt::Key_Left) {
107 cursor.setPosition(cursor.selectionStart());
108 } else {
109 cursor.setPosition(cursor.selectionEnd());
110 }
111 cursor.clearSelection();
112 setTextCursor(cursor);
113 event->accept();
114 return;
115 }
116 break;
117 }
118 case Qt::Key_Home:
119 case Qt::Key_End: {
120 if (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::ShiftModifier) {
121 const QTextCursor::MoveOperation op = event->key() == Qt::Key_Home ? QTextCursor::Start : QTextCursor::End;
122 const QTextCursor::MoveMode mode = event->modifiers() == Qt::NoModifier ? QTextCursor::MoveAnchor : QTextCursor::KeepAnchor;
123 QTextCursor cursor = textCursor();
124 cursor.movePosition(op, mode);
125 setTextCursor(cursor);
126 event->accept();
127 return;
128 }
129 break;
130 }
131 default:
132 break;
133 }
134
135 KTextEdit::keyPressEvent(event);
136 }
137
138 void KItemListRoleEditor::autoAdjustSize()
139 {
140 const qreal frameBorder = 2 * frameWidth();
141
142 const qreal requiredWidth = document()->size().width();
143 const qreal availableWidth = size().width() - frameBorder;
144 if (requiredWidth > availableWidth) {
145 qreal newWidth = requiredWidth + frameBorder;
146 if (parentWidget() && pos().x() + newWidth > parentWidget()->width()) {
147 newWidth = parentWidget()->width() - pos().x();
148 }
149 resize(newWidth, size().height());
150 }
151
152 const qreal requiredHeight = document()->size().height();
153 const qreal availableHeight = size().height() - frameBorder;
154 if (requiredHeight > availableHeight) {
155 qreal newHeight = requiredHeight + frameBorder;
156 if (parentWidget() && pos().y() + newHeight > parentWidget()->height()) {
157 newHeight = parentWidget()->height() - pos().y();
158 }
159 resize(size().width(), newHeight);
160 }
161 }
162
163 void KItemListRoleEditor::emitRoleEditingFinished(EditResultDirection direction)
164 {
165 QVariant ret;
166 ret.setValue(EditResult{KIO::encodeFileName(toPlainText()), direction});
167
168 if (!m_blockFinishedSignal) {
169 Q_EMIT roleEditingFinished(m_role, ret);
170 }
171 }