File indexing completed on 2024-05-26 04:32:42

0001 /*
0002  *  SPDX-FileCopyrightText: 2019 Tusooa Zhu <tusooa@vista.aero>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "SnapshotDocker.h"
0008 
0009 #include <QWidget>
0010 #include <QListView>
0011 #include <QToolButton>
0012 #include <QVBoxLayout>
0013 #include <QHBoxLayout>
0014 
0015 #include "KisSnapshotModel.h"
0016 #include "KisSnapshotView.h"
0017 
0018 #include <kis_canvas2.h>
0019 #include <kis_icon_utils.h>
0020 #include <kis_action.h>
0021 #include <kis_action_manager.h>
0022 #include <KisViewManager.h>
0023 #include <kis_signal_auto_connection.h>
0024 
0025 struct SnapshotDocker::Private
0026 {
0027     Private();
0028     ~Private();
0029 
0030     QScopedPointer<KisSnapshotModel> model;
0031     QPointer<KisSnapshotView> view;
0032     QPointer<KisCanvas2> canvas;
0033     QPointer<QToolButton> bnAdd;
0034     QPointer<QToolButton> bnSwitchTo;
0035     QPointer<QToolButton> bnRemove;
0036     KisSignalAutoConnectionsStore connections;
0037 };
0038 
0039 SnapshotDocker::Private::Private()
0040     : model(new KisSnapshotModel)
0041     , view(new KisSnapshotView)
0042     , canvas(0)
0043     , bnAdd(new QToolButton)
0044     , bnSwitchTo(new QToolButton)
0045     , bnRemove(new QToolButton)
0046 {
0047 }
0048 
0049 SnapshotDocker::Private::~Private()
0050 {
0051 }
0052 
0053 SnapshotDocker::SnapshotDocker()
0054     : QDockWidget()
0055     , m_d(new Private)
0056 {
0057     QWidget *widget = new QWidget(this);
0058     QVBoxLayout *mainLayout = new QVBoxLayout(widget);
0059     m_d->view->setModel(m_d->model.data());
0060     mainLayout->addWidget(m_d->view);
0061     QHBoxLayout *buttonsLayout = new QHBoxLayout();
0062     m_d->bnAdd->setIcon(KisIconUtils::loadIcon("list-add"));
0063     m_d->bnAdd->setToolTip(i18nc("@info:tooltip", "Create snapshot"));
0064     m_d->bnAdd->setAutoRaise(true);
0065 
0066     connect(m_d->bnAdd, &QToolButton::clicked, this, &SnapshotDocker::slotBnAddClicked);
0067     buttonsLayout->addWidget(m_d->bnAdd);
0068     m_d->bnSwitchTo->setIcon(KisIconUtils::loadIcon("snapshot-load"));
0069     m_d->bnSwitchTo->setToolTip(i18nc("@info:tooltip", "Switch to selected snapshot"));
0070     m_d->bnSwitchTo->setAutoRaise(true);
0071     connect(m_d->bnSwitchTo, &QToolButton::clicked, this, &SnapshotDocker::slotBnSwitchToClicked);
0072 
0073     buttonsLayout->addWidget(m_d->bnSwitchTo);
0074     m_d->bnRemove->setIcon(KisIconUtils::loadIcon("edit-delete"));
0075     m_d->bnRemove->setToolTip(i18nc("@info:tooltip", "Remove selected snapshot"));
0076     m_d->bnRemove->setAutoRaise(true);
0077     connect(m_d->bnRemove, &QToolButton::clicked, this, &SnapshotDocker::slotBnRemoveClicked);
0078     buttonsLayout->addWidget(m_d->bnRemove);
0079     mainLayout->addLayout(buttonsLayout);
0080 
0081     setWidget(widget);
0082     setWindowTitle(i18n("Snapshot Docker"));
0083     setEnabled(false);
0084 }
0085 
0086 SnapshotDocker::~SnapshotDocker()
0087 {
0088 }
0089 
0090 void SnapshotDocker::setViewManager(KisViewManager *viewManager)
0091 {
0092     m_d->connections.clear();
0093     KisAction *action = viewManager->actionManager()->createAction("create_snapshot");
0094     m_d->connections.addConnection(action, &KisAction::triggered,
0095                                    m_d->model.data(), &KisSnapshotModel::slotCreateSnapshot);
0096     action = viewManager->actionManager()->createAction("switchto_snapshot");
0097     m_d->connections.addConnection(action, &KisAction::triggered,
0098                                    m_d->view, &KisSnapshotView::slotSwitchToSelectedSnapshot);
0099     action = viewManager->actionManager()->createAction("remove_snapshot");
0100     m_d->connections.addConnection(action, &KisAction::triggered,
0101                                    m_d->view, &KisSnapshotView::slotRemoveSelectedSnapshot);
0102 }
0103 
0104 void SnapshotDocker::setCanvas(KoCanvasBase *canvas)
0105 {
0106     KisCanvas2 *c = dynamic_cast<KisCanvas2 *>(canvas);
0107     if (c) {
0108         if (m_d->canvas == c) {
0109             return;
0110         }
0111     }
0112     setEnabled(canvas != 0);
0113     m_d->canvas = c;
0114     m_d->model->setCanvas(c);
0115 }
0116 
0117 void SnapshotDocker::unsetCanvas()
0118 {
0119     setCanvas(0);
0120 }
0121 
0122 void SnapshotDocker::slotBnAddClicked()
0123 {
0124     if (m_d->canvas) {
0125         KisAction *action = m_d->canvas->viewManager()->actionManager()->actionByName("create_snapshot");
0126         action->trigger();
0127     }
0128 }
0129 
0130 void SnapshotDocker::slotBnSwitchToClicked()
0131 {
0132     if (m_d->canvas) {
0133         KisAction *action = m_d->canvas->viewManager()->actionManager()->actionByName("switchto_snapshot");
0134         action->trigger();
0135     }
0136 }
0137 
0138 void SnapshotDocker::slotBnRemoveClicked()
0139 {
0140     if (m_d->canvas) {
0141         KisAction *action = m_d->canvas->viewManager()->actionManager()->actionByName("remove_snapshot");
0142         action->trigger();
0143     }
0144 }