summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Palettes/Slide/SlideView.h
blob: eed796553016d4564f394bb4b90e4b5a9889a0d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt 3D Studio.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef SLIDEVIEW_H
#define SLIDEVIEW_H

#include <QtQuickWidgets/qquickwidget.h>

#include "DispatchListeners.h"
#include "SlideModel.h"
#include "DataInputSelectView.h"
#include "Qt3DSDMHandles.h"
#include "Qt3DSDMSignals.h"
#include "DispatchListeners.h"
#include "Dispatch.h"

class CClientDataModelBridge;
class CDoc;

QT_FORWARD_DECLARE_CLASS(QLabel);

namespace qt3dsdm {
class ISlideSystem;
}

class SlideView : public QQuickWidget,
                  public CPresentationChangeListener,
                  public IDataModelListener
{
    Q_OBJECT
    Q_PROPERTY(QAbstractItemModel *currentModel READ currentModel NOTIFY currentModelChanged FINAL)
    Q_PROPERTY(bool showMasterSlide READ showMasterSlide WRITE setShowMasterSlide NOTIFY showMasterSlideChanged FINAL)
    Q_PROPERTY(bool controlled MEMBER m_controlled NOTIFY controlledChanged)
    Q_PROPERTY(QString currController MEMBER m_currentController NOTIFY controlledChanged)
    Q_PROPERTY(QString toolTip MEMBER m_toolTip NOTIFY controlledChanged)
    Q_PROPERTY(Qt::DockWidgetArea dockArea MEMBER m_dockArea NOTIFY dockAreaChanged)
public:
    SlideView(QWidget *parent = nullptr);
    ~SlideView();

    bool showMasterSlide() const;
    void setShowMasterSlide(bool show);
    QAbstractItemModel *currentModel() { return m_CurrentModel; }
    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;
    void onDataInputChange(int handle, int instance, const QString &dataInputName);
    void onDockLocationChange(Qt::DockWidgetArea area);
    void refreshVariants();

    Q_INVOKABLE void deselectAll();
    Q_INVOKABLE void addNewSlide(int row);
    Q_INVOKABLE void removeSlide(int row);
    Q_INVOKABLE void duplicateSlide(int row);
    Q_INVOKABLE void startSlideRearrange(int row);
    Q_INVOKABLE void moveSlide(int from, int to);
    Q_INVOKABLE void finishSlideRearrange(bool commit);
    Q_INVOKABLE void showContextMenu(int x, int y, int row);
    Q_INVOKABLE void showControllerDialog(const QPoint &point);
    Q_INVOKABLE void showVariantsTooltip(int row, const QPoint &point);
    Q_INVOKABLE void hideVariantsTooltip();
    Q_INVOKABLE bool toolTipsEnabled();

    // Presentation Change Listener
    void OnNewPresentation() override;
    void OnClosingPresentation() override;

    // IDataModelListener
    void OnBeginDataModelNotifications() override;
    void OnEndDataModelNotifications() override;
    void OnImmediateRefreshInstanceSingle(qt3dsdm::Qt3DSDMInstanceHandle inInstance) override;
    void OnImmediateRefreshInstanceMultiple(qt3dsdm::Qt3DSDMInstanceHandle *inInstance,
                                            long inInstanceCount) override;

Q_SIGNALS:
    void currentModelChanged();
    void showMasterSlideChanged();
    void controlledChanged();
    void dockAreaChanged();

protected:
    void mousePressEvent(QMouseEvent *event) override;

    // DataModel callbacks
    virtual void OnActiveSlide(const qt3dsdm::Qt3DSDMSlideHandle &inMaster, int inIndex,
                               const qt3dsdm::Qt3DSDMSlideHandle &inSlide);
    virtual void OnNewSlide(const qt3dsdm::Qt3DSDMSlideHandle &inSlide);
    virtual void OnDeleteSlide(const qt3dsdm::Qt3DSDMSlideHandle &inSlide);
    virtual void OnSlideRearranged(const qt3dsdm::Qt3DSDMSlideHandle &inMaster, int inOldIndex,
                                   int inNewIndex);

    void updateDataInputStatus();
    void UpdateSlideViewTitleColor();

private:
    void initialize();
    void clearSlideList();
    void setActiveSlide(const qt3dsdm::Qt3DSDMSlideHandle &inActiveSlideHandle);
    inline CDoc *GetDoc();
    inline CClientDataModelBridge *GetBridge();
    inline qt3dsdm::ISlideSystem *GetSlideSystem();
    long GetSlideIndex(const qt3dsdm::Qt3DSDMSlideHandle &inSlideHandle);
    bool isMaster(const qt3dsdm::Qt3DSDMSlideHandle &inSlideHandle);
    void rebuildSlideList(const qt3dsdm::Qt3DSDMSlideHandle &inActiveSlideHandle);
    void onAssetCreated(qt3dsdm::Qt3DSDMInstanceHandle inInstance);
    void onAssetDeleted(qt3dsdm::Qt3DSDMInstanceHandle inInstance);
    void onPropertyChanged(qt3dsdm::Qt3DSDMInstanceHandle inInstance,
                           qt3dsdm::Qt3DSDMPropertyHandle inProperty);

    SlideModel *m_MasterSlideModel = nullptr;
    SlideModel *m_SlidesModel = nullptr;
    SlideModel *m_CurrentModel = nullptr;
    DataInputSelectView *m_dataInputSelector = nullptr;
    QLabel *m_variantsToolTip = nullptr;
    QColor m_BaseColor = QColor::fromRgb(75, 75, 75);
    std::vector<std::shared_ptr<qt3dsdm::ISignalConnection>> m_Connections;
    typedef QHash<int, int> TIntIntMap;
    // We need to remember which slide we were on when we entered the master slide.
    // Then, when the users leave the master slide we can go back to roughly the same
    // state.
    TIntIntMap m_MasterSlideReturnPointers;

    // the object containing the slides to be inspected.
    qt3dsdm::Qt3DSDMInstanceHandle m_ActiveRoot = 0;
    qt3dsdm::Qt3DSDMSlideHandle m_ActiveSlideHandle; // the active slide handle
    bool m_controlled = false; // Are slides in this slide set controlled by datainput?
    QString m_currentController;
    QString m_toolTip;
    Qt::DockWidgetArea m_dockArea;
};

#endif // SLIDEVIEW_H