]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/private/kitemlistroleeditor.cpp
Output of licensedigger + manual cleanup afterwards.
[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 bool KItemListRoleEditor::eventFilter(QObject* watched, QEvent* event)
44 {
45 if (watched == parentWidget() && event->type() == QEvent::Resize) {
46 emitRoleEditingFinished();
47 }
48
49 return KTextEdit::eventFilter(watched, event);
50 }
51
52 bool KItemListRoleEditor::event(QEvent* event)
53 {
54 if (event->type() == QEvent::FocusOut) {
55 QFocusEvent* focusEvent = static_cast<QFocusEvent*>(event);
56 if (focusEvent->reason() != Qt::PopupFocusReason) {
57 emitRoleEditingFinished();
58 }
59 }
60 return KTextEdit::event(event);
61 }
62
63 void KItemListRoleEditor::keyPressEvent(QKeyEvent* event)
64 {
65 switch (event->key()) {
66 case Qt::Key_Escape:
67 // Emitting the signal roleEditingCanceled might result
68 // in losing the focus. Per default losing the focus emits
69 // a roleEditingFinished signal (see KItemListRoleEditor::event),
70 // which is not wanted in this case.
71 m_blockFinishedSignal = true;
72 emit roleEditingCanceled(m_role, KIO::encodeFileName(toPlainText()));
73 m_blockFinishedSignal = false;
74 event->accept();
75 return;
76 case Qt::Key_Enter:
77 case Qt::Key_Return:
78 emitRoleEditingFinished();
79 event->accept();
80 return;
81 case Qt::Key_Left:
82 case Qt::Key_Right: {
83 QTextCursor cursor = textCursor();
84 if (event->modifiers() == Qt::NoModifier && cursor.hasSelection()) {
85 if (event->key() == Qt::Key_Left) {
86 cursor.setPosition(cursor.selectionStart());
87 } else {
88 cursor.setPosition(cursor.selectionEnd());
89 }
90 cursor.clearSelection();
91 setTextCursor(cursor);
92 event->accept();
93 return;
94 }
95 break;
96 }
97 case Qt::Key_Home:
98 case Qt::Key_End: {
99 if (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::ShiftModifier) {
100 const QTextCursor::MoveOperation op = event->key() == Qt::Key_Home
101 ? QTextCursor::Start
102 : QTextCursor::End;
103 const QTextCursor::MoveMode mode = event->modifiers() == Qt::NoModifier
104 ? QTextCursor::MoveAnchor
105 : QTextCursor::KeepAnchor;
106 QTextCursor cursor = textCursor();
107 cursor.movePosition(op, mode);
108 setTextCursor(cursor);
109 event->accept();
110 return;
111 }
112 break;
113 }
114 default:
115 break;
116 }
117
118 KTextEdit::keyPressEvent(event);
119 }
120
121 void KItemListRoleEditor::autoAdjustSize()
122 {
123 const qreal frameBorder = 2 * frameWidth();
124
125 const qreal requiredWidth = document()->size().width();
126 const qreal availableWidth = size().width() - frameBorder;
127 if (requiredWidth > availableWidth) {
128 qreal newWidth = requiredWidth + frameBorder;
129 if (parentWidget() && pos().x() + newWidth > parentWidget()->width()) {
130 newWidth = parentWidget()->width() - pos().x();
131 }
132 resize(newWidth, size().height());
133 }
134
135 const qreal requiredHeight = document()->size().height();
136 const qreal availableHeight = size().height() - frameBorder;
137 if (requiredHeight > availableHeight) {
138 qreal newHeight = requiredHeight + frameBorder;
139 if (parentWidget() && pos().y() + newHeight > parentWidget()->height()) {
140 newHeight = parentWidget()->height() - pos().y();
141 }
142 resize(size().width(), newHeight);
143 }
144 }
145
146 void KItemListRoleEditor::emitRoleEditingFinished()
147 {
148 if (!m_blockFinishedSignal) {
149 emit roleEditingFinished(m_role, KIO::encodeFileName(toPlainText()));
150 }
151 }
152