Project Manager Toolbar Update
- use flow control for projects page for automatic updates when resizing - made the first time screen only display the first time
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <ScreenFactory.h>
|
||||
#include <ScreenWidget.h>
|
||||
|
||||
#include <QTabWidget>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
namespace O3DE::ProjectManager
|
||||
@@ -21,17 +22,19 @@ namespace O3DE::ProjectManager
|
||||
ScreensCtrl::ScreensCtrl(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
setObjectName("ScreensCtrl");
|
||||
|
||||
QVBoxLayout* vLayout = new QVBoxLayout();
|
||||
vLayout->setMargin(0);
|
||||
vLayout->setSpacing(0);
|
||||
vLayout->setContentsMargins(0, 0, 0, 0);
|
||||
setLayout(vLayout);
|
||||
|
||||
m_screenStack = new QStackedWidget();
|
||||
vLayout->addWidget(m_screenStack);
|
||||
|
||||
//Track the bottom of the stack
|
||||
m_screenVisitOrder.push(ProjectManagerScreen::Invalid);
|
||||
// add a tab widget at the bottom of the stack
|
||||
m_tabWidget = new QTabWidget();
|
||||
m_screenStack->addWidget(m_tabWidget);
|
||||
connect(m_tabWidget, &QTabWidget::currentChanged, this, &ScreensCtrl::TabChanged);
|
||||
}
|
||||
|
||||
void ScreensCtrl::BuildScreens(QVector<ProjectManagerScreen> screens)
|
||||
@@ -57,7 +60,14 @@ namespace O3DE::ProjectManager
|
||||
|
||||
ScreenWidget* ScreensCtrl::GetCurrentScreen()
|
||||
{
|
||||
return reinterpret_cast<ScreenWidget*>(m_screenStack->currentWidget());
|
||||
if (m_screenStack->currentWidget() == m_tabWidget)
|
||||
{
|
||||
return reinterpret_cast<ScreenWidget*>(m_tabWidget->currentWidget());
|
||||
}
|
||||
else
|
||||
{
|
||||
return reinterpret_cast<ScreenWidget*>(m_screenStack->currentWidget());
|
||||
}
|
||||
}
|
||||
|
||||
bool ScreensCtrl::ChangeToScreen(ProjectManagerScreen screen)
|
||||
@@ -79,13 +89,28 @@ namespace O3DE::ProjectManager
|
||||
if (iterator != m_screenMap.end())
|
||||
{
|
||||
ScreenWidget* currentScreen = GetCurrentScreen();
|
||||
if (currentScreen != iterator.value())
|
||||
ScreenWidget* newScreen = iterator.value();
|
||||
|
||||
if (currentScreen != newScreen)
|
||||
{
|
||||
if (addVisit)
|
||||
{
|
||||
m_screenVisitOrder.push(currentScreen->GetScreenEnum());
|
||||
ProjectManagerScreen oldScreen = currentScreen->GetScreenEnum();
|
||||
m_screenVisitOrder.push(oldScreen);
|
||||
}
|
||||
m_screenStack->setCurrentWidget(iterator.value());
|
||||
|
||||
if (newScreen->IsTab())
|
||||
{
|
||||
m_tabWidget->setCurrentWidget(newScreen);
|
||||
m_screenStack->setCurrentWidget(m_tabWidget);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_screenStack->setCurrentWidget(newScreen);
|
||||
}
|
||||
|
||||
newScreen->NotifyCurrentScreen();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -95,23 +120,46 @@ namespace O3DE::ProjectManager
|
||||
|
||||
bool ScreensCtrl::GotoPreviousScreen()
|
||||
{
|
||||
// Don't go back if we are on the first set screen
|
||||
if (m_screenVisitOrder.top() != ProjectManagerScreen::Invalid)
|
||||
if (!m_screenVisitOrder.isEmpty())
|
||||
{
|
||||
// We do not check with screen if we can go back, we should always be able to go back
|
||||
return ForceChangeToScreen(m_screenVisitOrder.pop(), false);
|
||||
ProjectManagerScreen previousScreen = m_screenVisitOrder.pop();
|
||||
return ForceChangeToScreen(previousScreen, false);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ScreensCtrl::ResetScreen(ProjectManagerScreen screen)
|
||||
{
|
||||
bool shouldRestoreCurrentScreen = false;
|
||||
if (GetCurrentScreen() && GetCurrentScreen()->GetScreenEnum() == screen)
|
||||
{
|
||||
shouldRestoreCurrentScreen = true;
|
||||
}
|
||||
|
||||
// Delete old screen if it exists to start fresh
|
||||
DeleteScreen(screen);
|
||||
|
||||
// Add new screen
|
||||
ScreenWidget* newScreen = BuildScreen(this, screen);
|
||||
m_screenStack->addWidget(newScreen);
|
||||
if (newScreen->IsTab())
|
||||
{
|
||||
m_tabWidget->addTab(newScreen, newScreen->GetTabText());
|
||||
if (shouldRestoreCurrentScreen)
|
||||
{
|
||||
m_tabWidget->setCurrentWidget(newScreen);
|
||||
m_screenStack->setCurrentWidget(m_tabWidget);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_screenStack->addWidget(newScreen);
|
||||
if (shouldRestoreCurrentScreen)
|
||||
{
|
||||
m_screenStack->setCurrentWidget(newScreen);
|
||||
}
|
||||
}
|
||||
|
||||
m_screenMap.insert(screen, newScreen);
|
||||
|
||||
connect(newScreen, &ScreenWidget::ChangeScreenRequest, this, &ScreensCtrl::ChangeToScreen);
|
||||
@@ -134,8 +182,21 @@ namespace O3DE::ProjectManager
|
||||
const auto iter = m_screenMap.find(screen);
|
||||
if (iter != m_screenMap.end())
|
||||
{
|
||||
m_screenStack->removeWidget(iter.value());
|
||||
iter.value()->deleteLater();
|
||||
ScreenWidget* screenToDelete = iter.value();
|
||||
if (screenToDelete->IsTab())
|
||||
{
|
||||
int tabIndex = m_tabWidget->indexOf(screenToDelete);
|
||||
if (tabIndex > -1)
|
||||
{
|
||||
m_tabWidget->removeTab(tabIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// if the screen we delete is the current widget, a new one will
|
||||
// be selected automatically (randomly?)
|
||||
m_screenStack->removeWidget(screenToDelete);
|
||||
}
|
||||
|
||||
// Erase does not cause a rehash so interators remain valid
|
||||
m_screenMap.erase(iter);
|
||||
@@ -150,4 +211,12 @@ namespace O3DE::ProjectManager
|
||||
}
|
||||
}
|
||||
|
||||
void ScreensCtrl::TabChanged([[maybe_unused]] int index)
|
||||
{
|
||||
ScreenWidget* screen = reinterpret_cast<ScreenWidget*>(m_tabWidget->currentWidget());
|
||||
if (screen)
|
||||
{
|
||||
screen->NotifyCurrentScreen();
|
||||
}
|
||||
}
|
||||
} // namespace O3DE::ProjectManager
|
||||
|
||||
Reference in New Issue
Block a user