diff --git a/levelonecommands.cpp b/levelonecommands.cpp index 057b765..2bebfc6 100644 --- a/levelonecommands.cpp +++ b/levelonecommands.cpp @@ -26,6 +26,7 @@ #include "levelonecommands.h" #include "document.h" +#include "keymap.h" LevelOneCommand::LevelOneCommand(TeletextDocument *teletextDocument, QUndoCommand *parent) : QUndoCommand(parent) { @@ -417,6 +418,7 @@ PasteCommand::PasteCommand(TeletextDocument *teletextDocument, QUndoCommand *par m_clipboardDataHeight = m_clipboardDataWidth = 0; // Try to get something from the clipboard + // FIXME is this a correct "custom" mime type? Or should we use vnd? nativeData = mimeData->data("application/x-teletext"); if (nativeData.size() > 2) { // Native clipboard data: we put it there ourselves @@ -430,9 +432,26 @@ PasteCommand::PasteCommand(TeletextDocument *teletextDocument, QUndoCommand *par else // Invalidate m_clipboardDataHeight = m_clipboardDataWidth = 0; + } else if (mimeData->hasText()) { + // Plain text + QStringList plainTextData = mimeData->text().split(QRegExp("\n|\r\n|\r")); + + m_clipboardDataHeight = plainTextData.size(); + m_clipboardDataWidth = 0; + + for (int r=0; rselectSubPageIndex(m_subPageIndex); @@ -508,7 +527,7 @@ void PasteCommand::redo() void PasteCommand::undo() { - if (m_clipboardDataWidth == 0) + if (m_clipboardDataWidth == 0 || m_clipboardDataHeight == 0) return; m_teletextDocument->selectSubPageIndex(m_subPageIndex); @@ -528,6 +547,9 @@ void PasteCommand::undo() arrayR++; } + + if (!m_selectionActive) + m_teletextDocument->moveCursor(m_row, m_column); } #endif // !QT_NO_CLIPBOARD diff --git a/mainwidget.cpp b/mainwidget.cpp index a9e772d..431c57a 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -394,20 +394,33 @@ void TeletextWidget::toggleCharacterBit(unsigned char bitToToggle) void TeletextWidget::selectionToClipboard() { QByteArray nativeData; + QString plainTextData; QClipboard *clipboard = QApplication::clipboard(); nativeData.resize(2 + m_teletextDocument->selectionWidth() * m_teletextDocument->selectionHeight()); nativeData[0] = m_teletextDocument->selectionHeight(); nativeData[1] = m_teletextDocument->selectionWidth(); + plainTextData.reserve((m_teletextDocument->selectionWidth()+1) * m_teletextDocument->selectionHeight() - 1); + int i=2; - for (int r=m_teletextDocument->selectionTopRow(); r<=m_teletextDocument->selectionBottomRow(); r++) - for (int c=m_teletextDocument->selectionLeftColumn(); c<=m_teletextDocument->selectionRightColumn(); c++) + for (int r=m_teletextDocument->selectionTopRow(); r<=m_teletextDocument->selectionBottomRow(); r++) { + for (int c=m_teletextDocument->selectionLeftColumn(); c<=m_teletextDocument->selectionRightColumn(); c++) { nativeData[i++] = m_teletextDocument->currentSubPage()->character(r, c); + if (m_teletextDocument->currentSubPage()->character(r, c) >= 0x20) + plainTextData.append(keymapping[m_pageRender.level1CharSet(r, c)].key(m_teletextDocument->currentSubPage()->character(r, c), m_teletextDocument->currentSubPage()->character(r, c))); + else + plainTextData.append(' '); + } + + plainTextData.append('\n'); + } + QMimeData *mimeData = new QMimeData(); mimeData->setData("application/x-teletext", nativeData); + mimeData->setText(plainTextData); clipboard->setMimeData(mimeData); }