Add support for copying HTML formatted text from terminal

Currently, only text is supported - this add HTML

Thanks to Anonymous Koavohv koavohv gmail com

REVIEW: 119914
wilder-portage
Kurt Hindenburg 12 years ago
parent b6304bcc59
commit abb83e8ef0
  1. 26
      src/Screen.cpp
  2. 4
      src/Screen.h
  3. 4
      src/ScreenWindow.cpp
  4. 2
      src/ScreenWindow.h
  5. 22
      src/TerminalDisplay.cpp

@ -1107,23 +1107,35 @@ bool Screen::isSelected(const int x, const int y) const
return pos >= _selTopLeft && pos <= _selBottomRight && columnInSelection;
}
QString Screen::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces) const
QString Screen::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces, bool html) const
{
if (!isSelectionValid())
return QString();
return text(_selTopLeft, _selBottomRight, preserveLineBreaks, trimTrailingSpaces);
return text(_selTopLeft, _selBottomRight, preserveLineBreaks, trimTrailingSpaces, html);
}
QString Screen::text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces) const
QString Screen::text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces, bool html) const
{
QString result;
QTextStream stream(&result, QIODevice::ReadWrite);
PlainTextDecoder decoder;
decoder.begin(&stream);
writeToStream(&decoder, startIndex, endIndex, preserveLineBreaks, trimTrailingSpaces);
decoder.end();
HTMLDecoder htmlDecoder;
PlainTextDecoder plainTextDecoder;
TerminalCharacterDecoder *decoder;
if(html)
{
decoder = &htmlDecoder;
}
else
{
decoder = &plainTextDecoder;
}
decoder->begin(&stream);
writeToStream(decoder, startIndex, endIndex, preserveLineBreaks, trimTrailingSpaces);
decoder->end();
return result;
}

@ -447,7 +447,7 @@ public:
* @param trimTrailingSpaces Specifies whether trailing spaces should be
* trimmed in the returned text.
*/
QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false) const;
QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false, bool html = false) const;
/**
* Convenience method. Returns the text between two indices.
@ -458,7 +458,7 @@ public:
* @param trimTrailingSpaces Specifies whether trailing spaces should be
* trimmed in the returned text.
*/
QString text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces = false) const;
QString text(int startIndex, int endIndex, bool preserveLineBreaks, bool trimTrailingSpaces = false, bool html = false) const;
/**
* Copies part of the output to a stream.

@ -120,9 +120,9 @@ QVector<LineProperty> ScreenWindow::getLineProperties()
return result;
}
QString ScreenWindow::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces) const
QString ScreenWindow::selectedText(bool preserveLineBreaks, bool trimTrailingSpaces, bool html) const
{
return _screen->selectedText(preserveLineBreaks, trimTrailingSpaces);
return _screen->selectedText(preserveLineBreaks, trimTrailingSpaces, html);
}
void ScreenWindow::getSelectionStart(int& column , int& line)

@ -232,7 +232,7 @@ public:
* @param preserveLineBreaks See Screen::selectedText()
* @param trimTrailingSpaces See Screen::selectedText()
*/
QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false) const;
QString selectedText(bool preserveLineBreaks, bool trimTrailingSpaces = false, bool html = false) const;
public slots:
/**

@ -35,6 +35,7 @@
#include <QGridLayout>
#include <QAction>
#include <QLabel>
#include <QMimeData>
#include <QtGui/QPainter>
#include <QtGui/QPixmap>
#include <QScrollBar>
@ -2751,11 +2752,16 @@ void TerminalDisplay::copyToX11Selection()
QString text = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces);
if (text.isEmpty())
return;
QString html = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces, true);
QApplication::clipboard()->setText(text, QClipboard::Selection);
QMimeData *mimeData = new QMimeData;
mimeData->setText(text);
mimeData->setHtml(html);
QApplication::clipboard()->setMimeData(mimeData, QClipboard::Selection);
if (_autoCopySelectedText)
QApplication::clipboard()->setText(text, QClipboard::Clipboard);
QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard);
}
void TerminalDisplay::copyToClipboard()
@ -2766,8 +2772,13 @@ void TerminalDisplay::copyToClipboard()
QString text = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces);
if (text.isEmpty())
return;
QString html = _screenWindow->selectedText(_preserveLineBreaks, _trimTrailingSpaces, true);
QMimeData *mimeData = new QMimeData;
mimeData->setText(text);
mimeData->setHtml(html);
QApplication::clipboard()->setText(text, QClipboard::Clipboard);
QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard);
}
void TerminalDisplay::pasteFromClipboard(bool appendEnter)
@ -3222,8 +3233,9 @@ void TerminalDisplay::doDrag()
{
_dragInfo.state = diDragging;
_dragInfo.dragObject = new QDrag(this);
QMimeData* mimeData = new QMimeData;
mimeData->setText(QApplication::clipboard()->text(QClipboard::Selection));
QMimeData* mimeData = new QMimeData();
mimeData->setText(QApplication::clipboard()->mimeData(QClipboard::Selection)->text());
mimeData->setHtml(QApplication::clipboard()->mimeData(QClipboard::Selection)->html());
_dragInfo.dragObject->setMimeData(mimeData);
_dragInfo.dragObject->exec(Qt::CopyAction);
}

Loading…
Cancel
Save