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 }