Commit ca57dec0 authored by Jean-Baptiste Mardelle's avatar Jean-Baptiste Mardelle
Browse files

First steps towards track effects

svn path=/trunk/kdenlive/; revision=4737
parent a07218ce
......@@ -1525,73 +1525,6 @@ EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool /*animat
return parameters;
}
EffectsParameterList ClipItem::getEffectArgs(const QDomElement effect)
{
EffectsParameterList parameters;
parameters.addParam("tag", effect.attribute("tag"));
if (effect.hasAttribute("region")) parameters.addParam("region", effect.attribute("region"));
parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
parameters.addParam("id", effect.attribute("id"));
if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable"));
if (effect.hasAttribute("in")) parameters.addParam("in", effect.attribute("in"));
if (effect.hasAttribute("out")) parameters.addParam("out", effect.attribute("out"));
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
//kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag");
if (e.attribute("type") == "simplekeyframe") {
QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
double factor = e.attribute("factor", "1").toDouble();
for (int j = 0; j < values.count(); j++) {
QString pos = values.at(j).section(":", 0, 0);
double val = values.at(j).section(":", 1, 1).toDouble() / factor;
values[j] = pos + "=" + QString::number(val);
}
// kDebug() << "/ / / /SENDING KEYFR:" << values;
parameters.addParam(e.attribute("name"), values.join(";"));
/*parameters.addParam(e.attribute("name"), e.attribute("keyframes").replace(":", "="));
parameters.addParam("max", e.attribute("max"));
parameters.addParam("min", e.attribute("min"));
parameters.addParam("factor", e.attribute("factor", "1"));*/
} else if (e.attribute("type") == "keyframe") {
kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE";
parameters.addParam("keyframes", e.attribute("keyframes"));
parameters.addParam("max", e.attribute("max"));
parameters.addParam("min", e.attribute("min"));
parameters.addParam("factor", e.attribute("factor", "1"));
parameters.addParam("starttag", e.attribute("starttag", "start"));
parameters.addParam("endtag", e.attribute("endtag", "end"));
} else if (e.attribute("namedesc").contains(';')) {
QString format = e.attribute("format");
QStringList separators = format.split("%d", QString::SkipEmptyParts);
QStringList values = e.attribute("value").split(QRegExp("[,:;x]"));
QString neu;
QTextStream txtNeu(&neu);
if (values.size() > 0)
txtNeu << (int)values[0].toDouble();
for (int i = 0; i < separators.size() && i + 1 < values.size(); i++) {
txtNeu << separators[i];
txtNeu << (int)(values[i+1].toDouble());
}
parameters.addParam("start", neu);
} else {
if (e.attribute("factor", "1") != "1") {
double fact;
if (e.attribute("factor").startsWith('%')) {
fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor"));
} else fact = e.attribute("factor", "1").toDouble();
parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
} else {
parameters.addParam(e.attribute("name"), e.attribute("value"));
}
}
}
return parameters;
}
void ClipItem::deleteEffect(QString index)
{
bool needRepaint = false;
......
......@@ -72,9 +72,6 @@ public:
* @return The parameters that will be passed to Mlt */
EffectsParameterList addEffect(const QDomElement effect, bool animate = true);
/** @brief Gets the effect parameters that will be passed to Mlt. */
EffectsParameterList getEffectArgs(QDomElement effect);
/** @brief Deletes the effect with id @param index. */
void deleteEffect(QString index);
......
......@@ -60,6 +60,7 @@
#include "configtrackscommand.h"
#include "rebuildgroupcommand.h"
#include "razorgroupcommand.h"
#include "profilesdialog.h"
#include <KDebug>
#include <KLocale>
......@@ -1537,7 +1538,7 @@ void CustomTrackView::slotRefreshEffects(ClipItem *clip)
}
bool success = true;
for (int i = 0; i < clip->effectsCount(); i++) {
if (!m_document->renderer()->mltAddEffect(track, pos, clip->getEffectArgs(clip->effectAt(i)), false)) success = false;
if (!m_document->renderer()->mltAddEffect(track, pos, getEffectArgs(clip->effectAt(i)), false)) success = false;
}
if (!success) emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
m_document->renderer()->doRefresh();
......@@ -1773,7 +1774,7 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedE
return;
}
EffectsParameterList effectParams = clip->getEffectArgs(effect);
EffectsParameterList effectParams = getEffectArgs(effect);
if (effect.attribute("tag") == "ladspa") {
// Update the ladspa affect file
initEffects::ladspaEffectFile(effect.attribute("src"), effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
......@@ -1781,7 +1782,7 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedE
// check if we are trying to reset a keyframe effect
if (effectParams.hasParam("keyframes") && effectParams.paramValue("keyframes").isEmpty()) {
clip->initEffect(effect);
effectParams = clip->getEffectArgs(effect);
effectParams = getEffectArgs(effect);
}
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - clip->track(), clip->startPos(), effectParams))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
......@@ -3208,7 +3209,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
prod = clip->baseClip()->producer(info.track);
m_document->renderer()->mltInsertClip(info, clip->xml(), prod, m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT);
for (int i = 0; i < clip->effectsCount(); i++) {
m_document->renderer()->mltAddEffect(info.track, info.startPos, clip->getEffectArgs(clip->effectAt(i)), false);
m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effectAt(i)), false);
}
} else {
Transition *tr = static_cast <Transition*>(item);
......@@ -3609,7 +3610,7 @@ void CustomTrackView::cutSelectedClips()
for (int j = 0; j < children.count(); ++j) {
for (int k = 0; k < itemList.count(); ++k) {
if (children.at(j)->pos() == itemList.at(k)->pos()
&& children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
&& children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
toRemove.append(k);
}
}
......@@ -3631,7 +3632,7 @@ void CustomTrackView::cutSelectedClips()
for (int j = 0; j < children.count(); ++j) {
for (int k = 0; k < itemList.count(); ++k) {
if (children.at(j)->pos() == itemList.at(k)->pos()
&& children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
&& children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
toRemove.append(k);
}
}
......@@ -3845,7 +3846,7 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i
else prod = baseclip->producer(info.track);
m_document->renderer()->mltInsertClip(info, xml, prod, overwrite, push);
for (int i = 0; i < item->effectsCount(); i++) {
m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false);
m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(item->effectAt(i)), false);
}
setDocumentModified();
if (refresh) m_document->renderer()->doRefresh();
......@@ -4493,7 +4494,7 @@ void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info)
end += start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
......@@ -4511,7 +4512,7 @@ void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info)
end += start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
......@@ -4533,7 +4534,7 @@ void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info)
start = end - start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
......@@ -4551,7 +4552,7 @@ void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info)
start = end - start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
......@@ -4583,7 +4584,7 @@ void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info)
}
oldeffect.setAttribute("in", start);
oldeffect.setAttribute("out", max);
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
......@@ -5411,7 +5412,7 @@ void CustomTrackView::slotUpdateAllThumbs()
item->slotSetEndThumb(pix);
}
}
item->refreshClip(false);
item->refreshClip(false);
}
}
}
......@@ -6259,3 +6260,76 @@ bool CustomTrackView::hasAudio(int track) const
}
return false;
}
void CustomTrackView::slotAddTrackEffect(const QDomElement effect, int ix)
{
m_document->renderer()->mltAddTrackEffect(m_document->tracksCount() - ix, getEffectArgs(effect));
}
EffectsParameterList CustomTrackView::getEffectArgs(const QDomElement effect)
{
EffectsParameterList parameters;
parameters.addParam("tag", effect.attribute("tag"));
if (effect.hasAttribute("region")) parameters.addParam("region", effect.attribute("region"));
parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
parameters.addParam("id", effect.attribute("id"));
if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable"));
if (effect.hasAttribute("in")) parameters.addParam("in", effect.attribute("in"));
if (effect.hasAttribute("out")) parameters.addParam("out", effect.attribute("out"));
QDomNodeList params = effect.elementsByTagName("parameter");
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
//kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag");
if (e.attribute("type") == "simplekeyframe") {
QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
double factor = e.attribute("factor", "1").toDouble();
for (int j = 0; j < values.count(); j++) {
QString pos = values.at(j).section(":", 0, 0);
double val = values.at(j).section(":", 1, 1).toDouble() / factor;
values[j] = pos + "=" + QString::number(val);
}
// kDebug() << "/ / / /SENDING KEYFR:" << values;
parameters.addParam(e.attribute("name"), values.join(";"));
/*parameters.addParam(e.attribute("name"), e.attribute("keyframes").replace(":", "="));
parameters.addParam("max", e.attribute("max"));
parameters.addParam("min", e.attribute("min"));
parameters.addParam("factor", e.attribute("factor", "1"));*/
} else if (e.attribute("type") == "keyframe") {
kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE";
parameters.addParam("keyframes", e.attribute("keyframes"));
parameters.addParam("max", e.attribute("max"));
parameters.addParam("min", e.attribute("min"));
parameters.addParam("factor", e.attribute("factor", "1"));
parameters.addParam("starttag", e.attribute("starttag", "start"));
parameters.addParam("endtag", e.attribute("endtag", "end"));
} else if (e.attribute("namedesc").contains(';')) {
QString format = e.attribute("format");
QStringList separators = format.split("%d", QString::SkipEmptyParts);
QStringList values = e.attribute("value").split(QRegExp("[,:;x]"));
QString neu;
QTextStream txtNeu(&neu);
if (values.size() > 0)
txtNeu << (int)values[0].toDouble();
for (int i = 0; i < separators.size() && i + 1 < values.size(); i++) {
txtNeu << separators[i];
txtNeu << (int)(values[i+1].toDouble());
}
parameters.addParam("start", neu);
} else {
if (e.attribute("factor", "1") != "1") {
double fact;
if (e.attribute("factor").startsWith('%')) {
fact = ProfilesDialog::getStringEval(m_document->mltProfile(), e.attribute("factor"));
} else fact = e.attribute("factor", "1").toDouble();
parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
} else {
parameters.addParam(e.attribute("name"), e.attribute("value"));
}
}
}
return parameters;
}
\ No newline at end of file
......@@ -246,6 +246,11 @@ public slots:
* @param cut true = cut, false = "uncut" */
void slotRazorGroup(QList <ItemInfo> clips1, QList <ItemInfo> transitions1, QList <ItemInfo> clipsCut, QList <ItemInfo> transitionsCut, QList <ItemInfo> clips2, QList <ItemInfo> transitions2, GenTime cutPos, bool cut);
/** @brief Add en effect to a track.
* @param effect The new effect xml
* @param ix The track index */
void slotAddTrackEffect(const QDomElement effect, int ix);
protected:
virtual void drawBackground(QPainter * painter, const QRectF & rect);
//virtual void drawForeground ( QPainter * painter, const QRectF & rect );
......@@ -383,6 +388,9 @@ private:
* @param cutPos The absolute position of the cut */
void razorGroup(AbstractGroupItem *group, GenTime cutPos);
/** @brief Gets the effect parameters that will be passed to Mlt. */
EffectsParameterList getEffectArgs(const QDomElement effect);
private slots:
void slotRefreshGuides();
void slotEnableRefresh();
......
......@@ -31,6 +31,7 @@
#include <QAction>
#include <QTimer>
#include <QColor>
#include <QDomDocument>
HeaderTrack::HeaderTrack(int index, TrackInfo info, int height, QWidget *parent) :
QWidget(parent),
......@@ -54,6 +55,8 @@ HeaderTrack::HeaderTrack(int index, TrackInfo info, int height, QWidget *parent)
buttonLock->setChecked(info.isLocked);
buttonLock->setToolTip(i18n("Lock track"));
setAcceptDrops(true);
QPalette p = palette();
KColorScheme scheme(p.currentColorGroup(), KColorScheme::Window);
p.setColor(QPalette::Button, scheme.background(KColorScheme::ActiveBackground).color().darker(120));
......@@ -140,6 +143,28 @@ void HeaderTrack::mouseDoubleClickEvent(QMouseEvent* event)
QWidget::mouseDoubleClickEvent(event);
}
//virtual
void HeaderTrack::dropEvent(QDropEvent * event)
{
const QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
QDomDocument doc;
doc.setContent(effects, true);
const QDomElement e = doc.documentElement();
emit addTrackInfo(e, m_index);
/*if (scene() && !scene()->views().isEmpty()) {
event->accept();
CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
if (view) view->slotAddEffect(e, m_info.startPos, track());
}*/
}
//virtual
void HeaderTrack::dragEnterEvent(QDragEnterEvent *event)
{
if (buttonLock->isChecked()) event->setAccepted(false);
else event->setAccepted(event->mimeData()->hasFormat("kdenlive/effectslist"));
}
void HeaderTrack::setSelectedIndex(int ix)
{
if (m_index == ix) {
......
......@@ -22,6 +22,7 @@
#include <QContextMenuEvent>
#include <QMenu>
#include <QDomElement>
#include "definitions.h"
#include "ui_trackheader_ui.h"
......@@ -41,6 +42,8 @@ protected:
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseDoubleClickEvent(QMouseEvent * event);
virtual void contextMenuEvent(QContextMenuEvent * event);
virtual void dropEvent(QDropEvent * event);
virtual void dragEnterEvent(QDragEnterEvent *event);
private:
int m_index;
......@@ -68,6 +71,7 @@ signals:
void renameTrack(int, QString);
void selectTrack(int);
void configTrack(int);
void addTrackInfo(const QDomElement, int);
};
#endif
......@@ -2292,6 +2292,16 @@ bool Render::mltRemoveEffect(int track, GenTime position, QString index, bool up
return success;
}
bool Render::mltAddTrackEffect(int track, EffectsParameterList params)
{
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
Mlt::Service trackService(trackPlaylist.get_service());
return mltAddEffect(trackService, params, 15000, true);
}
bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList params, bool doRefresh)
{
......@@ -2311,18 +2321,22 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
Mlt::Service clipService(clip->get_service());
m_isBlocked = true;
int duration = clip->get_playtime();
bool updateIndex = false;
if (doRefresh) {
// Check if clip is visible in monitor
int diff = trackPlaylist.clip_start(clipIndex) + duration - m_mltProducer->position();
if (diff < 0 || diff > duration) doRefresh = false;
}
delete clip;
return mltAddEffect(clipService, params, duration, doRefresh);
}
bool Render::mltAddEffect(Mlt::Service service, EffectsParameterList params, int duration, bool doRefresh)
{
bool updateIndex = false;
const int filter_ix = params.paramValue("kdenlive_ix").toInt();
const QString region = params.paramValue("region");
int ct = 0;
Mlt::Filter *filter = clipService.filter(ct);
Mlt::Filter *filter = service.filter(ct);
while (filter) {
if (QString(filter->get("kdenlive_ix")).toInt() == filter_ix) {
// A filter at that position already existed, so we will increase all indexes later
......@@ -2330,19 +2344,19 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
break;
}
ct++;
filter = clipService.filter(ct);
filter = service.filter(ct);
}
if (params.paramValue("id") == "speed") {
// special case, speed effect is not really inserted, we just update the other effects index (kdenlive_ix)
ct = 0;
filter = clipService.filter(ct);
filter = service.filter(ct);
while (filter) {
if (QString(filter->get("kdenlive_ix")).toInt() >= filter_ix) {
if (updateIndex) filter->set("kdenlive_ix", QString(filter->get("kdenlive_ix")).toInt() + 1);
}
ct++;
filter = clipService.filter(ct);
filter = service.filter(ct);
}
m_isBlocked = false;
if (doRefresh) refresh();
......@@ -2353,13 +2367,13 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
// temporarily remove all effects after insert point
QList <Mlt::Filter *> filtersList;
ct = 0;
filter = clipService.filter(ct);
filter = service.filter(ct);
while (filter) {
if (QString(filter->get("kdenlive_ix")).toInt() >= filter_ix) {
filtersList.append(filter);
clipService.detach(*filter);
service.detach(*filter);
} else ct++;
filter = clipService.filter(ct);
filter = service.filter(ct);
}
// create filter
......@@ -2410,7 +2424,7 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
//kDebug() << "// ADDING KEYFRAME vals: " << min<<" / "<<max<<", "<<y1<<", factor: "<<factor;
filter->set(starttag, QString::number((min + y1) / factor).toUtf8().data());
filter->set(endtag, QString::number((min + y2) / factor).toUtf8().data());
clipService.attach(*filter);
service.attach(*filter);
offset = 1;
}
}
......@@ -2471,7 +2485,7 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
// attach filter to the clip
clipService.attach(*filter);
service.attach(*filter);
}
delete[] filterId;
delete[] filterTag;
......@@ -2481,7 +2495,7 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
Mlt::Filter *filter = filtersList.at(i);
if (updateIndex)
filter->set("kdenlive_ix", QString(filter->get("kdenlive_ix")).toInt() + 1);
clipService.attach(*filter);
service.attach(*filter);
}
m_isBlocked = false;
if (doRefresh) refresh();
......
......@@ -205,6 +205,8 @@ Q_OBJECT public:
/** @brief Adds an effect to a clip in MLT's playlist. */
bool mltAddEffect(int track, GenTime position, EffectsParameterList params, bool doRefresh = true);
bool mltAddEffect(Mlt::Service service, EffectsParameterList params, int duration, bool doRefresh);
bool mltAddTrackEffect(int track, EffectsParameterList params);
/** @brief Edits an effect parameters in MLT's playlist. */
bool mltEditEffect(int track, GenTime position, EffectsParameterList params);
......
......@@ -557,6 +557,7 @@ void TrackView::slotRebuildTrackHeaders()
connect(header, SIGNAL(insertTrack(int)), this, SIGNAL(insertTrack(int)));
connect(header, SIGNAL(renameTrack(int, QString)), this, SLOT(slotRenameTrack(int, QString)));
connect(header, SIGNAL(configTrack(int)), this, SIGNAL(configTrack(int)));
connect(header, SIGNAL(addTrackInfo(const QDomElement, int)), m_trackview, SLOT(slotAddTrackEffect(const QDomElement, int)));
headers_container->layout()->addWidget(header);
}
frame = new QFrame(this);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment