]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/private/kitemlistroleeditor.cpp
Fix zooming animation
[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
122 ? QTextCursor::Start
123 : QTextCursor::End;
124 const QTextCursor::MoveMode mode = event->modifiers() == Qt::NoModifier
125 ? QTextCursor::MoveAnchor
126 : QTextCursor::KeepAnchor;
127 QTextCursor cursor = textCursor();
128 cursor.movePosition(op, mode);
129 setTextCursor(cursor);
130 event->accept();
131 return;
132 }
133 break;
134 }
135 default:
136 break;
137 }
138
139 KTextEdit::keyPressEvent(event);
140 }
141
142 void KItemListRoleEditor::autoAdjustSize()
143 {
144 const qreal frameBorder = 2 * frameWidth();
145
146 const qreal requiredWidth = document()->size().width();
147 const qreal availableWidth = size().width() - frameBorder;
148 if (requiredWidth > availableWidth) {
149 qreal newWidth = requiredWidth + frameBorder;
150 if (parentWidget() && pos().x() + newWidth > parentWidget()->width()) {
151 newWidth = parentWidget()->width() - pos().x();
152 }
153 resize(newWidth, size().height());
154 }
155
156 const qreal requiredHeight = document()->size().height();
157 const qreal availableHeight = size().height() - frameBorder;
158 if (requiredHeight > availableHeight) {
159 qreal newHeight = requiredHeight + frameBorder;
160 if (parentWidget() && pos().y() + newHeight > parentWidget()->height()) {
161 newHeight = parentWidget()->height() - pos().y();
162 }
163 resize(size().width(), newHeight);
164 }
165 }
166
167 void KItemListRoleEditor::emitRoleEditingFinished(EditResultDirection direction)
168 {
169 QVariant ret;
170 ret.setValue(EditResult {KIO::encodeFileName(toPlainText()), direction});
171
172 if (!m_blockFinishedSignal) {
173 Q_EMIT roleEditingFinished(m_role, ret);
174 }
175 }
176