Merge pull request #998 from manongjohn/add_default_projects_folder_to_browser

Add Default Projects Folder to Browser
This commit is contained in:
manongjohn 2022-06-20 18:06:56 -04:00 committed by GitHub
commit e3773003f4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 164 additions and 5 deletions

View file

@ -126,6 +126,13 @@ void DvDirModelNode::addChild(DvDirModelNode *child) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void DvDirModelNode::insertChild(int row, DvDirModelNode *child) {
child->setRow(row);
m_children.insert(m_children.begin() + row, child);
}
//-----------------------------------------------------------------------------
int DvDirModelNode::getChildCount() { int DvDirModelNode::getChildCount() {
if (!m_childrenValid) refreshChildren(); if (!m_childrenValid) refreshChildren();
return (int)m_children.size(); return (int)m_children.size();
@ -1108,6 +1115,45 @@ void DvDirModelRootNode::add(std::wstring name, const TFilePath &path) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void DvDirModelRootNode::refreshDefaultProjectPath() {
// Windows has 1 more entry (Network) than macOS/Linux
#ifdef WIN32
int row = 8;
#else
int row = 7;
#endif
if (m_projectDirNodes.size() > 0) {
removeChildren(row, m_projectDirNodes.size());
m_projectDirNodes.clear();
}
QString defaultProjectPaths =
Preferences::instance()->getDefaultProjectPath();
if (!defaultProjectPaths.isEmpty()) {
QStringList projectRoots =
defaultProjectPaths.split(";", QString::SkipEmptyParts);
int folderCount = 0;
for (int i = 0; i < projectRoots.size(); i++) {
TFilePath projectRootDir(projectRoots.at(i));
if (!TFileStatus(projectRootDir).isDirectory()) continue;
std::wstring folderName = L"Projects";
if (projectRoots.size() > 1)
folderName +=
L" (" + projectRootDir.withoutParentDir().getWideString() + L")";
DvDirModelSpecialFileFolderNode *projectFolderNode =
new DvDirModelSpecialFileFolderNode(this, folderName, projectRootDir);
projectFolderNode->setPixmap(recolorPixmap(
svgToPixmap(getIconThemePath("actions/16/projects_folder.svg"))));
m_projectDirNodes.push_back(projectFolderNode);
insertChild(row + folderCount, projectFolderNode);
folderCount++;
}
}
}
//-----------------------------------------------------------------------------
void DvDirModelRootNode::refreshChildren() { void DvDirModelRootNode::refreshChildren() {
m_childrenValid = true; m_childrenValid = true;
if (m_children.empty()) { if (m_children.empty()) {
@ -1156,6 +1202,28 @@ void DvDirModelRootNode::refreshChildren() {
addChild(new DvDirModelHistoryNode(this)); addChild(new DvDirModelHistoryNode(this));
QString defaultProjectPaths =
Preferences::instance()->getDefaultProjectPath();
if (!defaultProjectPaths.isEmpty()) {
QStringList projectRoots =
defaultProjectPaths.split(";", QString::SkipEmptyParts);
for (int i = 0; i < projectRoots.size(); i++) {
TFilePath projectRootDir(projectRoots.at(i));
if (!TFileStatus(projectRootDir).isDirectory()) continue;
std::wstring folderName = L"Projects";
if (projectRoots.size() > 1)
folderName +=
L" (" + projectRootDir.withoutParentDir().getWideString() + L")";
DvDirModelSpecialFileFolderNode *projectFolderNode =
new DvDirModelSpecialFileFolderNode(this, folderName,
projectRootDir);
projectFolderNode->setPixmap(recolorPixmap(
svgToPixmap(getIconThemePath("actions/16/projects_folder.svg"))));
m_projectDirNodes.push_back(projectFolderNode);
addChild(projectFolderNode);
}
}
TProjectManager *pm = TProjectManager::instance(); TProjectManager *pm = TProjectManager::instance();
TFilePath sandboxProjectPath = pm->getSandboxProjectFolder(); TFilePath sandboxProjectPath = pm->getSandboxProjectFolder();
m_projectPaths.insert(sandboxProjectPath); m_projectPaths.insert(sandboxProjectPath);
@ -1289,6 +1357,12 @@ DvDirModelNode *DvDirModelRootNode::getNodeByPath(const TFilePath &path) {
if (node) return node; if (node) return node;
} }
// check for the project root folders
for (DvDirModelSpecialFileFolderNode *projectDirNode : m_projectDirNodes) {
DvDirModelNode *node = projectDirNode->getNodeByPath(path);
if (node) return node;
}
// it could be a regular folder, somewhere in the file system // it could be a regular folder, somewhere in the file system
if (m_myComputerNode) { if (m_myComputerNode) {
for (i = 0; i < m_myComputerNode->getChildCount(); i++) { for (i = 0; i < m_myComputerNode->getChildCount(); i++) {
@ -1593,12 +1667,15 @@ void DvDirModel::onSceneSwitched() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void DvDirModel::onPreferenceChanged(const QString &prefName) { void DvDirModel::onPreferenceChanged(const QString &prefName) {
if (prefName != "PathAliasPriority") return;
Preferences::PathAliasPriority priority =
Preferences::instance()->getPathAliasPriority();
DvDirModelRootNode *rootNode = dynamic_cast<DvDirModelRootNode *>(m_root); DvDirModelRootNode *rootNode = dynamic_cast<DvDirModelRootNode *>(m_root);
if (rootNode) if (!rootNode) return;
if (prefName == "PathAliasPriority") {
Preferences::PathAliasPriority priority =
Preferences::instance()->getPathAliasPriority();
rootNode->updateSceneFolderNodeVisibility(priority == rootNode->updateSceneFolderNodeVisibility(priority ==
Preferences::ProjectFolderOnly); Preferences::ProjectFolderOnly);
} else if (prefName == "DefaultProjectPath") {
rootNode->refreshDefaultProjectPath();
emit layoutChanged();
}
} }

View file

@ -44,6 +44,7 @@ public:
void removeChildren(int row, int count); void removeChildren(int row, int count);
void addChild(DvDirModelNode *child); void addChild(DvDirModelNode *child);
void insertChild(int row, DvDirModelNode *child);
virtual void visualizeContent(FileBrowser *browser) {} // ????????????? virtual void visualizeContent(FileBrowser *browser) {} // ?????????????
virtual QPixmap getPixmap(bool isOpen) const; virtual QPixmap getPixmap(bool isOpen) const;
@ -324,11 +325,13 @@ class DvDirModelRootNode final : public DvDirModelNode {
std::set<TFilePath> m_projectPaths; std::set<TFilePath> m_projectPaths;
DvDirModelSceneFolderNode *m_sceneFolderNode; DvDirModelSceneFolderNode *m_sceneFolderNode;
std::vector<DvDirModelSpecialFileFolderNode *> m_specialNodes; std::vector<DvDirModelSpecialFileFolderNode *> m_specialNodes;
std::vector<DvDirModelSpecialFileFolderNode *> m_projectDirNodes;
void add(std::wstring name, const TFilePath &path); void add(std::wstring name, const TFilePath &path);
public: public:
DvDirModelRootNode(); DvDirModelRootNode();
void refreshDefaultProjectPath();
void refreshChildren() override; void refreshChildren() override;
int getProjectPathsSize() { return m_projectPaths.size(); } int getProjectPathsSize() { return m_projectPaths.size(); }

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16px"
height="16px"
version="1.1"
xml:space="preserve"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
id="svg10"
sodipodi:docname="projects_folder.svg"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata
id="metadata16"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs14" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1141"
id="namedview12"
showgrid="true"
inkscape:zoom="45.6875"
inkscape:cx="8"
inkscape:cy="9.4555404"
inkscape:window-x="-7"
inkscape:window-y="-7"
inkscape:window-maximized="1"
inkscape:current-layer="svg10"
inkscape:pagecheckerboard="0"><inkscape:grid
type="xygrid"
id="grid823" /></sodipodi:namedview>
<path
style="color:#000000;clip-rule:nonzero;fill:#000000;fill-opacity:0.8;fill-rule:nonzero;stroke-linejoin:miter;-inkscape-stroke:none"
d="M 3,9.5 A 0.50005,0.50005 0 0 0 2.5,10 v 1 A 0.50005,0.50005 0 0 0 3,11.5 H 4 A 0.50005,0.50005 0 0 0 4.5,11 V 10 A 0.50005,0.50005 0 0 0 4,9.5 Z"
id="path3773" /><path
style="color:#000000;clip-rule:nonzero;fill:#000000;fill-opacity:0.8;fill-rule:nonzero;stroke-linejoin:miter;-inkscape-stroke:none"
d="M 3,5.5 A 0.50005,0.50005 0 0 0 2.5,6 V 7 A 0.50005,0.50005 0 0 0 3,7.5 H 4 A 0.50005,0.50005 0 0 0 4.5,7 V 6 A 0.50005,0.50005 0 0 0 4,5.5 Z"
id="path3668" /><g
id="rect1031"><path
style="color:#000000;clip-rule:nonzero;fill:#ffffff;fill-opacity:0;fill-rule:nonzero;stroke-linejoin:miter;-inkscape-stroke:none"
d="M 1,2 V 4 14 H 15 V 4 H 7 L 5,2 Z"
id="path2560" /><path
style="color:#000000;clip-rule:nonzero;fill:#000000;fill-opacity:0.8;fill-rule:nonzero;stroke-linejoin:miter;-inkscape-stroke:none"
d="M 1,1.5 C 0.72386906,1.5000276 0.50002761,1.7238691 0.5,2 v 2 10 c 2.761e-5,0.276131 0.22386906,0.499972 0.5,0.5 h 14 c 0.276131,-2.8e-5 0.499972,-0.223869 0.5,-0.5 V 4 C 15.499972,3.7238691 15.276131,3.5000276 15,3.5 H 7.2070312 L 5.3535156,1.6464844 C 5.2597597,1.5527163 5.1325995,1.5000255 5,1.5 Z m 6,3 h 7.5 v 9 h -13 v -9 c 1.6556381,-0.080228 4.4346962,0.026255 5.5,0 z"
id="path2562"
sodipodi:nodetypes="ccccccccccccccccccc" /></g><path
style="color:#000000;clip-rule:nonzero;fill:#000000;fill-opacity:0.8;fill-rule:nonzero;stroke-linejoin:miter;-inkscape-stroke:none"
d="M 13,5.5 A 0.50005,0.50005 0 0 1 13.5,6 V 7 A 0.50005,0.50005 0 0 1 13,7.5 H 6 A 0.50005,0.50005 0 0 1 5.5,7 V 6 A 0.50005,0.50005 0 0 1 6,5.5 Z"
id="path3785" /><path
style="color:#000000;clip-rule:nonzero;fill:#000000;fill-opacity:0.8;fill-rule:nonzero;stroke-linejoin:miter;-inkscape-stroke:none"
d="M 6,9.5 C 5.7238691,9.5000276 5.5000276,9.7238691 5.5,10 v 1 c 2.76e-5,0.276131 0.2238691,0.499972 0.5,0.5 h 7 c 0.276131,-2.8e-5 0.499972,-0.223869 0.5,-0.5 V 10 C 13.499972,9.7238691 13.276131,9.5000276 13,9.5 Z"
id="path3779"
sodipodi:nodetypes="ccccccccc" /></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -443,6 +443,14 @@ QList<ComboBoxItem> PreferencesPopup::buildFontStyleList() const {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void PreferencesPopup::onDefaultProjectPathChanged() {
// emit signal to update behavior of the File browser
TApp::instance()->getCurrentScene()->notifyPreferenceChanged(
"DefaultProjectPath");
}
//-----------------------------------------------------------------------------
void PreferencesPopup::onAutoSaveChanged() { void PreferencesPopup::onAutoSaveChanged() {
bool on = getUI<QGroupBox*>(autosaveEnabled)->isChecked(); bool on = getUI<QGroupBox*>(autosaveEnabled)->isChecked();
if (!on) return; if (!on) return;
@ -1605,6 +1613,8 @@ QWidget* PreferencesPopup::createGeneralPage() {
pathAliasPriorityCB->setItemData(1, scenefolderTooltip, Qt::ToolTipRole); pathAliasPriorityCB->setItemData(1, scenefolderTooltip, Qt::ToolTipRole);
pathAliasPriorityCB->setItemData(2, QString(" "), Qt::ToolTipRole); pathAliasPriorityCB->setItemData(2, QString(" "), Qt::ToolTipRole);
m_onEditedFuncMap.insert(defaultProjectPath,
&PreferencesPopup::onDefaultProjectPathChanged);
m_onEditedFuncMap.insert(autosaveEnabled, m_onEditedFuncMap.insert(autosaveEnabled,
&PreferencesPopup::onAutoSaveChanged); &PreferencesPopup::onAutoSaveChanged);
m_onEditedFuncMap.insert(autosaveSceneEnabled, m_onEditedFuncMap.insert(autosaveSceneEnabled,

View file

@ -135,6 +135,7 @@ private:
//--- callbacks --- //--- callbacks ---
// General // General
void onDefaultProjectPathChanged();
void onAutoSaveChanged(); void onAutoSaveChanged();
void onAutoSaveOptionsChanged(); void onAutoSaveOptionsChanged();
void onWatchFileSystemClicked(); void onWatchFileSystemClicked();

View file

@ -138,6 +138,7 @@
<file>icons/dark/actions/16/fb_down.svg</file> <file>icons/dark/actions/16/fb_down.svg</file>
<file>icons/dark/actions/16/viewlist.svg</file> <file>icons/dark/actions/16/viewlist.svg</file>
<file>icons/dark/actions/16/viewicon.svg</file> <file>icons/dark/actions/16/viewicon.svg</file>
<file>icons/dark/actions/16/projects_folder.svg</file>
<file>icons/dark/actions/16/favorites.svg</file> <file>icons/dark/actions/16/favorites.svg</file>
<file>icons/dark/actions/18/folder_project_root.svg</file> <file>icons/dark/actions/18/folder_project_root.svg</file>