summaryrefslogtreecommitdiffstats
path: root/examples/animation/stickman/editor/animationdialog.cpp
blob: ca0daf0d54cf9de23923ea4a9c25244724309470 (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
#include "animationdialog.h"
#include "stickman.h"
#include "animation.h"
#include "node.h"

#include <QHBoxLayout>
#include <QStackedWidget>
#include <QSpinBox>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QMessageBox>
#include <QFileDialog>

AnimationDialog::AnimationDialog(StickMan *stickman, QWidget *parent)
    : QDialog(parent), m_animation(0), m_stickman(stickman)
{
    initUi();    
}

AnimationDialog::~AnimationDialog()
{
    delete m_animation;
}

void AnimationDialog::initUi() 
{
    setWindowTitle("Animation");
    setEnabled(false);

    // Second page
    m_currentFrame = new QSpinBox();
    m_totalFrames = new QSpinBox();
    m_name = new QLineEdit();

    connect(m_currentFrame, SIGNAL(valueChanged(int)), this, SLOT(currentFrameChanged(int)));
    connect(m_totalFrames, SIGNAL(valueChanged(int)), this, SLOT(totalFramesChanged(int)));
    connect(m_name, SIGNAL(textChanged(QString)), this, SLOT(setCurrentAnimationName(QString)));

    QGridLayout *gridLayout = new QGridLayout(this);
    gridLayout->addWidget(new QLabel("Name:"), 0, 0, 1, 2);
    gridLayout->addWidget(m_name, 0, 2, 1, 2);
    gridLayout->addWidget(new QLabel("Frame:"), 1, 0);    
    gridLayout->addWidget(m_currentFrame, 1, 1);
    gridLayout->addWidget(new QLabel("of total # of frames: "), 1, 2);
    gridLayout->addWidget(m_totalFrames, 1, 3);
}

void AnimationDialog::initFromAnimation()
{
    m_currentFrame->setRange(0, m_animation->totalFrames()-1);
    m_currentFrame->setValue(m_animation->currentFrame());

    m_totalFrames->setRange(1, 1000);
    m_totalFrames->setValue(m_animation->totalFrames());

    m_name->setText(m_animation->name());
}

void AnimationDialog::saveAnimation()
{
    saveCurrentFrame();

    QString fileName = QFileDialog::getSaveFileName(this, "Save animation");

    QFile file(fileName);
    if (file.open(QIODevice::WriteOnly))
        m_animation->save(&file);    
}

void AnimationDialog::loadAnimation()
{
    if (maybeSave() != QMessageBox::Cancel) {
        QString fileName = QFileDialog::getOpenFileName(this, "Open animation");

        QFile file(fileName);
        if (file.open(QIODevice::ReadOnly)) {        
            if (m_animation == 0)
                newAnimation();

            m_animation->load(&file);
            stickManFromCurrentFrame();
            initFromAnimation();
        }
    }
}

QMessageBox::StandardButton AnimationDialog::maybeSave() 
{
    if (m_animation == 0)
        return QMessageBox::No;

    QMessageBox::StandardButton button = QMessageBox::question(this, "Save?", "Do you want to save your changes?", 
                                                               QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    if (button == QMessageBox::Save)
        saveAnimation();   

    return button;                 
}

void AnimationDialog::newAnimation()
{    
    if (maybeSave() != QMessageBox::Cancel) {
        setEnabled(true);
        delete m_animation;
        m_animation = new Animation();
        initFromAnimation();        
    }
}

// Gets the data from the stickman and stores it in current frame
void AnimationDialog::saveCurrentFrame()
{
    int count = m_stickman->nodeCount();
    m_animation->setNodeCount(count);
    for (int i=0; i<count; ++i) {
        QGraphicsItem *node = m_stickman->node(i);
        m_animation->setNodePos(i, node->pos());
    }
}

// Gets the data from the current frame and sets the stickman
void AnimationDialog::stickManFromCurrentFrame()
{
    int count = m_animation->nodeCount();
    for (int i=0;i<count;++i) {
        QGraphicsItem *node = m_stickman->node(i);
        node->setPos(m_animation->nodePos(i));
    }
}

void AnimationDialog::currentFrameChanged(int currentFrame)
{
    saveCurrentFrame();
    qDebug("currentFrame: %d", currentFrame);
    m_animation->setCurrentFrame(currentFrame);    
    stickManFromCurrentFrame();
    initFromAnimation();
}
 
void AnimationDialog::totalFramesChanged(int totalFrames)
{
    m_animation->setTotalFrames(totalFrames);    
    stickManFromCurrentFrame();
    initFromAnimation();
}

void AnimationDialog::setCurrentAnimationName(const QString &name)
{
    m_animation->setName(name);
}