Initial commit

This commit is contained in:
alexpete
2021-03-05 11:26:34 -08:00
commit a10351f38d
27091 changed files with 5521199 additions and 0 deletions
@@ -0,0 +1,418 @@
/*
* 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.
*
*/
#include "EditorDefs.h"
#include "WelcomeScreenDialog.h"
// Qt
#include <QStringListModel>
#include <QToolTip>
#include <QMenu>
#include <QDesktopServices>
#include <QFileDialog>
#include <QMessageBox>
#include <QScreen>
#include <QDesktopWidget>
#include <QTimer>
// AzFramework
#include <AzFramework/API/ApplicationAPI.h>
// AzToolsFramework
#include <AzToolsFramework/UI/UICore/WidgetHelpers.h>
// AzQtComponents
#include <AzQtComponents/Components/Widgets/CheckBox.h>
#include <AzQtComponents/Components/WindowDecorationWrapper.h>
// Editor
#include "Settings.h"
#include "MainWindow.h"
#include "CryEdit.h"
#include "LevelFileDialog.h"
// NewsShared
#include <NewsShared/ResourceManagement/ResourceManifest.h> // for News::ResourceManifest
#include <NewsShared/Qt/ArticleViewContainer.h> // for News::ArticleViewContainer
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
#include <WelcomeScreen/ui_WelcomeScreenDialog.h>
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
using namespace AzQtComponents;
#define WMSEVENTNAME "WMSEvent"
#define WMSEVENTOPERATION "operation"
static int GetSmallestScreenHeight()
{
QDesktopWidget* desktopWidget = QApplication::desktop();
int smallestHeight = -1;
for (QScreen* screen : QApplication::screens())
{
int screenHeight = screen->availableGeometry().height();
if ((smallestHeight < 0) || (smallestHeight > screenHeight))
{
smallestHeight = screenHeight;
}
}
return smallestHeight;
}
WelcomeScreenDialog::WelcomeScreenDialog(QWidget* pParent)
: QDialog(new WindowDecorationWrapper(WindowDecorationWrapper::OptionAutoAttach | WindowDecorationWrapper::OptionAutoTitleBarButtons, pParent), Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint | Qt::WindowTitleHint)
, ui(new Ui::WelcomeScreenDialog)
, m_pRecentListModel(new QStringListModel(this))
, m_pRecentList(nullptr)
{
ui->setupUi(this);
// Make our welcome screen checkboxes appear as toggle switches
AzQtComponents::CheckBox::applyToggleSwitchStyle(ui->autoLoadLevel);
AzQtComponents::CheckBox::applyToggleSwitchStyle(ui->showOnStartup);
ui->autoLoadLevel->setChecked(gSettings.bAutoloadLastLevelAtStartup);
ui->showOnStartup->setChecked(!gSettings.bShowDashboardAtStartup);
ui->recentLevelList->setModel(m_pRecentListModel);
ui->recentLevelList->setMouseTracking(true);
ui->recentLevelList->setContextMenuPolicy(Qt::CustomContextMenu);
auto currentProjectButtonMenu = new QMenu();
ui->currentProjectButton->setMenu(currentProjectButtonMenu);
ui->currentProjectButton->setText(gEnv->pConsole->GetCVar("sys_game_folder")->GetString());
ui->currentProjectButton->adjustSize();
ui->currentProjectButton->setMinimumWidth(ui->currentProjectButton->width() + 40);
ui->documentationLink->setCursor(Qt::PointingHandCursor);
ui->documentationLink->installEventFilter(this);
connect(ui->recentLevelList, &QWidget::customContextMenuRequested, this, &WelcomeScreenDialog::OnShowContextMenu);
connect(ui->recentLevelList, &QListView::entered, this, &WelcomeScreenDialog::OnShowToolTip);
connect(ui->recentLevelList, &QListView::clicked, this, &WelcomeScreenDialog::OnRecentLevelListItemClicked);
connect(ui->newLevelButton, &QPushButton::clicked, this, &WelcomeScreenDialog::OnNewLevelBtnClicked);
connect(ui->openLevelButton, &QPushButton::clicked, this, &WelcomeScreenDialog::OnOpenLevelBtnClicked);
connect(ui->newSliceButton, &QPushButton::clicked, this, &WelcomeScreenDialog::OnNewSliceBtnClicked);
connect(ui->openSliceButton, &QPushButton::clicked, this, &WelcomeScreenDialog::OnOpenSliceBtnClicked);
connect(ui->documentationButton, &QPushButton::clicked, this, &WelcomeScreenDialog::OnDocumentationBtnClicked);
connect(ui->showOnStartup, &QCheckBox::clicked, this, &WelcomeScreenDialog::OnShowOnStartupBtnClicked);
connect(ui->autoLoadLevel, &QCheckBox::clicked, this, &WelcomeScreenDialog::OnAutoLoadLevelBtnClicked);
m_manifest = new News::ResourceManifest(
std::bind(&WelcomeScreenDialog::SyncSuccess, this),
std::bind(&WelcomeScreenDialog::SyncFail, this, std::placeholders::_1),
std::bind(&WelcomeScreenDialog::SyncUpdate, this, std::placeholders::_1, std::placeholders::_2));
m_articleViewContainer = new News::ArticleViewContainer(this, *m_manifest);
connect(m_articleViewContainer, &News::ArticleViewContainer::scrolled,
this, &WelcomeScreenDialog::previewAreaScrolled);
ui->articleViewContainerRoot->layout()->addWidget(m_articleViewContainer);
m_manifest->Sync();
#ifndef ENABLE_SLICE_EDITOR
ui->newSliceButton->hide();
ui->openSliceButton->hide();
#endif
// Adjust the height, if need be
// Do it in the constructor so that the WindowDecoratorWrapper handles it correctly
int smallestHeight = GetSmallestScreenHeight();
if (smallestHeight < geometry().height())
{
const int SOME_PADDING_IN_PIXELS = 90;
int difference = geometry().height() - (smallestHeight - SOME_PADDING_IN_PIXELS);
QRect newGeometry = geometry().adjusted(0, difference / 2, 0, -difference / 2);
setMinimumSize(minimumSize().width(), newGeometry.height());
resize(newGeometry.size());
}
}
WelcomeScreenDialog::~WelcomeScreenDialog()
{
delete ui;
delete m_manifest;
}
void WelcomeScreenDialog::done(int result)
{
if (m_waitingOnAsync)
{
m_manifest->Abort();
}
QDialog::done(result);
}
const QString& WelcomeScreenDialog::GetLevelPath()
{
return m_levelPath;
}
bool WelcomeScreenDialog::eventFilter(QObject *watched, QEvent *event)
{
if (watched == ui->documentationLink)
{
if (event->type() == QEvent::MouseButtonRelease)
{
OnDocumentationBtnClicked(false);
return true;
}
}
return QDialog::eventFilter(watched, event);
}
void WelcomeScreenDialog::SetRecentFileList(RecentFileList* pList)
{
if (!pList)
{
return;
}
m_pRecentList = pList;
const char* engineRoot;
EBUS_EVENT_RESULT(engineRoot, AzFramework::ApplicationRequests::Bus, GetEngineRoot);
QString gamePath = QString(engineRoot) + QDir::separator() + gEnv->pConsole->GetCVar("sys_game_folder")->GetString();
Path::ConvertSlashToBackSlash(gamePath);
gamePath = Path::ToUnixPath(gamePath.toLower());
gamePath = Path::AddSlash(gamePath);
QString sCurDir = (Path::GetEditingGameDataFolder() + QDir::separator().toLatin1()).c_str();
int nCurDir = sCurDir.length();
int recentListSize = pList->GetSize();
for (int i = 0; i < recentListSize; ++i)
{
if (CFileUtil::Exists(pList->m_arrNames[i], false))
{
QString sCurEntryDir = pList->m_arrNames[i].left(nCurDir);
if (sCurEntryDir.compare(sCurDir, Qt::CaseInsensitive) != 0)
{
//unavailable entry (wrong directory)
continue;
}
}
else
{
//invalid entry (not existing)
continue;
}
QString fullPath = pList->m_arrNames[i];
QString name = Path::GetFileName(fullPath);
Path::ConvertSlashToBackSlash(fullPath);
fullPath = Path::ToUnixPath(fullPath.toLower());
fullPath = Path::AddSlash(fullPath);
if (fullPath.contains(gamePath))
{
m_pRecentListModel->setStringList(m_pRecentListModel->stringList() << QString(name));
m_levels.push_back(std::make_pair(name, pList->m_arrNames[i]));
}
}
ui->recentLevelList->setCurrentIndex(QModelIndex());
int rowSize = ui->recentLevelList->sizeHintForRow(0) + ui->recentLevelList->spacing() * 2;
ui->recentLevelList->setMinimumHeight(m_pRecentListModel->rowCount() * rowSize);
ui->recentLevelList->setMaximumHeight(m_pRecentListModel->rowCount() * rowSize);
}
void WelcomeScreenDialog::RemoveLevelEntry(int index)
{
TNamePathPair levelPath = m_levels[index];
m_pRecentListModel->removeRow(index);
m_levels.erase(m_levels.begin() + index);
if (!m_pRecentList)
{
return;
}
for (int i = 0; i < m_pRecentList->GetSize(); ++i)
{
QString fullPath = m_pRecentList->m_arrNames[i];
QString fullPath2 = levelPath.second;
// path from recent list
Path::ConvertSlashToBackSlash(fullPath);
fullPath = Path::ToUnixPath(fullPath.toLower());
fullPath = Path::AddPathSlash(fullPath);
// path from our dashboard list
Path::ConvertSlashToBackSlash(fullPath2);
fullPath2 = Path::ToUnixPath(fullPath2.toLower());
fullPath2 = Path::AddPathSlash(fullPath2);
if (fullPath == fullPath2)
{
m_pRecentList->Remove(index);
break;
}
}
m_pRecentList->WriteList();
}
void WelcomeScreenDialog::OnShowToolTip(const QModelIndex& index)
{
const QString& fullPath = m_levels[index.row()].second;
//TEMPORARY:Begin This can be put back once the main window is in Qt
//QRect itemRect = ui->recentLevelList->visualRect(index);
QToolTip::showText(QCursor::pos(), QString("Open level: %1").arg(fullPath) /*, ui->recentLevelList, itemRect*/);
//TEMPORARY:END
}
void WelcomeScreenDialog::OnShowContextMenu(const QPoint& pos)
{
QModelIndex index = ui->recentLevelList->indexAt(pos);
if (index.isValid())
{
QString level = m_pRecentListModel->data(index, 0).toString();
QPoint globalPos = ui->recentLevelList->viewport()->mapToGlobal(pos);
QMenu contextMenu;
contextMenu.addAction(QString("Remove " + level + " from recent list"));
QAction* selectedItem = contextMenu.exec(globalPos);
if (selectedItem)
{
RemoveLevelEntry(index.row());
}
}
}
void WelcomeScreenDialog::OnNewLevelBtnClicked([[maybe_unused]] bool checked)
{
m_levelPath = "new";
accept();
}
void WelcomeScreenDialog::OnOpenLevelBtnClicked([[maybe_unused]] bool checked)
{
CLevelFileDialog dlg(true, this);
if (dlg.exec() == QDialog::Accepted)
{
m_levelPath = dlg.GetFileName();
accept();
}
}
void WelcomeScreenDialog::OnNewSliceBtnClicked([[maybe_unused]] bool checked)
{
m_levelPath = "new slice";
accept();
}
void WelcomeScreenDialog::OnOpenSliceBtnClicked(bool)
{
QString fileName = QFileDialog::getOpenFileName(MainWindow::instance(),
tr("Open Slice"),
Path::GetEditingGameDataFolder().c_str(),
tr("Slice (*.slice)"));
if (!fileName.isEmpty())
{
m_levelPath = fileName;
accept();
}
}
void WelcomeScreenDialog::OnRecentLevelListItemClicked(const QModelIndex& modelIndex)
{
int index = modelIndex.row();
if (index >= 0 && index < m_levels.size())
{
m_levelPath = m_levels[index].second;
accept();
}
}
void WelcomeScreenDialog::OnCloseBtnClicked([[maybe_unused]] bool checked)
{
accept();
}
void WelcomeScreenDialog::OnAutoLoadLevelBtnClicked(bool checked)
{
gSettings.bAutoloadLastLevelAtStartup = checked;
gSettings.Save();
}
void WelcomeScreenDialog::OnShowOnStartupBtnClicked(bool checked)
{
gSettings.bShowDashboardAtStartup = !checked;
gSettings.Save();
if (gSettings.bShowDashboardAtStartup == false)
{
QMessageBox msgBox(AzToolsFramework::GetActiveWindow());
msgBox.setWindowTitle(QObject::tr("Skip the Welcome dialog on startup"));
msgBox.setText(QObject::tr("You may re-enable the Welcome dialog at any time by going to Edit > Editor Settings > Global Preferences in the menu bar."));
msgBox.exec();
}
}
void WelcomeScreenDialog::OnDocumentationBtnClicked([[maybe_unused]] bool checked)
{
QString webLink = tr("https://aws.amazon.com/lumberyard/support/");
QDesktopServices::openUrl(QUrl(webLink));
}
void WelcomeScreenDialog::SyncFail([[maybe_unused]] News::ErrorCode error)
{
m_articleViewContainer->AddErrorMessage();
m_waitingOnAsync = false;
}
void WelcomeScreenDialog::SyncSuccess()
{
m_articleViewContainer->PopulateArticles();
m_waitingOnAsync = false;
}
void WelcomeScreenDialog::previewAreaScrolled()
{
//this should only be reported once per session
if (m_messageScrollReported)
{
return;
}
m_messageScrollReported = true;
}
#include <WelcomeScreen/moc_WelcomeScreenDialog.cpp>
@@ -0,0 +1,87 @@
/*
* 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.
*
*/
#pragma once
#if !defined(Q_MOC_RUN)
#include <QDialog>
#include "NewsShared/LogType.h"
#include "NewsShared/ErrorCodes.h"
#endif
namespace News {
class ResourceManifest;
class ArticleViewContainer;
}
namespace Ui {
class WelcomeScreenDialog;
}
class QStringListModel;
class RecentFileList;
class WelcomeScreenDialog
: public QDialog
{
Q_OBJECT
public:
WelcomeScreenDialog(QWidget* pParent = nullptr);
~WelcomeScreenDialog();
const QString& GetLevelPath();
void SetRecentFileList(RecentFileList* pList);
bool eventFilter(QObject *watched, QEvent *event) override;
public Q_SLOTS:
void done(int result) override;
private:
typedef std::pair<QString, QString> TNamePathPair;
typedef std::vector<TNamePathPair> TNameFullPathArray;
Ui::WelcomeScreenDialog* ui;
QString m_levelPath;
QStringListModel* m_pRecentListModel;
TNameFullPathArray m_levels;
RecentFileList* m_pRecentList;
News::ResourceManifest* m_manifest = nullptr;
News::ArticleViewContainer* m_articleViewContainer = nullptr;
bool m_waitingOnAsync = true;
bool m_messageScrollReported = false;
void RemoveLevelEntry(int index);
void OnShowToolTip(const QModelIndex& index);
void OnShowContextMenu(const QPoint& point);
void OnNewLevelBtnClicked(bool checked);
void OnOpenLevelBtnClicked(bool checked);
void OnNewSliceBtnClicked(bool checked);
void OnOpenSliceBtnClicked(bool checked);
void OnRecentLevelListItemClicked(const QModelIndex& index);
void OnGettingStartedBtnClicked(bool checked);
void OnTutorialsBtnClicked(bool checked);
void OnDocumentationBtnClicked(bool checked);
void OnForumsBtnClicked(bool checked);
void OnAutoLoadLevelBtnClicked(bool checked);
void OnShowOnStartupBtnClicked(bool checked);
void OnCloseBtnClicked(bool checked);
void SyncUpdate(const QString& /* message */, News::LogType /* logType */) {}
void SyncFail(News::ErrorCode error);
void SyncSuccess();
private Q_SLOTS:
void previewAreaScrolled();
};
@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="WelcomeScreenDialog">
<file>WelcomeScreenDialogHeader.png</file>
</qresource>
</RCC>
@@ -0,0 +1,643 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WelcomeScreenDialog</class>
<widget class="QWidget" name="WelcomeScreenDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>800</width>
<height>600</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>800</width>
<height>16777215</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<property name="windowTitle">
<string>Welcome to Lumberyard</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="projectViewContainer" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>36</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>36</height>
</size>
</property>
<layout class="QHBoxLayout" name="projectViewContainer_layout" stretch="0,0,1,0,0">
<property name="spacing">
<number>10</number>
</property>
<property name="leftMargin">
<number>16</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>12</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="currentProjectLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Current project:</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="currentProjectButton">
<property name="text">
<string>Current Project Name</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>1</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">color: &quot;black&quot;</string>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="bodyContainer">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="levelViewFTUEContainer" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>320</width>
<height>16777215</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item alignment="Qt::AlignTop">
<widget class="QWidget" name="levelViewContainer" native="true">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>16</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>16</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="openALevelLabel">
<property name="minimumSize">
<size>
<width>0</width>
<height>48</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>48</height>
</size>
</property>
<property name="text">
<string>Open or create a level</string>
</property>
<property name="indent">
<number>-1</number>
</property>
<property name="fontStyle" stdset="0">
<string>sectionTitle</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="levelViewListContainer" native="true">
<layout class="QVBoxLayout" name="levelViewListContainer_layout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>16</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QListView" name="recentLevelList">
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="spacing">
<number>4</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QWidget" name="horizontalWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="levelControlContainer">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QPushButton" name="newLevelButton">
<property name="text">
<string>New level...</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>24</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="openLevelButton">
<property name="text">
<string>Open level...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QWidget" name="horizontalWidget_2" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="sliceControlContainer">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QPushButton" name="newSliceButton">
<property name="text">
<string>New slice...</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>24</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="openSliceButton">
<property name="text">
<string>Open slice...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line_4">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>1</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">color: &quot;black&quot;</string>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item alignment="Qt::AlignHCenter">
<widget class="QWidget" name="documentationLinkContainer" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>48</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>48</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>10</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="documentationButton">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="text">
<string>info</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/stylesheet/img/UI20/Info.svg</normaloff>:/stylesheet/img/UI20/Info.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="documentationLink">
<property name="text">
<string>Documentation and tutorials</string>
</property>
<property name="class" stdset="0">
<string>link</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line_3">
<property name="maximumSize">
<size>
<width>1</width>
<height>16777215</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">color: &quot;black&quot;</string>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="articleViewContainerRoot" native="true">
<property name="minimumSize">
<size>
<width>480</width>
<height>0</height>
</size>
</property>
<layout class="QVBoxLayout" name="newsContainerLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>1</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">color: &quot;black&quot;</string>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item alignment="Qt::AlignRight">
<widget class="QWidget" name="optionsViewContainer" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>36</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>36</height>
</size>
</property>
<layout class="QHBoxLayout" name="optionsViewContainer_layout">
<property name="spacing">
<number>30</number>
</property>
<property name="leftMargin">
<number>16</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>16</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="autoLoadLevel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Auto-load last opened level on startup</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showOnStartup">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Skip this dialog on startup</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="WelcomeScreenDialog.qrc"/>
</resources>
<connections/>
</ui>
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:53b846352880d940621b14b1ea9514e0a4c95aa6ead4d00234a98684c061c04f
size 29505