ATOM-15473 added context menu to material inspector group header with expand and collapse actions

https://jira.agscollab.com/browse/ATOM-15473
This commit is contained in:
guthadam
2021-05-05 16:35:32 -05:00
parent be1e4e7b1a
commit eb847ce9fa
5 changed files with 88 additions and 24 deletions
@@ -15,6 +15,7 @@
#if !defined(Q_MOC_RUN)
#include <AzCore/Memory/SystemAllocator.h>
#include <AzQtComponents/Components/ExtendedLabel.h>
#include <QMouseEvent>
#include <QPaintEvent>
#endif
@@ -31,7 +32,11 @@ namespace AtomToolsFramework
void SetExpanded(bool expanded);
bool IsExpanded() const;
Q_SIGNALS:
void clicked(QMouseEvent* event);
protected:
void mousePressEvent(QMouseEvent* event) override;
void paintEvent(QPaintEvent* event) override;
private:
@@ -55,6 +55,12 @@ namespace AtomToolsFramework
//! Calls Rebuild for all InspectorGroupWidget, allowing for destructive UI changes
virtual void RebuildAll() = 0;
//! Expands all groups and headers
virtual void ExpandAll() = 0;
//! Collapses all groups and headers
virtual void CollapseAll() = 0;
};
using InspectorRequestBus = AZ::EBus<InspectorRequests>;
@@ -29,11 +29,8 @@ namespace Ui
namespace AtomToolsFramework
{
class InspectorPropertyGroupWidget;
}
class InspectorGroupHeaderWidget;
namespace AtomToolsFramework
{
//! Provides controls for viewing and editing object settings.
//! The settings can be divided into groups, with each one showing a subset of properties.
class InspectorWidget
@@ -66,8 +63,15 @@ namespace AtomToolsFramework
void RefreshAll() override;
void RebuildAll() override;
void ExpandAll() override;
void CollapseAll() override;
private:
void OnHeaderClicked(QMouseEvent* event, InspectorGroupHeaderWidget* groupHeader, QWidget* groupWidget);
QVBoxLayout* m_layout = nullptr;
QScopedPointer<Ui::InspectorWidget> m_ui;
AZStd::vector<InspectorGroupHeaderWidget*> m_headers;
AZStd::vector<QWidget*> m_groups;
};
} // namespace AtomToolsFramework
@@ -14,10 +14,10 @@
#include <AzQtComponents/Components/StyleManager.h>
#include <AzQtComponents/Components/Widgets/Text.h>
#include <QStyle>
#include <QPainter>
#include <QApplication>
#include <QPainter>
#include <QPixmap>
#include <QStyle>
#include <QStyleOptionViewItem>
namespace AtomToolsFramework
@@ -44,6 +44,11 @@ namespace AtomToolsFramework
return m_expanded;
}
void InspectorGroupHeaderWidget::mousePressEvent(QMouseEvent* event)
{
emit clicked(event);
}
void InspectorGroupHeaderWidget::paintEvent([[maybe_unused]] QPaintEvent* event)
{
QPainter painter(this);
@@ -52,19 +57,10 @@ namespace AtomToolsFramework
auto& icon = m_expanded ? m_iconExpanded : m_iconCollapsed;
const QRect iconRect(5, (geometry().height() / 2) - (iconSize.height() / 2), iconSize.width(), iconSize.height());
style->drawItemPixmap(&painter,
iconRect,
Qt::AlignLeft | Qt::AlignVCenter,
icon.scaledToWidth(iconSize.width()));
style->drawItemPixmap(&painter, iconRect, Qt::AlignLeft | Qt::AlignVCenter, icon.scaledToWidth(iconSize.width()));
const auto textRect = QRect(25, 0, geometry().width() - 21, geometry().height());
style->drawItemText(&painter,
textRect,
Qt::AlignLeft | Qt::AlignVCenter,
QPalette(),
true,
text(),
QPalette::HighlightedText);
style->drawItemText(&painter, textRect, Qt::AlignLeft | Qt::AlignVCenter, QPalette(), true, text(), QPalette::HighlightedText);
}
} // namespace AtomToolsFramework
@@ -10,12 +10,13 @@
*
*/
#include <QMenu>
#include <QScrollArea>
#include <QScrollBar>
#include <QSizePolicy>
#include <AtomToolsFramework/Inspector/InspectorGroupWidget.h>
#include <AtomToolsFramework/Inspector/InspectorGroupHeaderWidget.h>
#include <AtomToolsFramework/Inspector/InspectorGroupWidget.h>
#include <AtomToolsFramework/Inspector/InspectorWidget.h>
#include <Source/Inspector/ui_InspectorWidget.h>
@@ -38,6 +39,8 @@ namespace AtomToolsFramework
m_layout = new QVBoxLayout(m_ui->m_propertyContent);
m_layout->setContentsMargins(0, 0, 0, 0);
m_layout->setSpacing(0);
m_headers.clear();
m_groups.clear();
}
void InspectorWidget::AddGroupsBegin()
@@ -52,8 +55,7 @@ namespace AtomToolsFramework
m_layout->addStretch();
// Scroll to top whenever there is new content
m_ui->m_propertyScrollArea->verticalScrollBar()->setValue(
m_ui->m_propertyScrollArea->verticalScrollBar()->minimum());
m_ui->m_propertyScrollArea->verticalScrollBar()->setValue(m_ui->m_propertyScrollArea->verticalScrollBar()->minimum());
setUpdatesEnabled(true);
}
@@ -68,15 +70,15 @@ namespace AtomToolsFramework
groupHeader->setText(groupDisplayName.c_str());
groupHeader->setToolTip(groupDescription.c_str());
m_layout->addWidget(groupHeader);
m_headers.push_back(groupHeader);
groupWidget->setObjectName(groupNameId.c_str());
groupWidget->setParent(m_ui->m_propertyContent);
m_layout->addWidget(groupWidget);
m_groups.push_back(groupWidget);
connect(groupHeader, &AzQtComponents::ExtendedLabel::clicked, this, [groupHeader, groupWidget]()
{
groupHeader->SetExpanded(!groupHeader->IsExpanded());
groupWidget->setVisible(groupHeader->IsExpanded());
connect(groupHeader, &InspectorGroupHeaderWidget::clicked, this, [this, groupHeader, groupWidget](QMouseEvent* event) {
OnHeaderClicked(event, groupHeader, groupWidget);
});
}
@@ -111,6 +113,57 @@ namespace AtomToolsFramework
groupWidget->Rebuild();
}
}
void InspectorWidget::ExpandAll()
{
for (auto headerWidget : m_headers)
{
headerWidget->SetExpanded(true);
}
for (auto groupWidget : m_groups)
{
groupWidget->setVisible(true);
}
}
void InspectorWidget::CollapseAll()
{
for (auto headerWidget : m_headers)
{
headerWidget->SetExpanded(false);
}
for (auto groupWidget : m_groups)
{
groupWidget->setVisible(false);
}
}
void InspectorWidget::OnHeaderClicked(QMouseEvent* event, InspectorGroupHeaderWidget* groupHeader, QWidget* groupWidget)
{
if (event->button() == Qt::MouseButton::LeftButton)
{
groupHeader->SetExpanded(!groupHeader->IsExpanded());
groupWidget->setVisible(groupHeader->IsExpanded());
return;
}
if (event->button() == Qt::MouseButton::RightButton)
{
QMenu menu;
menu.addAction("Expand", [groupHeader, groupWidget]() {
groupHeader->SetExpanded(true);
groupWidget->setVisible(true);
})->setEnabled(!groupHeader->IsExpanded());
menu.addAction("Collapse", [groupHeader, groupWidget]() {
groupHeader->SetExpanded(false);
groupWidget->setVisible(false);
})->setEnabled(groupHeader->IsExpanded());
menu.addAction("Expand All", [this]() { ExpandAll(); });
menu.addAction("Collapse All", [this]() { CollapseAll(); });
menu.exec(event->globalPos());
return;
}
}
} // namespace AtomToolsFramework
#include <AtomToolsFramework/Inspector/moc_InspectorWidget.cpp>