File indexing completed on 2024-05-12 16:28:23
0001 /* 0002 * This file is part of the KDE project 0003 * 0004 * Copyright (C) 2013 Shantanu Tushar <shantanu@kde.org> 0005 * Copyright (C) 2013 Sujith Haridasan <sujith.h@gmail.com> 0006 * Copyright (C) 2013 Arjen Hiemstra <ahiemstra@heimr.nl> 0007 * 0008 * This library is free software; you can redistribute it and/or 0009 * modify it under the terms of the GNU Library General Public 0010 * License as published by the Free Software Foundation; either 0011 * version 2 of the License, or (at your option) any later version. 0012 * 0013 * This library is distributed in the hope that it will be useful, 0014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0016 * Library General Public License for more details. 0017 * 0018 * You should have received a copy of the GNU Library General Public License 0019 * along with this library; see the file COPYING.LIB. If not, write to 0020 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0021 * Boston, MA 02110-1301, USA. 0022 * 0023 */ 0024 0025 #include "PresentationKoPAView.h" 0026 0027 #include <KoZoomController.h> 0028 #include <KoPADocument.h> 0029 #include <KoPACanvasBase.h> 0030 #include <KoPAPageBase.h> 0031 #include <KoPAViewModeNormal.h> 0032 #include <stage/part/KPrDocument.h> 0033 #include <KoShapeManager.h> 0034 #include <KoShapeLayer.h> 0035 #include <KoSelection.h> 0036 #include <KoPAPage.h> 0037 #include <KoPAMasterPage.h> 0038 #include <QGraphicsItem> 0039 #include <KoCanvasController.h> 0040 #include <KoPACanvasItem.h> 0041 #include <KoZoomHandler.h> 0042 #include <KoPart.h> 0043 0044 using namespace Calligra::Components; 0045 0046 class PresentationKoPAView::Private 0047 { 0048 public: 0049 Private() : canvasController{nullptr}, 0050 zoomController{nullptr}, 0051 paCanvas{nullptr}, 0052 prDocument{nullptr}, 0053 page{nullptr} 0054 { } 0055 0056 KoCanvasController* canvasController; 0057 KoZoomController* zoomController; 0058 KoPACanvasBase* paCanvas; 0059 KPrDocument* prDocument; 0060 KoPAPageBase* page; 0061 }; 0062 0063 //TODO: Cleanup code that is not called 0064 PresentationKoPAView::PresentationKoPAView (KoCanvasController* canvasController, KoPACanvasBase* canvas, KPrDocument* prDocument) 0065 : d{new Private} 0066 { 0067 d->canvasController = canvasController; 0068 d->paCanvas = canvas; 0069 d->prDocument = prDocument; 0070 0071 KoPAViewModeNormal* mode = new KoPAViewModeNormal(this, d->paCanvas); 0072 setViewMode(mode); 0073 } 0074 0075 PresentationKoPAView::~PresentationKoPAView() 0076 { 0077 0078 } 0079 0080 void PresentationKoPAView::setShowRulers (bool show) 0081 { 0082 Q_UNUSED(show); 0083 } 0084 0085 void PresentationKoPAView::editPaste() 0086 { 0087 0088 } 0089 0090 void PresentationKoPAView::pagePaste() 0091 { 0092 0093 } 0094 0095 void PresentationKoPAView::insertPage() 0096 { 0097 0098 } 0099 0100 void PresentationKoPAView::updatePageNavigationActions() 0101 { 0102 0103 } 0104 0105 void PresentationKoPAView::setActionEnabled (int actions, bool enable) 0106 { 0107 Q_UNUSED(actions); 0108 Q_UNUSED(enable); 0109 0110 } 0111 0112 void PresentationKoPAView::navigatePage (KoPageApp::PageNavigation pageNavigation) 0113 { 0114 Q_UNUSED(pageNavigation); 0115 } 0116 0117 KoPAPageBase* PresentationKoPAView::activePage() const 0118 { 0119 return d->page; 0120 } 0121 0122 void PresentationKoPAView::setActivePage (KoPAPageBase* page) 0123 { 0124 auto shapeManager = d->paCanvas->shapeManager(); 0125 auto masterShapeManager = d->paCanvas->masterShapeManager(); 0126 shapeManager->removeAdditional(d->page); 0127 d->page = page; 0128 shapeManager->addAdditional (page); 0129 0130 auto shapes = page->shapes(); 0131 shapeManager->setShapes (shapes, KoShapeManager::AddWithoutRepaint); 0132 //Make the top most layer active 0133 if (!shapes.isEmpty()) { 0134 KoShapeLayer* layer = dynamic_cast<KoShapeLayer*> (shapes.last()); 0135 shapeManager->selection()->setActiveLayer (layer); 0136 } 0137 0138 // if the page is not a master page itself set shapes of the master page 0139 auto paPage = dynamic_cast<KoPAPage*> (page); 0140 if (paPage) { 0141 auto masterPage = paPage->masterPage(); 0142 auto masterShapes = masterPage->shapes(); 0143 masterShapeManager->setShapes (masterShapes, KoShapeManager::AddWithoutRepaint); 0144 //Make the top most layer active 0145 if (!masterShapes.isEmpty()) { 0146 auto layer = dynamic_cast<KoShapeLayer*> (masterShapes.last()); 0147 masterShapeManager->selection()->setActiveLayer (layer); 0148 } 0149 } else { 0150 // if the page is a master page no shapes are in the masterShapeManager 0151 masterShapeManager->setShapes (QList<KoShape*>()); 0152 } 0153 0154 // Set the current page number in the canvas resource provider 0155 d->paCanvas->resourceManager()->setResource (KoCanvasResourceManager::CurrentPage, d->prDocument->pageIndex (page) + 1); 0156 } 0157 0158 void PresentationKoPAView::doUpdateActivePage (KoPAPageBase* page) 0159 { 0160 setActivePage (page); 0161 0162 d->paCanvas->updateSize(); 0163 auto layout = page->pageLayout(); 0164 0165 QSizeF pageSize{layout.width, layout.height}; 0166 d->paCanvas->setDocumentOrigin (QPointF (0, 0)); 0167 d->paCanvas->resourceManager()->setResource (KoCanvasResourceManager::PageSize, pageSize); 0168 zoomController()->setPageSize(pageSize); 0169 zoomController()->setDocumentSize(pageSize); 0170 0171 d->paCanvas->updateSize(); 0172 auto item = dynamic_cast<QGraphicsItem*> (d->paCanvas); 0173 item->update(); 0174 0175 proxyObject->emitActivePageChanged(); 0176 } 0177 0178 KoZoomController* PresentationKoPAView::zoomController() const 0179 { 0180 return d->zoomController; 0181 } 0182 0183 KoPADocument* PresentationKoPAView::kopaDocument() const 0184 { 0185 return d->prDocument; 0186 } 0187 0188 KoPACanvasBase* PresentationKoPAView::kopaCanvas() const 0189 { 0190 return d->paCanvas; 0191 } 0192 0193 void PresentationKoPAView::connectToZoomController() 0194 { 0195 connect(zoomController(), &KoZoomController::zoomChanged, this, &PresentationKoPAView::slotZoomChanged); 0196 } 0197 0198 void PresentationKoPAView::slotZoomChanged (KoZoomMode::Mode mode, qreal zoom) 0199 { 0200 Q_UNUSED (zoom); 0201 if (d->page) { 0202 if (mode == KoZoomMode::ZOOM_PAGE) { 0203 auto layout = d->page->pageLayout(); 0204 QRectF pageRect{0, 0, layout.width, layout.height}; 0205 d->canvasController->ensureVisible(d->paCanvas->viewConverter()->documentToView (pageRect)); 0206 } else if (mode == KoZoomMode::ZOOM_WIDTH) { 0207 // horizontally center the page 0208 auto layout = d->page->pageLayout(); 0209 QRectF pageRect{0, 0, layout.width, layout.height}; 0210 auto viewRect = d->paCanvas->viewConverter()->documentToView(pageRect).toRect(); 0211 viewRect.translate(d->paCanvas->documentOrigin()); 0212 QRect currentVisible{qMax (0, -d->canvasController->canvasOffsetX()), 0213 qMax (0, -d->canvasController->canvasOffsetY()), 0214 d->canvasController->visibleWidth(), 0215 d->canvasController->visibleHeight()}; 0216 int horizontalMove = viewRect.center().x() - currentVisible.center().x(); 0217 d->canvasController->pan(QPoint(horizontalMove, 0)); 0218 } 0219 dynamic_cast<KoPACanvasItem*>(d->paCanvas)->update(); 0220 } 0221 } 0222 0223 void PresentationKoPAView::setZoomController(KoZoomController* controller) 0224 { 0225 d->zoomController = controller; 0226 }