+void Render::mltMoveTrackEffect(int track, int oldPos, int newPos)
+{
+ 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 clipService(trackPlaylist.get_service());
+
+ m_isBlocked = true;
+ int ct = 0;
+ QList <Mlt::Filter *> filtersList;
+ Mlt::Filter *filter = clipService.filter(ct);
+ bool found = false;
+ if (newPos > oldPos) {
+ while (filter) {
+ if (!found && filter->get_int("kdenlive_ix") == oldPos) {
+ filter->set("kdenlive_ix", newPos);
+ filtersList.append(filter);
+ clipService.detach(*filter);
+ filter = clipService.filter(ct);
+ while (filter && filter->get_int("kdenlive_ix") <= newPos) {
+ filter->set("kdenlive_ix", filter->get_int("kdenlive_ix") - 1);
+ ct++;
+ filter = clipService.filter(ct);
+ }
+ found = true;
+ }
+ if (filter && filter->get_int("kdenlive_ix") > newPos) {
+ filtersList.append(filter);
+ clipService.detach(*filter);
+ } else ct++;
+ filter = clipService.filter(ct);
+ }
+ } else {
+ while (filter) {
+ if (filter->get_int("kdenlive_ix") == oldPos) {
+ filter->set("kdenlive_ix", newPos);
+ filtersList.append(filter);
+ clipService.detach(*filter);
+ } else ct++;
+ filter = clipService.filter(ct);
+ }
+
+ ct = 0;
+ filter = clipService.filter(ct);
+ while (filter) {
+ int pos = filter->get_int("kdenlive_ix");
+ if (pos >= newPos) {
+ if (pos < oldPos) filter->set("kdenlive_ix", pos + 1);
+ filtersList.append(filter);
+ clipService.detach(*filter);
+ } else ct++;
+ filter = clipService.filter(ct);
+ }
+ }
+
+ for (int i = 0; i < filtersList.count(); i++) {
+ clipService.attach(*(filtersList.at(i)));
+ }
+ m_isBlocked = false;
+ refresh();
+}
+