X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipproperties.cpp;h=866349a6adcd0a9ad89d8691713d8199b6f9f9f2;hb=668d8a4d6a1436697fb48fdf279b69e61dec8f8d;hp=d75400fa8bff16a301d9944cbd5facf0b2db8b17;hpb=2d939108ce791b1e093d2ed10028701d39d15ccd;p=kdenlive diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index d75400fa..866349a6 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,41 @@ 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 == 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 +382,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 +432,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 +470,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 +528,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 +541,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 +602,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 +724,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 +740,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 +750,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 +759,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 +768,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 +777,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 +786,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 +796,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 +804,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) { @@ -810,7 +875,7 @@ QMap ClipProperties::properties() if (duration != m_old_props.value("ttl").toInt()) { m_clipNeedsRefresh = true; props["ttl"] = QString::number(duration); - props["out"] = QString::number(duration * m_count - 1); + props["length"] = QString::number(duration * m_count); } if (duration * m_count - 1 != m_old_props.value("out").toInt()) { @@ -950,6 +1015,17 @@ void ClipProperties::slotUpdateDurationFormat(int ix) } } +void ClipProperties::slotDeleteProxy() +{ + QString proxy = m_clip->getProperty("proxy"); + QFile::remove(proxy); + QMap props; + props.insert("proxy", QString()); + emit applyNewClipProperties(m_clip->getId(), m_clip->properties(), props, false, true); + if (m_proxyContainer) delete m_proxyContainer; +} + #include "clipproperties.moc" +