File indexing completed on 2024-04-21 04:51:11
0001 /* 0002 SPDX-FileCopyrightText: 2012 Till Theato <root@ttill.de> 0003 SPDX-FileCopyrightText: 2014 Jean-Baptiste Mardelle <jb@kdenlive.org> 0004 This file is part of Kdenlive. See www.kdenlive.org. 0005 0006 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0007 */ 0008 0009 #pragma once 0010 0011 #include "abstractprojectitem.h" 0012 #include "utils/timecode.h" 0013 0014 #include <KMessageWidget> 0015 0016 #include <QDir> 0017 #include <QDomElement> 0018 #include <QFuture> 0019 #include <QLineEdit> 0020 #include <QListView> 0021 #include <QMutex> 0022 #include <QPushButton> 0023 #include <QTreeView> 0024 #include <QListWidget> 0025 #include <QUrl> 0026 #include <QWidget> 0027 #include <QActionGroup> 0028 0029 #include <KRecentDirs> 0030 0031 class AbstractProjectItem; 0032 class BinItemDelegate; 0033 class BinListItemDelegate; 0034 class ClipController; 0035 class EffectStackModel; 0036 class InvalidDialog; 0037 class TranscodeSeek; 0038 class KdenliveDoc; 0039 class TagWidget; 0040 class Monitor; 0041 class ProjectClip; 0042 class ProjectFolder; 0043 class ProjectItemModel; 0044 class ProjectSortProxyModel; 0045 class QDockWidget; 0046 class QMenu; 0047 class QScrollArea; 0048 class QTimeLine; 0049 class QToolBar; 0050 class QToolButton; 0051 class QUndoCommand; 0052 class QVBoxLayout; 0053 class SmallJobLabel; 0054 class MediaBrowser; 0055 0056 namespace Mlt { 0057 class Producer; 0058 } 0059 0060 /** @class MyListView 0061 @brief \@todo Describe class MyListView 0062 @todo Describe class MyListView 0063 */ 0064 class MyListView : public QListView 0065 { 0066 Q_OBJECT 0067 public: 0068 explicit MyListView(QWidget *parent = nullptr); 0069 0070 protected: 0071 void mousePressEvent(QMouseEvent *event) override; 0072 void mouseReleaseEvent(QMouseEvent *event) override; 0073 void mouseMoveEvent(QMouseEvent *event) override; 0074 void focusInEvent(QFocusEvent *event) override; 0075 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 0076 void enterEvent(QEnterEvent *event) override; 0077 #else 0078 void enterEvent(QEvent *event) override; 0079 #endif 0080 void leaveEvent(QEvent *event) override; 0081 void dropEvent(QDropEvent *event) override; 0082 0083 Q_SIGNALS: 0084 void focusView(); 0085 void updateDragMode(PlaylistState::ClipState type); 0086 void displayBinFrame(QModelIndex ix, int frame, bool storeFrame = false); 0087 void processDragEnd(); 0088 private: 0089 QPoint m_startPos; 0090 PlaylistState::ClipState m_dragType; 0091 QModelIndex m_lastHoveredItem; 0092 }; 0093 0094 /** @class MyTreeView 0095 @brief \@todo Describe class MyTreeView 0096 @todo Describe class MyTreeView 0097 */ 0098 class MyTreeView : public QTreeView 0099 { 0100 Q_OBJECT 0101 Q_PROPERTY(bool editing READ isEditing WRITE setEditing NOTIFY editingChanged) 0102 public: 0103 explicit MyTreeView(QWidget *parent = nullptr); 0104 void setEditing(bool edit); 0105 0106 protected: 0107 void mousePressEvent(QMouseEvent *event) override; 0108 void mouseReleaseEvent(QMouseEvent *event) override; 0109 void mouseMoveEvent(QMouseEvent *event) override; 0110 void focusInEvent(QFocusEvent *event) override; 0111 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 0112 void enterEvent(QEnterEvent *) override; 0113 #else 0114 void enterEvent(QEvent *event) override; 0115 #endif 0116 void leaveEvent(QEvent *event) override; 0117 0118 protected Q_SLOTS: 0119 void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint) override; 0120 void editorDestroyed(QObject *editor) override; 0121 0122 private: 0123 QPoint m_startPos; 0124 PlaylistState::ClipState m_dragType; 0125 QModelIndex m_lastHoveredItem; 0126 bool m_editing; 0127 bool performDrag(); 0128 bool isEditing() const; 0129 0130 Q_SIGNALS: 0131 void focusView(); 0132 void updateDragMode(PlaylistState::ClipState type); 0133 void displayBinFrame(QModelIndex ix, int frame, bool storeFrame = false); 0134 void processDragEnd(); 0135 void selectCurrent(); 0136 void editingChanged(); 0137 }; 0138 0139 /** @class SmallJobLabel 0140 @brief \@todo Describe class SmallJobLabel 0141 @todo Describe class SmallJobLabel 0142 */ 0143 class SmallJobLabel : public QPushButton 0144 { 0145 Q_OBJECT 0146 public: 0147 explicit SmallJobLabel(QWidget *parent = nullptr); 0148 static const QString getStyleSheet(const QPalette &p); 0149 void setAction(QAction *action); 0150 0151 private: 0152 enum ItemRole { NameRole = Qt::UserRole, DurationRole, UsageRole }; 0153 0154 QTimeLine *m_timeLine; 0155 QAction *m_action{nullptr}; 0156 QMutex m_locker; 0157 0158 public Q_SLOTS: 0159 void slotSetJobCount(int jobCount); 0160 0161 private Q_SLOTS: 0162 void slotTimeLineChanged(qreal value); 0163 void slotTimeLineFinished(); 0164 }; 0165 0166 /** @class LineEventEater 0167 @brief \@todo Describe class LineEventEater 0168 @todo Describe class LineEventEater 0169 */ 0170 class LineEventEater : public QObject 0171 { 0172 Q_OBJECT 0173 public: 0174 explicit LineEventEater(QObject *parent = nullptr); 0175 0176 protected: 0177 bool eventFilter(QObject *obj, QEvent *event) override; 0178 0179 Q_SIGNALS: 0180 void clearSearchLine(); 0181 void showClearButton(bool); 0182 }; 0183 0184 /** 0185 * @class Bin 0186 * @brief The bin widget takes care of both item model and view upon project opening. 0187 */ 0188 class Bin : public QWidget 0189 { 0190 Q_OBJECT 0191 0192 /** @brief Defines the view types (icon view, tree view,...) */ 0193 enum BinViewType { BinTreeView, BinIconView }; 0194 0195 public: 0196 explicit Bin(std::shared_ptr<ProjectItemModel> model, QWidget *parent = nullptr, bool isMainBin = true); 0197 ~Bin() override; 0198 0199 bool isLoading; 0200 /** @brief Sets the document for the bin and initialize some stuff */ 0201 const QString setDocument(KdenliveDoc *project, const QString &id = QString()); 0202 /** @brief Delete all project related data, to be called before setDocument */ 0203 void cleanDocument(); 0204 0205 /** @brief Create a clip item from its xml description */ 0206 void createClip(const QDomElement &xml); 0207 0208 /** @brief Used to notify the Model View that an item was updated */ 0209 void emitItemUpdated(std::shared_ptr<AbstractProjectItem> item); 0210 0211 /** @brief Set monitor associated with this bin (clipmonitor) */ 0212 void setMonitor(Monitor *monitor); 0213 0214 /** @brief Returns the clip monitor */ 0215 Monitor *monitor(); 0216 0217 /** @brief Open a producer in the clip monitor */ 0218 void openProducer(std::shared_ptr<ProjectClip> controller); 0219 void openProducer(std::shared_ptr<ProjectClip> controller, int in, int out); 0220 0221 /** @brief Get a clip from it's id */ 0222 std::shared_ptr<ProjectClip> getBinClip(const QString &id); 0223 /** @brief Get a clip's name from it's id */ 0224 const QString getBinClipName(const QString &id) const; 0225 /** @brief Returns the duration of a given clip. */ 0226 size_t getClipDuration(int itemId) const; 0227 /** @brief Returns the frame size of a given clip. */ 0228 QSize getFrameSize(int itemId) const; 0229 /** @brief Returns the state of a given clip: AudioOnly, VideoOnly, Disabled (Disabled means it has audio and video capabilities */ 0230 PlaylistState::ClipState getClipState(int itemId) const; 0231 0232 /** @brief Add markers on clip \@param binId at \@param positions with @comments text if given */ 0233 void addClipMarker(const QString &binId, const QList<int> &positions, const QStringList &comments = {}); 0234 0235 /** @brief Get the count of all markers in all clips using this category */ 0236 int getAllClipMarkers(int category) const; 0237 0238 /** @brief Remove all clip markers using a category */ 0239 void removeMarkerCategories(QList<int> toRemove, const QMap<int, int> remapCategories); 0240 0241 /** @brief Returns a list of selected clip ids. 0242 * @param allowSubClips: if true, will include subclip ids in the form: "master clip id/in/out" 0243 */ 0244 std::vector<QString> selectedClipsIds(bool allowSubClips = false); 0245 0246 // Returns the selected clips 0247 QList<std::shared_ptr<ProjectClip>> selectedClips(); 0248 0249 /** @brief Current producer has changed, refresh monitor and timeline*/ 0250 void refreshClip(const QString &id); 0251 0252 void setupMenu(); 0253 0254 /** @brief The source file was modified, we will reload it soon, disable item in the meantime */ 0255 void setWaitingStatus(const QString &id); 0256 0257 const QString getDocumentProperty(const QString &key); 0258 0259 /** @brief Ask MLT to reload this clip's producer */ 0260 void reloadClip(const QString &id); 0261 0262 /** @brief refresh monitor (if clip changed) */ 0263 void reloadMonitorIfActive(const QString &id); 0264 /** @brief refresh monitor stream selector */ 0265 void reloadMonitorStreamIfActive(const QString &id); 0266 /** @brief Update timeline targets according to selected audio streams */ 0267 void updateTargets(QString id = QStringLiteral("-1")); 0268 /** @brief Update some timeline related stuff, like used clips bound, audio targets,... */ 0269 void sequenceActivated(); 0270 0271 void doMoveClip(const QString &id, const QString &newParentId); 0272 void doMoveFolder(const QString &id, const QString &newParentId); 0273 void setupGeneratorMenu(); 0274 0275 /** @brief Set focus to the Bin view. */ 0276 void focusBinView() const; 0277 /** @brief Get a string list of all clip ids that are inside a folder defined by id. */ 0278 QStringList getBinFolderClipIds(const QString &id) const; 0279 /** @brief Build a rename subclip command. */ 0280 void renameSubClipCommand(const QString &id, const QString &newName, const QString &oldName, int in, int out); 0281 /** @brief Rename a clip zone (subclip). */ 0282 void renameSubClip(const QString &id, const QString &newName, int in, int out); 0283 0284 /** @brief Edit an effect settings to a bin clip. */ 0285 void editMasterEffect(const std::shared_ptr<AbstractProjectItem> &clip); 0286 /** @brief An effect setting was changed, update stack if displayed. */ 0287 void updateMasterEffect(ClipController *ctl); 0288 void rebuildMenu(); 0289 void refreshIcons(); 0290 0291 /** @brief This function change the global enabled state of the bin effects 0292 */ 0293 void setBinEffectsEnabled(bool enabled, bool refreshMonitor = true); 0294 0295 void requestAudioThumbs(const QString &id, long duration); 0296 /** @brief Proxy status for the project changed, update. */ 0297 void refreshProxySettings(); 0298 /** @brief A clip is ready, update its info panel if displayed. */ 0299 void emitRefreshPanel(const QString &id); 0300 /** @brief Returns true if there is a clip in bin. Timeline clips are ignored. */ 0301 bool hasUserClip() const; 0302 /** @brief Trigger reload of all clips. */ 0303 void reloadAllProducers(bool reloadThumbs = true); 0304 /** @brief Ensure all audio thumbs have been created */ 0305 void checkAudioThumbs(); 0306 /** @brief Get usage stats for project bin. */ 0307 void getBinStats(uint *used, uint *unused, qint64 *usedSize, qint64 *unusedSize); 0308 /** @brief Returns the clip properties dockwidget. */ 0309 QDockWidget *clipPropertiesDock(); 0310 void rebuildProxies(); 0311 /** @brief Return a list of all clips hashes used in this project */ 0312 QStringList getProxyHashList(); 0313 /** @brief Get binId of the current selected folder */ 0314 QString getCurrentFolder(); 0315 /** @brief Save a clip zone as MLT playlist */ 0316 void saveZone(const QStringList &info, const QDir &dir); 0317 /** @brief A bin clip changed (its effects), invalidate preview */ 0318 void invalidateClip(const QString &binId); 0319 /** @brief Recreate missing proxies on document opening */ 0320 void checkMissingProxies(); 0321 /** @brief Save folder state (expanded or not) */ 0322 void saveFolderState(); 0323 /** @brief Load folder state (expanded or not), zoom level and possible other project stored Bin settings */ 0324 void loadBinProperties(const QStringList &foldersToExpand, int zoomLevel = -1); 0325 /** @brief gets a QList of all clips used in timeline */ 0326 QList<int> getUsedClipIds(); 0327 /** @brief Update a new timeline clip when it has been changed 0328 * @param uuid the uuid of the timeline clip that was changed 0329 * @param id the updated duration of the timeline clip 0330 * * @param current the uuid of the currently active timeline 0331 */ 0332 void updateSequenceClip(const QUuid &uuid, int duration, int pos); 0333 /** @brief Update a sequence AV info (has audio/video) */ 0334 void updateSequenceAVType(const QUuid &uuid, int tracksCount); 0335 0336 // TODO refac: remove this and call directly the function in ProjectItemModel 0337 void cleanupUnused(); 0338 void selectAll(); 0339 /** @brief Save an mlt playlist from a bin id and a list of cuts 0340 * @param binId the id of the source clip for zones 0341 * @param savePath the path for the resulting playlist 0342 * @param zones the source cli pzones that will be put in the result playlist 0343 * @param properties some extra properties that will be set on the producer 0344 * @param createNew if true, the playlist will be added as a new clip in project binId */ 0345 void savePlaylist(const QString &binId, const QString &savePath, const QVector<QPoint> &zones, const QMap<QString, QString> &properties, bool createNew); 0346 /** @brief Do some checks on the profile */ 0347 static void checkProfile(const std::shared_ptr<Mlt::Producer> &producer); 0348 /** @brief Should we process a profile check for added clips */ 0349 std::atomic<bool> shouldCheckProfile; 0350 /** @brief Set the message for key binding info. */ 0351 void updateKeyBinding(const QString &bindingMessage = QString()); 0352 /** @brief Returns true if a clip with id cid is visible in this bin. */ 0353 bool containsId(const QString &cid) const; 0354 void replaceSingleClip(const QString clipId, const QString &newUrl); 0355 /** @brief List all clips referenced in a timeline sequence. */ 0356 QStringList sequenceReferencedClips(const QUuid &uuid) const; 0357 /** @brief Define a thumbnail for a sequence clip. */ 0358 void setSequenceThumbnail(const QUuid &uuid, int frame); 0359 /** @brief When saving or rendering, copy timewarp temporary playlists to the correct folder. */ 0360 void moveTimeWarpToFolder(const QDir sequenceFolder, bool copy); 0361 /** @brief Create new sequence clip 0362 * @param aTracks the audio tracks count, use default if -1 0363 * @param vTracks the video tracks count, use default if -1 */ 0364 void buildSequenceClip(int aTracks = -1, int vTracks = -1); 0365 const QString buildSequenceClipWithUndo(Fun &undo, Fun &redo, int aTracks = -1, int vTracks = -1, QString suggestedName = QString()); 0366 /** @brief Returns true if the project uses a clip with variable framerate. */ 0367 bool usesVariableFpsClip(); 0368 0369 private Q_SLOTS: 0370 void slotAddClip(); 0371 /** @brief Reload clip from disk */ 0372 void slotReloadClip(); 0373 /** @brief Replace clip with another file */ 0374 void slotReplaceClip(); 0375 /** @brief Replace audio or video component in timeline with another file */ 0376 void slotReplaceClipInTimeline(); 0377 /** @brief Set sorting column */ 0378 void slotSetSorting(); 0379 /** @brief Show/hide date column */ 0380 void slotShowColumn(bool show); 0381 /** @brief Ensure current item is selected */ 0382 void ensureCurrent(); 0383 /** @brief Go to parent folder */ 0384 void slotBack(); 0385 /** @brief Setup the bin view type (icon view, tree view, ...). 0386 * @param action The action whose data defines the view type or nullptr to keep default view */ 0387 void slotInitView(QAction *action); 0388 void slotSetIconSize(int size); 0389 void selectProxyModel(const QModelIndex &id); 0390 void slotSaveHeaders(); 0391 0392 /** @brief Reset all text and log data from info message widget. */ 0393 void slotResetInfoMessage(); 0394 /** @brief Show dialog prompting for removal of invalid clips. */ 0395 void slotQueryRemoval(const QString &id, const QString &url, const QString &errorMessage); 0396 /** @brief Request display of current clip in monitor. */ 0397 void slotOpenCurrent(); 0398 void slotZoomView(bool zoomIn); 0399 /** @brief Widget gained focus, make sure we display effects for master clip. */ 0400 void slotGotFocus(); 0401 /** @brief Rename a Bin Item. */ 0402 void slotRenameItem(); 0403 void doRefreshPanel(const QString &id); 0404 /** @brief Enable item view and hide message */ 0405 void slotMessageActionTriggered(); 0406 /** @brief Request editing of title or slideshow clip */ 0407 void slotEditClip(); 0408 /** @brief Enable / disable clear button on search line 0409 * this is a workaround foq Qt bug 54676 0410 */ 0411 void showClearButton(bool show); 0412 /** @brief Display a defined frame in bin clip thumbnail 0413 */ 0414 void showBinFrame(const QModelIndex &ix, int frame, bool storeFrame = false); 0415 /** @brief Switch a tag on/off on current selection 0416 */ 0417 void switchTag(const QString &tag, bool add); 0418 /** @brief Update project tags 0419 */ 0420 void updateTags(const QMap <int, QStringList> &previousTags, const QMap <int, QStringList> &tags); 0421 void rebuildFilters(int tagsCount); 0422 /** @brief Switch a tag on a clip list 0423 */ 0424 void editTags(const QList <QString> &allClips, const QString &tag, bool add); 0425 /** @brief Update the string description of the clips count, like: 123 clips (3 selected). */ 0426 void updateClipsCount(); 0427 /** @brief Update the menu entry listing the occurrences of a clip in timeline. */ 0428 void updateTimelineOccurrences(); 0429 /** @brief Set (or unset) the default folder for newly created sequence clips. */ 0430 void setDefaultSequenceFolder(bool enable); 0431 /** @brief Set (or unset) the default folder for newly created audio captures. */ 0432 void setDefaultAudioCaptureFolder(bool enable); 0433 /** @brief Fetch the filters from the UI and apply them to the proxy model */ 0434 void slotApplyFilters(); 0435 0436 public Q_SLOTS: 0437 0438 void slotRemoveInvalidClip(const QString &id, bool replace, const QString &errorMessage); 0439 /** @brief Reload clip thumbnail - when frame for thumbnail changed */ 0440 void slotRefreshClipThumbnail(const QString &id); 0441 void slotDeleteClip(); 0442 void slotItemDoubleClicked(const QModelIndex &ix, const QPoint &pos, uint modifiers); 0443 void slotSwitchClipProperties(const std::shared_ptr<ProjectClip> &clip); 0444 void slotSwitchClipProperties(); 0445 /** @brief Creates a new folder with optional name, and returns new folder's id */ 0446 void slotAddFolder(); 0447 void slotCreateProjectClip(); 0448 void slotEditClipCommand(const QString &id, const QMap<QString, QString> &oldProps, const QMap<QString, QString> &newProps); 0449 /** @brief Start a filter job requested by a filter applied in timeline */ 0450 void slotStartFilterJob(const ItemInfo &info, const QString &id, QMap<QString, QString> &filterParams, QMap<QString, QString> &consumerParams, 0451 QMap<QString, QString> &extraParams); 0452 void slotItemDropped(const QStringList ids, const QModelIndex parent); 0453 const QString slotUrlsDropped(const QList<QUrl> urls, const QModelIndex parent); 0454 void slotEffectDropped(const QStringList &effectData, const QModelIndex &parent); 0455 void slotTagDropped(const QString &tag, const QModelIndex &parent); 0456 void slotItemEdited(const QModelIndex &, const QModelIndex &, const QVector<int> &); 0457 /** @brief Open current clip in an external editing application */ 0458 void slotOpenClipExtern(); 0459 void slotDuplicateClip(); 0460 void slotLocateClip(); 0461 void showClipProperties(const std::shared_ptr<ProjectClip> &clip, bool forceRefresh = false); 0462 /** @brief Add extra data to a clip. */ 0463 void slotAddClipExtraData(const QString &id, const QString &key, const QString &data = QString()); 0464 void slotUpdateClipProperties(const QString &id, const QMap<QString, QString> &properties, bool refreshPropertiesPanel); 0465 /** @brief Add effect to active Bin clip (used when double clicking an effect in list). */ 0466 void slotAddEffect(std::vector<QString> ids, const QStringList &effectData); 0467 void slotExpandUrl(const ItemInfo &info, const QString &url, QUndoCommand *command); 0468 /** @brief Abort all ongoing operations to prepare close. */ 0469 void abortOperations(); 0470 void doDisplayMessage(const QString &text, KMessageWidget::MessageType type, const QList<QAction *> &actions = QList<QAction *>(), bool showCloseButton = false, BinMessage::BinCategory messageCategory = BinMessage::BinCategory::NoMessage); 0471 void doDisplayMessage(const QString &text, KMessageWidget::MessageType type, const QString logInfo); 0472 /** @brief Select a clip in the Bin from its id. */ 0473 void selectClipById(const QString &id, int frame = -1, const QPoint &zone = QPoint(), bool activateMonitor = true); 0474 const QString slotAddClipToProject(const QUrl &url); 0475 void droppedUrls(const QList<QUrl> &urls, const QString &folderInfo = QString()); 0476 /** @brief Adjust project profile to current clip. */ 0477 void adjustProjectProfileToItem(); 0478 /** @brief Check and propose auto adding audio tracks. 0479 * @param clipId The clip whose streams have to be checked 0480 * @param minimumTracksCount the number of active streams for this clip 0481 */ 0482 void checkProjectAudioTracks(QString clipId, int minimumTracksCount); 0483 void showTitleWidget(const std::shared_ptr<ProjectClip> &clip); 0484 /** @brief Add a clip in a specially named folder */ 0485 bool addProjectClipInFolder(const QString &path, const QString &sourceClipId, const QString &sourceFolder, const QString &jobId); 0486 /** @brief Add a filter with some presets to a clip */ 0487 void addFilterToClip(const QString &sourceClipId, const QString &filterId, stringMap params); 0488 /** @brief Check if a clip profile matches project, propose switch otherwise */ 0489 void slotCheckProfile(const QString &binId); 0490 /** @brief A non seekable clip was added to project, propose transcoding */ 0491 void requestTranscoding(const QString &url, const QString &id, int type, bool checkProfile, const QString &suffix = QString(), const QString &message = QString()); 0492 /** @brief Display the transcode to edit friendly format for currenly selected bin clips */ 0493 void requestSelectionTranscoding(bool forceReplace = false); 0494 /** @brief Build the project bin audio/video icons according to color theme */ 0495 void slotUpdatePalette(); 0496 /** @brief Import multiple video streams in a clip */ 0497 void processMultiStream(const QString &clipId, QList<int> videoStreams, QList<int> audioStreams); 0498 /** @brief Transcode all used clips with variable framerate to edit friendly format. */ 0499 void transcodeUsedClips(); 0500 0501 protected: 0502 /* This function is called whenever an item is selected to propagate signals 0503 (for ex request to show the clip in the monitor) 0504 */ 0505 void setCurrent(const std::shared_ptr<AbstractProjectItem> &item); 0506 void selectClip(const std::shared_ptr<ProjectClip> &clip); 0507 void contextMenuEvent(QContextMenuEvent *event) override; 0508 bool eventFilter(QObject *obj, QEvent *event) override; 0509 QSize sizeHint() const override; 0510 0511 private: 0512 bool m_isMainBin; 0513 std::shared_ptr<ProjectItemModel> m_itemModel; 0514 QAbstractItemView *m_itemView; 0515 BinItemDelegate *m_binTreeViewDelegate; 0516 BinListItemDelegate *m_binListViewDelegate; 0517 std::unique_ptr<ProjectSortProxyModel> m_proxyModel; 0518 QToolBar *m_toolbar; 0519 KdenliveDoc *m_doc; 0520 QLineEdit *m_searchLine; 0521 QToolButton *m_addButton; 0522 QMenu *m_extractAudioAction; 0523 QAction *m_transcodeAction; 0524 QMenu *m_clipsActionsMenu; 0525 QAction *m_inTimelineAction; 0526 QAction *m_showDate; 0527 QAction *m_showDesc; 0528 QAction *m_showRating; 0529 QAction *m_sortDescend; 0530 /** @brief Default view type (icon, tree, ...) */ 0531 BinViewType m_listType; 0532 /** @brief Default icon size for the views. */ 0533 QSize m_baseIconSize; 0534 /** @brief Keeps the column width info of the tree view. */ 0535 QByteArray m_headerInfo; 0536 QVBoxLayout *m_layout; 0537 QDockWidget *m_propertiesDock; 0538 QScrollArea *m_propertiesPanel; 0539 QSlider *m_slider; 0540 Monitor *m_monitor; 0541 QIcon m_blankThumb; 0542 QMenu *m_menu; 0543 QAction *m_openAction; 0544 QAction *m_editAction; 0545 QAction *m_reloadAction; 0546 QAction *m_replaceAction{nullptr}; 0547 QAction *m_replaceInTimelineAction{nullptr}; 0548 QAction *m_duplicateAction; 0549 QAction *m_locateAction; 0550 QAction *m_proxyAction; 0551 QAction *m_deleteAction; 0552 QAction *m_openInBin; 0553 QAction *m_sequencesFolderAction; 0554 QAction *m_audioCapturesFolderAction; 0555 QAction *m_addClip; 0556 QAction *m_createFolderAction; 0557 QAction *m_renameAction; 0558 QMenu *m_jobsMenu; 0559 QAction *m_cancelJobs; 0560 QAction *m_discardCurrentClipJobs; 0561 QAction *m_discardPendingJobs; 0562 QAction *m_upAction; 0563 QAction *m_tagAction; 0564 QActionGroup *m_sortGroup; 0565 SmallJobLabel *m_infoLabel; 0566 TagWidget *m_tagsWidget; 0567 QMenu *m_filterMenu; 0568 QActionGroup m_filterTagGroup; 0569 QActionGroup m_filterRateGroup; 0570 QActionGroup m_filterUsageGroup; 0571 QActionGroup m_filterTypeGroup; 0572 QToolButton *m_filterButton; 0573 /** @brief The info widget for failed jobs. */ 0574 KMessageWidget *m_infoMessage; 0575 BinMessage::BinCategory m_currentMessage; 0576 QStringList m_errorLog; 0577 /** @brief Dialog listing invalid clips on load. */ 0578 InvalidDialog *m_invalidClipDialog; 0579 /** @brief Dialog listing non seekable clips on load. */ 0580 TranscodeSeek *m_transcodingDialog; 0581 /** @brief Set to true if widget just gained focus (means we have to update effect stack . */ 0582 bool m_gainedFocus; 0583 /** @brief List of Clip Ids that want an audio thumb. */ 0584 QStringList m_audioThumbsList; 0585 QString m_processingAudioThumb; 0586 QMutex m_audioThumbMutex; 0587 /** @brief This is a lock that ensures safety in case of concurrent access */ 0588 mutable QReadWriteLock m_lock; 0589 /** @brief Total number of milliseconds to process for audio thumbnails */ 0590 long m_audioDuration; 0591 /** @brief Total number of milliseconds already processed for audio thumbnails */ 0592 long m_processedAudio; 0593 /** @brief Indicates whether audio thumbnail creation is running. */ 0594 QFuture<void> m_audioThumbsThread; 0595 QAction *addAction(const QString &name, const QString &text, const QIcon &icon, const QString &category = {}); 0596 void setupAddClipAction(QMenu *addClipMenu, ClipType::ProducerType type, const QString &name, const QString &text, const QIcon &icon); 0597 /** @brief Get the QModelIndex value for an item in the Bin. */ 0598 QModelIndex getIndexForId(const QString &id, bool folderWanted) const; 0599 std::shared_ptr<ProjectClip> getFirstSelectedClip(); 0600 void showSlideshowWidget(const std::shared_ptr<ProjectClip> &clip); 0601 void processAudioThumbs(); 0602 void updateSortingAction(int ix); 0603 int wheelAccumulatedDelta; 0604 QString m_keyBindingMessage; 0605 QString m_clipsCountMessage; 0606 /** @brief Show the clip count and key binfing info in status bar. */ 0607 void showBinInfo(); 0608 /** @brief Find all clip Ids that have a specific tag. */ 0609 const QList<QString> getAllClipsWithTag(const QString &tag); 0610 0611 Q_SIGNALS: 0612 void itemUpdated(std::shared_ptr<AbstractProjectItem>); 0613 void producerReady(const QString &id); 0614 /** @brief Save folder info into MLT. */ 0615 void storeFolder(const QString &folderId, const QString &parentId, const QString &oldParentId, const QString &folderName); 0616 void gotFilterJobResults(const QString &, int, int, stringMap, stringMap); 0617 /** @brief Request display of effect stack for a Bin clip. */ 0618 void requestShowEffectStack(const QString &clipName, std::shared_ptr<EffectStackModel>, QSize frameSize, bool showKeyframes); 0619 void requestShowClipProperties(const std::shared_ptr<ProjectClip> &clip, bool forceRefresh = false); 0620 /** @brief Request that the given clip is displayed in the clip monitor */ 0621 void requestClipShow(std::shared_ptr<ProjectClip>); 0622 void displayBinMessage(const QString &, KMessageWidget::MessageType); 0623 void requesteInvalidRemoval(const QString &, const QString &, const QString &); 0624 /** @brief Analysis data changed, refresh panel. */ 0625 void updateAnalysisData(const QString &); 0626 void openClip(std::shared_ptr<ProjectClip> c, int in = -1, int out = -1); 0627 /** @brief Fill context menu with occurrences of this clip in timeline. */ 0628 void findInTimeline(const QString &, QList<int> ids = QList<int>()); 0629 void clipNameChanged(int, const QString); 0630 /** @brief A clip was updated, request panel update. */ 0631 void refreshPanel(const QString &id); 0632 /** @brief Upon selection, activate timeline target tracks. */ 0633 void setupTargets(bool hasVideo, QMap <int, QString> audioStreams); 0634 /** @brief A drag event ended, inform timeline. */ 0635 void processDragEnd(); 0636 void requestBinClose(); 0637 /** @brief Update a timeline tab name on clip rename. */ 0638 void updateTabName(const QUuid &, const QString &); 0639 };