23
23
#include <qlayout.h>
24
24
#include <qslider.h>
25
25
#include <qcheckbox.h>
26
#include <qtextedit.h>
27
26
#include <qcolor.h>
28
27
#include <qtoolbutton.h>
29
28
#include <qradiobutton.h>
30
29
#include <qspinbox.h>
30
#include <qtabwidget.h>
32
32
#include <kpushbutton.h>
33
33
#include <kurlrequester.h>
34
34
#include <klocale.h>
35
35
#include <kcolorbutton.h>
36
#include <ktextedit.h>
36
37
#include <kfiledialog.h>
37
38
#include <kcombobox.h>
39
#include <klistview.h>
40
#include <kiconloader.h>
38
41
#include <kdebug.h>
42
#include <kio/netaccess.h>
40
45
#include "transition.h"
41
46
#include "docclipref.h"
42
47
#include "docclipavfile.h"
43
48
#include "clipproperties.h"
44
49
#include "kdenlivesettings.h"
49
ClipProperties::ClipProperties(DocClipRef *refClip, KdenliveDoc * document, QWidget * parent, const char *name): KDialogBase (KDialogBase::Swallow, 0, parent,name, true, i18n("Clip Properties"), KDialogBase::Ok | KDialogBase::Cancel), m_imageCount(0) {
54
ClipProperties::ClipProperties(DocClipRef *refClip, KdenliveDoc * document, QWidget * parent, const char *name): KDialogBase (KDialogBase::Swallow, 0, parent,name, true, i18n("Clip Properties"), KDialogBase::User2 | KDialogBase::User1 | KDialogBase::Stretch | KDialogBase::Ok | KDialogBase::Cancel), m_imageCount(0) {
51
56
clipChoice = new clipProperties_UI(this);
57
setButtonText(KDialogBase::User1, i18n("Edit"));
58
setButtonText(KDialogBase::User2, i18n("Save Description"));
52
59
clipChoice->edit_name->setText(refClip->name());
53
60
clipChoice->edit_description->setText(refClip->description());
54
61
clipChoice->edit_duration->setText(document->timeCode().getTimecode(refClip->duration(), KdenliveSettings::defaultfps()));
64
71
DocClipAVFile * avclip = refClip->referencedClip()->toDocClipAVFile();
73
if (m_clipType != DocClipBase::PLAYLIST) {
74
showButton( KDialogBase::User1, false);
75
showButton( KDialogBase::User2, false);
78
connect(this, SIGNAL(user1Clicked()), this, SLOT(slotEditPlayList()));
79
connect(this, SIGNAL(user2Clicked()), this, SLOT(saveDescription()));
80
connect(clipChoice->edit_description, SIGNAL(textChanged()), this, SLOT(slotEnableSaveDescription()));
82
clipChoice->clipType->setText(DocClipBase::getTypeName(m_clipType));
67
84
if (m_clipType != DocClipBase::SLIDESHOW) {
68
85
clipChoice->ttl_label->hide();
70
87
clipChoice->image_ttl->hide();
71
88
clipChoice->image_type_label->hide();
72
89
clipChoice->imageType->hide();
90
clipChoice->slide_loop->hide();
74
93
if (m_clipType == DocClipBase::COLOR) {
75
94
QString color = avclip->color();
76
95
color = color.replace(0, 2, "#");
82
101
clipChoice->transparent_bg->hide();
83
102
clipChoice->label_file->hide();
84
103
clipChoice->edit_url->hide();
85
clipChoice->clipType->setText(i18n("Color Clip"));
86
104
clipChoice->clipSize->setText("-");
87
105
clipChoice->clipFps->setText("-");
88
106
clipChoice->clipAudio->setText("-");
89
107
clipChoice->clipFilesize->setText("-");
108
clipChoice->tab_extra->removePage(clipChoice->tab_extra->page(2));
91
110
else if (m_clipType == DocClipBase::IMAGE) {
92
111
clipChoice->transparent_bg->setChecked(avclip->isTransparent());
96
115
clipChoice->button_color->hide();
97
116
clipChoice->label_name->hide();
98
117
clipChoice->edit_name->hide();
99
clipChoice->clipType->setText(i18n("Image Clip"));
100
118
clipChoice->clipSize->setText(QString::number(refClip->clipWidth())+"x"+QString::number(refClip->clipHeight()));
101
119
clipChoice->clipFps->setText("-");
102
120
clipChoice->clipAudio->setText("-");
103
121
clipChoice->clipFilesize->setText(refClip->formattedFileSize());
122
clipChoice->tab_extra->removePage(clipChoice->tab_extra->page(2));
105
124
else if (m_clipType == DocClipBase::VIRTUAL) {
106
125
clipChoice->label_color->hide();
107
126
clipChoice->button_color->hide();
108
127
clipChoice->label_name->hide();
109
128
clipChoice->edit_name->hide();
110
clipChoice->clipType->setText(i18n("Virtual Clip"));
111
129
clipChoice->clipSize->setText(QString::number(refClip->clipWidth())+"x"+QString::number(refClip->clipHeight()));
112
130
clipChoice->clipFps->setText("-");
113
131
clipChoice->clipAudio->setText("-");
114
132
clipChoice->clipFilesize->setText("-");
133
clipChoice->tab_extra->removePage(clipChoice->tab_extra->page(2));
116
135
else if (m_clipType == DocClipBase::SLIDESHOW) {
136
clipChoice->slide_loop->setChecked(avclip->loop());
117
137
clipChoice->transparent_bg->setChecked(avclip->isTransparent());
118
138
clipChoice->crossfade->setChecked(avclip->hasCrossfade());
119
139
m_luma = avclip->lumaFile();
129
149
clipChoice->button_color->hide();
130
150
clipChoice->label_name->hide();
131
151
clipChoice->edit_name->hide();
132
clipChoice->clipType->setText(i18n("Slideshow Clip"));
133
152
clipChoice->image_ttl->setText(document->timeCode().getTimecode(GenTime(avclip->clipTtl(), KdenliveSettings::defaultfps()), KdenliveSettings::defaultfps()));
134
153
clipChoice->transition_ttl->setText(document->timeCode().getTimecode(GenTime(avclip->lumaDuration(), KdenliveSettings::defaultfps()), KdenliveSettings::defaultfps()));
147
166
clipChoice->clipFps->setText("-");
148
167
clipChoice->clipAudio->setText("-");
149
168
clipChoice->clipFilesize->setText(refClip->formattedFileSize());
169
clipChoice->tab_extra->removePage(clipChoice->tab_extra->page(2));
152
172
clipChoice->meta_text->setText(avclip->formattedMetaData());
178
198
else clipChoice->clipAudio->setText(i18n("None"));
179
199
if (m_clipType == DocClipBase::AUDIO) {
180
clipChoice->clipType->setText(i18n("Audio Clip"));
200
clipChoice->tab_extra->removePage(clipChoice->tab_extra->page(2));
182
202
else { // Video clip
183
203
QPixmap pix = document->renderer()->getVideoThumbnail(refClip->fileURL().path(), clip->getProjectThumbFrame(), clipChoice->preview_pixmap->width(), clipChoice->preview_pixmap->height());
184
204
if (!pix.isNull()) clipChoice->preview_pixmap->setPixmap(pix);
185
clipChoice->clipType->setText(i18n("Video Clip"));
186
205
clipChoice->clipSize->setText(QString::number(refClip->clipWidth())+"x"+QString::number(refClip->clipHeight()));
206
if (m_clipType == DocClipBase::PLAYLIST) {
207
// westley clip, populate playlist tab
208
clipChoice->tab_extra->page(2)->setEnabled(true);
209
clipChoice->tab_extra->removePage(clipChoice->tab_extra->page(1));
210
parsePlayList(refClip->fileURL());
213
clipChoice->tab_extra->removePage(clipChoice->tab_extra->page(2));
229
void ClipProperties::saveDescription()
231
PlayList::saveDescription(url(), description());
232
enableButton(KDialogBase::User2, false);
235
void ClipProperties::slotEnableSaveDescription()
237
enableButton(KDialogBase::User2, true);
240
void ClipProperties::slotEditPlayList()
242
(void) new KRun(KURL(clipChoice->edit_url->url()));
245
void ClipProperties::parsePlayList(KURL url)
248
doc.setContent(&QFile(url.path()), false);
249
QDomElement documentElement = doc.documentElement();
250
if (documentElement.tagName() != "westley") {
251
kdWarning() << "KdenliveDoc::loadFromXML() document element has unknown tagName : " << documentElement.tagName() << endl;
254
QDomNode kdenlivedoc = documentElement.elementsByTagName("kdenlivedoc").item(0);
256
if (!kdenlivedoc.isNull()) n = kdenlivedoc.firstChild();
257
else n = documentElement.firstChild();
259
bool missingFiles = false;
261
while (!n.isNull()) {
263
if (!e.isNull() && e.tagName() == "producer") {
264
QString prodUrl = e.attribute("resource", QString::null);
265
if (!prodUrl.isEmpty()) {
266
QListViewItem *item = new QListViewItem(clipChoice->clips_list, prodUrl);
267
if (KIO::NetAccess::exists(KURL(prodUrl), false, this))
268
item->setPixmap(0, KGlobal::iconLoader()->loadIcon("ok", KIcon::Small));
270
item->setPixmap(0, KGlobal::iconLoader()->loadIcon("no", KIcon::Small));
278
clipChoice->tab_extra->setTabIconSet(clipChoice->tab_extra->page(1), KGlobal::iconLoader()->loadIcon("file_broken", KIcon::Small));
279
clipChoice->tab_extra->setCurrentPage(1);
201
283
void ClipProperties::insertLuma(const QPixmap &pix, const QString &txt)
203
285
clipChoice->luma_list->insertItem(pix, txt);
246
328
if (!pix.isNull()) clipChoice->preview_pixmap->setPixmap(pix);
249
QString ClipProperties::color()
331
QString ClipProperties::color() const
251
333
QString color = clipChoice->button_color->color().name();
252
334
color = color.replace(0, 1, "0x") + "ff";
256
QString ClipProperties::name()
338
QString ClipProperties::name() const
258
340
return clipChoice->edit_name->text();
261
int ClipProperties::ttl()
343
bool ClipProperties::loop() const
345
return clipChoice->slide_loop->isChecked();
348
int ClipProperties::ttl() const
263
350
return m_document->getTimecodePosition(clipChoice->image_ttl->text()).frames(KdenliveSettings::defaultfps());
266
QString ClipProperties::extension()
353
QString ClipProperties::extension() const
268
355
return clipChoice->imageType->currentText();
271
QString ClipProperties::description()
358
QString ClipProperties::description() const
273
360
return clipChoice->edit_description->text();
276
GenTime ClipProperties::duration()
363
GenTime ClipProperties::duration() const
278
365
QString d = clipChoice->edit_duration->text();
279
366
return m_document->getTimecodePosition(d);
285
372
clipChoice->preview_pixmap->repaint();
288
QString ClipProperties::url()
375
QString ClipProperties::url() const
290
return clipChoice->edit_url->url();
377
return clipChoice->edit_url->url();
293
bool ClipProperties::transparency()
380
bool ClipProperties::transparency() const
295
382
return clipChoice->transparent_bg->isChecked();
298
bool ClipProperties::crossfading()
385
bool ClipProperties::crossfading() const
300
387
return clipChoice->crossfade->isChecked();
303
390
QString ClipProperties::lumaFile() const
392
if (!clipChoice->luma_selected->isChecked()) return QString::null;
305
393
return clipChoice->luma_list->currentText();