merge from main and resolve conflicts

This commit is contained in:
hultonha
2021-04-27 10:58:35 +01:00
46 changed files with 3732 additions and 635 deletions
@@ -27,12 +27,12 @@ namespace AzToolsFramework::ViewportUi::Internal
Deselected
};
explicit Button(AZStd::string icon, ButtonId buttonId);
Button(AZStd::string icon, ButtonId buttonId);
Button(AZStd::string icon, AZStd::string name, ButtonId buttonId);
~Button() = default;
AZStd::string m_icon; //!< The icon for this button, string path to an image.
AZStd::string m_name; //!< The icon for this button, string path to an image.
AZStd::string m_name; //!< The name displayed as a label next to the button's icon.
State m_state = State::Deselected;
ButtonId m_buttonId;
};
@@ -50,7 +50,7 @@ namespace AzToolsFramework::ViewportUi::Internal
{
auto buttonId = ButtonId(m_buttons.size() + 1);
if (name == AZStd::string())
if (name.empty())
{
m_buttons.insert({buttonId, AZStd::make_unique<Button>(icon, buttonId)});
}
@@ -94,14 +94,14 @@ namespace AzToolsFramework::ViewportUi::Internal
}
}
void ViewportUiDisplay::AddSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup, ButtonId currMode)
void ViewportUiDisplay::AddSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup)
{
if (!buttonGroup.get())
{
return;
}
auto viewportUiSwitcher = AZStd::make_shared<ViewportUiSwitcher>(buttonGroup, currMode);
auto viewportUiSwitcher = AZStd::make_shared<ViewportUiSwitcher>(buttonGroup);
auto id = AddViewportUiElement(viewportUiSwitcher);
buttonGroup->SetViewportUiElementId(id);
PositionViewportUiElementAnchored(id, Qt::AlignTop | Qt::AlignLeft);
@@ -131,11 +131,11 @@ namespace AzToolsFramework::ViewportUi::Internal
}
}
void ViewportUiDisplay::SetSwitcherActiveMode(ViewportUiElementId clusterId, ButtonId buttonId)
void ViewportUiDisplay::SetSwitcherActiveButton(ViewportUiElementId clusterId, ButtonId buttonId)
{
if (auto viewportUiSwitcher = qobject_cast<ViewportUiSwitcher*>(GetViewportUiElement(clusterId).get()))
{
viewportUiSwitcher->SetActiveMode(buttonId);
viewportUiSwitcher->SetActiveButton(buttonId);
}
}
@@ -61,11 +61,11 @@ namespace AzToolsFramework::ViewportUi::Internal
void RemoveClusterButton(ViewportUiElementId clusterId, ButtonId buttonId);
void UpdateCluster(const ViewportUiElementId clusterId);
void AddSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup, ButtonId currMode);
void AddSwitcherButton(ViewportUiElementId clusterId, Button* button);
void RemoveSwitcherButton(ViewportUiElementId clusterId, ButtonId buttonId);
void UpdateSwitcher(const ViewportUiElementId clusterId);
void SetSwitcherActiveMode(ViewportUiElementId clusterId, ButtonId buttonId);
void AddSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup);
void AddSwitcherButton(ViewportUiElementId switcherId, Button* button);
void RemoveSwitcherButton(ViewportUiElementId switcherId, ButtonId buttonId);
void UpdateSwitcher(ViewportUiElementId switcherId);
void SetSwitcherActiveButton(ViewportUiElementId switcherId, ButtonId buttonId);
void AddTextField(AZStd::shared_ptr<TextField> textField);
void UpdateTextField(ViewportUiElementId textFieldId);
@@ -30,7 +30,7 @@ namespace AzToolsFramework::ViewportUi::Internal
// create a 3x2 map of sub layouts which will stack widgets according to their mapped alignment
m_internalLayouts = AZStd::unordered_map<Qt::Alignment, QBoxLayout*> {
CreateSubLayout(new QHBoxLayout(), 0, 0, Qt::AlignTop | Qt::AlignLeft),
CreateSubLayout(new QVBoxLayout(), 0, 0, Qt::AlignTop | Qt::AlignLeft),
CreateSubLayout(new QHBoxLayout(), 1, 0, Qt::AlignBottom | Qt::AlignLeft),
CreateSubLayout(new QVBoxLayout(), 0, 1, Qt::AlignTop),
CreateSubLayout(new QHBoxLayout(), 1, 1, Qt::AlignBottom),
@@ -60,7 +60,7 @@ namespace AzToolsFramework::ViewportUi::Internal
AZStd::pair<Qt::Alignment, QBoxLayout*> ViewportUiDisplayLayout::CreateSubLayout(
QBoxLayout* layout, const int row, const int column, const Qt::Alignment alignment)
{
layout->setAlignment(alignment);
layout->setAlignment(alignment);
// add an invisible spacer (stretch) to occupy empty space
// without this, alignment and resizing within the sublayouts becomes difficult
@@ -38,10 +38,10 @@ namespace AzToolsFramework::ViewportUi
return RegisterNewCluster(buttonGroup);
}
const SwitcherId ViewportUiManager::CreateSwitcher(ButtonId currMode)
const SwitcherId ViewportUiManager::CreateSwitcher()
{
auto buttonGroup = AZStd::make_shared<Internal::ButtonGroup>();
m_viewportUi->AddSwitcher(buttonGroup, currMode);
m_viewportUi->AddSwitcher(buttonGroup);
return RegisterNewSwitcher(buttonGroup);
}
@@ -62,7 +62,7 @@ namespace AzToolsFramework::ViewportUi
{
auto switcher = switcherIt->second;
switcher->SetHighlightedButton(buttonId);
m_viewportUi->SetSwitcherActiveMode(switcher->GetViewportUiElementId(), buttonId);
m_viewportUi->SetSwitcherActiveButton(switcher->GetViewportUiElementId(), buttonId);
UpdateButtonGroupUi(switcher.get());
}
}
@@ -144,7 +144,7 @@ namespace AzToolsFramework::ViewportUi
}
}
void ViewportUiManager::SetClusterVisible(ClusterId clusterId, bool visible)
void ViewportUiManager::SetClusterVisible(const ClusterId clusterId, bool visible)
{
if (auto clusterIt = m_clusterButtonGroups.find(clusterId); clusterIt != m_clusterButtonGroups.end())
{
@@ -153,7 +153,7 @@ namespace AzToolsFramework::ViewportUi
}
}
void ViewportUiManager::SetSwitcherVisible(SwitcherId switcherId, bool visible)
void ViewportUiManager::SetSwitcherVisible(const SwitcherId switcherId, bool visible)
{
if (auto switcherIt = m_switcherButtonGroups.find(switcherId); switcherIt != m_switcherButtonGroups.end())
{
@@ -32,7 +32,7 @@ namespace AzToolsFramework::ViewportUi
// ViewportUiRequestBus ...
const ClusterId CreateCluster() override;
const SwitcherId CreateSwitcher(ButtonId currMode) override;
const SwitcherId CreateSwitcher() override;
void SetClusterActiveButton(ClusterId clusterId, ButtonId buttonId) override;
void SetSwitcherActiveButton(SwitcherId switcherId, ButtonId buttonId) override;
const ButtonId CreateClusterButton(ClusterId clusterId, const AZStd::string& icon) override;
@@ -49,17 +49,16 @@ namespace AzToolsFramework::ViewportUi
//! Creates and registers a cluster with the Viewport UI system.
virtual const ClusterId CreateCluster() = 0;
//! Creates and registers a switcher with the Viewport UI system.
virtual const SwitcherId CreateSwitcher(ButtonId currMode) = 0;
virtual const SwitcherId CreateSwitcher() = 0;
//! Sets the active button of the cluster. This is the button which will display as highlighted.
virtual void SetClusterActiveButton(ClusterId clusterId, ButtonId buttonId) = 0;
//! Sets the active button of the switcher. This is the button which will display as highlighted.
//! Maybe update this comment
//! Sets the active button of the switcher. This is the button which has a text label.
virtual void SetSwitcherActiveButton(SwitcherId clusterId, ButtonId buttonId) = 0;
//! Registers a new button onto a cluster.
virtual const ButtonId CreateClusterButton(const ClusterId clusterId, const AZStd::string& icon) = 0;
//! Registers a new button onto a switcher.
virtual const ButtonId CreateSwitcherButton(
const SwitcherId switcherId, const AZStd::string& icon, const AZStd::string& name = AZStd::string()) = 0;
SwitcherId switcherId, const AZStd::string& icon, const AZStd::string& name = AZStd::string()) = 0;
//! Registers an event handler to handle events from the cluster.
virtual void RegisterClusterEventHandler(ClusterId clusterId, AZ::Event<ButtonId>::Handler& handler) = 0;
//! Registers an event handler to handle events from the cluster.
@@ -3,20 +3,27 @@
namespace AzToolsFramework::ViewportUi::Internal
{
ViewportUiSwitcher::ViewportUiSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup, ButtonId currentMode)
ViewportUiSwitcher::ViewportUiSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup)
: m_buttonGroup(buttonGroup)
, m_currentMode(currentMode)
{
setOrientation(Qt::Orientation::Horizontal);
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
setStyleSheet(QString("QToolBar {background-color: none; border: none; spacing: 3px;}"
"QToolButton {background-color: #464646; border: outset; border-color: white; border-radius: 7px; "
"border-width: 2px; padding: 7px; color: white;}"));
"QToolButton {background-color: black; border: outset; border-color: white; border-radius: 7px; border-width: 2px; padding: 7px; color: white;}"));
// Add am empty active button (is set in the call to SetActiveMode)
m_activeButton = new QToolButton();
// No hover effect for the main button as it's not clickable
m_activeButton->setProperty("IconHasHoverEffect", false);
m_activeButton->setCheckable(false);
m_activeButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
addWidget(m_activeButton);
const AZStd::vector<Button*> buttons = buttonGroup->GetButtons();
for (auto button : buttons)
{
// add all the other buttons after
// Add all the buttons as actions
if (button->m_buttonId)
{
AddButton(button);
@@ -26,6 +33,7 @@ namespace AzToolsFramework::ViewportUi::Internal
ViewportUiSwitcher::~ViewportUiSwitcher()
{
delete m_activeButton;
}
void ViewportUiSwitcher::AddButton(Button* button)
@@ -42,23 +50,8 @@ namespace AzToolsFramework::ViewportUi::Internal
// set hover to true by default
action->setProperty("IconHasHoverEffect", true);
// if its the first button added to the switcher add it as a button instead of action
if (button->m_buttonId == m_currentMode)
{
QString buttonName = (button->m_name).c_str();
QIcon buttonIcon = QString((button->m_icon).c_str());
m_activeButton = new QToolButton();
m_activeButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
m_activeButton->setIcon(buttonIcon);
m_activeButton->setText(buttonName);
addWidget(m_activeButton);
}
else
{
// add the action
addAction(action);
}
// add the action
addAction(action);
// resize to fit new action with minimum extra space
resize(minimumSizeHint());
@@ -85,41 +78,70 @@ namespace AzToolsFramework::ViewportUi::Internal
void ViewportUiSwitcher::RemoveButton(ButtonId buttonId)
{
ButtonId deleteLater = buttonId;
}
void ViewportUiSwitcher::Update()
{
}
void ViewportUiSwitcher::SetActiveMode(ButtonId buttonId)
{
// Change the tool button's name and icon to that button
const AZStd::vector<Button*> buttons = m_buttonGroup->GetButtons();
for (auto button : buttons)
if (auto actionEntry = m_buttonActionMap.find(buttonId); actionEntry != m_buttonActionMap.end())
{
if (button->m_buttonId == buttonId)
QAction* action = actionEntry->second;
// remove the action from the toolbar
removeAction(action);
// deregister from the widget manager
m_widgetCallbacks.RemoveWidget(action);
// resize to fit new area with minimum extra space
resize(minimumSizeHint());
m_buttonActionMap.erase(buttonId);
// reset current active mode if its the button being removed
if (buttonId == m_activeButtonId)
{
QString buttonName = (button->m_name).c_str();
QIcon buttonIcon = QString((button->m_icon).c_str());
m_activeButton->setIcon(buttonIcon);
m_activeButton->setText(buttonName);
if (auto nextEntry = m_buttonActionMap.find(ButtonId(buttonId + 1)); nextEntry != m_buttonActionMap.end())
{
SetActiveButton(nextEntry->first);
}
}
}
}
// look up button ID in map then remove it from its current position
void ViewportUiSwitcher::Update()
{
m_widgetCallbacks.Update();
}
void ViewportUiSwitcher::SetActiveButton(ButtonId buttonId)
{
// Check if it is the first active mode to be set
bool initialActiveMode = (m_activeButtonId == ButtonId(0));
// Change the toolbutton's name and icon to that button
const AZStd::vector<Button*> buttons = m_buttonGroup->GetButtons();
auto found = [buttonId](Button* button) { return (button->m_buttonId == buttonId); };
if (auto buttonIt = AZStd::find_if(buttons.begin(), buttons.end(), found); buttonIt != buttons.end())
{
QString buttonName = ((*buttonIt)->m_name).c_str();
QIcon buttonIcon = QString(((*buttonIt)->m_icon).c_str());
m_activeButton->setIcon(buttonIcon);
m_activeButton->setText(buttonName);
}
// Look up button ID in map then remove it from its current position
auto itr = m_buttonActionMap.find(buttonId);
QAction* action = itr->second;
removeAction(action); // call remove button?
removeAction(action);
// add the last action removed
if (m_currentMode != buttonId)
if (!initialActiveMode)
{
itr = m_buttonActionMap.find(m_currentMode);
action = itr->second;
addAction(action);
// Add the last action removed
if (m_activeButtonId != buttonId)
{
itr = m_buttonActionMap.find(m_activeButtonId);
action = itr->second;
addAction(action);
}
}
m_currentMode = buttonId;
m_activeButtonId = buttonId;
}
} // namespace AzToolsFramework::ViewportUi::Internal
@@ -19,18 +19,19 @@ namespace AzToolsFramework::ViewportUi::Internal
Q_OBJECT
public:
ViewportUiSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup, ButtonId currentMode);
ViewportUiSwitcher(AZStd::shared_ptr<ButtonGroup> buttonGroup);
~ViewportUiSwitcher();
//! Adds a new button to the cluster.
//! Adds a new button to the switcher.
void AddButton(Button* button);
//! Removes a button from the cluster.
//! Removes a button from the switcher.
void RemoveButton(ButtonId buttonId);
void Update();
void SetActiveMode(ButtonId buttonId);
//! Changes the m_activeButton.
void SetActiveButton(ButtonId buttonId);
private:
QToolButton* m_activeButton;
ButtonId m_currentMode;
QToolButton* m_activeButton; //!< The first button in the toolbar. Only button with a label/text.
ButtonId m_activeButtonId = ButtonId(0); //!< ButtonId corresponding to the active button in the buttonActionMap.
AZStd::shared_ptr<ButtonGroup> m_buttonGroup; //!< Data structure which the cluster will be displaying to the Viewport UI.
AZStd::unordered_map<ButtonId, QPointer<QAction>> m_buttonActionMap; //!< Map for buttons to their corresponding actions.
ViewportUiWidgetCallbacks m_widgetCallbacks; //!< Registers actions and manages updates.