#include <QDialog>
#include <QMenu>
#include <QVBoxLayout>
+
#include <KDebug>
#include <KGlobalSettings>
#include <KLocale>
#include <KStandardDirs>
#include <KFileDialog>
#include <KUrlRequester>
+#include <KColorScheme>
class Boolval: public QWidget, public Ui::Boolval_UI
{
}
-CollapsibleEffect::CollapsibleEffect(QDomElement effect, QDomElement original_effect, ItemInfo info, int ix, EffectMetaInfo *metaInfo, bool lastEffect, bool isGroup, QWidget * parent) :
- QWidget(parent),
+CollapsibleEffect::CollapsibleEffect(QDomElement effect, QDomElement original_effect, ItemInfo info, EffectMetaInfo *metaInfo, bool lastEffect, QWidget * parent) :
+ AbstractCollapsibleWidget(parent),
m_paramWidget(NULL),
m_effect(effect),
m_original_effect(original_effect),
- m_lastEffect(lastEffect),
- m_isGroup(isGroup),
- m_active(false),
- m_index(ix)
+ m_lastEffect(lastEffect)
{
- //setMouseTracking(true);
setupUi(this);
filterWheelEvent = true;
m_info.fromString(effect.attribute("kdenlive_info"));
- frame->setBackgroundRole(QPalette::Midlight);
- frame->setAutoFillBackground(true);
setFont(KGlobalSettings::smallestReadableFont());
- buttonUp->setIcon(KIcon("go-up"));
+ buttonUp->setIcon(KIcon("kdenlive-up"));
buttonUp->setToolTip(i18n("Move effect up"));
if (!lastEffect) {
- buttonDown->setIcon(KIcon("go-down"));
+ buttonDown->setIcon(KIcon("kdenlive-down"));
buttonDown->setToolTip(i18n("Move effect down"));
}
- buttonDel->setIcon(KIcon("edit-delete"));
+ buttonDel->setIcon(KIcon("kdenlive-deleffect"));
buttonDel->setToolTip(i18n("Delete effect"));
-
- buttonUp->setVisible(false);
- buttonDown->setVisible(false);
- buttonDel->setVisible(false);
+ if (effectIndex() == 1) buttonUp->setVisible(false);
+ if (m_lastEffect) buttonDown->setVisible(false);
+ //buttonUp->setVisible(false);
+ //buttonDown->setVisible(false);
/*buttonReset->setIcon(KIcon("view-refresh"));
buttonReset->setToolTip(i18n("Reset effect"));*/
m_menu->addAction(KIcon("view-refresh"), i18n("Reset effect"), this, SLOT(slotResetEffect()));
m_menu->addAction(KIcon("document-save"), i18n("Save effect"), this, SLOT(slotSaveEffect()));
- if (!m_isGroup) {
- QDomElement namenode = m_effect.firstChildElement("name");
- if (namenode.isNull()) return;
- title->setText(i18n(namenode.text().toUtf8().data()));
- QString type = m_effect.attribute("type", QString());
- KIcon icon;
- if (type == "audio") icon = KIcon("kdenlive-show-audio");
- else if (m_effect.attribute("tag") == "region") icon = KIcon("kdenlive-mask-effect");
- else if (type == "custom") icon = KIcon("kdenlive-custom-effect");
- else icon = KIcon("kdenlive-show-video");
- title->setIcon(icon);
- m_menu->addAction(KIcon("folder-new"), i18n("Create Group"), this, SLOT(slotCreateGroup()));
- setupWidget(info, ix, metaInfo);
- }
- else {
- title->setText(i18n("Effect Group"));
- title->setIcon(KIcon("folder"));
- m_menu->addAction(KIcon("list-remove"), i18n("Ungroup"), this, SLOT(slotUnGroup()));
- }
+ QDomElement namenode = m_effect.firstChildElement("name");
+ if (namenode.isNull()) return;
+ title->setText(i18n(namenode.text().toUtf8().data()));
+ QString type = m_effect.attribute("type", QString());
+ KIcon icon;
+ if (type == "audio") icon = KIcon("kdenlive-show-audio");
+ else if (m_effect.attribute("tag") == "region") icon = KIcon("kdenlive-mask-effect");
+ else if (type == "custom") icon = KIcon("kdenlive-custom-effect");
+ else icon = KIcon("kdenlive-show-video");
+ effecticon->setPixmap(icon.pixmap(16,16));
+ m_menu->addAction(KIcon("folder-new"), i18n("Create Group"), this, SLOT(slotCreateGroup()));
+ setupWidget(info, metaInfo);
+
setAcceptDrops(true);
- title->setMenu(m_menu);
+ menuButton->setIcon(KIcon("kdenlive-menu"));
+ menuButton->setMenu(m_menu);
if (m_effect.attribute("disable") == "1") {
- enabledBox->setCheckState(Qt::Unchecked);
title->setEnabled(false);
+ enabledBox->setChecked(false);
}
else {
- enabledBox->setCheckState(Qt::Checked);
+ enabledBox->setChecked(true);
}
connect(collapseButton, SIGNAL(clicked()), this, SLOT(slotSwitch()));
delete m_menu;
}
+//static
+const QString CollapsibleEffect::getStyleSheet(QPalette p)
+{
+ KColorScheme scheme(p.currentColorGroup(), KColorScheme::View, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
+ QColor dark_bg = scheme.shade(KColorScheme::DarkShade);
+ QColor selected_bg = scheme.decoration(KColorScheme::FocusColor).color();
+ QColor hover_bg = scheme.decoration(KColorScheme::HoverColor).color();
+ QColor light_bg = scheme.shade(KColorScheme::LightShade);
+ QColor midlight_bg = scheme.shade(KColorScheme::MidlightShade);
+ QColor normal_bg = scheme.background(KColorScheme::AlternateBackground).color();
+ QColor alt_bg = scheme.background(KColorScheme::NormalBackground).color();
+
+ KColorScheme scheme2(p.currentColorGroup(), KColorScheme::Window, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
+ QColor normal_bg2 = scheme2.background(KColorScheme::NormalBackground).color();
+ QColor normal_bg3 = scheme2.background(KColorScheme::AlternateBackground).color();
+
+ QString stylesheet;
+
+ // group editable labels
+ stylesheet.append(QString("MyEditableLabel { background-color: transparent;} "));
+
+ // effect background
+ stylesheet.append(QString("QFrame#decoframe {border-radius:5px;border:0px solid %1;background:%3;} QFrame:hover#decoframe {background:%4;} QFrame#decoframe[active=\"true\"] {background:%2;} ").arg(dark_bg.name()).arg(alt_bg.name()).arg(normal_bg2.name()).arg(normal_bg.name()));
+
+ // effect group background
+ stylesheet.append(QString("QFrame#decoframegroup {border-radius:5px;border:1px solid %1;background:%2;} QFrame#decoframegroup[active=\"true\"] {background:%3;} ").arg(dark_bg.name()).arg(normal_bg2.name()).arg(alt_bg.name()));
+
+ // effect title bar
+ stylesheet.append(QString("QFrame#frame {border-radius: 5px;} QFrame#frame[active=\"true\"] {background:%1;}").arg(selected_bg.name()));
+
+ // group effect title bar
+ stylesheet.append(QString("QFrame#framegroup {border-radius: 5px; background: %2;} QFrame#framegroup[active=\"true\"] {background:%1;} ").arg(selected_bg.name()).arg(normal_bg3.name()));
+
+ // draggable effect content bar
+ stylesheet.append(QString("QProgressBar::chunk:horizontal {background: %1;border-top-left-radius: 4px;border-bottom-left-radius: 4px;} QProgressBar::chunk:horizontal#dragOnly {background: %2;border-top-left-radius: 4px;border-bottom-left-radius: 4px;} QProgressBar::chunk:horizontal:hover {background: %3;}").arg(normal_bg2.name()).arg(alt_bg.name()).arg(selected_bg.name()));
+
+ // draggable effect content bar
+ stylesheet.append(QString("QProgressBar:horizontal {border: 1px solid %1;border-top-left-radius: 4px;border-bottom-left-radius: 4px;border-right:0px;background:%4;padding: 0px;text-align:left center} QProgressBar:horizontal:disabled {border: 1px solid %5} QProgressBar:horizontal#dragOnly {background: %4} QProgressBar:horizontal[inTimeline=\"true\"] { border: 1px solid %2;border-right: 0px;background: %3;padding: 0px;text-align:left center } QProgressBar::chunk:horizontal[inTimeline=\"true\"] {background: %2;}").arg(dark_bg.name()).arg(hover_bg.name()).arg(light_bg.name()).arg(alt_bg.name()).arg(normal_bg2.name()));
+
+
+ // spin box for draggable widget
+ stylesheet.append(QString("QAbstractSpinBox#dragBox {border: 1px solid %1;border-top-right-radius: 4px;border-bottom-right-radius: 4px;padding-right:0px;} QAbstractSpinBox::down-button#dragBox {width:0px;padding:0px;} QAbstractSpinBox:disabled#dragBox {border: 1px solid %4;} QAbstractSpinBox::up-button#dragBox {width:0px;padding:0px;} QAbstractSpinBox[inTimeline=\"true\"]#dragBox { border: 1px solid %2;} QAbstractSpinBox:hover#dragBox {border: 1px solid %3;} ").arg(dark_bg.name()).arg(hover_bg.name()).arg(selected_bg.name()).arg(normal_bg2.name()));
+
+ return stylesheet;
+}
void CollapsibleEffect::slotCreateGroup()
{
bool CollapsibleEffect::isActive() const
{
- return m_active;
+ return decoframe->property("active").toBool();
}
-void CollapsibleEffect::setActive(bool activate, bool focused)
+void CollapsibleEffect::setActive(bool activate)
{
- m_active = activate;
- if (focused) {
- frame->setBackgroundRole(QPalette::Highlight);
- }
- else frame->setBackgroundRole(m_active ? QPalette::Mid : QPalette::Midlight);
+ decoframe->setProperty("active", activate);
+ decoframe->setStyleSheet(decoframe->styleSheet());
}
void CollapsibleEffect::mouseDoubleClickEvent ( QMouseEvent * event )
void CollapsibleEffect::mousePressEvent ( QMouseEvent *event )
{
- if (!m_active && !isGroup()) emit activateEffect(effectIndex());
+
+ if (!decoframe->property("active").toBool() && !isGroup()) emit activateEffect(effectIndex());
QWidget::mousePressEvent(event);
}
-void CollapsibleEffect::enterEvent ( QEvent * event )
-{
- if (m_paramWidget == NULL || m_paramWidget->index() > 0) buttonUp->setVisible(true);
- if (!m_lastEffect) buttonDown->setVisible(true);
- buttonDel->setVisible(true);
- QWidget::enterEvent(event);
-}
-
-void CollapsibleEffect::leaveEvent ( QEvent * event )
-{
- buttonUp->setVisible(false);
- buttonDown->setVisible(false);
- buttonDel->setVisible(false);
- QWidget::leaveEvent(event);
-}
void CollapsibleEffect::slotEnable(bool enable)
{
enabledBox->blockSignals(true);
enabledBox->setChecked(enable);
enabledBox->blockSignals(false);
- if (m_isGroup) {
- QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
- if (vbox == NULL) return;
- for (int i = 0; i < vbox->count(); i++) {
- CollapsibleEffect *e = static_cast<CollapsibleEffect *>(vbox->itemAt(i)->widget());
- if (e) e->enabledBox->setChecked(enable);// slotEnable(enable);
- }
- } else {
- m_effect.setAttribute("disable", enable ? 0 : 1);
- if (enable || KdenliveSettings::disable_effect_parameters()) {
- widgetFrame->setEnabled(enable);
- }
- emit effectStateChanged(!enable, effectIndex());
+ m_effect.setAttribute("disable", enable ? 0 : 1);
+ if (enable || KdenliveSettings::disable_effect_parameters()) {
+ widgetFrame->setEnabled(enable);
}
+ emit effectStateChanged(!enable, effectIndex());
}
void CollapsibleEffect::slotDeleteEffect()
{
- if (!m_isGroup) emit deleteEffect(m_effect);
+ emit deleteEffect(m_effect);
}
void CollapsibleEffect::slotEffectUp()
{
- if (!m_isGroup) emit changeEffectPosition(effectIndex(), true);
+ emit changeEffectPosition(effectIndex(), true);
}
void CollapsibleEffect::slotEffectDown()
{
- if (!m_isGroup) emit changeEffectPosition(effectIndex(), false);
+ emit changeEffectPosition(effectIndex(), false);
}
void CollapsibleEffect::slotSaveEffect()
emit parameterChanged(m_original_effect, m_effect, effectIndex());
}
-void CollapsibleEffect::updateGroupIndex(int groupIndex)
-{
- m_info.groupIndex = groupIndex;
- m_effect.setAttribute("kdenlive_info", m_info.toString());
- emit parameterChanged(m_original_effect, m_effect, effectIndex());
-}
-
void CollapsibleEffect::setGroupIndex(int ix)
{
m_info.groupIndex = ix;
}
-void CollapsibleEffect::addGroupEffect(CollapsibleEffect *effect)
+void CollapsibleEffect::setGroupName(const QString &groupName)
{
- QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
- if (vbox == NULL) {
- vbox = new QVBoxLayout();
- vbox->setContentsMargins(10, 0, 0, 0);
- vbox->setSpacing(2);
- widgetFrame->setLayout(vbox);
- }
- effect->setGroupIndex(groupIndex());
- vbox->addWidget(effect);
+ m_info.groupName = groupName;
}
QString CollapsibleEffect::infoString() const
return m_info.toString();
}
-void CollapsibleEffect::removeGroup(int ix, QVBoxLayout *layout)
+void CollapsibleEffect::removeFromGroup()
{
- QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
- if (vbox == NULL) return;
-
- for (int j = vbox->count() - 1; j >= 0; j--) {
- QLayoutItem *child = vbox->takeAt(j);
- CollapsibleEffect *e = static_cast<CollapsibleEffect *>(child->widget());
- layout->insertWidget(ix, e);
- e->updateGroupIndex(-1);
- delete child;
- }
-}
-
-int CollapsibleEffect::index() const
-{
- return m_index;
+ m_info.groupIndex = -1;
+ m_info.groupName.clear();
+ m_effect.setAttribute("kdenlive_info", m_info.toString());
+ emit parameterChanged(m_original_effect, m_effect, effectIndex());
}
int CollapsibleEffect::groupIndex() const
{
- if (m_isGroup) return m_index;
- return -1;
-}
-
-bool CollapsibleEffect::isGroup() const
-{
- return m_isGroup;
+ return m_info.groupIndex;
}
int CollapsibleEffect::effectIndex() const
return m_effect.attribute("kdenlive_ix").toInt();
}
-void CollapsibleEffect::updateWidget(ItemInfo info, int index, QDomElement effect, EffectMetaInfo *metaInfo)
+void CollapsibleEffect::updateWidget(ItemInfo info, QDomElement effect, EffectMetaInfo *metaInfo)
{
if (m_paramWidget) {
// cleanup
m_paramWidget = NULL;
}
m_effect = effect;
- setupWidget(info, index, metaInfo);
+ setupWidget(info, metaInfo);
}
-void CollapsibleEffect::setupWidget(ItemInfo info, int index, EffectMetaInfo *metaInfo)
+void CollapsibleEffect::setupWidget(ItemInfo info, EffectMetaInfo *metaInfo)
{
if (m_effect.isNull()) {
// kDebug() << "// EMPTY EFFECT STACK";
if (m_effect.attribute("tag") == "region") {
QVBoxLayout *vbox = new QVBoxLayout(widgetFrame);
- vbox->setContentsMargins(0, 0, 0, 0);
+ vbox->setContentsMargins(2, 0, 2, 0);
vbox->setSpacing(2);
QDomNodeList effects = m_effect.elementsByTagName("effect");
QDomNodeList origin_effects = m_original_effect.elementsByTagName("effect");
QWidget *container = new QWidget(widgetFrame);
vbox->addWidget(container);
- m_paramWidget = new ParameterContainer(m_effect.toElement(), info, metaInfo, index, container);
+ m_paramWidget = new ParameterContainer(m_effect.toElement(), info, metaInfo, container);
for (int i = 0; i < effects.count(); i++) {
- CollapsibleEffect *coll = new CollapsibleEffect(effects.at(i).toElement(), origin_effects.at(i).toElement(), info, i, metaInfo, container);
+ CollapsibleEffect *coll = new CollapsibleEffect(effects.at(i).toElement(), origin_effects.at(i).toElement(), info, metaInfo, container);
m_subParamWidgets.append(coll);
//container = new QWidget(widgetFrame);
vbox->addWidget(coll);
}
else {
- m_paramWidget = new ParameterContainer(m_effect, info, metaInfo, index, widgetFrame);
+ m_paramWidget = new ParameterContainer(m_effect, info, metaInfo, widgetFrame);
if (m_effect.firstChildElement("parameter").isNull()) {
// Effect has no parameter, don't allow expand
collapseButton->setEnabled(false);
+ collapseButton->setVisible(false);
widgetFrame->setVisible(false);
}
}
}
+bool CollapsibleEffect::isGroup() const
+{
+ return false;
+}
+
void CollapsibleEffect::updateTimecodeFormat()
{
m_paramWidget->updateTimecodeFormat();
void CollapsibleEffect::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("kdenlive/effectslist")) {
- setActive(m_active, true);
+ frame->setProperty("active", true);
+ frame->setStyleSheet(frame->styleSheet());
event->acceptProposedAction();
}
}
void CollapsibleEffect::dragLeaveEvent(QDragLeaveEvent */*event*/)
{
- setActive(m_active, false);
+ frame->setProperty("active", false);
+ frame->setStyleSheet(frame->styleSheet());
}
void CollapsibleEffect::dropEvent(QDropEvent *event)
{
+ frame->setProperty("active", false);
+ frame->setStyleSheet(frame->styleSheet());
const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist"));
//event->acceptProposedAction();
QDomDocument doc;
emit addEffect(e);
return;
}
- int new_index = -1;
- if (m_isGroup) {
- QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
- if (vbox == NULL) return;
- CollapsibleEffect *e = static_cast<CollapsibleEffect *>(vbox->itemAt(vbox->count() -1)->widget());
- new_index = e->effectIndex() + 1;
- }
- else {
- new_index = effectIndex();
- }
- emit moveEffect(ix, new_index, this);
+ emit moveEffect(ix, effectIndex(), m_info.groupIndex, m_info.groupName);
event->setDropAction(Qt::MoveAction);
event->accept();
}
-ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, EffectMetaInfo *metaInfo, int index, QWidget * parent) :
- m_index(index),
+ParameterContainer::ParameterContainer(QDomElement effect, ItemInfo info, EffectMetaInfo *metaInfo, QWidget * parent) :
m_keyframeEditor(NULL),
m_geometryWidget(NULL),
m_metaInfo(metaInfo),
bool stretch = true;
m_vbox = new QVBoxLayout(parent);
- m_vbox->setContentsMargins(0, 0, 0, 0);
+ m_vbox->setContentsMargins(2, 0, 2, 0);
m_vbox->setSpacing(2);
for (int i = 0; i < namenode.count() ; i++) {
return QString(start + ";-1=" + end);
}
-int ParameterContainer::index() const
-{
- return m_index;
-}
-
void ParameterContainer::slotStartFilterJobAction()
{
QDomNodeList namenode = m_effect.elementsByTagName("parameter");
}
}
}
-
-