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 }