Split text block saving into intermediate class
This commit is contained in:
@@ -38,6 +38,49 @@ LevelOneCommand::LevelOneCommand(TeletextDocument *teletextDocument, QUndoComman
|
|||||||
m_firstDo = true;
|
m_firstDo = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StoreOldCharactersCommand::StoreOldCharactersCommand(TeletextDocument *teletextDocument, QUndoCommand *parent) : LevelOneCommand(teletextDocument, parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void StoreOldCharactersCommand::storeOldCharacters(int topRow, int leftColumn, int bottomRow, int rightColumn)
|
||||||
|
{
|
||||||
|
for (int r=topRow; r<=bottomRow; r++) {
|
||||||
|
QByteArray rowArray;
|
||||||
|
|
||||||
|
for (int c=leftColumn; c<=rightColumn; c++)
|
||||||
|
// Guard against size of pasted block going beyond last line or column
|
||||||
|
if (r < 25 && c < 40)
|
||||||
|
rowArray.append(m_teletextDocument->currentSubPage()->character(r, c));
|
||||||
|
else
|
||||||
|
// Gone beyond last line or column - store a filler character which we won't see
|
||||||
|
// Not sure if this is really necessary as out-of-bounds access might not occur?
|
||||||
|
rowArray.append(0x7f);
|
||||||
|
|
||||||
|
m_oldCharacters.append(rowArray);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StoreOldCharactersCommand::retrieveOldCharacters(int topRow, int leftColumn, int bottomRow, int rightColumn)
|
||||||
|
{
|
||||||
|
int arrayR = 0;
|
||||||
|
int arrayC;
|
||||||
|
|
||||||
|
for (int r=topRow; r<=bottomRow; r++) {
|
||||||
|
arrayC = 0;
|
||||||
|
for (int c=leftColumn; c<=rightColumn; c++)
|
||||||
|
// Guard against size of pasted block going beyond last line or column
|
||||||
|
if (r < 25 && c < 40) {
|
||||||
|
m_teletextDocument->currentSubPage()->setCharacter(r, c, m_oldCharacters[arrayR].at(arrayC));
|
||||||
|
|
||||||
|
arrayC++;
|
||||||
|
}
|
||||||
|
|
||||||
|
arrayR++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TypeCharacterCommand::TypeCharacterCommand(TeletextDocument *teletextDocument, unsigned char newCharacter, bool insertMode, QUndoCommand *parent) : LevelOneCommand(teletextDocument, parent)
|
TypeCharacterCommand::TypeCharacterCommand(TeletextDocument *teletextDocument, unsigned char newCharacter, bool insertMode, QUndoCommand *parent) : LevelOneCommand(teletextDocument, parent)
|
||||||
{
|
{
|
||||||
m_columnStart = m_columnEnd = m_column;
|
m_columnStart = m_columnEnd = m_column;
|
||||||
@@ -351,7 +394,7 @@ void DeleteRowCommand::undo()
|
|||||||
|
|
||||||
|
|
||||||
#ifndef QT_NO_CLIPBOARD
|
#ifndef QT_NO_CLIPBOARD
|
||||||
CutCommand::CutCommand(TeletextDocument *teletextDocument, QUndoCommand *parent) : LevelOneCommand(teletextDocument, parent)
|
CutCommand::CutCommand(TeletextDocument *teletextDocument, QUndoCommand *parent) : StoreOldCharactersCommand(teletextDocument, parent)
|
||||||
{
|
{
|
||||||
m_selectionTopRow = m_teletextDocument->selectionTopRow();
|
m_selectionTopRow = m_teletextDocument->selectionTopRow();
|
||||||
m_selectionBottomRow = m_teletextDocument->selectionBottomRow();
|
m_selectionBottomRow = m_teletextDocument->selectionBottomRow();
|
||||||
@@ -361,15 +404,7 @@ CutCommand::CutCommand(TeletextDocument *teletextDocument, QUndoCommand *parent)
|
|||||||
m_selectionCornerRow = m_teletextDocument->selectionCornerRow();
|
m_selectionCornerRow = m_teletextDocument->selectionCornerRow();
|
||||||
m_selectionCornerColumn = m_teletextDocument->selectionCornerColumn();
|
m_selectionCornerColumn = m_teletextDocument->selectionCornerColumn();
|
||||||
|
|
||||||
// Store copy of the characters that we're about to blank
|
storeOldCharacters(m_selectionTopRow, m_selectionLeftColumn, m_selectionBottomRow, m_selectionRightColumn);
|
||||||
for (int r=m_selectionTopRow; r<=m_selectionBottomRow; r++) {
|
|
||||||
QByteArray rowArray;
|
|
||||||
|
|
||||||
for (int c=m_selectionLeftColumn; c<=m_selectionRightColumn; c++)
|
|
||||||
rowArray.append(m_teletextDocument->currentSubPage()->character(r, c));
|
|
||||||
|
|
||||||
m_deletedCharacters.append(rowArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
setText(QObject::tr("cut"));
|
setText(QObject::tr("cut"));
|
||||||
}
|
}
|
||||||
@@ -390,16 +425,7 @@ void CutCommand::undo()
|
|||||||
{
|
{
|
||||||
m_teletextDocument->selectSubPageIndex(m_subPageIndex);
|
m_teletextDocument->selectSubPageIndex(m_subPageIndex);
|
||||||
|
|
||||||
int arrayR = 0;
|
retrieveOldCharacters(m_selectionTopRow, m_selectionLeftColumn, m_selectionBottomRow, m_selectionRightColumn);
|
||||||
int arrayC;
|
|
||||||
|
|
||||||
for (int r=m_selectionTopRow; r<=m_selectionBottomRow; r++) {
|
|
||||||
arrayC = 0;
|
|
||||||
for (int c=m_selectionLeftColumn; c<=m_selectionRightColumn; c++)
|
|
||||||
m_teletextDocument->currentSubPage()->setCharacter(r, c, m_deletedCharacters[arrayR].at(arrayC++));
|
|
||||||
|
|
||||||
arrayR++;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit m_teletextDocument->contentsChanged();
|
emit m_teletextDocument->contentsChanged();
|
||||||
|
|
||||||
@@ -408,7 +434,7 @@ void CutCommand::undo()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PasteCommand::PasteCommand(TeletextDocument *teletextDocument, int pageCharSet, QUndoCommand *parent) : LevelOneCommand(teletextDocument, parent)
|
PasteCommand::PasteCommand(TeletextDocument *teletextDocument, int pageCharSet, QUndoCommand *parent) : StoreOldCharactersCommand(teletextDocument, parent)
|
||||||
{
|
{
|
||||||
const QClipboard *clipboard = QApplication::clipboard();
|
const QClipboard *clipboard = QApplication::clipboard();
|
||||||
const QMimeData *mimeData = clipboard->mimeData();
|
const QMimeData *mimeData = clipboard->mimeData();
|
||||||
@@ -586,21 +612,7 @@ PasteCommand::PasteCommand(TeletextDocument *teletextDocument, int pageCharSet,
|
|||||||
if (m_clipboardDataWidth == 0 || m_clipboardDataHeight == 0)
|
if (m_clipboardDataWidth == 0 || m_clipboardDataHeight == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Store copy of the characters that we're about to overwrite
|
storeOldCharacters(m_pasteTopRow, m_pasteLeftColumn, m_pasteBottomRow, m_pasteRightColumn);
|
||||||
for (int r=m_pasteTopRow; r<=m_pasteBottomRow; r++) {
|
|
||||||
QByteArray rowArray;
|
|
||||||
|
|
||||||
for (int c=m_pasteLeftColumn; c<=m_pasteRightColumn; c++)
|
|
||||||
// Guard against size of pasted block going beyond last line or column
|
|
||||||
if (r < 25 && c < 40)
|
|
||||||
rowArray.append(m_teletextDocument->currentSubPage()->character(r, c));
|
|
||||||
else
|
|
||||||
// Gone beyond last line or column - store a filler character which we won't see
|
|
||||||
// Not sure if this is really necessary as out-of-bounds access might not occur?
|
|
||||||
rowArray.append(0x7f);
|
|
||||||
|
|
||||||
m_deletedCharacters.append(rowArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
setText(QObject::tr("paste"));
|
setText(QObject::tr("paste"));
|
||||||
}
|
}
|
||||||
@@ -666,21 +678,7 @@ void PasteCommand::undo()
|
|||||||
|
|
||||||
m_teletextDocument->selectSubPageIndex(m_subPageIndex);
|
m_teletextDocument->selectSubPageIndex(m_subPageIndex);
|
||||||
|
|
||||||
int arrayR = 0;
|
retrieveOldCharacters(m_pasteTopRow, m_pasteLeftColumn, m_pasteBottomRow, m_pasteRightColumn);
|
||||||
int arrayC;
|
|
||||||
|
|
||||||
for (int r=m_pasteTopRow; r<=m_pasteBottomRow; r++) {
|
|
||||||
arrayC = 0;
|
|
||||||
for (int c=m_pasteLeftColumn; c<=m_pasteRightColumn; c++)
|
|
||||||
// Guard against size of pasted block going beyond last line or column
|
|
||||||
if (r < 25 && c < 40) {
|
|
||||||
m_teletextDocument->currentSubPage()->setCharacter(r, c, m_deletedCharacters[arrayR].at(arrayC));
|
|
||||||
|
|
||||||
arrayC++;
|
|
||||||
}
|
|
||||||
|
|
||||||
arrayR++;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit m_teletextDocument->contentsChanged();
|
emit m_teletextDocument->contentsChanged();
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,18 @@ protected:
|
|||||||
bool m_firstDo;
|
bool m_firstDo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class StoreOldCharactersCommand : public LevelOneCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StoreOldCharactersCommand(TeletextDocument *teletextDocument, QUndoCommand *parent = 0);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void storeOldCharacters(int topRow, int leftColumn, int bottomRow, int rightColumn);
|
||||||
|
void retrieveOldCharacters(int topRow, int leftColumn, int bottomRow, int rightColumn);
|
||||||
|
|
||||||
|
QByteArrayList m_oldCharacters;
|
||||||
|
};
|
||||||
|
|
||||||
class TypeCharacterCommand : public LevelOneCommand
|
class TypeCharacterCommand : public LevelOneCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -152,7 +164,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifndef QT_NO_CLIPBOARD
|
#ifndef QT_NO_CLIPBOARD
|
||||||
class CutCommand : public LevelOneCommand
|
class CutCommand : public StoreOldCharactersCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CutCommand(TeletextDocument *teletextDocument, QUndoCommand *parent = 0);
|
CutCommand(TeletextDocument *teletextDocument, QUndoCommand *parent = 0);
|
||||||
@@ -161,12 +173,11 @@ public:
|
|||||||
void undo() override;
|
void undo() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QByteArrayList m_deletedCharacters;
|
|
||||||
int m_selectionTopRow, m_selectionBottomRow, m_selectionLeftColumn, m_selectionRightColumn;
|
int m_selectionTopRow, m_selectionBottomRow, m_selectionLeftColumn, m_selectionRightColumn;
|
||||||
int m_selectionCornerRow, m_selectionCornerColumn;
|
int m_selectionCornerRow, m_selectionCornerColumn;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PasteCommand : public LevelOneCommand
|
class PasteCommand : public StoreOldCharactersCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PasteCommand(TeletextDocument *teletextDocument, int pageCharSet, QUndoCommand *parent = 0);
|
PasteCommand(TeletextDocument *teletextDocument, int pageCharSet, QUndoCommand *parent = 0);
|
||||||
@@ -175,7 +186,7 @@ public:
|
|||||||
void undo() override;
|
void undo() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QByteArrayList m_deletedCharacters, m_pastingCharacters;
|
QByteArrayList m_pastingCharacters;
|
||||||
int m_pasteTopRow, m_pasteBottomRow, m_pasteLeftColumn, m_pasteRightColumn;
|
int m_pasteTopRow, m_pasteBottomRow, m_pasteLeftColumn, m_pasteRightColumn;
|
||||||
int m_clipboardDataHeight, m_clipboardDataWidth;
|
int m_clipboardDataHeight, m_clipboardDataWidth;
|
||||||
int m_selectionCornerRow, m_selectionCornerColumn;
|
int m_selectionCornerRow, m_selectionCornerColumn;
|
||||||
|
|||||||
Reference in New Issue
Block a user