widgets/transitionsettings_ui.ui
widgets/configjogshuttle_ui.ui
widgets/trackheader_ui.ui
+ widgets/clipproperties_ui.ui
)
set(kdenlive_SRCS
edittransitioncommand.cpp
addfoldercommand.cpp
editfoldercommand.cpp
+ clipproperties.cpp
)
kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#include <QDir>
+
+#include <KStandardDirs>
+#include <KDebug>
+
+#include "kdenlivesettings.h"
+#include "clipproperties.h"
+#include "kthumb.h"
+
+ClipProperties::ClipProperties(DocClipBase *clip, QWidget * parent): QDialog(parent) {
+ m_view.setupUi(this);
+ m_clip = clip;
+
+ m_view.clip_path->setText(m_clip->fileURL().path());
+ m_view.clip_description->setText(m_clip->description());
+ QMap <QString, QString> props = m_clip->properties();
+ if (props.contains("frame_size"))
+ m_view.clip_size->setText(props["frame_size"]);
+ if (props.contains("videocodec"))
+ m_view.clip_vcodec->setText(props["videocodec"]);
+ if (props.contains("audiocodec"))
+ m_view.clip_acodec->setText(props["audiocodec"]);
+ if (props.contains("fps"))
+ m_view.clip_fps->setText(props["fps"]);
+ if (props.contains("frequency"))
+ m_view.clip_frequency->setText(props["frequency"]);
+ if (props.contains("channels"))
+ m_view.clip_channels->setText(props["channels"]);
+ if (props.contains("aspect_ratio"))
+ m_view.clip_ratio->setText(props["aspect_ratio"]);
+ QPixmap pix = m_clip->thumbProducer()->getImage(m_clip->fileURL(), 240, 180);
+ m_view.clip_thumb->setPixmap(pix);
+ CLIPTYPE t = m_clip->clipType();
+ if (t == IMAGE || t == VIDEO) m_view.tabWidget->removeTab(1);
+}
+
+#include "clipproperties.moc"
+
+
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+
+#ifndef CLIPPROPSDIALOG_H
+#define CLIPPROPSDIALOG_H
+
+#include <QDialog>
+
+#include "definitions.h"
+#include "docclipbase.h"
+#include "ui_clipproperties_ui.h"
+
+class ClipProperties : public QDialog {
+ Q_OBJECT
+
+public:
+ ClipProperties(DocClipBase *clip, QWidget * parent = 0);
+
+
+private slots:
+
+
+private:
+ Ui::ClipProperties_UI m_view;
+ DocClipBase *m_clip;
+
+};
+
+
+#endif
+
}
void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition) {
- QString s;
- QTextStream tx(&s);
- transition.save(tx,2);
- kDebug() << "in" << s;
+ QString s;
+ QTextStream tx(&s);
+ transition.save(tx, 2);
+ kDebug() << "in" << s;
QMap < QString, QString> map;
QDomNamedNodeMap attribs = transition.attributes();
for (int i = 0;i < attribs.count();i++) {
return QString::null;
}
-//static
-QString DocClipBase::getTypeName(CLIPTYPE type) {
- QString result;
- switch (type) {
- case AV:
- result = i18n("Video Clip");
- break;
- case COLOR:
- result = i18n("Color Clip");
- break;
- case PLAYLIST:
- result = i18n("Playlist Clip");
- break;
- case IMAGE:
- result = i18n("Image Clip");
- break;
- case SLIDESHOW:
- result = i18n("Slideshow Clip");
- break;
- case VIRTUAL:
- result = i18n("Virtual Clip");
- break;
- case AUDIO:
- result = i18n("Audio Clip");
- break;
- case VIDEO:
- result = i18n("Mute Video Clip");
- break;
- case TEXT:
- result = i18n("Text Clip");
- break;
- default:
- result = i18n("None");
- break;
- }
- return result;
+void DocClipBase::setProperties(QMap <QString, QString> properties) {
+ m_properties = properties;
}
+QMap <QString, QString> DocClipBase::properties() {
+ return m_properties;
+}
+
+
void DocClipBase::slotGetAudioThumbs() {
if (m_audioThumbCreated) {
/** format is frame -> channel ->bytes */
QMap<int, QMap<int, QByteArray> > audioFrameChache;
- /** return english name for clip type */
- static QString getTypeName(CLIPTYPE type);
-
/** Clip is ready to get thumbs */
void slotRequestAudioThumbs();
/** Free cache data */
uint m_projectThumbFrame;
void setAudioThumbCreated(bool isDone);
+ QMap <QString, QString> m_properties;
+
public slots:
void updateAudioThumbnail(QMap<int, QMap<int, QByteArray> > data);
void slotGetAudioThumbs();
QString markerComment(GenTime t);
void setProjectThumbFrame(const uint &ix);
uint getProjectThumbFrame() const;
+ void setProperties(QMap <QString, QString> properties);
+ QMap <QString, QString> properties();
signals:
void getAudioThumbs();
emit docModified(m_modified);
}
+bool KdenliveDoc::isModified() {
+ return m_modified;
+}
+
QString KdenliveDoc::description() const {
if (m_url.isEmpty())
return i18n("Untitled") + " / " + m_profile.description;
/** Set to true if document needs saving, false otherwise */
void setModified(bool mod);
int getFreeClipId();
+ /** does the document need saving */
+ bool isModified();
private:
KUrl m_url;
<default>hdv_1080_50i</default>
</entry>
+ <entry name="showdescriptioncolumn" type="Bool">
+ <label>Show descriptions in project tree view.</label>
+ <default>true</default>
+ </entry>
+ <entry name="showratingcolumn" type="Bool">
+ <label>Show ratings in project tree view.</label>
+ <default>false</default>
+ </entry>
</group>
</kcfg>
\ No newline at end of file
#include "renderwidget.h"
#include "renderer.h"
#include "jogshuttle.h"
+#include "clipproperties.h"
#define ID_STATUS_MSG 1
#define ID_EDITMODE_MSG 2
activateShuttleDevice();
}
+void MainWindow::queryQuit() {
+ kDebug() << "----- SAVING CONFUIG";
+ if (queryClose()) kapp->quit();
+}
+
//virtual
bool MainWindow::queryClose() {
saveOptions();
- switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document ?"))) {
- case KMessageBox::Yes :
- // save document here. If saving fails, return false;
- return true;
- case KMessageBox::No :
- return true;
- default: // cancel
- return false;
+ if (m_activeDocument && m_activeDocument->isModified()) {
+ switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document ?"))) {
+ case KMessageBox::Yes :
+ // save document here. If saving fails, return false;
+ return true;
+ case KMessageBox::No :
+ return true;
+ default: // cancel
+ return false;
+ }
}
+ return true;
}
void MainWindow::activateShuttleDevice() {
m_projectList->setRenderer(m_clipMonitor->render);
connect(m_projectList, SIGNAL(clipSelected(const QDomElement &)), m_clipMonitor, SLOT(slotSetXml(const QDomElement &)));
connect(m_projectList, SIGNAL(receivedClipDuration(int, int)), this, SLOT(slotSetClipDuration(int, int)));
+ connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *)));
connect(m_projectList, SIGNAL(getFileProperties(const QDomElement &, int)), m_clipMonitor->render, SLOT(getFileProperties(const QDomElement &, int)));
connect(m_clipMonitor->render, SIGNAL(replyGetImage(int, int, const QPixmap &, int, int)), m_projectList, SLOT(slotReplyGetImage(int, int, const QPixmap &, int, int)));
connect(m_clipMonitor->render, SIGNAL(replyGetFileProperties(int, const QMap < QString, QString > &, const QMap < QString, QString > &)), m_projectList, SLOT(slotReplyGetFileProperties(int, const QMap < QString, QString > &, const QMap < QString, QString > &)));
actionCollection()->addAction("delete_timeline_clip", deleteTimelineClip);
connect(deleteTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotDeleteTimelineClip()));
- KStandardAction::quit(kapp, SLOT(quit()),
+ KStandardAction::quit(this, SLOT(queryQuit()),
actionCollection());
KStandardAction::open(this, SLOT(openFile()),
}
void MainWindow::saveOptions() {
+ KdenliveSettings::self()->writeConfig();
KSharedConfigPtr config = KGlobal::config();
m_fileOpenRecent->saveEntries(KConfigGroup(config, "Recent Files"));
config->sync();
}
}
+void MainWindow::slotShowClipProperties(DocClipBase *clip) {
+ ClipProperties dia(clip);
+ dia.exec();
+}
+
void MainWindow::customEvent(QEvent* e) {
if (e->type() == QEvent::User) {
// The timeline playing position changed...
class CustomTrackView;
class RenderWidget;
class JogShuttle;
+class DocClipBase;
class MainWindow : public KXmlGuiWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
-
void parseProfiles();
protected:
void newFile();
void undo();
void redo();
+ void queryQuit();
void activateDocument();
void connectDocument(TrackView*, KdenliveDoc*);
void openFile();
void slotAddCustomEffect(QAction *result);
void slotAddProjectClip(KUrl url);
void slotShuttleButton(int code);
+ void slotShowClipProperties(DocClipBase *clip);
};
#endif
// folder
ProjectItem::ProjectItem(QTreeWidget * parent, const QStringList & strings, int clipId)
- : QTreeWidgetItem(parent, strings, QTreeWidgetItem::UserType), m_element(QDomElement()), m_clipType(FOLDER), m_groupName(strings.at(1)), m_clipId(clipId), m_clip(NULL) {
+ : QTreeWidgetItem(parent, strings), m_element(QDomElement()), m_clipType(FOLDER), m_groupName(strings.at(1)), m_clipId(clipId), m_clip(NULL) {
setSizeHint(0, QSize(65, 45));
setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
setIcon(0, KIcon("folder"));
+ setToolTip(1, "<qt><b>" + i18n("Folder"));
}
ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip)
- : QTreeWidgetItem(parent, QStringList(), QTreeWidgetItem::UserType) {
+ : QTreeWidgetItem(parent) {
setSizeHint(0, QSize(65, 45));
setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
m_clip = clip;
}
ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip)
- : QTreeWidgetItem(parent, QStringList(), QTreeWidgetItem::UserType) {
+ : QTreeWidgetItem(parent) {
setSizeHint(0, QSize(65, 45));
setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
m_clip = clip;
else return KUrl();
}
+void ProjectItem::changeDuration(int frames) {
+ m_element.setAttribute("duration", frames);
+ m_duration = GenTime(frames, 25);
+ setData(1, DurationRole, Timecode::getEasyTimecode(m_duration, 25));
+ m_durationKnown = true;
+ m_clip->setDuration(m_duration);
+}
+
+void ProjectItem::setDescription(const QString &desc) {
+ m_clip->setDescription(desc);
+}
+
+DocClipBase *ProjectItem::referencedClip() {
+ return m_clip;
+}
void ProjectItem::slotSetToolTip() {
QString tip = "<qt><b>";
switch (m_clipType) {
case 1:
- tip.append(i18n("Audio clip"));
+ tip.append(i18n("Audio clip") + "</b><br />" + clipUrl().path());
break;
case 2:
- tip.append(i18n("Mute video clip"));
+ tip.append(i18n("Mute video clip") + "</b><br />" + clipUrl().path());
break;
case 3:
- tip.append(i18n("Video clip"));
+ tip.append(i18n("Video clip") + "</b><br />" + clipUrl().path());
break;
case 4:
tip.append(i18n("Color clip"));
setData(1, DurationRole, Timecode::getEasyTimecode(GenTime(m_element.attribute("out", "250").toInt(), 25), 25));
break;
case 5:
- tip.append(i18n("Image clip"));
+ tip.append(i18n("Image clip") + "</b><br />" + clipUrl().path());
break;
case 6:
tip.append(i18n("Text clip"));
tip.append(i18n("Virtual clip"));
break;
case 9:
- tip.append(i18n("Playlist clip"));
+ tip.append(i18n("Playlist clip") + "</b><br />" + clipUrl().path());
break;
default:
tip.append(i18n("Unknown clip"));
m_element.setAttribute("type", (int) m_clipType);
if (KdenliveSettings::audiothumbnails()) m_clip->slotRequestAudioThumbs();
+
+ m_clip->setProperties(attributes);
/*
- if (attributes.contains("height")) {
- m_height = attributes["height"].toInt();
- } else {
- m_height = 0;
- }
- if (attributes.contains("width")) {
- m_width = attributes["width"].toInt();
- } else {
- m_width = 0;
- }
- //decoder name
- if (attributes.contains("name")) {
- m_decompressor = attributes["name"];
- } else {
- m_decompressor = "n/a";
- }
- //video type ntsc/pal
- if (attributes.contains("system")) {
- m_system = attributes["system"];
- } else {
- m_system = "n/a";
- }
- if (attributes.contains("fps")) {
- m_framesPerSecond = attributes["fps"].toInt();
- } else {
- // No frame rate known.
- m_framesPerSecond = 0;
- }
- //audio attributes -reh
- if (attributes.contains("channels")) {
- m_channels = attributes["channels"].toInt();
- } else {
- m_channels = 0;
- }
- if (attributes.contains("format")) {
- m_format = attributes["format"];
- } else {
- m_format = "n/a";
- }
- if (attributes.contains("frequency")) {
- m_frequency = attributes["frequency"].toInt();
- } else {
- m_frequency = 0;
- }
- if (attributes.contains("videocodec")) {
- m_videoCodec = attributes["videocodec"];
- }
- if (attributes.contains("audiocodec")) {
- m_audioCodec = attributes["audiocodec"];
- }
-
- m_metadata = metadata;
-
- if (m_metadata.contains("description")) {
- setDescription (m_metadata["description"]);
- }
- else if (m_metadata.contains("comment")) {
- setDescription (m_metadata["comment"]);
- }
+ m_metadata = metadata;
+
+ if (m_metadata.contains("description")) {
+ setDescription (m_metadata["description"]);
+ }
+ else if (m_metadata.contains("comment")) {
+ setDescription (m_metadata["comment"]);
+ }
*/
}
int clipMaxDuration() const;
CLIPTYPE clipType() const;
void setGroup(const QString name, const QString id);
+ void changeDuration(int frames);
+ DocClipBase *referencedClip();
+ void setDescription(const QString &desc);
private:
QDomElement m_element;
//m_toolbar->setEnabled(false);
searchView->setTreeWidget(listView);
- listView->setColumnCount(3);
- QStringList headers;
- headers << i18n("Thumbnail") << i18n("Filename") << i18n("Description");
- listView->setHeaderLabels(headers);
- listView->sortByColumn(1, Qt::AscendingOrder);
m_menu = new QMenu();
m_menu->addAction(addClipButton);
connect(listView, SIGNAL(addClip()), this, SLOT(slotAddClip()));
connect(listView, SIGNAL(addClip(QUrl, const QString &)), this, SLOT(slotAddClip(QUrl, const QString &)));
connect(listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotUpdateItemDescription(QTreeWidgetItem *, int)));
+ connect(listView, SIGNAL(showProperties(DocClipBase *)), this, SIGNAL(showClipProperties(DocClipBase *)));
m_listViewDelegate = new ItemDelegate(listView);
listView->setItemDelegate(m_listViewDelegate);
- listView->setIconSize(QSize(60, 40));
- listView->setSortingEnabled(true);
}
ProjectList::~ProjectList() {
delete m_toolbar;
}
+
+
void ProjectList::setRenderer(Render *projectRender) {
m_render = projectRender;
}
if (type == AUDIO || type == VIDEO || type == AV || type == IMAGE || type == PLAYLIST) {
// Use Nepomuk system to store clip description
Nepomuk::Resource f(clip->clipUrl().path());
- f.setDescription(item->text(2));
+ if (f.isValid()) f.setDescription(item->text(2));
+ clip->setDescription(item->text(2));
kDebug() << "NEPOMUK, SETTING CLIP: " << clip->clipUrl().path() << ", TO TEXT: " << item->text(2);
}
} else if (column == 1 && type == FOLDER) {
}
}
-void ProjectList::slotEditClip() {
- kDebug() << "//////////////////////////////////////// DBLÂ CLK";
-}
-
-
-void ProjectList::slotEditClip(QTreeWidgetItem *item, int column) {
- kDebug() << "//////////////////////////////////////// DBLÂ CLK";
-}
-
void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item) {
bool enable = false;
if (item) {
- QFrame *w = new QFrame;
- w->setFrameShape(QFrame::StyledPanel);
- w->setLineWidth(2);
- w->setAutoFillBackground(true);
- QHBoxLayout *layout = new QHBoxLayout;
- layout->addWidget(new QLabel(i18n("Color:")));
- layout->addWidget(new KColorButton());
- layout->addWidget(new QLabel(i18n("Duration:")));
- layout->addWidget(new KRestrictedLine());
- w->setLayout(layout);
- m_listViewDelegate->extendItem(w, listView->currentIndex());
enable = true;
}
m_editAction->setEnabled(enable);
if (!url.isEmpty()) {
// if file has Nepomuk comment, use it
Nepomuk::Resource f(url.path());
- QString annotation = f.description();
+ QString annotation;
+ if (f.isValid()) annotation = f.description();
+
if (!annotation.isEmpty()) item->setText(2, annotation);
QString resource = url.path();
if (resource.endsWith("westley") || resource.endsWith("kdenlive")) {
}
void ProjectList::slotDeleteClip(int clipId) {
- kDebug() << "/////// DELETE CLIP: " << clipId;
ProjectItem *item = getItemById(clipId);
- if (item) delete item;
+ QTreeWidgetItem *p = item->parent();
+ if (p) {
+ kDebug() << "/////// DELETEED CLIP HAS A PARENT... " << p->indexOfChild(item);
+ QTreeWidgetItem *clone = p->takeChild(p->indexOfChild(item));
+ } else if (item) delete item;
}
void ProjectList::slotAddFolder() {
void ProjectList::slotAddClip(DocClipBase *clip) {
const int parent = clip->toXML().attribute("groupid").toInt();
+ ProjectItem *item = NULL;
if (parent != 0) {
ProjectItem *parentitem = getItemById(parent);
- if (parentitem)(void) new ProjectItem(parentitem, clip);
- else (void) new ProjectItem(listView, clip);
- } else (void) new ProjectItem(listView, clip);
+ if (parentitem) item = new ProjectItem(parentitem, clip);
+ }
+ if (item == NULL) item = new ProjectItem(listView, clip);
+
+ KUrl url = clip->fileURL();
+ if (!url.isEmpty()) {
+ // if file has Nepomuk comment, use it
+ Nepomuk::Resource f(url.path());
+ QString annotation;
+ if (f.isValid()) {
+ annotation = f.description();
+ /*
+ Nepomuk::Tag tag("test");
+ f.addTag(tag);*/
+ } else kDebug() << "--- CANNOT CONTACTÂ NEPOMUK";
+ if (!annotation.isEmpty()) item->setText(2, annotation);
+ }
emit getFileProperties(clip->toXML(), clip->getId());
}
#include <QToolBar>
#include <QTreeWidget>
#include <QPainter>
+#include <QItemDelegate>
#include <KUndoStack>
#include <KTreeWidgetSearchLine>
-#include "kextendableitemdelegate.h"
#include <KUrl>
#include "definitions.h"
const int DurationRole = NameRole + 1;
const int UsageRole = NameRole + 2;
-class ItemDelegate: public KExtendableItemDelegate {
+class ItemDelegate: public QItemDelegate {
public:
- ItemDelegate(QAbstractItemView* parent = 0): KExtendableItemDelegate(parent) {
+ ItemDelegate(QAbstractItemView* parent = 0): QItemDelegate(parent) {
}
/*
+ static_cast<ProjectItem *>( index.internalPointer() );
+
void expand()
{
QWidget *w = new QWidget;
painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , subText);
painter->restore();
} else {
- KExtendableItemDelegate::paint(painter, option, index);
+ QItemDelegate::paint(painter, option, index);
}
}
};
ProjectItem *getItemById(int id);
QAction *m_editAction;
QAction *m_deleteAction;
- ItemDelegate *m_listViewDelegate;
KdenliveDoc *m_doc;
+ ItemDelegate *m_listViewDelegate;
private slots:
void slotAddClip(QUrl givenUrl = QUrl(), QString group = QString());
void slotRemoveClip();
- void slotEditClip();
void slotClipSelected();
void slotAddColorClip();
void slotAddTitleClip();
- void slotEditClip(QTreeWidgetItem *, int);
void slotContextMenu(const QPoint &pos, QTreeWidgetItem *);
void slotAddFolder();
void slotAddFolder(const QString foldername, int clipId, bool remove, bool edit);
void clipSelected(const QDomElement &);
void getFileProperties(const QDomElement&, int);
void receivedClipDuration(int, int);
+ void showClipProperties(DocClipBase *);
};
#endif
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#include "QApplication"
+#include <QApplication>
+#include <QHeaderView>
+#include <QAction>
-#include "KDebug"
+#include <KDebug>
+#include <KMenu>
+#include <KLocale>
#include "projectitem.h"
#include "projectlistview.h"
+#include "kdenlivesettings.h"
ProjectListView::ProjectListView(QWidget *parent)
setAlternatingRowColors(true);
setDragEnabled(true);
setAcceptDrops(true);
+
+ setColumnCount(4);
+ QStringList headers;
+ headers << i18n("Thumbnail") << i18n("Filename") << i18n("Description") << i18n("Rating");
+ setHeaderLabels(headers);
+ sortByColumn(1, Qt::AscendingOrder);
+
+ QHeaderView* headerView = header();
+ headerView->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(headerView, SIGNAL(customContextMenuRequested(const QPoint&)),
+ this, SLOT(configureColumns(const QPoint&)));
+
+ connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(slotFocusOut(QTreeWidgetItem *, QTreeWidgetItem *)));
+
+ if (!KdenliveSettings::showdescriptioncolumn()) hideColumn(2);
+ if (!KdenliveSettings::showratingcolumn()) hideColumn(3);
+
+ setIconSize(QSize(60, 40));
+ setSortingEnabled(true);
}
ProjectListView::~ProjectListView() {
}
-void ProjectListView::editItem(QTreeWidgetItem * item, int column) {
- kDebug() << "//////////////// EDIT ITEM, COL: " << column;
+
+void ProjectListView::configureColumns(const QPoint& pos) {
+ KMenu popup(this);
+ popup.addTitle(i18nc("@title:menu", "Columns"));
+
+ QHeaderView* headerView = header();
+ for (int i = 2; i < headerView->count(); ++i) {
+ const int logicalIndex = headerView->logicalIndex(i);
+ const QString text = model()->headerData(i, Qt::Horizontal).toString();
+ QAction* action = popup.addAction(text);
+ action->setCheckable(true);
+ action->setChecked(!headerView->isSectionHidden(logicalIndex));
+ action->setData(i);
+ }
+
+ QAction* activatedAction = popup.exec(header()->mapToGlobal(pos));
+ if (activatedAction != 0) {
+ const bool show = activatedAction->isChecked();
+
+ // remember the changed column visibility in the settings
+ const int columnIndex = activatedAction->data().toInt();
+ switch (columnIndex) {
+ case 2:
+ KdenliveSettings::setShowdescriptioncolumn(show);
+ break;
+ case 3:
+ KdenliveSettings::setShowratingcolumn(show);
+ break;
+ default:
+ break;
+ }
+
+ // apply the changed column visibility
+ if (show) {
+ showColumn(columnIndex);
+ } else {
+ hideColumn(columnIndex);
+ }
+ }
}
// virtual
ProjectItem *item = static_cast <ProjectItem *>(itemAt(event->pos()));
if (!item) emit addClip();
else if ((item->clipType() == FOLDER && columnAt(event->pos().x()) == 1) || columnAt(event->pos().x()) == 2) QTreeWidget::mouseDoubleClickEvent(event);
+ else emit showProperties(item->referencedClip());
}
// virtual
#include <QTreeWidget>
#include <QContextMenuEvent>
+#include <QPainter>
+
class ProjectListView : public QTreeWidget {
Q_OBJECT
public:
ProjectListView(QWidget *parent = 0);
virtual ~ProjectListView();
- void editItem(QTreeWidgetItem * item, int column = 0);
protected:
virtual void contextMenuEvent(QContextMenuEvent * event);
QPoint m_DragStartPosition;
private slots:
-
+ void configureColumns(const QPoint& pos);
signals:
void requestMenu(const QPoint &, QTreeWidgetItem *);
void addClip();
void addClip(QUrl, const QString &);
+ void showProperties(DocClipBase *);
};
#endif
producer.attach(m_convert);
Mlt::Frame * frame = producer.get_frame();
- filePropertyMap["fps"] =
- QString::number(mlt_producer_get_fps(producer.get_producer()));
+ //filePropertyMap["fps"] = QString::number(mlt_producer_get_fps(producer.get_producer()));
+ filePropertyMap["fps"] = producer.get("source_fps");
if (frame && frame->is_valid()) {
- filePropertyMap["width"] =
- QString::number(frame->get_int("width"));
- filePropertyMap["height"] =
- QString::number(frame->get_int("height"));
- filePropertyMap["frequency"] =
- QString::number(frame->get_int("frequency"));
- filePropertyMap["channels"] =
- QString::number(frame->get_int("channels"));
+ filePropertyMap["frame_size"] = QString::number(frame->get_int("width")) + "x" + QString::number(frame->get_int("height"));
+ filePropertyMap["frequency"] = QString::number(frame->get_int("frequency"));
+ filePropertyMap["channels"] = QString::number(frame->get_int("channels"));
+ filePropertyMap["aspect_ratio"] = frame->get("aspect_ratio");
if (frame->get_int("test_image") == 0) {
if (url.path().endsWith(".westley") || url.path().endsWith(".kdenlive")) {
--- /dev/null
+<ui version="4.0" >
+ <class>ClipProperties_UI</class>
+ <widget class="QDialog" name="ClipProperties_UI" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>284</width>
+ <height>439</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2" >
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>Path</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="KLineEdit" name="clip_path" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="text" >
+ <string>Description</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" >
+ <widget class="KLineEdit" name="clip_description" />
+ </item>
+ <item row="5" column="0" >
+ <widget class="QLabel" name="clip_filesize" >
+ <property name="text" >
+ <string>File size:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" >
+ <widget class="QTabWidget" name="tabWidget" >
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab_video" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>264</width>
+ <height>187</height>
+ </rect>
+ </property>
+ <attribute name="title" >
+ <string>Video</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_8" >
+ <property name="text" >
+ <string>Video codec</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="KLineEdit" name="clip_vcodec" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2" >
+ <widget class="QLabel" name="label_6" >
+ <property name="text" >
+ <string>Frame size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="KLineEdit" name="clip_size" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2" >
+ <widget class="QLabel" name="label_7" >
+ <property name="text" >
+ <string>Frame rate</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="KLineEdit" name="clip_fps" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2" >
+ <widget class="QLabel" name="label_12" >
+ <property name="text" >
+ <string>Aspect ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="KLineEdit" name="clip_ratio" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" colspan="2" >
+ <spacer name="verticalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>17</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_audio" >
+ <attribute name="title" >
+ <string>Audio</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_4" >
+ <item row="0" column="1" colspan="2" >
+ <widget class="KLineEdit" name="clip_acodec" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <widget class="KLineEdit" name="clip_channels" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2" >
+ <widget class="KLineEdit" name="clip_frequency" >
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <spacer name="verticalSpacer_3" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>77</width>
+ <height>68</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_9" >
+ <property name="text" >
+ <string>Audio codec</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_11" >
+ <property name="text" >
+ <string>Channels</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_10" >
+ <property name="text" >
+ <string>Frequency</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ <zorder>ClipProperties_2</zorder>
+ <zorder>clip_acodec</zorder>
+ <zorder>clip_frequency</zorder>
+ <zorder>verticalSpacer_3</zorder>
+ <zorder>clip_channels</zorder>
+ <zorder>label_9</zorder>
+ <zorder>label_11</zorder>
+ <zorder>label_10</zorder>
+ </widget>
+ <widget class="QWidget" name="tab_advanced" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>264</width>
+ <height>187</height>
+ </rect>
+ </property>
+ <attribute name="title" >
+ <string>Advanced</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_3" >
+ <item row="0" column="0" >
+ <widget class="QCheckBox" name="clip_force_ar" >
+ <property name="text" >
+ <string>Force aspect ratio</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="KDoubleNumInput" name="clip_ar" />
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>Decoding threads</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QSpinBox" name="clip_threads" >
+ <property name="maximum" >
+ <number>4</number>
+ </property>
+ <property name="value" >
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Video index</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="clip_vindex" >
+ <property name="minimum" >
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Audio index</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="clip_aindex" >
+ <property name="minimum" >
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" >
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>35</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="7" column="0" >
+ <widget class="QDialogButtonBox" name="buttonBox" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons" >
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="clip_thumb" >
+ <property name="text" >
+ <string>Image preview</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>KDoubleNumInput</class>
+ <extends>QWidget</extends>
+ <header>knuminput.h</header>
+ </customwidget>
+ <customwidget>
+ <class>KLineEdit</class>
+ <extends>QLineEdit</extends>
+ <header>klineedit.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>ClipProperties_UI</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>ClipProperties_UI</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>