| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <QGraphicsView>
- #include <QLabel>
- #include <QMenu>
- #include <QMouseEvent>
- #include <QVariant>
- #include <QVBoxLayout>
- #include "GraphTabBar.h"
- #include <ScriptCanvas/Bus/RequestBus.h>
- #include <Editor/View/Widgets/CanvasWidget.h>
- #include <Editor/QtMetaTypes.h>
- #include <ScriptCanvas/Asset/AssetDescription.h>
- #include <Editor/Include/ScriptCanvas/Components/EditorGraph.h>
- namespace ScriptCanvasEditor
- {
- namespace Widget
- {
- ////////////////
- // GraphTabBar
- ////////////////
- GraphTabBar::GraphTabBar(QWidget* parent)
- : AzQtComponents::TabBar(parent)
- {
- setTabsClosable(true);
- setMovable(true);
- setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
- connect(this, &QTabBar::currentChanged, this, &GraphTabBar::currentChangedTab);
- setContextMenuPolicy(Qt::CustomContextMenu);
- connect(this, &QTabBar::customContextMenuRequested, this, &GraphTabBar::OnContextMenu);
- }
- void GraphTabBar::AddGraphTab(SourceHandle assetId, Tracker::ScriptCanvasFileState fileState)
- {
- InsertGraphTab(count(), assetId, fileState);
- }
- void GraphTabBar::ClearTabView(int tabIndex)
- {
- if (tabIndex < count())
- {
- if (QVariant tabDataVariant = tabData(tabIndex); tabDataVariant.isValid())
- {
- GraphTabMetadata replacement = tabDataVariant.value<GraphTabMetadata>();
- if (replacement.m_canvasWidget)
- {
- delete replacement.m_canvasWidget;
- replacement.m_canvasWidget = nullptr;
- tabDataVariant.setValue(replacement);
- setTabData(tabIndex, tabDataVariant);
- }
- }
- }
- }
- CanvasWidget* GraphTabBar::ModOrCreateTabView(int tabIndex)
- {
- if (tabIndex < count())
- {
- if (QVariant tabDataVariant = tabData(tabIndex); tabDataVariant.isValid())
- {
- if (!tabDataVariant.value<GraphTabMetadata>().m_canvasWidget)
- {
- CanvasWidget* canvasWidget = new CanvasWidget(tabDataVariant.value<GraphTabMetadata>().m_assetId, this);
- canvasWidget->SetDefaultBorderColor(ScriptCanvasEditor::SourceDescription::GetDisplayColor());
- GraphTabMetadata replacement = tabDataVariant.value<GraphTabMetadata>();
- replacement.m_canvasWidget = canvasWidget;
- tabDataVariant.setValue(replacement);
- setTabData(tabIndex, tabDataVariant);
- }
- return tabDataVariant.value<GraphTabMetadata>().m_canvasWidget;
- }
- }
- return nullptr;
- }
- CanvasWidget* GraphTabBar::ModTabView(int tabIndex)
- {
- if (tabIndex < count())
- {
- if (QVariant tabDataVariant = tabData(tabIndex); tabDataVariant.isValid())
- {
- return tabDataVariant.value<GraphTabMetadata>().m_canvasWidget;
- }
- }
- return nullptr;
- }
- AZStd::optional<GraphTabMetadata> GraphTabBar::GetTabData(int tabIndex) const
- {
- if (tabIndex < count())
- {
- if (QVariant tabDataVariant = tabData(tabIndex); tabDataVariant.isValid())
- {
- return tabDataVariant.value<GraphTabMetadata>();
- }
- }
- return AZStd::nullopt;
- }
- AZStd::optional<GraphTabMetadata> GraphTabBar::GetTabData(SourceHandle assetId) const
- {
- return GetTabData(FindTab(assetId));
- }
- void GraphTabBar::SetTabData(const GraphTabMetadata& metadata, int tabIndex)
- {
- if (tabIndex < count())
- {
- setTabData(tabIndex, QVariant::fromValue(metadata));
- }
- }
- void GraphTabBar::SetTabData(const GraphTabMetadata& metadata, SourceHandle assetId)
- {
- auto index = FindTab(assetId);
- auto replacement = GetTabData(assetId);
- if (index >= 0 && replacement)
- {
- replacement->m_assetId = assetId;
- SetTabData(metadata, index);
- }
- }
- int GraphTabBar::InsertGraphTab(int tabIndex, SourceHandle assetId, Tracker::ScriptCanvasFileState fileState)
- {
- if (!SelectTab(assetId))
- {
- QIcon tabIcon = QIcon(ScriptCanvasEditor::SourceDescription::GetIconPath());
- tabIndex = qobject_cast<AzQtComponents::TabWidget*>(parent())->insertTab(tabIndex, new QWidget(), tabIcon, "");
- GraphTabMetadata metaData;
- CanvasWidget* canvasWidget = new CanvasWidget(assetId, this);
- canvasWidget->SetDefaultBorderColor(SourceDescription::GetDisplayColor());
- metaData.m_canvasWidget = canvasWidget;
- metaData.m_assetId = assetId;
- metaData.m_fileState = fileState;
-
- AZStd::string tabName;
- AzFramework::StringFunc::Path::GetFileName(assetId.RelativePath().c_str(), tabName);
- SetTabText(tabIndex, tabName.c_str(), fileState);
- setTabData(tabIndex, QVariant::fromValue(metaData));
- return tabIndex;
- }
- return -1;
- }
- bool GraphTabBar::SelectTab(SourceHandle assetId)
- {
- int tabIndex = FindTab(assetId);
- if (-1 != tabIndex)
- {
- setCurrentIndex(tabIndex);
- return true;
- }
- return false;
- }
- int GraphTabBar::FindTab(SourceHandle assetId) const
- {
- for (int tabIndex = 0; tabIndex < count(); ++tabIndex)
- {
- QVariant tabDataVariant = tabData(tabIndex);
- if (tabDataVariant.isValid())
- {
- auto tabAssetId = tabDataVariant.value<GraphTabMetadata>();
- if (tabAssetId.m_assetId.AnyEquals(assetId))
- {
- return tabIndex;
- }
- }
- }
- return -1;
- }
- int GraphTabBar::FindTab(ScriptCanvasEditor::GraphPtrConst graph) const
- {
- for (int tabIndex = 0; tabIndex < count(); ++tabIndex)
- {
- QVariant tabDataVariant = tabData(tabIndex);
- if (tabDataVariant.isValid())
- {
- auto tabAssetId = tabDataVariant.value<GraphTabMetadata>();
- if (tabAssetId.m_assetId.Get() == graph)
- {
- return tabIndex;
- }
- }
- }
- return -1;
- }
- int GraphTabBar::FindSaveOverMatch(SourceHandle assetId) const
- {
- for (int tabIndex = 0; tabIndex < count(); ++tabIndex)
- {
- QVariant tabDataVariant = tabData(tabIndex);
- if (tabDataVariant.isValid())
- {
- auto tabAssetId = tabDataVariant.value<GraphTabMetadata>();
- if (tabAssetId.m_assetId.Get() != assetId.Get() && tabAssetId.m_assetId.PathEquals(assetId))
- {
- return tabIndex;
- }
- }
- }
- return -1;
- }
- SourceHandle GraphTabBar::FindTabByPath(AZStd::string_view path) const
- {
- SourceHandle candidate;
- candidate = SourceHandle::MarkAbsolutePath(candidate, path);
- for (int index = 0; index < count(); ++index)
- {
- QVariant tabdata = tabData(index);
- if (tabdata.isValid())
- {
- auto tabAssetId = tabdata.value<GraphTabMetadata>();
- if (tabAssetId.m_assetId.AnyEquals(candidate))
- {
- return tabAssetId.m_assetId;
- }
- }
- }
- return {};
- }
- SourceHandle GraphTabBar::FindAssetId(int tabIndex)
- {
- QVariant dataVariant = tabData(tabIndex);
- if (dataVariant.isValid())
- {
- auto tabAssetId = dataVariant.value<GraphTabMetadata>();
- return tabAssetId.m_assetId;
- }
- return SourceHandle();
- }
- ScriptCanvas::ScriptCanvasId GraphTabBar::FindScriptCanvasIdFromGraphCanvasId(const GraphCanvas::GraphId& graphCanvasGraphId) const
- {
- for (int index = 0; index < count(); ++index)
- {
- QVariant tabdata = tabData(index);
- if (tabdata.isValid())
- {
- auto tabAssetId = tabdata.value<GraphTabMetadata>();
- if (tabAssetId.m_assetId.IsGraphValid()
- && tabAssetId.m_assetId.Get()->GetGraphCanvasGraphId() == graphCanvasGraphId)
- {
- return tabAssetId.m_assetId.Get()->GetScriptCanvasId();
- }
- }
- }
- return ScriptCanvas::ScriptCanvasId{};
- }
- void GraphTabBar::CloseTab(int index)
- {
- if (index >= 0 && index < count())
- {
- qobject_cast<AzQtComponents::TabWidget*>(parent())->removeTab(index);
- }
- }
- void GraphTabBar::CloseAllTabs()
- {
- for (int i = count() - 1; i >= 0; --i)
- {
- Q_EMIT TabCloseNoButton(i);
- }
- }
- void GraphTabBar::OnContextMenu(const QPoint& point)
- {
- QPoint screenPoint = mapToGlobal(point);
- int tabIndex = tabAt(point);
- bool hasValidTab = (tabIndex >= 0);
- bool isModified = false;
- QVariant tabdata = tabData(tabIndex);
- if (tabdata.isValid())
- {
- auto tabAssetId = tabdata.value<GraphTabMetadata>();
- Tracker::ScriptCanvasFileState fileState = Tracker::ScriptCanvasFileState::INVALID;
- isModified = fileState == Tracker::ScriptCanvasFileState::NEW || fileState == Tracker::ScriptCanvasFileState::MODIFIED;
- }
- QMenu menu;
- QAction* saveAction = menu.addAction("Save");
- saveAction->setEnabled(hasValidTab && isModified);
- QAction* closeAction = menu.addAction("Close");
- closeAction->setEnabled(hasValidTab);
- QAction* closeAllAction = menu.addAction("Close All");
- QAction* closeAllButThis = menu.addAction("Close All But This");
- closeAllButThis->setEnabled(hasValidTab);
- menu.addSeparator();
- QAction* fullPathAction = menu.addAction("Copy Source Path To Clipboard");
- fullPathAction->setEnabled(hasValidTab);
- QAction* action = menu.exec(screenPoint);
- if (action)
- {
- if (action == saveAction)
- {
- if (tabIndex != currentIndex())
- {
- m_signalSaveOnChangeTo = tabIndex;
- setCurrentIndex(tabIndex);
- }
- else
- {
- Q_EMIT SaveTab(tabIndex);
- }
- }
- else if (action == closeAction)
- {
- tabCloseRequested(tabIndex);
- }
- else if (action == closeAllAction)
- {
- Q_EMIT CloseAllTabsSignal();
- }
- else if (action == closeAllButThis)
- {
- Q_EMIT CloseAllTabsButSignal(tabIndex);
- }
- else if (action == fullPathAction)
- {
- Q_EMIT CopyPathToClipboard(tabIndex);
- }
- }
- }
- void GraphTabBar::mouseReleaseEvent(QMouseEvent* event)
- {
- if (event->button() == Qt::MidButton)
- {
- int tabIndex = tabAt(event->localPos().toPoint());
- if (tabIndex >= 0)
- {
- tabCloseRequested(tabIndex);
- return;
- }
- }
- AzQtComponents::TabBar::mouseReleaseEvent(event);
- }
- void GraphTabBar::SetTabText(int tabIndex, const QString& path, Tracker::ScriptCanvasFileState fileState)
- {
- QString safePath = path;
- if (path.endsWith("^") || path.endsWith("*"))
- {
- safePath.chop(1);
- }
- if (tabIndex >= 0 && tabIndex < count())
- {
- const char* fileStateTag = "";
- switch (fileState)
- {
- case Tracker::ScriptCanvasFileState::NEW:
- fileStateTag = "^";
- break;
- case Tracker::ScriptCanvasFileState::SOURCE_REMOVED:
- case Tracker::ScriptCanvasFileState::MODIFIED:
- fileStateTag = "*";
- break;
- default:
- break;
- }
- setTabText(tabIndex, QString("%1%2").arg(safePath).arg(fileStateTag));
- }
- }
- void GraphTabBar::tabInserted(int index)
- {
- AzQtComponents::TabBar::tabInserted(index);
- Q_EMIT TabInserted(index);
- }
- void GraphTabBar::tabRemoved(int index)
- {
- AzQtComponents::TabBar::tabRemoved(index);
- Q_EMIT TabRemoved(index);
- }
- void GraphTabBar::UpdateFileState(const SourceHandle& assetId, Tracker::ScriptCanvasFileState fileState)
- {
- auto tabData = GetTabData(assetId);
- if (tabData && tabData->m_fileState != Tracker::ScriptCanvasFileState::NEW && tabData->m_fileState != fileState)
- {
- int index = FindTab(assetId);
- tabData->m_fileState = fileState;
- SetTabData(*tabData, assetId);
- SetTabText(index, tabText(index), fileState);
- if (index == currentIndex())
- {
- Q_EMIT OnActiveFileStateChanged();
- }
- }
- }
- void GraphTabBar::currentChangedTab(int index)
- {
- if (index < 0)
- {
- return;
- }
- QVariant tabdata = tabData(index);
- if (!tabdata.isValid())
- {
- return;
- }
- auto assetId = tabdata.value<GraphTabMetadata>().m_assetId;
- ScriptCanvasEditor::GeneralRequestBus::Broadcast(&ScriptCanvasEditor::GeneralRequests::OnChangeActiveGraphTab, assetId);
- if (m_signalSaveOnChangeTo >= 0 && m_signalSaveOnChangeTo == index)
- {
- m_signalSaveOnChangeTo = -1;
- Q_EMIT SaveTab(m_signalSaveOnChangeTo);
- }
- }
- #include <Editor/View/Widgets/moc_GraphTabBar.cpp>
- }
- }
|