X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipproperties.cpp;h=5d1c9b40532b3d3076af7e316c51e99520a33cc8;hb=a069009f0f0baddf27b5c8df321b2579cccd92c9;hp=c79a74b493d944e5c98fde876888e02c90100f8a;hpb=ede0efde9bd02c6e4bcdcd46695bc10204cf4dfb;p=kdenlive diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index c79a74b4..5d1c9b40 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -47,12 +47,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_fps(fps), m_count(0), m_clipNeedsRefresh(false), - m_clipNeedsReLoad(false), - m_propsDelegate(NULL) + m_clipNeedsReLoad(false) { setAttribute(Qt::WA_DeleteOnClose, true); setFont(KGlobalSettings::toolBarFont()); m_view.setupUi(this); + + // force transparency is only for group properties, so hide it + m_view.clip_force_transparency->setHidden(true); + m_view.clip_transparency->setHidden(true); + KUrl url = m_clip->fileURL(); m_view.clip_path->setText(url.path()); m_view.clip_description->setText(m_clip->description()); @@ -61,7 +65,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg QMap props = m_clip->properties(); m_view.clip_force_out->setHidden(true); m_view.clip_out->setHidden(true); - + // New display aspect ratio support if (props.contains("force_aspect_num") && props.value("force_aspect_num").toInt() > 0 && props.contains("force_aspect_den") && props.value("force_aspect_den").toInt() > 0) { @@ -194,15 +198,45 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg connect(m_view.clip_force_colorspace, SIGNAL(toggled(bool)), m_view.clip_colorspace, SLOT(setEnabled(bool))); if (props.contains("audiocodec")) - QTreeWidgetItem *item = new QTreeWidgetItem(m_view.clip_aproperties, QStringList() << i18n("Audio codec") << props.value("audiocodec")); + new QTreeWidgetItem(m_view.clip_aproperties, QStringList() << i18n("Audio codec") << props.value("audiocodec")); if (props.contains("channels")) - QTreeWidgetItem *item = new QTreeWidgetItem(m_view.clip_aproperties, QStringList() << i18n("Channels") << props.value("channels")); + new QTreeWidgetItem(m_view.clip_aproperties, QStringList() << i18n("Channels") << props.value("channels")); if (props.contains("frequency")) - QTreeWidgetItem *item = new QTreeWidgetItem(m_view.clip_aproperties, QStringList() << i18n("Frequency") << props.value("frequency")); + new QTreeWidgetItem(m_view.clip_aproperties, QStringList() << i18n("Frequency") << props.value("frequency")); + CLIPTYPE t = m_clip->clipType(); + + if (props.contains("proxy") && props.value("proxy") != "-") { + KFileItem f(KFileItem::Unknown, KFileItem::Unknown, KUrl(props.value("proxy")), true); + QFrame* line = new QFrame(); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + m_proxyContainer = new QFrame(); + m_proxyContainer->setFrameShape(QFrame::NoFrame); + QHBoxLayout *l = new QHBoxLayout; + l->addWidget(new QLabel(i18n("Proxy clip: %1").arg(KIO::convertSize(f.size())))); + l->addStretch(5); + QPushButton *pb = new QPushButton(i18n("Delete proxy")); + l->addWidget(pb); + connect(pb, SIGNAL(clicked()), this, SLOT(slotDeleteProxy())); + m_proxyContainer->setLayout(l); + if (t == IMAGE) { + m_view.tab_image->layout()->addWidget(line); + m_view.tab_image->layout()->addWidget(m_proxyContainer); + } + else if (t == AUDIO) { + m_view.tab_audio->layout()->addWidget(line); + m_view.tab_audio->layout()->addWidget(m_proxyContainer); + } + else { + m_view.tab_video->layout()->addWidget(line); + m_view.tab_video->layout()->addWidget(m_proxyContainer); + } + } + if (t != AUDIO && t != AV) { m_view.clip_force_aindex->setEnabled(false); } @@ -352,16 +386,15 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.tabWidget->removeTab(SLIDETAB); m_view.tabWidget->removeTab(COLORTAB); - - - m_propsDelegate = new PropertiesViewDelegate(this); - m_view.clip_vproperties->setItemDelegate(m_propsDelegate); - m_view.clip_aproperties->setItemDelegate(m_propsDelegate); + PropertiesViewDelegate *del1 = new PropertiesViewDelegate(this); + PropertiesViewDelegate *del2 = new PropertiesViewDelegate(this); + m_view.clip_vproperties->setItemDelegate(del1); + m_view.clip_aproperties->setItemDelegate(del2); m_view.clip_aproperties->setStyleSheet(QString("QTreeWidget { background-color: transparent;}")); m_view.clip_vproperties->setStyleSheet(QString("QTreeWidget { background-color: transparent;}")); if (props.contains("videocodec")) - QTreeWidgetItem *item = new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Video codec") << props.value("videocodec")); + new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Video codec") << props.value("videocodec")); if (props.contains("frame_size")) new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Frame size") << props.value("frame_size")); @@ -403,7 +436,10 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.clip_duration->setValidator(tc.validator()); m_view.clip_duration->setText(tc.getTimecode(m_clip->duration())); if (t != IMAGE && t != COLOR && t != TEXT) m_view.clip_duration->setReadOnly(true); - else connect(m_view.clip_duration, SIGNAL(editingFinished()), this, SLOT(slotCheckMaxLength())); + else { + connect(m_view.clip_duration, SIGNAL(editingFinished()), this, SLOT(slotCheckMaxLength())); + connect(m_view.clip_duration, SIGNAL(textChanged(QString)), this, SLOT(slotModified())); + } // markers m_view.marker_new->setIcon(KIcon("document-new")); @@ -438,6 +474,9 @@ ClipProperties::ClipProperties(QList cliplist, Timecode tc, QMap { setFont(KGlobalSettings::toolBarFont()); m_view.setupUi(this); + QString title = windowTitle(); + title.append(" " + i18np("(%1 clip)", "(%1 clips)", cliplist.count())); + setWindowTitle(title); QMap props = cliplist.at(0)->properties(); m_old_props = commonproperties; @@ -493,6 +532,10 @@ ClipProperties::ClipProperties(QList cliplist, Timecode tc, QMap m_view.clip_vindex->setMaximum(props.value("video_max").toInt()); } + m_view.clip_colorspace->addItem(ProfilesDialog::getColorspaceDescription(601), 601); + m_view.clip_colorspace->addItem(ProfilesDialog::getColorspaceDescription(709), 709); + m_view.clip_colorspace->addItem(ProfilesDialog::getColorspaceDescription(240), 240); + if (commonproperties.contains("force_colorspace") && !commonproperties.value("force_colorspace").isEmpty() && commonproperties.value("force_colorspace").toInt() != 0) { m_view.clip_force_colorspace->setChecked(true); m_view.clip_colorspace->setEnabled(true); @@ -502,7 +545,25 @@ ClipProperties::ClipProperties(QList cliplist, Timecode tc, QMap if (commonproperties.contains("full_luma") && !commonproperties.value("full_luma").isEmpty()) { m_view.clip_full_luma->setChecked(true); } + + if (commonproperties.contains("transparency")) { + // image transparency checkbox + int transparency = commonproperties.value("transparency").toInt(); + if (transparency == 0) { + m_view.clip_force_transparency->setChecked(true); + } + else if (transparency == 1) { + m_view.clip_force_transparency->setChecked(true); + m_view.clip_transparency->setCurrentIndex(1); + } + } + else { + m_view.clip_force_transparency->setHidden(true); + m_view.clip_transparency->setHidden(true); + } + + connect(m_view.clip_force_transparency, SIGNAL(toggled(bool)), m_view.clip_transparency, SLOT(setEnabled(bool))); connect(m_view.clip_force_ar, SIGNAL(toggled(bool)), m_view.clip_ar_num, SLOT(setEnabled(bool))); connect(m_view.clip_force_ar, SIGNAL(toggled(bool)), m_view.clip_ar_den, SLOT(setEnabled(bool))); connect(m_view.clip_force_progressive, SIGNAL(toggled(bool)), m_view.clip_progressive, SLOT(setEnabled(bool))); @@ -545,7 +606,10 @@ ClipProperties::ClipProperties(QList cliplist, Timecode tc, QMap ClipProperties::~ClipProperties() { - if (m_propsDelegate) delete m_propsDelegate; + QAbstractItemDelegate *del1 = m_view.clip_vproperties->itemDelegate(); + if (del1) delete del1; + QAbstractItemDelegate *del2 = m_view.clip_aproperties->itemDelegate(); + if (del2) delete del2; } void ClipProperties::slotApplyProperties() @@ -664,11 +728,11 @@ QMap ClipProperties::properties() m_clipNeedsRefresh = true; } } else { - if (m_old_props.contains("force_aspect_num")) { + if (m_old_props.contains("force_aspect_num") && !m_old_props.value("force_aspect_num").isEmpty()) { props["force_aspect_num"].clear(); m_clipNeedsRefresh = true; } - if (m_old_props.contains("force_aspect_den")) { + if (m_old_props.contains("force_aspect_den") && !m_old_props.value("force_aspect_den").isEmpty()) { props["force_aspect_den"].clear(); m_clipNeedsRefresh = true; } @@ -680,7 +744,7 @@ QMap ClipProperties::properties() props["force_fps"] = QString::number(fps); m_clipNeedsRefresh = true; } - } else if (m_old_props.contains("force_fps")) { + } else if (m_old_props.contains("force_fps") && !m_old_props.value("force_fps").isEmpty()) { props["force_fps"].clear(); m_clipNeedsRefresh = true; } @@ -690,7 +754,7 @@ QMap ClipProperties::properties() if (progressive != m_old_props.value("force_progressive").toInt()) { props["force_progressive"] = QString::number(progressive); } - } else if (m_old_props.contains("force_progressive")) { + } else if (m_old_props.contains("force_progressive") && !m_old_props.value("force_progressive").isEmpty()) { props["force_progressive"].clear(); } @@ -699,7 +763,7 @@ QMap ClipProperties::properties() if (fieldOrder != m_old_props.value("force_tff").toInt()) { props["force_tff"] = QString::number(fieldOrder); } - } else if (m_old_props.contains("force_tff")) { + } else if (m_old_props.contains("force_tff") && !m_old_props.value("force_tff").isEmpty()) { props["force_tff"].clear(); } @@ -708,7 +772,7 @@ QMap ClipProperties::properties() if (threads != m_old_props.value("threads").toInt()) { props["threads"] = QString::number(threads); } - } else if (m_old_props.contains("threads")) { + } else if (m_old_props.contains("threads") && !m_old_props.value("threads").isEmpty()) { props["threads"].clear(); } @@ -717,7 +781,7 @@ QMap ClipProperties::properties() if (vindex != m_old_props.value("video_index").toInt()) { props["video_index"] = QString::number(vindex); } - } else if (m_old_props.contains("video_index")) { + } else if (m_old_props.contains("video_index") && !m_old_props.value("video_index").isEmpty()) { props["video_index"].clear(); } @@ -726,7 +790,7 @@ QMap ClipProperties::properties() if (aindex != m_old_props.value("audio_index").toInt()) { props["audio_index"] = QString::number(aindex); } - } else if (m_old_props.contains("audio_index")) { + } else if (m_old_props.contains("audio_index") && !m_old_props.value("audio_index").isEmpty()) { props["audio_index"].clear(); } @@ -736,7 +800,7 @@ QMap ClipProperties::properties() props["force_colorspace"] = QString::number(colorspace); m_clipNeedsRefresh = true; } - } else if (m_old_props.contains("force_colorspace")) { + } else if (m_old_props.contains("force_colorspace") && !m_old_props.value("force_colorspace").isEmpty()) { props["force_colorspace"].clear(); m_clipNeedsRefresh = true; } @@ -744,10 +808,15 @@ QMap ClipProperties::properties() if (m_view.clip_full_luma->isChecked()) { props["full_luma"] = QString::number(1); m_clipNeedsRefresh = true; - } else if (m_old_props.contains("full_luma")) { + } else if (m_old_props.contains("full_luma") && !m_old_props.value("full_luma").isEmpty()) { props["full_luma"].clear(); m_clipNeedsRefresh = true; } + + if (m_view.clip_force_transparency->isChecked()) { + QString transp = QString::number(m_view.clip_transparency->currentIndex()); + if (transp != m_old_props.value("transparency")) props["transparency"] = transp; + } // If we adjust several clips, return now if (m_clip == NULL) { @@ -950,6 +1019,15 @@ void ClipProperties::slotUpdateDurationFormat(int ix) } } +void ClipProperties::slotDeleteProxy() +{ + QString proxy = m_clip->getProperty("proxy"); + if (proxy.isEmpty()) return; + emit deleteProxy(proxy); + if (m_proxyContainer) delete m_proxyContainer; +} + #include "clipproperties.moc" +