recmonitor.cpp
jogshuttle.cpp
addtransitioncommand.cpp
+ edittransitioncommand.cpp
)
kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
#include "addeffectcommand.h"
#include "editeffectcommand.h"
#include "addtransitioncommand.h"
+#include "edittransitioncommand.h"
#include "kdenlivesettings.h"
#include "transition.h"
void CustomTrackView::slotAddTransition(ClipItem* clip , QDomElement transition, GenTime startTime , int startTrack) {
AddTransitionCommand* command = new AddTransitionCommand(this, startTrack, transition, startTime, true);
m_commandStack->push(command);
+ m_document->setModified(true);
}
void CustomTrackView::addTransition(int startTrack, GenTime startPos , QDomElement e) {
m_document->setModified(true);
}
+void CustomTrackView::slotTransitionUpdated(QDomElement old, QDomElement newEffect) {
+ EditTransitionCommand *command = new EditTransitionCommand(this, newEffect.attribute("a_track").toInt(), GenTime(newEffect.attribute("start").toInt(), m_document->renderer()->fps()) , old, newEffect , true);
+ m_commandStack->push(command);
+ m_document->setModified(true);
+}
+
+void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement transition) {
+ QMap < QString, QString> map;
+ QDomNamedNodeMap attribs = transition.attributes();
+ for (int i = 0;i < attribs.count();i++) {
+ if (attribs.item(i).nodeName() != "type" &&
+ attribs.item(i).nodeName() != "start" &&
+ attribs.item(i).nodeName() != "end"
+ )
+ map[attribs.item(i).nodeName()] = attribs.item(i).nodeValue();
+ }
+ m_document->renderer()->mltUpdateTransition(transition.attribute("type"), m_tracksList.count() - 1 - transition.attribute("transition_track").toInt(), m_tracksList.count() - transition.attribute("transition_track").toInt() ,
+ GenTime(transition.attribute("start").toInt(), m_document->renderer()->fps()),
+ GenTime(transition.attribute("end").toInt(), m_document->renderer()->fps()),
+ map);
+ m_document->setModified(true);
+}
+
void CustomTrackView::addItem(DocClipBase *clip, QPoint pos) {
int in = 0;
GenTime out = clip->duration();
void updateEffect(int track, GenTime pos, QDomElement effect);
void addTransition(int track, GenTime pos, QDomElement transition);
void deleteTransition(int track, GenTime pos, QDomElement transition);
+ void updateTransition(int track, GenTime pos, QDomElement transition);
void activateMonitor();
int duration() const;
void deleteSelectedClips();
void slotRefreshEffects(ClipItem *clip);
void setDuration(int duration);
void slotAddTransition(ClipItem* clip , QDomElement transition, GenTime startTime , int startTrack);
+ void slotTransitionUpdated(QDomElement, QDomElement);
protected:
virtual void drawBackground(QPainter * painter, const QRectF & rect);
tname.appendChild(ret.createTextNode("Affine"));
ktrans.appendChild(tname);
transitions->append(ret.documentElement());
+ } else if (name == "region") {
+ QDomDocument ret;
+ QDomElement ktrans = ret.createElement("ktransition");
+ ret.appendChild(ktrans);
+ ktrans.setAttribute("tag", name);
+ QDomElement tname = ret.createElement("name");
+ tname.appendChild(ret.createTextNode("Region"));
+ ktrans.appendChild(tname);
+ transitions->append(ret.documentElement());
}
}
+ /*
+ <transition fill="1" in="11" a_track="1" out="73" mlt_service="luma" b_track="2" softness="0" resource="/home/marco/Projekte/kdenlive/install_cmake/share/apps/kdenlive/pgm/PAL/square2.pgm" />
+ */
}
}
Mlt::Filter m_convert(profile, "avcolour_space");
m_convert.set("forced", mlt_image_rgb24a);
producer->attach(m_convert);
-
- producer->seek(frame);
+ if (frame > -1)
+ producer->seek(frame);
Mlt::Frame * m_frame = producer->get_frame();
mlt_image_format format = mlt_image_rgb24a;
QPixmap pix(width, height);
timeline_buttons_ui.buttonFitZoom->setIcon(KIcon("zoom-fit-best"));
timeline_buttons_ui.buttonFitZoom->setToolTip(i18n("Fit zoom to project"));
- setupGUI(Default, "kdenliveui.rc");
+ setupGUI(Default, NULL /*"kdenliveui.rc"*/);
+ kDebug() << factory() << " " << factory()->container("video_effects_menu", this);
// build effects menus
QAction *action;
disconnect(effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), m_activeTimeline->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement)));
disconnect(effectStack, SIGNAL(changeEffectState(ClipItem*, QDomElement, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, QDomElement, bool)));
disconnect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
+ disconnect(transitionConfig, SIGNAL(transitionUpdated(QDomElement, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(QDomElement, QDomElement)));
disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
}
m_activeDocument->setRenderer(NULL);
connect(effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement)));
connect(effectStack, SIGNAL(changeEffectState(ClipItem*, QDomElement, bool)), trackView->projectView(), SLOT(slotChangeEffectState(ClipItem*, QDomElement, bool)));
connect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
+ connect(transitionConfig, SIGNAL(transitionUpdated(QDomElement, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(QDomElement, QDomElement)));
connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu);
m_activeTimeline = trackView;
m_isBlocked = false;
}
+void Render::mltUpdateTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args) {
+ kDebug() << "update transition" << tag;
+ QList<QString> li = args.keys();
+ for (int i = 0;i < li.size();i++) {
+ kDebug() << li[i] << " " << args[li[i]];
+ }
+ m_isBlocked = true;
+ m_mltConsumer->set("refresh", 0);
+ mlt_service serv = m_mltProducer->parent().get_service();
+
+ mlt_service nextservice = mlt_service_get_producer(serv);
+ mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice);
+ QString mlt_type = mlt_properties_get(properties, "mlt_type");
+ QString resource = mlt_properties_get(properties, "mlt_service");
+ int old_pos = (in.frames(m_fps) + out.frames(m_fps)) / 2;
+ int trackOffset = 0;
+ int new_in = in.frames(m_fps);
+ int new_out = out.frames(m_fps) - 1;
+ while (mlt_type == "transition") {
+ mlt_transition tr = (mlt_transition) nextservice;
+ int currentTrack = mlt_transition_get_b_track(tr);
+ int currentIn = (int) mlt_transition_get_in(tr);
+ int currentOut = (int) mlt_transition_get_out(tr);
+ kDebug() << "// FOUND EXISTING TRANS, IN: " << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
+ //kDebug()<<"// LOOKING FOR IN: "<<old_in<<", OUT: "<<old_out;
+ kDebug() << "// OLD IN: " << in.frames(m_fps) << " // OLD OUT: " << out.frames(m_fps) << ", TRACK: " << a_track << ", MID POS: " << old_pos;
+ if (/*resource == type &&*/ b_track == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
+ kDebug() << "found transition that matches" << resource;
+ //mlt_transition_set_in_and_out(tr, new_in, new_out);
+ //mlt_service old=_mlt_transition_servcie(tr);
+ //mlt_transition_init((mlt_transition_s*)tr->child,tag.toAscii().data());
+ //tr->child=tag.toAscii().data();
+
+
+
+ mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
+ //mlt_events_disconnect(properties, nextservice);
+ mlt_events_fire(MLT_SERVICE_PROPERTIES(nextservice), "service-changed", NULL);
+ //mlt_properties_set_int(properties, "a_track", mlt_transition_get_a_track(tr) + trackOffset);
+ //mlt_properties_set_int(properties, "b_track", mlt_transition_get_b_track(tr) + trackOffset);
+ //}
+ break;
+ }
+ nextservice = mlt_service_producer(nextservice);
+ properties = MLT_SERVICE_PROPERTIES(nextservice);
+ mlt_type = mlt_properties_get(properties, "mlt_type");
+ resource = mlt_properties_get(properties, "mlt_service");
+ }
+ m_isBlocked = false;
+}
+
void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args) {
- kDebug() << "ja";
+
m_isBlocked = true;
m_mltConsumer->set("refresh", 0);
mlt_service serv = m_mltProducer->parent().get_service();
void mltMoveTransition(QString type, int startTrack, int trackOffset, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);
void mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args);
void mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args);
+ void mltUpdateTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args);
private: // Private attributes & methods
***************************************************************************/
#include "transitionsettings.h"
+#include "transition.h"
#include <KDebug>
TransitionSettings::TransitionSettings(EffectsList *transitions, QWidget* parent): QWidget(parent) {
m_transitions = transitions;
ui.listWidget->addItems(transitions->effectNames());
kDebug() << transitions->effectNames().size() << " -" << transitions->size();
+ connect(ui.listWidget, SIGNAL(currentRowChanged(int)), this, SLOT(slotTransitionChanged()));
+}
+
+void TransitionSettings::slotTransitionChanged() {
+ QDomElement e = m_usedTransition->toXML();
+ QDomElement newElement = e.cloneNode().toElement();
+ newElement.setAttribute("type", ui.listWidget->currentItem()->text());
+ emit transitionUpdated(e, newElement);
}
void TransitionSettings::slotTransitionItemSelected(Transition* t) {
setEnabled(t != NULL);
+ m_usedTransition = t;
}
private:
Ui::TransitionSettings_UI ui;
EffectsList *m_transitions;
+ Transition* m_usedTransition;
public slots:
void slotTransitionItemSelected(Transition*);
+ void slotTransitionChanged();
+signals:
+ void transitionUpdated(QDomElement, QDomElement);
};
#endif