From b96f40cc434d44ecb59ece95ad001abee8a0038d Mon Sep 17 00:00:00 2001 From: Konstantin Dmitriev Date: Nov 24 2022 22:55:21 +0000 Subject: #morevna #board Create copy of FileBrowser class as SceneBrowser class --- diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index c73aa8a..b468f19 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -82,6 +82,7 @@ set(MOC_HEADERS ruler.h savepresetpopup.h scanpopup.h + scenebrowser.h scenesettingspopup.h sceneviewer.h sceneviewercontextmenu.h @@ -285,6 +286,8 @@ set(SOURCES runscriptcommand.cpp savepresetpopup.cpp scanpopup.cpp + scenebrowser.cpp + scenebrowserversioncontrol.cpp sceneviewercontextmenu.cpp scenesettingspopup.cpp scriptconsolepanel.cpp diff --git a/toonz/sources/toonz/filebrowser.cpp b/toonz/sources/toonz/filebrowser.cpp index f8131cf..02a19e0 100644 --- a/toonz/sources/toonz/filebrowser.cpp +++ b/toonz/sources/toonz/filebrowser.cpp @@ -2351,7 +2351,7 @@ calculateTask: //----------------------------------------------------------------------------- -inline void FrameCountReader::stopReading() { m_executor.cancelAll(); } +void FrameCountReader::stopReading() { m_executor.cancelAll(); } //============================================================================= // FrameCountTask methods @@ -2423,6 +2423,3 @@ void FrameCountTask::onCanceled(TThread::RunnableP thisTask) { OpenFloatingPanel openBrowserPane(MI_OpenFileBrowser, "Browser", QObject::tr("File Browser")); - -OpenFloatingPanel openPreproductionBoardPane(MI_OpenPreproductionBoard, "PreproductionBoard", - QObject::tr("Preproduction Board")); \ No newline at end of file diff --git a/toonz/sources/toonz/scenebrowser.cpp b/toonz/sources/toonz/scenebrowser.cpp index 6cea7fb..b2800aa 100644 --- a/toonz/sources/toonz/scenebrowser.cpp +++ b/toonz/sources/toonz/scenebrowser.cpp @@ -1,9 +1,10 @@ -#include "filebrowser.h" +#include "scenebrowser.h" // Tnz6 includes #include "dvdirtreeview.h" +#include "filebrowser.h" #include "filebrowsermodel.h" #include "fileselection.h" #include "filmstripselection.h" @@ -89,57 +90,15 @@ namespace ba = boost::adaptors; using namespace DVGui; -//============================================================================= -// Local declarations -//============================================================================= - -//============================ -// FrameCountTask class -//---------------------------- - -class FrameCountTask final : public TThread::Runnable { - bool m_started; - - TFilePath m_path; - QDateTime m_modifiedDate; - -public: - FrameCountTask(const TFilePath &path, const QDateTime &modifiedDate); - - ~FrameCountTask(); - - void run() override; - - QThread::Priority runningPriority() override; - -public slots: - - void onStarted(TThread::RunnableP thisTask) override; - void onCanceled(TThread::RunnableP thisTask) override; -}; - -//============================ -// FCData struct -//---------------------------- - -struct FCData { - QDateTime m_date; - int m_frameCount; - bool m_underProgress; - int m_retryCount; - - FCData() {} - FCData(const QDateTime &date); -}; //============================================================================= // Local namespace //============================================================================= namespace { -std::set activeBrowsers; -std::map frameCountMap; -QMutex frameCountMapMutex; +std::set activePreproductionBoards; +//std::map frameCountMap; +//QMutex frameCountMapMutex; QMutex levelFileMutex; } // namespace @@ -151,19 +110,19 @@ inline bool isMultipleFrameType(std::string type) { } //============================================================================= -// FileBrowser +// SceneBrowser //----------------------------------------------------------------------------- #if QT_VERSION >= 0x050500 -FileBrowser::FileBrowser(QWidget *parent, Qt::WindowFlags flags, +SceneBrowser::SceneBrowser(QWidget *parent, Qt::WindowFlags flags, bool noContextMenu, bool multiSelectionEnabled) #else -FileBrowser::FileBrowser(QWidget *parent, Qt::WFlags flags, bool noContextMenu, +SceneBrowser::SceneBrowser(QWidget *parent, Qt::WFlags flags, bool noContextMenu, bool multiSelectionEnabled) #endif : QFrame(parent), m_folderName(0), m_itemViewer(0) { // style sheet - setObjectName("FileBrowser"); + setObjectName("SceneBrowser"); setFrameStyle(QFrame::StyledPanel); m_mainSplitter = new QSplitter(this); @@ -191,7 +150,7 @@ FileBrowser::FileBrowser(QWidget *parent, Qt::WFlags flags, bool noContextMenu, new DVItemViewPlayDelegate(viewerPanel); viewerPanel->setItemViewPlayDelegate(itemViewPlayDelegate); - m_mainSplitter->setObjectName("FileBrowserSplitter"); + m_mainSplitter->setObjectName("SceneBrowserSplitter"); m_folderTreeView->setObjectName("DirTreeView"); box->setObjectName("castFrame"); box->setFrameStyle(QFrame::StyledPanel); @@ -294,12 +253,12 @@ FileBrowser::FileBrowser(QWidget *parent, Qt::WFlags flags, bool noContextMenu, //----------------------------------------------------------------------------- -FileBrowser::~FileBrowser() {} +SceneBrowser::~SceneBrowser() {} //----------------------------------------------------------------------------- /*! when the m_folderName is edited, move the current folder accordingly */ -void FileBrowser::onFolderEdited() { +void SceneBrowser::onFolderEdited() { TFilePath inputPath(m_folderName->text().toStdWString()); QModelIndex index = DvDirModel::instance()->getIndexByPath(inputPath); @@ -326,7 +285,7 @@ void FileBrowser::onFolderEdited() { //----------------------------------------------------------------------------- -void FileBrowser::storeFolderHistory() { +void SceneBrowser::storeFolderHistory() { QModelIndex currentModelIndex = m_folderTreeView->currentIndex(); if (!currentModelIndex.isValid()) return; @@ -357,14 +316,14 @@ void FileBrowser::storeFolderHistory() { //----------------------------------------------------------------------------- -void FileBrowser::refreshHistoryButtons() { +void SceneBrowser::refreshHistoryButtons() { emit historyChanged((m_currentPosition != 0), (m_currentPosition != m_indexHistoryList.size() - 1)); } //----------------------------------------------------------------------------- -void FileBrowser::onBackButtonPushed() { +void SceneBrowser::onBackButtonPushed() { if (m_currentPosition == 0) return; m_currentPosition--; QModelIndex currentIndex = m_indexHistoryList[m_currentPosition]; @@ -381,7 +340,7 @@ void FileBrowser::onBackButtonPushed() { //----------------------------------------------------------------------------- -void FileBrowser::onFwdButtonPushed() { +void SceneBrowser::onFwdButtonPushed() { if (m_currentPosition >= m_indexHistoryList.size() - 1) return; m_currentPosition++; QModelIndex currentIndex = m_indexHistoryList[m_currentPosition]; @@ -399,7 +358,7 @@ void FileBrowser::onFwdButtonPushed() { //----------------------------------------------------------------------------- /*! clear the history when the tree date is replaced */ -void FileBrowser::clearHistory() { +void SceneBrowser::clearHistory() { int size = m_indexHistoryList.size(); // leave the last item for (int i = 1; i < size; i++) m_indexHistoryList.removeLast(); @@ -410,7 +369,7 @@ void FileBrowser::clearHistory() { //----------------------------------------------------------------------------- /*! update the current folder when changes detected from QFileSystemWatcher */ -void FileBrowser::onFileSystemChanged(const QString &folderPath) { +void SceneBrowser::onFileSystemChanged(const QString &folderPath) { if (folderPath != m_folder.getQString()) return; // changes may create/delete of folder, so update the DvDirModel QModelIndex parentFolderIndex = m_folderTreeView->currentIndex(); @@ -421,9 +380,9 @@ void FileBrowser::onFileSystemChanged(const QString &folderPath) { //----------------------------------------------------------------------------- -void FileBrowser::sortByDataModel(DataType dataType, bool isDiscendent) { +void SceneBrowser::sortByDataModel(DataType dataType, bool isDiscendent) { struct locals { - static inline bool itemLess(int aIdx, int bIdx, FileBrowser &fb, + static inline bool itemLess(int aIdx, int bIdx, SceneBrowser &fb, DataType dataType) { return (fb.compareData(dataType, aIdx, bIdx) > 0); } @@ -512,23 +471,23 @@ void FileBrowser::sortByDataModel(DataType dataType, bool isDiscendent) { //----------------------------------------------------------------------------- -void FileBrowser::setFilterTypes(const QStringList &types) { m_filter = types; } +void SceneBrowser::setFilterTypes(const QStringList &types) { m_filter = types; } //----------------------------------------------------------------------------- -void FileBrowser::addFilterType(const QString &type) { +void SceneBrowser::addFilterType(const QString &type) { if (!m_filter.contains(type)) m_filter.push_back(type); } //----------------------------------------------------------------------------- -void FileBrowser::removeFilterType(const QString &type) { +void SceneBrowser::removeFilterType(const QString &type) { m_filter.removeAll(type); } //----------------------------------------------------------------------------- -void FileBrowser::refreshCurrentFolderItems() { +void SceneBrowser::refreshCurrentFolderItems() { m_items.clear(); // put the parent directory item @@ -612,17 +571,7 @@ void FileBrowser::refreshCurrentFolderItems() { for (it = all_files.begin(); it != all_files.end(); it++) { TFrameId tFrameId; - try { - tFrameId = it->getFrame(); - } catch (TMalformedFrameException tmfe) { - // Incorrect frame name sequence. Warning to the user in the message - // center. - DVGui::warning(QString::fromStdWString( - tmfe.getMessage() + L": " + - QObject::tr("Skipping frame.").toStdWString())); - continue; - } - + tFrameId = it->getFrame(); TFilePath levelName(it->getLevelName()); if (levelName.isLevelName()) { @@ -685,7 +634,7 @@ void FileBrowser::refreshCurrentFolderItems() { //----------------------------------------------------------------------------- -void FileBrowser::setFolder(const TFilePath &fp, bool expandNode, +void SceneBrowser::setFolder(const TFilePath &fp, bool expandNode, bool forceUpdate) { if (fp == m_folder && !forceUpdate) return; @@ -708,7 +657,7 @@ void FileBrowser::setFolder(const TFilePath &fp, bool expandNode, /*! process when inputting the folder which is not regitered in the folder tree (e.g. UNC path in Windows) */ -void FileBrowser::setUnregisteredFolder(const TFilePath &fp) { +void SceneBrowser::setUnregisteredFolder(const TFilePath &fp) { if (fp != TFilePath()) { TFileStatus fpStatus(fp); // if the item is link, then set the link target of it @@ -799,7 +748,7 @@ void FileBrowser::setUnregisteredFolder(const TFilePath &fp) { //----------------------------------------------------------------------------- -void FileBrowser::setHistoryDay(std::string dayDateString) { +void SceneBrowser::setHistoryDay(std::string dayDateString) { m_folder = TFilePath(); m_dayDateString = dayDateString; const History::Day *day = History::instance()->getDay(dayDateString); @@ -821,7 +770,7 @@ void FileBrowser::setHistoryDay(std::string dayDateString) { /*! for all items in the folder, retrieve the file names(m_name) from the * paths(m_path) */ -void FileBrowser::refreshData() { +void SceneBrowser::refreshData() { std::vector::iterator it; for (it = m_items.begin(); it != m_items.end(); ++it) { if (it->m_name == QString("")) @@ -831,11 +780,11 @@ void FileBrowser::refreshData() { //----------------------------------------------------------------------------- -int FileBrowser::getItemCount() const { return m_items.size(); } +int SceneBrowser::getItemCount() const { return m_items.size(); } //----------------------------------------------------------------------------- -void FileBrowser::readInfo(Item &item) { +void SceneBrowser::readInfo(Item &item) { TFilePath fp = item.m_path; QFileInfo info(toQString(fp)); if (info.exists()) { @@ -892,7 +841,7 @@ item.m_validInfo = true;*/ //! are //! calculated by using a dedicated thread and therefore cannot be simply //! classified as *valid* or *invalid* infos... -void FileBrowser::readFrameCount(Item &item) { +void SceneBrowser::readFrameCount(Item &item) { if (TFileType::isViewable(TFileType::getInfo(item.m_path))) { if (isMultipleFrameType(item.m_path.getType())) item.m_frameCount = m_frameCountReader.getFrameCount(item.m_path); @@ -904,7 +853,7 @@ void FileBrowser::readFrameCount(Item &item) { //----------------------------------------------------------------------------- -QVariant FileBrowser::getItemData(int index, DataType dataType, +QVariant SceneBrowser::getItemData(int index, DataType dataType, bool isSelected) { if (index < 0 || index >= (int)m_items.size()) return QVariant(); Item &item = m_items[index]; @@ -981,14 +930,14 @@ QVariant FileBrowser::getItemData(int index, DataType dataType, //----------------------------------------------------------------------------- -bool FileBrowser::isSceneItem(int index) const { +bool SceneBrowser::isSceneItem(int index) const { return 0 <= index && index < (int)m_items.size() && m_items[index].m_path.getType() == "tnz"; } //----------------------------------------------------------------------------- -bool FileBrowser::canRenameItem(int index) const { +bool SceneBrowser::canRenameItem(int index) const { // se sto guardando la history non posso rinominare nulla if (getFolder() == TFilePath()) return false; if (index < 0 || index >= (int)m_items.size()) return false; @@ -1000,7 +949,7 @@ bool FileBrowser::canRenameItem(int index) const { //----------------------------------------------------------------------------- -int FileBrowser::findIndexWithPath(TFilePath path) { +int SceneBrowser::findIndexWithPath(TFilePath path) { int i; for (i = 0; i < m_items.size(); i++) if (m_items[i].m_path == path) return i; @@ -1009,7 +958,7 @@ int FileBrowser::findIndexWithPath(TFilePath path) { //----------------------------------------------------------------------------- -void FileBrowser::renameItem(int index, const QString &newName) { +void SceneBrowser::renameItem(int index, const QString &newName) { if (getFolder() == TFilePath()) return; if (index < 0 || index >= (int)m_items.size()) return; @@ -1048,7 +997,7 @@ void FileBrowser::renameItem(int index, const QString &newName) { //----------------------------------------------------------------------------- -bool FileBrowser::renameFile(TFilePath &fp, QString newName) { +bool SceneBrowser::renameFile(TFilePath &fp, QString newName) { if (isSpaceString(newName)) return true; TFilePath newFp(newName.toStdWString()); @@ -1107,7 +1056,7 @@ TSystem::renameFile(newFolder, folder); //----------------------------------------------------------------------------- -QMenu *FileBrowser::getContextMenu(QWidget *parent, int index) { +QMenu *SceneBrowser::getContextMenu(QWidget *parent, int index) { auto isOldLevelType = [](TFilePath &path) -> bool { return path.getType() == "tzp" || path.getType() == "tzu"; }; @@ -1427,7 +1376,7 @@ QMenu *FileBrowser::getContextMenu(QWidget *parent, int index) { //----------------------------------------------------------------------------- -void FileBrowser::startDragDrop() { +void SceneBrowser::startDragDrop() { TRepetitionGuard guard; if (!guard.hasLock()) return; @@ -1460,19 +1409,20 @@ void FileBrowser::startDragDrop() { //----------------------------------------------------------------------------- -bool FileBrowser::dropMimeData(QTreeWidgetItem *parent, int index, +bool SceneBrowser::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action) { return false; } //----------------------------------------------------------------------------- -void FileBrowser::onTreeFolderChanged() { +void SceneBrowser::onTreeFolderChanged() { + // Commented by KD DvDirModelNode *node = m_folderTreeView->getCurrentNode(); - if (node) - node->visualizeContent(this); - else - setFolder(TFilePath()); + //if (node) + // node->visualizeContent(this); + //else + // setFolder(TFilePath()); m_itemViewer->resetVerticalScrollBar(); m_itemViewer->updateContentSize(); m_itemViewer->getPanel()->update(); @@ -1486,18 +1436,18 @@ void FileBrowser::onTreeFolderChanged() { //----------------------------------------------------------------------------- -void FileBrowser::changeFolder(const QModelIndex &index) {} +void SceneBrowser::changeFolder(const QModelIndex &index) {} //----------------------------------------------------------------------------- -void FileBrowser::onDataChanged(const QModelIndex &topLeft, +void SceneBrowser::onDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { onTreeFolderChanged(); } //----------------------------------------------------------------------------- -bool FileBrowser::acceptDrop(const QMimeData *data) const { +bool SceneBrowser::acceptDrop(const QMimeData *data) const { // se il browser non sta visualizzando un folder standard non posso accettare // nessun drop if (getFolder() == TFilePath()) return false; @@ -1513,7 +1463,7 @@ bool FileBrowser::acceptDrop(const QMimeData *data) const { //----------------------------------------------------------------------------- -bool FileBrowser::drop(const QMimeData *mimeData) { +bool SceneBrowser::drop(const QMimeData *mimeData) { // se il browser non sta visualizzando un folder standard non posso accettare // nessun drop TFilePath folderPath = getFolder(); @@ -1609,7 +1559,7 @@ bool FileBrowser::drop(const QMimeData *mimeData) { //----------------------------------------------------------------------------- -void FileBrowser::loadResources() { +void SceneBrowser::loadResources() { FileSelection *fs = dynamic_cast(m_itemViewer->getPanel()->getSelection()); if (!fs) return; @@ -1627,64 +1577,6 @@ void FileBrowser::loadResources() { //----------------------------------------------------------------------------- -void RenameAsToonzPopup::onOk() { - if (!isValidFileName(m_name->text())) { - DVGui::error( - tr("The file name cannot be empty or contain any of the following " - "characters:(new line) \\ / : * ? \" |")); - return; - } - if (isReservedFileName_message(m_name->text())) return; - accept(); -} - -RenameAsToonzPopup::RenameAsToonzPopup(const QString name, int frames) - : Dialog(TApp::instance()->getMainWindow(), true, true, "RenameAsToonz") { - setWindowTitle(QString(tr("Rename"))); - - beginHLayout(); - - QLabel *lbl; - if (frames == -1) - lbl = new QLabel(QString(tr("Renaming File ")) + name); - else - lbl = new QLabel( - QString(tr("Creating an animation level of %1 frames").arg(frames))); - lbl->setFixedHeight(20); - lbl->setObjectName("TitleTxtLabel"); - - m_name = new LineEdit(frames == -1 ? "" : name); - m_name->setFixedHeight(20); - // connect(m_name, SIGNAL(editingFinished()), SLOT(onNameChanged())); - // addWidget(tr("Level Name:"),m_name); - - m_overwrite = new QCheckBox(tr("Delete Original Files")); - m_overwrite->setFixedHeight(20); - // addWidget(m_overwrite, false); - - QFormLayout *formLayout = new QFormLayout; - - QHBoxLayout *labelLayout = new QHBoxLayout; - labelLayout->addStretch(); - labelLayout->addWidget(lbl); - labelLayout->addStretch(); - - formLayout->addRow(labelLayout); - formLayout->addRow(tr("Level Name:"), m_name); - formLayout->addRow(m_overwrite); - - addLayout(formLayout); - - endHLayout(); - - m_okBtn = new QPushButton(tr("Rename"), this); - m_okBtn->setDefault(true); - m_cancelBtn = new QPushButton(tr("Cancel"), this); - connect(m_okBtn, SIGNAL(clicked()), this, SLOT(onOk())); - connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); - addButtonBarWidget(m_okBtn, m_cancelBtn); -} - namespace { bool parsePathName(const QString &fullpath, QString &parentPath, QString &name, @@ -1862,7 +1754,7 @@ void doRenameAsToonzLevel(const QString &fullpath) { //------------------------------------------------------------------------------- -void FileBrowser::renameAsToonzLevel() { +void SceneBrowser::renameAsToonzLevel() { std::vector filePaths; FileSelection *fs = dynamic_cast(m_itemViewer->getPanel()->getSelection()); @@ -1879,7 +1771,7 @@ void FileBrowser::renameAsToonzLevel() { #ifdef LEVO -void FileBrowser::convertToUnpaintedTlv() { +void SceneBrowser::convertToUnpaintedTlv() { std::vector filePaths; FileSelection *fs = dynamic_cast(m_itemViewer->getPanel()->getSelection()); @@ -1953,7 +1845,7 @@ void FileBrowser::convertToUnpaintedTlv() { if (errorMessage != "") DVGui::error(QString::fromStdString(errorMessage)); QApplication::restoreOverrideCursor(); - FileBrowser::refreshFolder(filePaths[0].getParentDir()); + SceneBrowser::refreshFolder(filePaths[0].getParentDir()); return; } pb.setValue(++k); @@ -1969,12 +1861,12 @@ void FileBrowser::convertToUnpaintedTlv() { pb.hide(); DVGui::info(tr("Done: All Levels converted to TLV Format")); - FileBrowser::refreshFolder(filePaths[0].getParentDir()); + SceneBrowser::refreshFolder(filePaths[0].getParentDir()); } //----------------------------------------------------------------------------- -void FileBrowser::convertToPaintedTlv() { +void SceneBrowser::convertToPaintedTlv() { std::vector filePaths; FileSelection *fs = dynamic_cast(m_itemViewer->getPanel()->getSelection()); @@ -2032,7 +1924,7 @@ void FileBrowser::convertToPaintedTlv() { if (errorMessage != "") DVGui::error(QString::fromStdString(errorMessage)); QApplication::restoreOverrideCursor(); - FileBrowser::refreshFolder(filePaths[0].getParentDir()); + SceneBrowser::refreshFolder(filePaths[0].getParentDir()); return; } @@ -2048,13 +1940,13 @@ void FileBrowser::convertToPaintedTlv() { DVGui::info(tr("Done: 2 Levels converted to TLV Format")); fs->selectNone(); - FileBrowser::refreshFolder(filePaths[0].getParentDir()); + SceneBrowser::refreshFolder(filePaths[0].getParentDir()); } #endif //----------------------------------------------------------------------------- -void FileBrowser::onSelectedItems(const std::set &indexes) { +void SceneBrowser::onSelectedItems(const std::set &indexes) { std::set filePaths; std::set::const_iterator it; @@ -2078,7 +1970,7 @@ void FileBrowser::onSelectedItems(const std::set &indexes) { //----------------------------------------------------------------------------- -void FileBrowser::onClickedItem(int index) { +void SceneBrowser::onClickedItem(int index) { if (0 <= index && index < (int)m_items.size()) { // if the folder is clicked, then move the current folder TFilePath fp = m_items[index].m_path; @@ -2093,7 +1985,7 @@ void FileBrowser::onClickedItem(int index) { //----------------------------------------------------------------------------- -void FileBrowser::onDoubleClickedItem(int index) { +void SceneBrowser::onDoubleClickedItem(int index) { // TODO: Avoid duplicate code with onClickedItem(). if (0 <= index && index < (int)m_items.size()) { // if the folder is clicked, then move the current folder @@ -2109,10 +2001,10 @@ void FileBrowser::onDoubleClickedItem(int index) { //----------------------------------------------------------------------------- -void FileBrowser::refreshFolder(const TFilePath &folderPath) { - std::set::iterator it; - for (it = activeBrowsers.begin(); it != activeBrowsers.end(); ++it) { - FileBrowser *browser = *it; +void SceneBrowser::refreshFolder(const TFilePath &folderPath) { + std::set::iterator it; + for (it = activePreproductionBoards.begin(); it != activePreproductionBoards.end(); ++it) { + SceneBrowser *browser = *it; DvDirModel::instance()->refreshFolder(folderPath); if (browser->getFolder() == folderPath) { browser->setFolder(folderPath, false, true); @@ -2122,17 +2014,17 @@ void FileBrowser::refreshFolder(const TFilePath &folderPath) { //----------------------------------------------------------------------------- -void FileBrowser::updateItemViewerPanel() { - std::set::iterator it; - for (it = activeBrowsers.begin(); it != activeBrowsers.end(); ++it) { - FileBrowser *browser = *it; +void SceneBrowser::updateItemViewerPanel() { + std::set::iterator it; + for (it = activePreproductionBoards.begin(); it != activePreproductionBoards.end(); ++it) { + SceneBrowser *browser = *it; browser->m_itemViewer->getPanel()->update(); } } //----------------------------------------------------------------------------- -void FileBrowser::getExpandedFolders(DvDirModelNode *node, +void SceneBrowser::getExpandedFolders(DvDirModelNode *node, QList &expandedNodes) { if (!node) return; QModelIndex newIndex = DvDirModel::instance()->getIndexByNode(node); @@ -2146,7 +2038,7 @@ void FileBrowser::getExpandedFolders(DvDirModelNode *node, //----------------------------------------------------------------------------- -void FileBrowser::refresh() { +void SceneBrowser::refresh() { TFilePath originalFolder( m_folder); // setFolder is invoked by Qt throughout the following... @@ -2180,7 +2072,7 @@ void FileBrowser::refresh() { //----------------------------------------------------------------------------- -void FileBrowser::folderUp() { +void SceneBrowser::folderUp() { QModelIndex index = m_folderTreeView->currentIndex(); if (!index.isValid() || !index.parent().isValid()) { // cannot go up tree view, so try going to parent directory @@ -2196,7 +2088,7 @@ void FileBrowser::folderUp() { //----------------------------------------------------------------------------- -void FileBrowser::newFolder() { +void SceneBrowser::newFolder() { TFilePath parentFolder = getFolder(); if (parentFolder == TFilePath() || !TFileStatus(parentFolder).isDirectory()) return; @@ -2234,8 +2126,8 @@ void FileBrowser::newFolder() { //----------------------------------------------------------------------------- -void FileBrowser::showEvent(QShowEvent *) { - activeBrowsers.insert(this); +void SceneBrowser::showEvent(QShowEvent *) { + activePreproductionBoards.insert(this); // refresh if (getFolder() != TFilePath()) setFolder(getFolder(), false, true); @@ -2251,29 +2143,29 @@ void FileBrowser::showEvent(QShowEvent *) { //----------------------------------------------------------------------------- -void FileBrowser::hideEvent(QHideEvent *) { - activeBrowsers.erase(this); +void SceneBrowser::hideEvent(QHideEvent *) { + activePreproductionBoards.erase(this); m_itemViewer->getPanel()->getItemViewPlayDelegate()->resetPlayWidget(); } //----------------------------------------------------------------------------- -void FileBrowser::makeCurrentProjectVisible() {} +void SceneBrowser::makeCurrentProjectVisible() {} //----------------------------------------------------------------------------- -void FileBrowser::enableGlobalSelection(bool enabled) { +void SceneBrowser::enableGlobalSelection(bool enabled) { m_folderTreeView->enableGlobalSelection(enabled); m_itemViewer->enableGlobalSelection(enabled); } //----------------------------------------------------------------------------- -void FileBrowser::selectNone() { m_itemViewer->selectNone(); } +void SceneBrowser::selectNone() { m_itemViewer->selectNone(); } //----------------------------------------------------------------------------- -void FileBrowser::enableDoubleClickToOpenScenes() { +void SceneBrowser::enableDoubleClickToOpenScenes() { // perhaps this should disconnect existing signal handlers first connect(this, SIGNAL(filePathDoubleClicked(const TFilePath &)), this, SLOT(tryToOpenScene(const TFilePath &))); @@ -2281,148 +2173,13 @@ void FileBrowser::enableDoubleClickToOpenScenes() { //----------------------------------------------------------------------------- -void FileBrowser::tryToOpenScene(const TFilePath &filePath) { +void SceneBrowser::tryToOpenScene(const TFilePath &filePath) { if (filePath.getType() == "tnz") { IoCmd::loadScene(filePath); } } //============================================================================= -// FCData methods -//----------------------------------------------------------------------------- - -FCData::FCData(const QDateTime &date) - : m_date(date), m_frameCount(0), m_underProgress(true), m_retryCount(1) {} - -//============================================================================= -// FrameCountReader methods -//----------------------------------------------------------------------------- - -FrameCountReader::FrameCountReader() : m_executor() { - m_executor.setMaxActiveTasks(2); -} - -//----------------------------------------------------------------------------- - -FrameCountReader::~FrameCountReader() {} - -//----------------------------------------------------------------------------- - -int FrameCountReader::getFrameCount(const TFilePath &fp) { - QDateTime modifiedDate = - QFileInfo(QString::fromStdWString(fp.getWideString())).lastModified(); - std::map::iterator it; - - { - // Access the static map to find an occurrence of the path. - QMutexLocker locker(&frameCountMapMutex); - it = frameCountMap.find(fp); - - if (it != frameCountMap.end()) { - if (it->second.m_frameCount > 0 && it->second.m_date == modifiedDate) { - // Found an unmodified occurrence with correctly calculated frame count - return it->second.m_frameCount; - } - } else { - // First time this frame count is calculated - initialize FC data - frameCountMap[fp] = FCData(modifiedDate); - goto calculateTask; - } - - if ((modifiedDate == it->second.m_date) && - (it->second.m_underProgress || it->second.m_retryCount < 0)) - return -1; - } - -calculateTask: - - // Now, we have to calculate the frame count; first, create a frame count - // calculation task and submit it. - FrameCountTask *task = new FrameCountTask(fp, modifiedDate); - connect(task, SIGNAL(finished(TThread::RunnableP)), this, - SIGNAL(calculatedFrameCount())); - connect(task, SIGNAL(exception(TThread::RunnableP)), this, - SIGNAL(calculatedFrameCount())); - - m_executor.addTask(task); - - return -1; // FrameCount has not yet been calculated -} - -//----------------------------------------------------------------------------- - -inline void FrameCountReader::stopReading() { m_executor.cancelAll(); } - -//============================================================================= -// FrameCountTask methods -//----------------------------------------------------------------------------- - -FrameCountTask::FrameCountTask(const TFilePath &path, - const QDateTime &modifiedDate) - : m_path(path), m_modifiedDate(modifiedDate), m_started(false) { - connect(this, SIGNAL(started(TThread::RunnableP)), this, - SLOT(onStarted(TThread::RunnableP))); - connect(this, SIGNAL(canceled(TThread::RunnableP)), this, - SLOT(onCanceled(TThread::RunnableP))); -} - -//----------------------------------------------------------------------------- - -FrameCountTask::~FrameCountTask() {} - -//----------------------------------------------------------------------------- - -void FrameCountTask::run() { - TLevelReaderP lr(m_path); - int frameCount = lr->loadInfo()->getFrameCount(); - - QMutexLocker fCMapMutex(&frameCountMapMutex); - - std::map::iterator it = frameCountMap.find(m_path); - - if (it == frameCountMap.end()) return; - - // Memorize the found frameCount into the frameCountMap - if (frameCount > 0) { - it->second.m_frameCount = frameCount; - it->second.m_date = m_modifiedDate; - } else { - // Seems that tlv reads sometimes may fail, returning invalid frame counts - // (typically 0). - // However, if no exception was thrown, we try to recover it - it->second.m_underProgress = false; - it->second.m_retryCount--; - } -} - -//----------------------------------------------------------------------------- - -QThread::Priority FrameCountTask::runningPriority() { - return QThread::LowPriority; -} - -//----------------------------------------------------------------------------- - -// NOTE: onStarted and onCanceled are invoked on the same thread - so m_started -// operations are serialized, it can be non-thread-guarded. -void FrameCountTask::onStarted(TThread::RunnableP thisTask) { - m_started = true; -} - -//----------------------------------------------------------------------------- - -void FrameCountTask::onCanceled(TThread::RunnableP thisTask) { - if (!m_started) { - QMutexLocker fCMapMutex(&frameCountMapMutex); - - frameCountMap.erase(m_path); - } -} - -//============================================================================= - -OpenFloatingPanel openBrowserPane(MI_OpenFileBrowser, "Browser", - QObject::tr("File Browser")); OpenFloatingPanel openPreproductionBoardPane(MI_OpenPreproductionBoard, "PreproductionBoard", QObject::tr("Preproduction Board")); \ No newline at end of file diff --git a/toonz/sources/toonz/scenebrowser.h b/toonz/sources/toonz/scenebrowser.h index bace081..273eec3 100644 --- a/toonz/sources/toonz/scenebrowser.h +++ b/toonz/sources/toonz/scenebrowser.h @@ -1,7 +1,7 @@ #pragma once -#ifndef FILEBROWSER_INCLUDED -#define FILEBROWSER_INCLUDED +#ifndef SCENEBROWSER_INCLUDED +#define SCENEBROWSER_INCLUDED #include #include @@ -14,6 +14,7 @@ #include "tfilepath.h" #include "toonzqt/dvdialog.h" #include "versioncontrol.h" +#include "filebrowser.h" #include "tthread.h" @@ -26,48 +27,18 @@ class QFileSystemWatcher; //----------------------------------------------------------------------------- -//! FrameCountReader is the class responsible for calculation of levels' frame -//! counts -//! in the file browser. Since on many file formats this requires to open the -//! level file -//! and scan each frame (MOV-like), and on some machine configurations such a -//! task -//! can be time consuming, we dedicate a separate thread for it - just like the -//! icon -//! generator does. Calculated frame counts are also stored for quick lookup -//! once they -//! have been calculated the first time. -class FrameCountReader final : public QObject { - Q_OBJECT - - TThread::Executor m_executor; - -public: - FrameCountReader(); - ~FrameCountReader(); - - int getFrameCount(const TFilePath &path); - void stopReading(); - -signals: - - void calculatedFrameCount(); -}; - -//----------------------------------------------------------------------------- - -class FileBrowser final : public QFrame, public DvItemListModel { +class SceneBrowser final : public QFrame, public DvItemListModel { Q_OBJECT public: #if QT_VERSION >= 0x050500 - FileBrowser(QWidget *parent, Qt::WindowFlags flags = 0, + SceneBrowser(QWidget *parent, Qt::WindowFlags flags = 0, bool noContextMenu = false, bool multiSelectionEnabled = false); #else - FileBrowser(QWidget *parent, Qt::WFlags flags = 0, bool noContextMenu = false, + SceneBrowser(QWidget *parent, Qt::WFlags flags = 0, bool noContextMenu = false, bool multiSelectionEnabled = false); #endif - ~FileBrowser(); + ~SceneBrowser(); void sortByDataModel(DataType dataType, bool isDiscendent) override; void refreshData() override; @@ -271,30 +242,7 @@ private: void refreshCurrentFolderItems(); DvItemListModel::Status getItemVersionControlStatus( - const FileBrowser::Item &item); -}; - -//-------------------------------------------------------------------- -class RenameAsToonzPopup final : public DVGui::Dialog { - Q_OBJECT - QPushButton *m_okBtn, *m_cancelBtn; - DVGui::LineEdit *m_name; - QCheckBox *m_overwrite; - -public: - RenameAsToonzPopup(const QString name = "", int frames = -1); - - bool doOverwrite() { return m_overwrite->isChecked(); } - QString getName() { return m_name->text(); } - -private: - // TPropertyGroup* getFormatProperties(const std::string &ext); - -public slots: - //! Starts the convertion. - // void onConvert(); - // void onOptionsClicked(); - void onOk(); + const SceneBrowser::Item &item); }; //----------------------------------------------------------- diff --git a/toonz/sources/toonz/tpanels.cpp b/toonz/sources/toonz/tpanels.cpp index e1c1fd3..1dce243 100644 --- a/toonz/sources/toonz/tpanels.cpp +++ b/toonz/sources/toonz/tpanels.cpp @@ -18,6 +18,7 @@ #include "flipbook.h" #include "castviewer.h" #include "filebrowser.h" +#include "scenebrowser.h" #include "filmstrip.h" #include "previewfxmanager.h" #include "comboviewerpane.h" @@ -1214,7 +1215,7 @@ class PreproductionBoardFactory final : public TPanelFactory { public: PreproductionBoardFactory() : TPanelFactory("PreproductionBoard") {} void initialize(TPanel *panel) override { - FileBrowser *browser = new FileBrowser(panel, 0, false, true); + SceneBrowser *browser = new SceneBrowser(panel, 0, false, true); panel->setWidget(browser); panel->setWindowTitle(QObject::tr("Preproduction Board")); TFilePath scenesFolder =