#morevna #board Create copy of FileBrowser class as SceneBrowser class

This commit is contained in:
Konstantin Dmitriev 2020-07-26 16:44:05 +07:00 committed by manongjohn
parent a6d50b5c57
commit 7e6bef804d
5 changed files with 99 additions and 393 deletions

View file

@ -79,6 +79,7 @@ set(MOC_HEADERS
reslist.h
ruler.h
savepresetpopup.h
scenebrowser.h
scenesettingspopup.h
sceneviewer.h
sceneviewercontextmenu.h
@ -271,6 +272,8 @@ set(SOURCES
renumberpopup.cpp
runscriptcommand.cpp
savepresetpopup.cpp
scenebrowser.cpp
scenebrowserversioncontrol.cpp
sceneviewercontextmenu.cpp
scenesettingspopup.cpp
scriptconsolepanel.cpp

View file

@ -2347,7 +2347,7 @@ calculateTask:
//-----------------------------------------------------------------------------
inline void FrameCountReader::stopReading() { m_executor.cancelAll(); }
void FrameCountReader::stopReading() { m_executor.cancelAll(); }
//=============================================================================
// FrameCountTask methods
@ -2418,7 +2418,4 @@ void FrameCountTask::onCanceled(TThread::RunnableP thisTask) {
//=============================================================================
OpenFloatingPanel openBrowserPane(MI_OpenFileBrowser, "Browser",
QObject::tr("File Browser"));
OpenFloatingPanel openPreproductionBoardPane(MI_OpenPreproductionBoard, "PreproductionBoard",
QObject::tr("Preproduction Board"));
QObject::tr("File Browser"));

View file

@ -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<FileBrowser *> activeBrowsers;
std::map<TFilePath, FCData> frameCountMap;
QMutex frameCountMapMutex;
std::set<SceneBrowser *> activePreproductionBoards;
//std::map<TFilePath, FCData> 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<Item>::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<FileSelection *>(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<TFilePath> filePaths;
FileSelection *fs =
dynamic_cast<FileSelection *>(m_itemViewer->getPanel()->getSelection());
@ -1874,12 +1766,12 @@ void FileBrowser::renameAsToonzLevel() {
QApplication::restoreOverrideCursor();
FileBrowser::refreshFolder(filePaths[0].getParentDir());
SceneBrowser::refreshFolder(filePaths[0].getParentDir());
}
#ifdef LEVO
void FileBrowser::convertToUnpaintedTlv() {
void SceneBrowser::convertToUnpaintedTlv() {
std::vector<TFilePath> filePaths;
FileSelection *fs =
dynamic_cast<FileSelection *>(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<TFilePath> filePaths;
FileSelection *fs =
dynamic_cast<FileSelection *>(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<int> &indexes) {
void SceneBrowser::onSelectedItems(const std::set<int> &indexes) {
std::set<TFilePath> filePaths;
std::set<int>::const_iterator it;
@ -2078,7 +1970,7 @@ void FileBrowser::onSelectedItems(const std::set<int> &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<FileBrowser *>::iterator it;
for (it = activeBrowsers.begin(); it != activeBrowsers.end(); ++it) {
FileBrowser *browser = *it;
void SceneBrowser::refreshFolder(const TFilePath &folderPath) {
std::set<SceneBrowser *>::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<FileBrowser *>::iterator it;
for (it = activeBrowsers.begin(); it != activeBrowsers.end(); ++it) {
FileBrowser *browser = *it;
void SceneBrowser::updateItemViewerPanel() {
std::set<SceneBrowser *>::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<DvDirModelNode *> &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<TFilePath, FCData>::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<TFilePath, FCData>::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"));

View file

@ -1,7 +1,7 @@
#pragma once
#ifndef FILEBROWSER_INCLUDED
#define FILEBROWSER_INCLUDED
#ifndef SCENEBROWSER_INCLUDED
#define SCENEBROWSER_INCLUDED
#include <QFrame>
#include <QTreeWidget>
@ -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);
};
//-----------------------------------------------------------

View file

@ -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"
@ -1242,7 +1243,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 =