Example #1
0
/****************************************************************************
**
** Copyright (C) 2016 - 2017
**
** This file is generated by the Magus toolkit
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
****************************************************************************/

// Include
#include "material_browser.h"
#include "material_tree.h"

//****************************************************************************/
MaterialTreeDockWidget::MaterialTreeDockWidget(const QString& iconDir, const QString& title, QMainWindow* parent, Qt::WindowFlags flags) :
    QDockWidget (title, parent, flags),
    mParent(parent)
{
    mIconDir = iconDir;
    mEmptyString = "";
    mResourceTreeWidget = new Magus::QtResourceTreeWidget(iconDir);
    mResourceTreeWidget->mActionDuplicateAssetText = QString("Clone material");
    mResourceTreeWidget->mActionDeleteResourceText = QString("Remove from list");
    mResourceTreeWidget->setAddAssetAfterDuplicateAssetSelected(false); // Do not duplicate automatically
    mResourceTreeWidget->setCreateTopLevelGroupContextMenuItemEnabled(false);
    mResourceTreeWidget->setDeleteTopLevelGroupEnabled(false);
    mResourceTreeWidget->setTopLevelGroupItemEditable(false);
    mResourceTreeWidget->setSubLevelGroupItemEditable(true);
    mResourceTreeWidget->setCreateAssetContextMenuItemEnabled(false);
    mResourceTreeWidget->setAssetItemEditable(false);
    mResourceTreeWidget->setDeleteResourceContextMenuItemEnabled(true);
    mResourceTreeWidget->setImportAssetContextMenuItemEnabled(false);
    mResourceTreeWidget->setDuplicateAssetContextMenuItemEnabled(true);

    // Miscellanious settings
    mResourceTreeWidget->addCustomContextMenuItem(ACTION_EDIT);

    // Listen to events.
    // Note, that although the 'create asset' context menu is disabled, the MaterialTreeDockWidget must still handle the 'resourceAdded'
    // signal, because it is also emitted when a subgroup is created in the mResourceTreeWidget; the subgroup must be added to
    // mSourceInfo after creation, to be able to recursively delete any assets resided in subgroups (these assets must also be
    // properly deleted from the MaterialThumbsDockWidget).
    connect(mResourceTreeWidget, SIGNAL(resourceSelected(int)), this, SLOT(handleResourceSelected(int)));
    connect(mResourceTreeWidget, SIGNAL(resourceDoubleClicked(int)), this, SLOT(handleResourceDoubleClicked(int)));
    connect(mResourceTreeWidget, SIGNAL(resourceAdded(int)), this, SLOT(handleResourceAdded(int)));
    connect(mResourceTreeWidget, SIGNAL(resourceDeleted(int)), this, SLOT(handleResourceDeleted(int)));
    connect(mResourceTreeWidget, SIGNAL(resourceMoved(int)), this, SLOT(handleResourceMoved(int)));
    connect(mResourceTreeWidget, SIGNAL(resourceSearched(QString)), this, SLOT(handleResourceSearched(QString)));
    connect(mResourceTreeWidget, SIGNAL(resourceSearchReset()), this, SLOT(handleResourceSearchReset()));
    connect(mResourceTreeWidget, SIGNAL(assetDuplicated(int)), this, SLOT(handleResourceDuplicated(int)));
    connect(mResourceTreeWidget, SIGNAL(customContextMenuItemSelected(QString,int)), this, SLOT(handleCustomContextMenuItemSelected(QString, int)));
    mInnerMain = new QMainWindow();
    mInnerMain->setMinimumSize(100,100);
    mInnerMain->setCentralWidget(mResourceTreeWidget);
    setWidget(mInnerMain);
    QWidget* oldTitleBar = titleBarWidget();
    setTitleBarWidget(new QWidget());
    delete oldTitleBar;

    // Add toplevel groups
    initializeResourceTree();
}

//****************************************************************************/
void MaterialTreeDockWidget::initializeResourceTree (void)
{
    // Initialize; add toplevel groups to the mResourceTreeWidget up front
    QtSourcesInfo info;

    // HLMS PBS
    mResourceTreeWidget->addResource (TOOL_SOURCES_LEVEL_X000_PBS,
                                      TOOL_SOURCES_LEVEL_X000_PBS,
                                      0,
                                      QString("PBS"),
                                      QString("PBS"),
                                      ICON_PBS_DATABLOCK_NO_PATH);
    info.toplevelId = TOOL_SOURCES_LEVEL_X000_PBS;
    info.resourceId = TOOL_SOURCES_LEVEL_X000_PBS;
    info.resourceType = Magus::TOOL_RESOURCETREE_KEY_TYPE_TOPLEVEL_GROUP;
    info.parentId = 0;
    info.fileName = QString("PBS");
    info.baseName = info.fileName;
    //info.filter = TOOL_SOURCES_FORMAT_PBS;
    info.filter = QString("");
    info.baseNameThumb = ICON_PBS_DATABLOCK;
    mSourceInfo[TOOL_SOURCES_LEVEL_X000_PBS] = info;

    // HLMS UNLIT
    mResourceTreeWidget->addResource (TOOL_SOURCES_LEVEL_X000_UNLIT,
                                      TOOL_SOURCES_LEVEL_X000_UNLIT,
                                      0,
                                      QString("Unlit"),
                                      QString("Unlit"),
                                      ICON_UNLIT_DATABLOCK_NO_PATH);
    info.toplevelId = TOOL_SOURCES_LEVEL_X000_UNLIT;
    info.resourceId = TOOL_SOURCES_LEVEL_X000_UNLIT;
    info.resourceType = Magus::TOOL_RESOURCETREE_KEY_TYPE_TOPLEVEL_GROUP;
    info.parentId = 0;
    info.fileName = QString("Unlit");
    info.baseName = info.fileName;
    //info.filter = TOOL_SOURCES_FORMAT_UNLIT;
    info.filter = QString("");
    info.baseNameThumb = ICON_UNLIT_DATABLOCK;
    mSourceInfo[TOOL_SOURCES_LEVEL_X000_UNLIT] = info;

    // Determine what is enabled/disabled if a toplevelgroup is selected
    mResourceTreeWidget->enableContextMenuItemForTopLevelGroup(mResourceTreeWidget->mActionCreateToplevelGroupText, false);
    mResourceTreeWidget->enableContextMenuItemForTopLevelGroup(mResourceTreeWidget->mActionCreateSubGroupText, true);
    mResourceTreeWidget->enableContextMenuItemForTopLevelGroup(mResourceTreeWidget->mActionCreateAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForTopLevelGroup(mResourceTreeWidget->mActionImportAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForTopLevelGroup(mResourceTreeWidget->mActionDuplicateAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForTopLevelGroup(mResourceTreeWidget->mActionDeleteResourceText, false);
    mResourceTreeWidget->enableContextMenuItemForTopLevelGroup(ACTION_EDIT, false);

    // Determine what is enabled/disabled if a subgroup is selected
    mResourceTreeWidget->enableContextMenuItemForSubGroup(mResourceTreeWidget->mActionCreateToplevelGroupText, false);
    mResourceTreeWidget->enableContextMenuItemForSubGroup(mResourceTreeWidget->mActionCreateSubGroupText, true);
    mResourceTreeWidget->enableContextMenuItemForSubGroup(mResourceTreeWidget->mActionCreateAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForSubGroup(mResourceTreeWidget->mActionImportAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForSubGroup(mResourceTreeWidget->mActionDuplicateAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForSubGroup(mResourceTreeWidget->mActionDeleteResourceText, true);
    mResourceTreeWidget->enableContextMenuItemForSubGroup(ACTION_EDIT, false);

    // Determine what is enabled/disabled if an asset is selected
    mResourceTreeWidget->enableContextMenuItemForAsset(mResourceTreeWidget->mActionCreateToplevelGroupText, false);
    mResourceTreeWidget->enableContextMenuItemForAsset(mResourceTreeWidget->mActionCreateSubGroupText, false);
    mResourceTreeWidget->enableContextMenuItemForAsset(mResourceTreeWidget->mActionCreateAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForAsset(mResourceTreeWidget->mActionImportAssetText, false);
    mResourceTreeWidget->enableContextMenuItemForAsset(mResourceTreeWidget->mActionDuplicateAssetText, true);
    mResourceTreeWidget->enableContextMenuItemForAsset(mResourceTreeWidget->mActionDeleteResourceText, true);
    mResourceTreeWidget->enableContextMenuItemForAsset(ACTION_EDIT, true);
}

//****************************************************************************/
MaterialTreeDockWidget::~MaterialTreeDockWidget(void)
{
}

//****************************************************************************/
QVector<Magus::QtResourceInfo*>& MaterialTreeDockWidget::getResources (void)
{
    // Delegate to mResourceTreeWidget; this is the component that actually retrieves the data
    return mResourceTreeWidget->getResources();
}

//****************************************************************************/
void MaterialTreeDockWidget::setResources(const QVector<Magus::QtResourceInfo*>& resources)
{
    // Add resources to the resource tree
    mResourceTreeWidget->setResources(resources, true);

    // Iterate again through the list to make sure that the thumb info is set
    QVectorIterator<Magus::QtResourceInfo*> it(resources);
    it.toFront();
    Magus::QtResourceInfo* resourceInfo;
    while (it.hasNext())
    {
        resourceInfo = it.next();
        QtSourcesInfo info;
        info.toplevelId = resourceInfo->topLevelId;
        info.resourceId = resourceInfo->resourceId;
        info.resourceType = resourceInfo->resourceType;
        info.parentId = resourceInfo->parentId;
        info.fileName = resourceInfo->fullQualifiedName;
        info.baseName = resourceInfo->resourceName;
        info.baseNameThumb = resourceInfo->resourceName + QString (".png"); // Do not forget
        mSourceInfo[resourceInfo->resourceId] = info;
    }

    mResourceTreeWidget->expandAll();
}

//****************************************************************************/
const QString& MaterialTreeDockWidget::getSelectedFullQualifiedName(void)
{
    QTreeWidgetItem* item = mResourceTreeWidget->getSelectedResourceItem ();
    if (item)
    {
        if (mResourceTreeWidget->isItemAsset(item))
            return mResourceTreeWidget->getFullQualifiedNameFromItem(item);
    }

    return mEmptyString;
}

//****************************************************************************/
bool MaterialTreeDockWidget::addMaterial(const QString& baseNameJson,
                                      const QString& fullNameJson,
                                      const QString& baseNameThumb,
                                      EditorHlmsTypes type)
{
    switch (type)
    {
        case HLMS_PBS:
        {
            return addAssetQuiet(TOOL_SOURCES_LEVEL_X000_PBS, fullNameJson, baseNameJson, baseNameThumb);
        }
        break;

        case HLMS_UNLIT:
        {
            return addAssetQuiet(TOOL_SOURCES_LEVEL_X000_UNLIT, fullNameJson, baseNameJson, baseNameThumb);
        }
        break;
    }
}

//****************************************************************************/
void MaterialTreeDockWidget::selectTopLevel(int toplevelId)
{
    mResourceTreeWidget->selectResource(toplevelId, false);
}

//****************************************************************************/
void MaterialTreeDockWidget::clearContent(void)
{
    mResourceTreeWidget->clear();
    initializeResourceTree();
}

//****************************************************************************/
bool MaterialTreeDockWidget::addAssetQuiet(int toplevelId,
                                           const QString& name,
                                           const QString& baseName,
                                           const QString& baseNameThumb)
{
    // Always add it even if the resource exists (sometimes the resourcetree and mSourceInfo are out-of-sync)
    if (isResourceExisting(baseName))
    {
        // delete it first
        deleteAssetQuiet(toplevelId, name, baseName);
    }

    // Suppress the signal that a resource was added, otherwise the signal causes the asset to
    // be added to the asset widget
    int resourceId = mResourceTreeWidget->addResource(toplevelId, baseName, name, name, true, true);
    mResourceTreeWidget->expand(toplevelId);

    // Also add/set it to mSourceInfo
    QtSourcesInfo info;
    info.toplevelId = toplevelId;
    info.resourceId = resourceId;
    info.resourceType = Magus::TOOL_RESOURCETREE_KEY_TYPE_ASSET; // It is an asset
    info.parentId = toplevelId;
    info.fileName = name;
    info.baseName = baseName;
    info.baseNameThumb = baseNameThumb;
    mSourceInfo[resourceId] = info;
    return true;
}

//****************************************************************************/
const QString& MaterialTreeDockWidget::setSelectAssetQuiet(const QString& baseNameThumb)
{
    int id = getResourceId(baseNameThumb);
    if (id != -1)
    {
        mResourceTreeWidget->selectResource(id, false);
        return mSourceInfo[id].fileName;
    }

    return mEmptyString;
}

//****************************************************************************/
const QString& MaterialTreeDockWidget::doubleClicked(const QString& baseNameThumb)
{
    int id = getResourceId(baseNameThumb);
    if (id != -1)
    {
        return mSourceInfo[id].fileName;
    }

    return mEmptyString;
}

//****************************************************************************/
void MaterialTreeDockWidget::deleteAssetQuiet(int toplevelId, const QString& name, const QString& baseName)
{
    // First, delete it from mResourceTreeWidget
    int resourceId = mResourceTreeWidget->getResourceIdFromToplevelIdAndName(toplevelId, name);
    if (resourceId < 0)
        return;

    mResourceTreeWidget->deleteResource(resourceId, true);

    // find the underlying asset (filenames) + delete it from the mSourceInfo
    mSourceInfo.remove(resourceId);
}

//****************************************************************************/
void MaterialTreeDockWidget::deleteAssetQuiet(const QString& baseNameThumb)
{
    int id = getResourceId(baseNameThumb);
    if (id != -1)
    {
        QtSourcesInfo info = mSourceInfo[id];
        mSourceInfo.remove(id);
        mResourceTreeWidget->deleteResource(info.toplevelId, info.fileName, true);
    }
}

//****************************************************************************/
void MaterialTreeDockWidget::handleResourceSelected(int resourceId)
{
    // Determine which type is selected
    QMap<int, QtSourcesInfo>::iterator it = mSourceInfo.find(resourceId);
    if (it != mSourceInfo.end())
    {
        QtSourcesInfo info = it.value();
        mResourceTreeWidget->setSubgroupIconName(determineSubgroupIcon(info.toplevelId));
        emit resourceSelected(info.toplevelId, info.parentId, info.resourceId, info.fileName, info.baseNameThumb);
        //QMessageBox::information(0, QString("this"), QVariant(info.toplevelId).toString()); // test
    }
}

//****************************************************************************/
void MaterialTreeDockWidget::handleResourceDoubleClicked(int resourceId)
{
    // Determine which type is selected
    QMap<int, QtSourcesInfo>::iterator it = mSourceInfo.find(resourceId);
    if (it != mSourceInfo.end())
    {
        QtSourcesInfo info = it.value();
        if (info.resourceType == Magus::TOOL_RESOURCETREE_KEY_TYPE_ASSET)
        {
            // Do not do something specific for a double click on a toplevel group or a (sub)group
            mResourceTreeWidget->setSubgroupIconName(determineSubgroupIcon(info.toplevelId));
            emit resourceDoubleClicked(info.toplevelId, info.parentId, info.resourceId, info.fileName, info.baseNameThumb);
        }
    }
}

//****************************************************************************/
void MaterialTreeDockWidget::handleResourceAdded(int resourceId)
{
    QtSourcesInfo info;
    int toplevelId = mResourceTreeWidget->getToplevelParentId(resourceId);
    QString name = mResourceTreeWidget->getResourceName(resourceId);
    QString fullQualifiedName = mResourceTreeWidget->getFullQualifiedName(resourceId);
    info.toplevelId = toplevelId;
    info.resourceId = resourceId;
    info.resourceType = mResourceTreeWidget->getTypeFromResourceId(resourceId);
    info.parentId = mResourceTreeWidget->getParentId(resourceId);
    info.fileName = fullQualifiedName;
    info.baseName = name;
    mSourceInfo[resourceId] = info;

    // Emit file info to MaterialMain, because the MaterialThumbsDockWidget must be appended with the new files
    // Do this only in case the resource is an asset
    if (mResourceTreeWidget->isResourceAsset(resourceId))
        emit resourceAdded(info.toplevelId, info.parentId, info.resourceId, info.fileName, info.baseName);
}
Example #2
0
void KoAbstractResourceServerAdapter::emitResourceAdded(KoResource* resource)
{
    emit resourceAdded(resource);
}