forked from qt-creator/qt-creator
Editor: Select moved text after drag and drop
Fixes: QTCREATORBUG-24245 Change-Id: I9da52424128825f729d5d20e2c7fd095120477c6 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -163,6 +163,8 @@ enum { NExtraSelectionKinds = 12 };
|
|||||||
using TransformationMethod = QString(const QString &);
|
using TransformationMethod = QString(const QString &);
|
||||||
using ListTransformationMethod = void(QStringList &);
|
using ListTransformationMethod = void(QStringList &);
|
||||||
|
|
||||||
|
static constexpr char dropProperty[] = "dropProp";
|
||||||
|
|
||||||
class LineColumnLabel : public FixedSizeClickLabel
|
class LineColumnLabel : public FixedSizeClickLabel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -714,7 +716,7 @@ public:
|
|||||||
// block selection mode
|
// block selection mode
|
||||||
bool m_inBlockSelectionMode = false;
|
bool m_inBlockSelectionMode = false;
|
||||||
QString copyBlockSelection();
|
QString copyBlockSelection();
|
||||||
void insertIntoBlockSelection(const QString &text = QString());
|
void insertIntoBlockSelection(const QString &text = QString(), const bool selectText = false);
|
||||||
void setCursorToColumn(QTextCursor &cursor, int column,
|
void setCursorToColumn(QTextCursor &cursor, int column,
|
||||||
QTextCursor::MoveMode moveMode = QTextCursor::MoveAnchor);
|
QTextCursor::MoveMode moveMode = QTextCursor::MoveAnchor);
|
||||||
void removeBlockSelection();
|
void removeBlockSelection();
|
||||||
@@ -3802,7 +3804,7 @@ void TextEditorWidgetPrivate::setCursorToColumn(QTextCursor &cursor, int column,
|
|||||||
cursor.block().text(), column), moveMode);
|
cursor.block().text(), column), moveMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextEditorWidgetPrivate::insertIntoBlockSelection(const QString &text)
|
void TextEditorWidgetPrivate::insertIntoBlockSelection(const QString &text, const bool selectText)
|
||||||
{
|
{
|
||||||
// TODO: add autocompleter support
|
// TODO: add autocompleter support
|
||||||
QTextCursor cursor = q->textCursor();
|
QTextCursor cursor = q->textCursor();
|
||||||
@@ -3828,6 +3830,7 @@ void TextEditorWidgetPrivate::insertIntoBlockSelection(const QString &text)
|
|||||||
int positionBlock = m_blockSelection.positionBlock;
|
int positionBlock = m_blockSelection.positionBlock;
|
||||||
int anchorBlock = m_blockSelection.anchorBlock;
|
int anchorBlock = m_blockSelection.anchorBlock;
|
||||||
int column = m_blockSelection.positionColumn;
|
int column = m_blockSelection.positionColumn;
|
||||||
|
const int anchorColumn = m_blockSelection.anchorColumn;
|
||||||
|
|
||||||
const QTextBlock &firstBlock =
|
const QTextBlock &firstBlock =
|
||||||
m_document->document()->findBlockByNumber(m_blockSelection.firstBlockNumber());
|
m_document->document()->findBlockByNumber(m_blockSelection.firstBlockNumber());
|
||||||
@@ -3880,7 +3883,10 @@ void TextEditorWidgetPrivate::insertIntoBlockSelection(const QString &text)
|
|||||||
cursor.endEditBlock();
|
cursor.endEditBlock();
|
||||||
|
|
||||||
column += textLength;
|
column += textLength;
|
||||||
m_blockSelection.fromPostition(positionBlock, column, anchorBlock, column);
|
m_blockSelection.fromPostition(positionBlock,
|
||||||
|
column,
|
||||||
|
anchorBlock,
|
||||||
|
selectText ? anchorColumn : column);
|
||||||
q->doSetTextCursor(m_blockSelection.selection(m_document.data()), true);
|
q->doSetTextCursor(m_blockSelection.selection(m_document.data()), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7722,8 +7728,9 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source)
|
|||||||
if (d->m_codeAssistant.hasContext())
|
if (d->m_codeAssistant.hasContext())
|
||||||
d->m_codeAssistant.destroyContext();
|
d->m_codeAssistant.destroyContext();
|
||||||
|
|
||||||
|
const bool selectInsertedText = source->property(dropProperty).toBool();
|
||||||
if (d->m_inBlockSelectionMode) {
|
if (d->m_inBlockSelectionMode) {
|
||||||
d->insertIntoBlockSelection(text);
|
d->insertIntoBlockSelection(text, selectInsertedText);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7738,7 +7745,16 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source)
|
|||||||
QTextCursor cursor = textCursor();
|
QTextCursor cursor = textCursor();
|
||||||
if (!tps.m_autoIndent) {
|
if (!tps.m_autoIndent) {
|
||||||
cursor.beginEditBlock();
|
cursor.beginEditBlock();
|
||||||
cursor.insertText(text);
|
if (selectInsertedText) {
|
||||||
|
const int anchor = cursor.position();
|
||||||
|
cursor.insertText(text);
|
||||||
|
const int pos = cursor.position();
|
||||||
|
cursor.endEditBlock();
|
||||||
|
cursor.setPosition(anchor);
|
||||||
|
cursor.setPosition(pos, QTextCursor::KeepAnchor);
|
||||||
|
} else {
|
||||||
|
cursor.insertText(text);
|
||||||
|
}
|
||||||
cursor.endEditBlock();
|
cursor.endEditBlock();
|
||||||
setTextCursor(cursor);
|
setTextCursor(cursor);
|
||||||
return;
|
return;
|
||||||
@@ -7768,6 +7784,9 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source)
|
|||||||
|
|
||||||
int cursorPosition = cursor.position();
|
int cursorPosition = cursor.position();
|
||||||
cursor.insertText(text);
|
cursor.insertText(text);
|
||||||
|
const QTextCursor endCursor = cursor;
|
||||||
|
QTextCursor startCursor = endCursor;
|
||||||
|
startCursor.setPosition(cursorPosition);
|
||||||
|
|
||||||
int reindentBlockEnd = cursor.blockNumber() - (hasFinalNewline?1:0);
|
int reindentBlockEnd = cursor.blockNumber() - (hasFinalNewline?1:0);
|
||||||
|
|
||||||
@@ -7788,9 +7807,33 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cursor.endEditBlock();
|
cursor.endEditBlock();
|
||||||
|
if (selectInsertedText) {
|
||||||
|
cursor.setPosition(startCursor.position());
|
||||||
|
cursor.setPosition(endCursor.position(), QTextCursor::KeepAnchor);
|
||||||
|
}
|
||||||
setTextCursor(cursor);
|
setTextCursor(cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextEditorWidget::dropEvent(QDropEvent *e)
|
||||||
|
{
|
||||||
|
const QMimeData *mime = e->mimeData();
|
||||||
|
if (mime && (mime->hasText() || mime->hasHtml())) {
|
||||||
|
QMimeData *mimeOverwrite = duplicateMimeData(mime);
|
||||||
|
mimeOverwrite->setProperty(dropProperty, true);
|
||||||
|
auto dropOverwrite = new QDropEvent(e->pos(),
|
||||||
|
e->possibleActions(),
|
||||||
|
mimeOverwrite,
|
||||||
|
e->mouseButtons(),
|
||||||
|
e->keyboardModifiers());
|
||||||
|
QPlainTextEdit::dropEvent(dropOverwrite);
|
||||||
|
e->setAccepted(dropOverwrite->isAccepted());
|
||||||
|
delete dropOverwrite;
|
||||||
|
delete mimeOverwrite;
|
||||||
|
} else {
|
||||||
|
QPlainTextEdit::dropEvent(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QMimeData *TextEditorWidget::duplicateMimeData(const QMimeData *source)
|
QMimeData *TextEditorWidget::duplicateMimeData(const QMimeData *source)
|
||||||
{
|
{
|
||||||
Q_ASSERT(source);
|
Q_ASSERT(source);
|
||||||
|
|||||||
@@ -530,6 +530,7 @@ protected:
|
|||||||
QMimeData *createMimeDataFromSelection() const override;
|
QMimeData *createMimeDataFromSelection() const override;
|
||||||
bool canInsertFromMimeData(const QMimeData *source) const override;
|
bool canInsertFromMimeData(const QMimeData *source) const override;
|
||||||
void insertFromMimeData(const QMimeData *source) override;
|
void insertFromMimeData(const QMimeData *source) override;
|
||||||
|
void dropEvent(QDropEvent *e) override;
|
||||||
|
|
||||||
virtual QString plainTextFromSelection(const QTextCursor &cursor) const;
|
virtual QString plainTextFromSelection(const QTextCursor &cursor) const;
|
||||||
static QString convertToPlainText(const QString &txt);
|
static QString convertToPlainText(const QString &txt);
|
||||||
|
|||||||
Reference in New Issue
Block a user