X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b2e54c3a316b502ab4f7a95250f8316dc591c057..6d9f5b21315bf7c9f6b08e32a89346e22c482714:/src/kitemviews/private/kitemlistroleeditor.cpp diff --git a/src/kitemviews/private/kitemlistroleeditor.cpp b/src/kitemviews/private/kitemlistroleeditor.cpp index 55af6a9c7..5ff013429 100644 --- a/src/kitemviews/private/kitemlistroleeditor.cpp +++ b/src/kitemviews/private/kitemlistroleeditor.cpp @@ -19,35 +19,29 @@ #include "kitemlistroleeditor.h" -#include +#include #include KItemListRoleEditor::KItemListRoleEditor(QWidget *parent) : KTextEdit(parent), - m_index(0), - m_role() + m_role(), + m_blockFinishedSignal(false) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setAcceptRichText(false); + enableFindReplace(false); document()->setDocumentMargin(0); if (parent) { parent->installEventFilter(this); } -} - -KItemListRoleEditor::~KItemListRoleEditor() -{ -} -void KItemListRoleEditor::setIndex(int index) -{ - m_index = index; + connect(this, &KItemListRoleEditor::textChanged, this, &KItemListRoleEditor::autoAdjustSize); } -int KItemListRoleEditor::index() const +KItemListRoleEditor::~KItemListRoleEditor() { - return m_index; } void KItemListRoleEditor::setRole(const QByteArray& role) @@ -60,10 +54,10 @@ QByteArray KItemListRoleEditor::role() const return m_role; } -bool KItemListRoleEditor::eventFilter(QObject* watched, QEvent* event) +bool KItemListRoleEditor::eventFilter(QObject* watched, QEvent* event) { if (watched == parentWidget() && event->type() == QEvent::Resize) { - autoAdjustSize(); + emitRoleEditingFinished(); } return KTextEdit::eventFilter(watched, event); @@ -72,7 +66,10 @@ bool KItemListRoleEditor::eventFilter(QObject* watched, QEvent* event) bool KItemListRoleEditor::event(QEvent* event) { if (event->type() == QEvent::FocusOut) { - emit roleEditingFinished(m_index, m_role, toPlainText()); + QFocusEvent* focusEvent = static_cast(event); + if (focusEvent->reason() != Qt::PopupFocusReason) { + emitRoleEditingFinished(); + } } return KTextEdit::event(event); } @@ -81,33 +78,72 @@ void KItemListRoleEditor::keyPressEvent(QKeyEvent* event) { switch (event->key()) { case Qt::Key_Escape: - emit roleEditingCanceled(m_index, m_role, toPlainText()); + // Emitting the signal roleEditingCanceled might result + // in losing the focus. Per default losing the focus emits + // a roleEditingFinished signal (see KItemListRoleEditor::event), + // which is not wanted in this case. + m_blockFinishedSignal = true; + emit roleEditingCanceled(m_role, KIO::encodeFileName(toPlainText())); + m_blockFinishedSignal = false; event->accept(); return; case Qt::Key_Enter: case Qt::Key_Return: - emit roleEditingFinished(m_index, m_role, toPlainText()); + emitRoleEditingFinished(); event->accept(); return; + case Qt::Key_Left: + case Qt::Key_Right: { + QTextCursor cursor = textCursor(); + if (event->modifiers() == Qt::NoModifier && cursor.hasSelection()) { + if (event->key() == Qt::Key_Left) { + cursor.setPosition(cursor.selectionStart()); + } else { + cursor.setPosition(cursor.selectionEnd()); + } + cursor.clearSelection(); + setTextCursor(cursor); + event->accept(); + return; + } + break; + } default: break; } KTextEdit::keyPressEvent(event); - autoAdjustSize(); } void KItemListRoleEditor::autoAdjustSize() { + const qreal frameBorder = 2 * frameWidth(); + const qreal requiredWidth = document()->size().width(); - const qreal availableWidth = size().width() - 2 * frameWidth(); + const qreal availableWidth = size().width() - frameBorder; if (requiredWidth > availableWidth) { - qreal newWidth = requiredWidth + 2 * frameWidth(); + qreal newWidth = requiredWidth + frameBorder; if (parentWidget() && pos().x() + newWidth > parentWidget()->width()) { newWidth = parentWidget()->width() - pos().x(); } resize(newWidth, size().height()); } + + const qreal requiredHeight = document()->size().height(); + const qreal availableHeight = size().height() - frameBorder; + if (requiredHeight > availableHeight) { + qreal newHeight = requiredHeight + frameBorder; + if (parentWidget() && pos().y() + newHeight > parentWidget()->height()) { + newHeight = parentWidget()->height() - pos().y(); + } + resize(size().width(), newHeight); + } +} + +void KItemListRoleEditor::emitRoleEditingFinished() +{ + if (!m_blockFinishedSignal) { + emit roleEditingFinished(m_role, KIO::encodeFileName(toPlainText())); + } } -#include "kitemlistroleeditor.moc"