From 19be00f4fed0d7055dc3366f23a4d35664d8e970 Mon Sep 17 00:00:00 2001 From: "G.K.MacGregor" Date: Tue, 15 Dec 2020 21:57:42 +0000 Subject: [PATCH] Implement deleting of subpages --- document.cpp | 15 +++++++++++++++ document.h | 3 +++ levelonecommands.cpp | 19 +++++++++++++++++++ levelonecommands.h | 13 +++++++++++++ mainwindow.cpp | 13 +++++++++++++ mainwindow.h | 2 ++ 6 files changed, 65 insertions(+) diff --git a/document.cpp b/document.cpp index f379f8c..b50faaa 100644 --- a/document.cpp +++ b/document.cpp @@ -41,6 +41,8 @@ TeletextDocument::~TeletextDocument() { for (auto &subPage : m_subPages) delete(subPage); + for (auto &recycleSubPage : m_recycleSubPages) + delete(recycleSubPage); } bool TeletextDocument::isEmpty() const @@ -101,6 +103,7 @@ void TeletextDocument::insertSubPage(int beforeSubPageIndex, bool copySubPage) insertedSubPage = new LevelOnePage(*m_subPages.at(beforeSubPageIndex)); else insertedSubPage = new LevelOnePage; + if (beforeSubPageIndex == m_subPages.size()) m_subPages.push_back(insertedSubPage); else @@ -113,6 +116,18 @@ void TeletextDocument::deleteSubPage(int subPageToDelete) m_subPages.erase(m_subPages.begin()+subPageToDelete); } +void TeletextDocument::deleteSubPageToRecycle(int subPageToRecycle) +{ + m_recycleSubPages.push_back(m_subPages[subPageToRecycle]); + m_subPages.erase(m_subPages.begin()+subPageToRecycle); +} + +void TeletextDocument::unDeleteSubPageFromRecycle(int subPage) +{ + m_subPages.insert(m_subPages.begin()+subPage, m_recycleSubPages.back()); + m_recycleSubPages.pop_back(); +} + void TeletextDocument::setPageNumber(QString pageNumberString) { bool pageNumberOk; diff --git a/document.h b/document.h index 0b52b01..0b58a90 100644 --- a/document.h +++ b/document.h @@ -54,6 +54,8 @@ public: void selectSubPagePrevious(); void insertSubPage(int, bool); void deleteSubPage(int); + void deleteSubPageToRecycle(int); + void unDeleteSubPageFromRecycle(int); int pageNumber() const { return m_pageNumber; } void setPageNumber(QString); QString description() const { return m_description; } @@ -94,6 +96,7 @@ private: PageFunctionEnum m_pageFunction; PacketCodingEnum m_packetCoding; std::vector m_subPages; + std::vector m_recycleSubPages; QUndoStack *m_undoStack; int m_cursorRow, m_cursorColumn, m_selectionTopRow, m_selectionBottomRow, m_selectionLeftColumn, m_selectionRightColumn; LevelOnePage *m_selectionSubPage; diff --git a/levelonecommands.cpp b/levelonecommands.cpp index 8808cca..7c2f8de 100644 --- a/levelonecommands.cpp +++ b/levelonecommands.cpp @@ -241,6 +241,25 @@ void InsertSubPageCommand::undo() } +DeleteSubPageCommand::DeleteSubPageCommand(TeletextDocument *teletextDocument, QUndoCommand *parent) : QUndoCommand(parent) +{ + m_teletextDocument = teletextDocument; + m_subPageToDelete = teletextDocument->currentSubPageIndex(); + setText(QObject::tr("delete subpage")); +} + +void DeleteSubPageCommand::redo() +{ + m_teletextDocument->deleteSubPageToRecycle(m_subPageToDelete); + m_teletextDocument->selectSubPageIndex(qMin(m_subPageToDelete, m_teletextDocument->numberOfSubPages()-1), true); +} + +void DeleteSubPageCommand::undo() +{ + m_teletextDocument->unDeleteSubPageFromRecycle(m_subPageToDelete); + m_teletextDocument->selectSubPageIndex(m_subPageToDelete, true); +} + SetColourCommand::SetColourCommand(TeletextDocument *teletextDocument, int colourIndex, int newColour, QUndoCommand *parent) : QUndoCommand(parent) { m_teletextDocument = teletextDocument; diff --git a/levelonecommands.h b/levelonecommands.h index 609e6ba..95c8b35 100644 --- a/levelonecommands.h +++ b/levelonecommands.h @@ -84,6 +84,19 @@ private: bool m_copySubPage; }; +class DeleteSubPageCommand : public QUndoCommand +{ +public: + DeleteSubPageCommand(TeletextDocument *, QUndoCommand *parent = 0); + + void redo() override; + void undo() override; + +private: + TeletextDocument *m_teletextDocument; + int m_subPageToDelete; +}; + class InsertRowCommand : public QUndoCommand { public: diff --git a/mainwindow.cpp b/mainwindow.cpp index eea154d..3a60f80 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -343,6 +343,10 @@ void MainWindow::createActions() insertCopyAct->setStatusTip(tr("Insert a subpage that's a copy of this subpage")); connect(insertCopyAct, &QAction::triggered, [=]() { insertSubPage(false, true); }); + m_deleteSubPageAction = editMenu->addAction(tr("Delete subpage")); + m_deleteSubPageAction->setStatusTip(tr("Delete this subpage")); + connect(m_deleteSubPageAction, &QAction::triggered, this, &MainWindow::deleteSubPage); + QMenu *viewMenu = menuBar()->addMenu(tr("&View")); QAction *revealAct = viewMenu->addAction(tr("&Reveal")); @@ -556,6 +560,14 @@ void MainWindow::insertSubPage(bool afterCurrentSubPage, bool copyCurrentSubPage m_textWidget->document()->undoStack()->push(insertSubPageCommand); } +void MainWindow::deleteSubPage() +{ + if (m_textWidget->document()->numberOfSubPages() == 1) + return; + + m_textWidget->document()->undoStack()->push(new DeleteSubPageCommand(m_textWidget->document())); +} + void MainWindow::setBorder(int newViewBorder) { m_viewBorder = newViewBorder; @@ -869,6 +881,7 @@ void MainWindow::updatePageWidgets() m_subPageLabel->setText(QString("%1/%2").arg(m_textWidget->document()->currentSubPageIndex()+1).arg(m_textWidget->document()->numberOfSubPages())); m_previousSubPageButton->setEnabled(!(m_textWidget->document()->currentSubPageIndex() == 0)); m_nextSubPageButton->setEnabled(!(m_textWidget->document()->currentSubPageIndex() == (m_textWidget->document()->numberOfSubPages()) - 1)); + m_deleteSubPageAction->setEnabled(m_textWidget->document()->numberOfSubPages() > 1); m_pageOptionsDockWidget->updateWidgets(); m_pageEnhancementsDockWidget->updateWidgets(); m_x26DockWidget->loadX26List(); diff --git a/mainwindow.h b/mainwindow.h index b6136fc..d4e2458 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -68,6 +68,7 @@ private slots: void insertRow(bool); void deleteRow(); void insertSubPage(bool, bool); + void deleteSubPage(); void setSceneDimensions(); void setBorder(int); @@ -108,6 +109,7 @@ private: QAction *m_recentFileActs[m_MaxRecentFiles]; QAction *m_recentFileSeparator; QAction *m_recentFileSubMenuAct; + QAction *m_deleteSubPageAction; QAction *m_borderActs[3]; QAction *m_aspectRatioActs[4];