/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ // Original file Copyright Crytek GMBH or its affiliates, used under license. #include "stdafx.h" #include #include "PropertyRowResourceFilePath.h" #include "Serialization/ClassFactory.h" #include #include #include #include #include #include #include // for getting game folder. #include "IGemManager.h" #include #include #include ResourceFilePathMenuHandler::ResourceFilePathMenuHandler(QPropertyTree* tree, PropertyRowResourceFilePath* self) : self(self) , tree(tree) { } void ResourceFilePathMenuHandler::onMenuClear() { tree->model()->rowAboutToBeChanged(self); self->clear(); tree->model()->rowChanged(self); } // Get filename relative to the asset folder, // whether it came from the project or from a gem QString AssetRelativePathFromAbsolutePath(const QString& absPath) { return Path::FullPathToGamePath(absPath); } bool PropertyRowResourceFilePath::onActivate(const PropertyActivationEvent& e) { using namespace AzToolsFramework::AssetBrowser; if (e.reason == e.REASON_RELEASE) { return false; } AssetSelectionModel selection; if (m_group) { selection = AssetSelectionModel::AssetGroupSelection(filter_); } else { selection = AssetSelectionModel::AssetTypeSelection(filter_); } AzToolsFramework::EditorRequests::Bus::Broadcast(&AzToolsFramework::EditorRequests::BrowseForAssets, selection); if (!selection.IsValid()) { return true; } auto product = azrtti_cast(selection.GetResult()); if (!product) { return true; } AZStd::string relativeFilename = product->GetRelativePath(); if (flags_ & ResourceFilePath::STRIP_EXTENSION) { size_t ext = relativeFilename.rfind('.'); if (ext != relativeFilename.npos) { relativeFilename.erase(ext, relativeFilename.length() - ext); } } e.tree->model()->rowAboutToBeChanged(this); path_ = relativeFilename.c_str(); e.tree->model()->rowChanged(this); return true; } void PropertyRowResourceFilePath::setValueAndContext(const Serialization::SStruct& ser, Serialization::IArchive& ar) { ResourceFilePath* value = (ResourceFilePath*)ser.pointer(); filter_ = value->filter.c_str(); path_ = value->path->c_str(); flags_ = value->flags; handle_ = value->path; m_group = value->group; } bool PropertyRowResourceFilePath::assignTo(const Serialization::SStruct& ser) const { ((ResourceFilePath*)ser.pointer())->SetPath(path_.c_str()); return true; } void PropertyRowResourceFilePath::serializeValue(Serialization::IArchive& ar) { ar(filter_, "filter"); ar(path_, "path"); ar(startFolder_, "startFolder"); ar(m_group, "group"); } const QIcon& PropertyRowResourceFilePath::buttonIcon(const QPropertyTree* tree, int index) const { #include "file_open.xpm" static QIcon fileOpenIcon = QIcon(QPixmap::fromImage(*tree->_iconCache()->getImageForIcon(Serialization::IconXPM(file_open_xpm)))); return fileOpenIcon; } string PropertyRowResourceFilePath::valueAsString() const { return path_; } void PropertyRowResourceFilePath::clear() { path_.clear(); } bool PropertyRowResourceFilePath::onContextMenu(QMenu& menu, QPropertyTree* tree) { QAction* action = menu.addAction("Clear"); Serialization::SharedPtr selfPointer(this); ResourceFilePathMenuHandler* handler = new ResourceFilePathMenuHandler(tree, this); QObject::connect(action, SIGNAL(triggered()), handler, SLOT(onMenuClear())); tree->addMenuHandler(handler); return true; } bool PropertyRowResourceFilePath::processesKey(QPropertyTree* tree, const QKeyEvent* ev) { if (ev->key() == Qt::Key_Delete) { return true; } return PropertyRowField::processesKey(tree, ev); } bool PropertyRowResourceFilePath::onKeyDown(QPropertyTree* tree, const QKeyEvent* ev) { if (ev->key() == Qt::Key_Delete) { tree->model()->rowAboutToBeChanged(this); clear(); tree->model()->rowChanged(this); return true; } return PropertyRowField::onKeyDown(tree, ev); } REGISTER_PROPERTY_ROW(ResourceFilePath, PropertyRowResourceFilePath); DECLARE_SEGMENT(PropertyRowResourceFilePath) #include