#include <KDebug>
#include <KGlobalSettings>
-#include <KLocale>
+#include <KLocalizedString>
#include <KMessageBox>
#include <KStandardDirs>
#include <KFileDialog>
{
setFrame(false);
setReadOnly(true);
- setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
+ setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
}
void MyEditableLabel::mouseDoubleClickEvent ( QMouseEvent * e )
}
-CollapsibleGroup::CollapsibleGroup(int ix, bool firstGroup, bool lastGroup, QString groupName, QWidget * parent) :
- AbstractCollapsibleWidget(parent),
- m_index(ix)
+CollapsibleGroup::CollapsibleGroup(int ix, bool firstGroup, bool lastGroup, const EffectInfo &info, QWidget * parent) :
+ AbstractCollapsibleWidget(parent)
{
- setupUi(this);
+ m_info.groupIndex = ix;
m_subWidgets = QList <CollapsibleEffect *> ();
setFont(KGlobalSettings::smallestReadableFont());
- QHBoxLayout *l = static_cast <QHBoxLayout *>(framegroup->layout());
+ frame->setObjectName("framegroup");
+ decoframe->setObjectName("decoframegroup");
+ QHBoxLayout *l = static_cast <QHBoxLayout *>(frame->layout());
m_title = new MyEditableLabel(this);
- l->insertWidget(3, m_title);
- m_title->setText(groupName.isEmpty() ? i18n("Effect Group") : groupName);
+ l->insertWidget(2, m_title);
+ m_title->setText(info.groupName.isEmpty() ? i18n("Effect Group") : info.groupName);
+ m_info.groupName = m_title->text();
connect(m_title, SIGNAL(editingFinished()), this, SLOT(slotRenameGroup()));
buttonUp->setIcon(KIcon("kdenlive-up"));
buttonUp->setToolTip(i18n("Move effect up"));
enabledButton->setChecked(false);
enabledButton->setIcon(KIcon("visible"));
+
+ if (info.groupIsCollapsed) {
+ slotShow(false);
+ }
connect(collapseButton, SIGNAL(clicked()), this, SLOT(slotSwitch()));
connect(enabledButton, SIGNAL(toggled(bool)), this, SLOT(slotEnable(bool)));
bool CollapsibleGroup::isActive() const
{
- return decoframegroup->property("active").toBool();
+ return decoframe->property("active").toBool();
}
void CollapsibleGroup::setActive(bool activate)
{
- decoframegroup->setProperty("active", activate);
- decoframegroup->setStyleSheet(decoframegroup->styleSheet());
+ decoframe->setProperty("active", activate);
+ decoframe->setStyleSheet(decoframe->styleSheet());
}
void CollapsibleGroup::mouseDoubleClickEvent ( QMouseEvent * event )
{
- if (framegroup->underMouse() && collapseButton->isEnabled()) slotSwitch();
+ if (frame->underMouse() && collapseButton->isEnabled()) slotSwitch();
QWidget::mouseDoubleClickEvent(event);
}
-void CollapsibleGroup::slotEnable(bool disable)
+void CollapsibleGroup::slotEnable(bool disable, bool emitInfo)
{
m_title->setEnabled(!disable);
enabledButton->blockSignals(true);
enabledButton->setChecked(disable);
enabledButton->setIcon(disable ? KIcon("novisible") : KIcon("visible"));
enabledButton->blockSignals(false);
- for (int i = 0; i < m_subWidgets.count(); i++)
- m_subWidgets.at(i)->slotEnable(disable);
+ for (int i = 0; i < m_subWidgets.count(); ++i)
+ m_subWidgets.at(i)->slotDisable(disable, emitInfo);
}
void CollapsibleGroup::slotDeleteGroup()
QDomDocument doc;
// delete effects from the last one to the first, otherwise each deletion would trigger an update
// in other effects's kdenlive_ix index.
- for (int i = m_subWidgets.count() - 1; i >= 0; i--)
+ for (int i = m_subWidgets.count() - 1; i >= 0; --i)
doc.appendChild(doc.importNode(m_subWidgets.at(i)->effect(), true));
emit deleteGroup(doc);
}
void CollapsibleGroup::slotEffectUp()
{
- emit changeGroupPosition(groupIndex(), true);
+ QList <int> indexes;
+ for (int i = 0; i < m_subWidgets.count(); ++i)
+ indexes << m_subWidgets.at(i)->effectIndex();
+ emit changeEffectPosition(indexes, true);
}
void CollapsibleGroup::slotEffectDown()
{
- emit changeGroupPosition(groupIndex(), false);
+ QList <int> indexes;
+ for (int i = 0; i < m_subWidgets.count(); ++i)
+ indexes << m_subWidgets.at(i)->effectIndex();
+ emit changeEffectPosition(indexes, false);
}
void CollapsibleGroup::slotSaveGroup()
QDomDocument doc = effectsData();
QDomElement base = doc.documentElement();
QDomNodeList effects = base.elementsByTagName("effect");
- for (int i = 0; i < effects.count(); i++) {
+ for (int i = 0; i < effects.count(); ++i) {
QDomElement eff = effects.at(i).toElement();
eff.removeAttribute("kdenlive_ix");
EffectInfo info;
void CollapsibleGroup::slotResetGroup()
{
QMutexLocker lock(&m_mutex);
- for (int i = 0; i < m_subWidgets.count(); i++)
+ for (int i = 0; i < m_subWidgets.count(); ++i)
m_subWidgets.at(i)->slotResetEffect();
}
widgetFrame->setVisible(show);
if (show) {
collapseButton->setArrowType(Qt::DownArrow);
- m_info.isCollapsed = false;
+ m_info.groupIsCollapsed = false;
}
else {
collapseButton->setArrowType(Qt::RightArrow);
- m_info.isCollapsed = true;
+ m_info.groupIsCollapsed = true;
}
- //emit parameterChanged(m_original_effect, m_effect, effectIndex());
+ if (!m_subWidgets.isEmpty()) m_subWidgets.at(0)->groupStateChanged(m_info.groupIsCollapsed);
}
QWidget *CollapsibleGroup::title() const
QMutexLocker lock(&m_mutex);
QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
if (vbox == NULL) return;
- for (int i = m_subWidgets.count() - 1; i >= 0 ; i--) {
+ for (int i = m_subWidgets.count() - 1; i >= 0 ; --i) {
vbox->removeWidget(m_subWidgets.at(i));
layout->insertWidget(ix, m_subWidgets.at(i));
m_subWidgets.at(i)->decoframe->setObjectName("decoframe");
int CollapsibleGroup::groupIndex() const
{
- return m_index;
+ return m_info.groupIndex;
}
bool CollapsibleGroup::isGroup() const
void CollapsibleGroup::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("kdenlive/effectslist")) {
- framegroup->setProperty("target", true);
- framegroup->setStyleSheet(framegroup->styleSheet());
+ frame->setProperty("target", true);
+ frame->setStyleSheet(frame->styleSheet());
event->acceptProposedAction();
}
}
void CollapsibleGroup::dragLeaveEvent(QDragLeaveEvent */*event*/)
{
- framegroup->setProperty("target", false);
- framegroup->setStyleSheet(framegroup->styleSheet());
+ frame->setProperty("target", false);
+ frame->setStyleSheet(frame->styleSheet());
}
void CollapsibleGroup::dropEvent(QDropEvent *event)
{
- framegroup->setProperty("target", false);
- framegroup->setStyleSheet(framegroup->styleSheet());
+ frame->setProperty("target", false);
+ frame->setStyleSheet(frame->styleSheet());
const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist"));
//event->acceptProposedAction();
QDomDocument doc;
doc.setContent(effects, true);
QDomElement e = doc.documentElement();
int ix = e.attribute("kdenlive_ix").toInt();
- if (ix == 0) {
+ if (ix == 0 || e.tagName() == "effectgroup") {
+ if (e.tagName() == "effectgroup") {
+ // dropped a group on another group
+ QDomNodeList pastedEffects = e.elementsByTagName("effect");
+ if (pastedEffects.isEmpty() || m_subWidgets.isEmpty()) {
+ // Buggy groups, should not happen
+ event->ignore();
+ return;
+ }
+ QList <int> pastedEffectIndexes;
+ QList <int> currentEffectIndexes;
+ EffectInfo pasteInfo;
+ pasteInfo.fromString(pastedEffects.at(0).toElement().attribute("kdenlive_info"));
+ if (pasteInfo.groupIndex == -1) {
+ // Group dropped from effects list, add effect
+ e.setAttribute("kdenlive_ix", m_subWidgets.last()->effectIndex());
+ emit addEffect(e);
+ event->setDropAction(Qt::CopyAction);
+ event->accept();
+ return;
+ }
+ // Moving group
+ for (int i = 0; i < pastedEffects.count(); ++i) {
+ pastedEffectIndexes << pastedEffects.at(i).toElement().attribute("kdenlive_ix").toInt();
+ }
+ for (int i = 0; i < m_subWidgets.count(); ++i) {
+ currentEffectIndexes << m_subWidgets.at(i)->effectIndex();
+ }
+ kDebug()<<"PASTING: "<<pastedEffectIndexes<<" TO "<<currentEffectIndexes;
+ if (pastedEffectIndexes.at(0) < currentEffectIndexes.at(0)) {
+ // Pasting group after current one:
+ emit moveEffect(pastedEffectIndexes, currentEffectIndexes.last(), pasteInfo.groupIndex, pasteInfo.groupName);
+ }
+ else {
+ // Group moved before current one
+ emit moveEffect(pastedEffectIndexes, currentEffectIndexes.first(), pasteInfo.groupIndex, pasteInfo.groupName);
+ }
+ event->setDropAction(Qt::MoveAction);
+ event->accept();
+ return;
+ }
// effect dropped from effects list, add it
- e.setAttribute("kdenlive_ix", ix);
+ e.setAttribute("kdenlive_info", m_info.toString());
+ if (!m_subWidgets.isEmpty()) {
+ e.setAttribute("kdenlive_ix", m_subWidgets.at(0)->effectIndex());
+ }
+ emit addEffect(e);
event->setDropAction(Qt::CopyAction);
event->accept();
- emit addEffect(e);
return;
}
if (m_subWidgets.isEmpty()) return;
int new_index = m_subWidgets.last()->effectIndex();
- emit moveEffect(ix, new_index, m_index, m_title->text());
+ emit moveEffect(QList <int> () <<ix, new_index, m_info.groupIndex, m_title->text());
event->setDropAction(Qt::MoveAction);
event->accept();
}
for (int j = 0; j < m_subWidgets.count(); j++) {
m_subWidgets.at(j)->setGroupName(m_title->text());
}
+ m_info.groupName = m_title->text();
emit groupRenamed(this);
}
return doc;
}
+void CollapsibleGroup::adjustEffects()
+{
+ for (int i = 0; i < m_subWidgets.count(); ++i) {
+ m_subWidgets.at(i)->adjustButtons(i, m_subWidgets.count());
+ }
+}
+
+
+#include "collapsiblegroup.moc"