changeset 397:9993873ff655

More work towards editor.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 19 Oct 2012 07:22:09 +0300
parents 1712cc35e9a1
children 8660c6005032
files edgui.cpp edmain.cpp edmain.h edtimeline.cpp edtimeline.h edtlobj.cpp
diffstat 6 files changed, 140 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/edgui.cpp	Fri Oct 19 07:21:54 2012 +0300
+++ b/edgui.cpp	Fri Oct 19 07:22:09 2012 +0300
@@ -21,10 +21,10 @@
     // Set window title based on document filename and changed status
     QString name;
 
-    if (!tl || tl->filename.isEmpty())
+    if (!currTimeline || currTimeline->filename.isEmpty())
         name = DOC_DEF_FILENAME;
     else
-        name = tl->filename;
+        name = currTimeline->filename;
 
     if (changed)
         name = "*" + name;
@@ -32,14 +32,9 @@
     setWindowTitle(name + " - " + QCoreApplication::applicationName());
 
     // Enable menu items based on states
-#if 0
-    menuActValidate->setEnabled(tl->get);
-    menuActSave->setEnabled(tl->changed || changed);
-    menuActSaveAs->setEnabled(tl->changed || changed);
-#else
-    menuActSave->setEnabled(false);
-    menuActSaveAs->setEnabled(false);
-#endif
+    menuActSave->setEnabled(currTimeline->changed || changed);
+    menuActSaveAs->setEnabled(currTimeline->changed || changed);
+
     
     // Enable undo/redo items and set their texts based on history status
     int historyLevels = undoHistory.size();
@@ -141,7 +136,7 @@
                 {
                     QMessageBox::information(this, 
                         "Document saved",
-                        "The document was saved as " + tl->filename);
+                        "The document was saved as " + currTimeline->filename);
 
                     okToCreate = true;
                 }
@@ -177,7 +172,7 @@
                 {
                     QMessageBox::information(this, 
                         "Document saved",
-                        "The document was saved as " + tl->filename);
+                        "The document was saved as " + currTimeline->filename);
                     
                     okToOpen = true;
                 }
@@ -205,9 +200,9 @@
 
 void DemoEditor::actionFileSaveAs()
 {
-    if (!tl)
+    if (!currTimeline)
     {
-        qDebug() << "DemoEditor::actionFileSaveAs(): tl == null";
+        qDebug() << "DemoEditor::actionFileSaveAs(): currTimeline == null";
         return;
     }
 
@@ -219,7 +214,7 @@
     fdialog.setDefaultSuffix("demo");
     fdialog.setConfirmOverwrite(true);
 
-    fdialog.selectFile(tl->filename.isEmpty() ? tl->filename : DOC_DEF_FILENAME);
+    fdialog.selectFile(currTimeline->filename.isEmpty() ? currTimeline->filename : DOC_DEF_FILENAME);
     
     if (fdialog.exec())
         saveToFile(fdialog.selectedFiles()[0]);
@@ -228,15 +223,15 @@
 
 void DemoEditor::actionFileSave()
 {
-    if (!tl)
+    if (!currTimeline)
     {
-        qDebug() << "DemoEditor::actionFileSave(): tl == null";
+        qDebug() << "DemoEditor::actionFileSave(): currTimeline == null";
         return;
     }
 
     // If filename has been set, save .. otherwise go to save as
-    if (!tl->filename.isEmpty())
-        saveToFile(tl->filename);
+    if (!currTimeline->filename.isEmpty())
+        saveToFile(currTimeline->filename);
     else
         actionFileSaveAs();
 }
@@ -494,11 +489,12 @@
     connect(timelineAudioTrack, SIGNAL(timeChanged(float)), this, SLOT(actionTimeChanged(float)));
 
     timelineView = new QTimelineView();
+    connect(timelineView, SIGNAL(timelineChanged()), this, SLOT(actionTimelineChanged()));
 
     demoView = new SWDemoView(this);
 
     verticalSplitter->addLayout(horizSplitter);
-    verticalSplitter->addWidget(timelineTrack);
+    verticalSplitter->addWidget(timelineView);
     verticalSplitter->addWidget(timelineAudioTrack);
     verticalSplitter->addWidget(timelineScrollBar);
 
--- a/edmain.cpp	Fri Oct 19 07:21:54 2012 +0300
+++ b/edmain.cpp	Fri Oct 19 07:22:09 2012 +0300
@@ -99,10 +99,10 @@
     resize(1024, 768);
     setWindowTitle(QCoreApplication::applicationName());
 
+    memset(&engine, 0, sizeof(engine));
     changed = FALSE;
     initSDL = FALSE;
     currTimeline = NULL;
-    memset(&engine, 0, sizeof(engine));
 
     // Pre-initialization
     if ((err = demoPreInit(&engine)) != DMERR_OK)
@@ -208,6 +208,10 @@
     // Setup GUI elements
     createMainGUI();
     createNewFile();
+    DMTimelineTrack *tr = NULL;
+    dmTimelineAddTrack(currTimeline->tl, &tr, "Penis");
+
+    timelineView->setTimeline(currTimeline);
 
     settingsRestore();
 
@@ -224,7 +228,6 @@
 
     settingsSave();
     delete demoView;
-    delete tl;
     historyReset();
 
     if (engine.screen)
@@ -263,16 +266,17 @@
 {
     demoView->setEngineData(&engine);    
 
-    timelineAudioTrack->setWaveform(
-        engine.audioRes->rdata, engine.audioRes->rdataSize,
-        engine.optAfmt.format, engine.optAfmt.channels,
-        engine.optAfmt.freq);
+    if (engine.audioRes != NULL)
+    {
+        timelineAudioTrack->setWaveform(
+            engine.audioRes->rdata, engine.audioRes->rdataSize,
+            engine.optAfmt.format, engine.optAfmt.channels,
+            engine.optAfmt.freq);
+    }
 
     timelineAudioTrack->setOffset(currViewOffset);
     timelineAudioTrack->setScale(currViewScale);
     
-    if (currTimeline != NULL)
-        timelineView->setTrack(currTimeline->tl);
 
     timelineView->setTime(currFrameTime);
     timelineView->setOffset(currViewOffset);
@@ -304,6 +308,13 @@
 }
 
 
+void DemoEditor::actionTimelineChanged()
+{
+    updateMenuStates();
+    update();
+}
+
+
 int DemoEditor::initEffectsAndResources()
 {
     int err;
@@ -355,7 +366,7 @@
 
 void DemoEditor::shutdownEffectsAndResources()
 {
-    dmFreeTimeline(engine.tl);
+    delete currTimeline;
     dmFreePreparedTimelineData(engine.ptl);
     engineShutdownEffects(&engine);
     dmres_close(engine.resources);
@@ -388,8 +399,8 @@
     }
     else
     {
-        delete tl;
-        tl = tmp;
+        delete currTimeline;
+        currTimeline = tmp;
 
         update();
         historyReset();
@@ -401,7 +412,7 @@
 
 void DemoEditor::saveToFile(QString filename)
 {
-    int ret = tl->save(filename);
+    int ret = currTimeline->save(filename);
     if (ret != DMERR_OK)
     {
         showFileErrorDialog("Saving demo blob file "+ filename, ret);
--- a/edmain.h	Fri Oct 19 07:21:54 2012 +0300
+++ b/edmain.h	Fri Oct 19 07:22:09 2012 +0300
@@ -67,6 +67,7 @@
     void actionTimelineScrollChanged(int);
     void actionOffsetChanged(float);
     void actionTimeChanged(float);
+    void actionTimelineChanged();
 
 private:
     QTableView *effectTable;
@@ -113,7 +114,7 @@
     int currViewOffset;
     int currFrameTime;
 
-    TimelineObject *tl;
+    TimelineObject *currTimeline;
     DMEngineData engine;
 
     QList<TimelineObject *> undoHistory;
--- a/edtimeline.cpp	Fri Oct 19 07:21:54 2012 +0300
+++ b/edtimeline.cpp	Fri Oct 19 07:22:09 2012 +0300
@@ -27,21 +27,18 @@
 void QTimelineTrackDisplay::setTrack(DMTimelineTrack *mtrack)
 {
     track = mtrack;
-    update();
 }
 
 
 void QTimelineTrackDisplay::setTime(const int mtime)
 {
     time = mtime;
-    update();
 }
 
 
 void QTimelineTrackDisplay::setOffset(const int moffs)
 {
     offs = moffs;
-    update();
 }
 
 
@@ -49,7 +46,6 @@
 {
     if (mscale > 0.05)
         scale = mscale;
-    update();
 }
 
 
@@ -72,12 +68,16 @@
         DMTimelineEvent *ev = track->events[event];
     }
 
+    painter.restore();
+
     if (time >= offs * scale && time - offs <= width() * scale)
     {
         int xc = time - offs;
+        painter.save();
         painter.scale(scale, 1);
         painter.setPen(markerColor);
         painter.drawLine(xc, 0, xc, height());
+        painter.restore();
     }
 }
 
@@ -137,7 +137,7 @@
 
     enabledCheck = new QCheckBox("Enabled");
     infoLayout->addWidget(enabledCheck);
-    connect(enabledCheck, SIGNAL(toggled(bool)), this, SLOT(slotEnabledChanged(bool)));
+    connect(enabledCheck, SIGNAL(toggled(bool)), this, SLOT(slotTrackChanged(bool)));
     
     infoData = new QLabel();
     infoData->setStyleSheet("QLabel { padding: 2px; }");
@@ -167,26 +167,91 @@
 }
 
 
-void QTimelineTrackView::setTime(const int mtime)
+void QTimelineTrackView::slotTrackChanged(bool value)
 {
-    track->setTime(mtime);
+    track->track->enabled = value;
+    emit trackChanged(value);
+}
+
+
+
+QTimelineView::QTimelineView(QWidget *parent) : QWidget(parent)
+{
+    layout = new QVBoxLayout(this);
+    tl = NULL;
 }
 
 
-void QTimelineTrackView::setOffset(const int moffs)
+void QTimelineView::setTimeline(TimelineObject *mtl)
 {
-    track->setOffset(moffs);
+    tl = mtl;
+
+    delete layout;
+    layout = new QVBoxLayout(this);
+    tracks.clear();
+
+    if (tl != NULL && tl->tl != NULL)
+    {
+        for (int track = 0; track < tl->tl->ntracks; track++)
+        {
+            QTimelineTrackView *vtr = new QTimelineTrackView(this);
+            vtr->setTrack(tl->tl->tracks[track]);
+            tracks.append(vtr);
+            layout->addWidget(vtr);
+            connect(vtr, SIGNAL(trackChanged(bool)), this, SLOT(slotTimelineChanged()));
+        }
+    }
+    update();
 }
 
 
-void QTimelineTrackView::setScale(const float mscale)
+void QTimelineView::slotTimelineChanged()
 {
-    track->setScale(mscale);
+    if (tl != NULL)
+    {
+        tl->changed++;
+        emit timelineChanged();
+    }
+}
+
+void QTimelineView::setTime(const int mtime)
+{
+    if (tl != NULL && tl->tl != NULL)
+    {
+        QList<QTimelineTrackView *>::iterator track;
+        for (track = tracks.begin(); track != tracks.end(); track++)
+        {
+            (*track)->track->setTime(mtime);
+        }
+        update();
+    }
 }
 
 
-void QTimelineTrackView::slotEnabledChanged(bool value)
+
+void QTimelineView::setOffset(const int moffs)
 {
-    track->track->enabled = value;
-//    emit enabledChanged(value);
+    if (tl != NULL && tl->tl != NULL)
+    {
+        QList<QTimelineTrackView *>::iterator track;
+        for (track = tracks.begin(); track != tracks.end(); track++)
+        {
+            (*track)->track->setOffset(moffs);
+        }
+        update();
+    }
 }
+
+
+void QTimelineView::setScale(const float mscale)
+{
+    if (tl != NULL && tl->tl != NULL)
+    {
+        QList<QTimelineTrackView *>::iterator track;
+        for (track = tracks.begin(); track != tracks.end(); track++)
+        {
+            (*track)->track->setScale(mscale);
+        }
+        update();
+    }
+}
--- a/edtimeline.h	Fri Oct 19 07:21:54 2012 +0300
+++ b/edtimeline.h	Fri Oct 19 07:22:09 2012 +0300
@@ -3,7 +3,9 @@
 
 #include <QWidget>
 #include <QCheckBox>
+#include <QVBoxLayout>
 #include <QLabel>
+#include "edtlobj.h"
 #include "dmengine.h"
 
 
@@ -58,10 +60,10 @@
     void setTrack(DMTimelineTrack *mtrack);
 
 private slots:
-    void slotEnabledChanged(bool);
+    void slotTrackChanged(bool);
 
-//signals:
-//    void enabledChanged(bool);
+signals:
+    void trackChanged(bool);
 };
 
 
@@ -70,16 +72,23 @@
     Q_OBJECT
 
 private:
-    DMTimeline *tl;
+    QVBoxLayout *layout;
+    TimelineObject *tl;
     QList<QTimelineTrackView *> tracks;
 
 public:
     QTimelineView(QWidget *parent = 0);
-    void setTimeline(DMTimeline *mtl);
+    void setTimeline(TimelineObject *mtl);
 
     void setTime(const int mtime);
     void setOffset(const int moffs);
     void setScale(const float mscale);
+
+private slots:
+    void slotTimelineChanged();
+
+signals:
+    void timelineChanged();
 };
 
 #endif
--- a/edtlobj.cpp	Fri Oct 19 07:21:54 2012 +0300
+++ b/edtlobj.cpp	Fri Oct 19 07:22:09 2012 +0300
@@ -1,5 +1,5 @@
 //
-// Map Mask Designer -- Map object and map region classes
+// Wrapper class for DMTimeline data
 // (C) Copyright 2012 Matti 'ccr' Hämäläinen <ccr@tnsp.org>
 //
 #include "edtlobj.h"
@@ -8,7 +8,7 @@
 
 TimelineObject::TimelineObject()
 {
-    tl = NULL;
+    dmTimelineNew(&tl, "Demo");
     changed = 0;
 }
 
@@ -17,6 +17,7 @@
 {
     changed = 0;
     filename = obj->filename;
+    dmCopyTimeline(obj->tl, &tl);
 }
 
 
@@ -33,7 +34,9 @@
     if ((res = dmf_create_stdio(fnba.data(), "rb")) == NULL)
         return DMERR_FOPEN;
 
+    dmFreeTimeline(tl);
     int err = dmLoadTimeline(res, &tl);
+    changed = 0;
 
     dmf_close(res);
     filename = mfilename;
@@ -49,6 +52,7 @@
         return DMERR_FOPEN;
 
     int err = dmSaveTimeline(res, tl);
+    changed = 0;
 
     dmf_close(res);
     return err;