Files
noggit-red/src/noggit/ui/windows/projectSelection/NoggitProjectSelectionWindow.cpp

247 lines
8.8 KiB
C++
Executable File

#include <noggit/ui/windows/projectSelection/NoggitProjectSelectionWindow.hpp>
#include <noggit/ui/windows/projectSelection/components/RecentProjectsComponent.hpp>
#include <noggit/ui/windows/projectSelection/components/CreateProjectComponent.hpp>
#include <noggit/ui/windows/projectSelection/components/LoadProjectComponent.hpp>
#include <noggit/project/CurrentProject.hpp>
#include <noggit/Log.h>
#include <filesystem>
#include <QString>
#include <QFile>
#include <noggit/ui/FontNoggit.hpp>
#include "ui_NoggitProjectSelectionWindow.h"
using namespace Noggit::Ui::Windows;
NoggitProjectSelectionWindow::NoggitProjectSelectionWindow(Noggit::Application::NoggitApplication* noggit_app,
QWidget* parent)
: QMainWindow(parent)
, _ui(new ::Ui::NoggitProjectSelectionWindow)
, _noggit_application(noggit_app)
{
setWindowFlags(Qt::Window | Qt::MSWindowsFixedSizeDialogHint);
_ui->setupUi(this);
_ui->label->setObjectName("title");
_ui->label->setStyleSheet("QLabel#title { font-size: 18px; padding: 0px; }");
_ui->label_2->setObjectName("title");
_ui->label_2->setStyleSheet("QLabel#title { font-size: 18px; padding: 0px; }");
_settings = new Noggit::Ui::settings(this);
//_changelog = new Noggit::Ui::CChangelog(this);
_load_project_component = std::make_unique<Component::LoadProjectComponent>();
_ui->settings_button->setIcon(Noggit::Ui::FontAwesomeIcon(Noggit::Ui::FontAwesome::Icons::cog));
_ui->settings_button->setIconSize(QSize(20,20));
_ui->changelog_button->hide();
//_ui->changelog_button->setIcon(Noggit::Ui::FontAwesomeIcon(Noggit::Ui::FontAwesome::Icons::file));
//_ui->changelog_button->setIconSize(QSize(20, 20));
//_ui->changelog_button->setText(tr(" Changelog"));
//_ui->changelog_button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
Component::RecentProjectsComponent::buildRecentProjectsList(this);
QObject::connect(_ui->settings_button, &QToolButton::clicked, [&]
{
_settings->show();
}
);
/*QObject::connect(_ui->changelog_button, &QToolButton::clicked, [&]()
{
_changelog->SelectFirst();
_changelog->show();
});*/
QObject::connect(_ui->button_create_new_project, &QPushButton::clicked, [=, this]
{
ProjectInformation project_reference;
NoggitProjectCreationDialog project_creation_dialog(project_reference, this);
QObject::connect(&project_creation_dialog, &QDialog::finished, [&project_reference, this](int result)
{
if (result != QDialog::Accepted)
return;
Component::CreateProjectComponent::createProject(this, project_reference);
Component::RecentProjectsComponent::buildRecentProjectsList(this);
});
project_creation_dialog.exec();
project_creation_dialog.setFixedSize(project_creation_dialog.size());
}
);
QObject::connect(_ui->button_open_existing_project, &QPushButton::clicked, [=]
{
auto project_reader = Noggit::Project::ApplicationProjectReader();
QString proj_file = QFileDialog::getOpenFileName(this, "Open File",
"/",
"*.noggitproj");
if (proj_file.isEmpty())
{
QMessageBox::critical(this, "Error", "Failed to read project: project file is empty");
return;
}
std::filesystem::path filepath(proj_file.toStdString());
auto project = project_reader.readProject(filepath.parent_path());
if (!project.has_value())
{
QMessageBox::critical(this, "Error", "Failed to read project");
return;
}
Component::RecentProjectsComponent::registerProjectChange(filepath.parent_path().string());
auto application_configuration = _noggit_application->getConfiguration();
auto application_projects_folder_path = std::filesystem::path(application_configuration->ApplicationProjectPath);
auto application_project_service = Noggit::Project::ApplicationProject(application_configuration);
auto project_to_launch = application_project_service.loadProject(filepath.parent_path());
if (!project_to_launch)
{
return;
}
Noggit::Application::NoggitApplication::instance()->setClientData(project_to_launch->ClientData);
Noggit::Project::CurrentProject::initialize(project_to_launch.get());
_project_selection_page = std::make_unique<Noggit::Ui::Windows::NoggitWindow>(
_noggit_application->getConfiguration(),
project_to_launch);
_project_selection_page->showMaximized();
close();
}
);
QObject::connect(_ui->listView, &QListView::doubleClicked, [=]
{
auto selected_project = _load_project_component->loadProject(this);
if (!selected_project)
{
LogError << "Selected Project is null, loading failed." << std::endl;
return;
}
Noggit::Project::CurrentProject::initialize(selected_project.get());
_project_selection_page = std::make_unique<Noggit::Ui::Windows::NoggitWindow>(
_noggit_application->getConfiguration(),
selected_project);
_project_selection_page->showMaximized();
close();
}
);
// !disable-update && !force-changelog
/*if (!_noggit_application->GetCommand(0) && !_noggit_application->GetCommand(1))
{
_updater = new Noggit::Ui::CUpdater(this);
QObject::connect(_updater, &CUpdater::OpenUpdater, [=]()
{
_updater->setModal(true);
_updater->show();
});
}*/
auto _set = new QSettings(this);
//auto first_changelog = _set->value("first_changelog", false);
// force-changelog
/*if (_noggit_application->GetCommand(1) || !first_changelog.toBool())
{
_changelog->setModal(true);
_changelog->show();
if (!first_changelog.toBool())
{
_set->setValue("first_changelog", true);
_set->sync();
}
}*/
}
void NoggitProjectSelectionWindow::handleContextMenuProjectListItemDelete(std::string const& project_path)
{
QMessageBox prompt;
prompt.setWindowIcon(QIcon(":/icon"));
prompt.setWindowTitle("Delete Project");
prompt.setIcon(QMessageBox::Warning);
prompt.setWindowFlags(Qt::WindowStaysOnTopHint);
prompt.setText("Deleting a project will remove all saved data. Do you want to continue?");
prompt.addButton("Accept", QMessageBox::AcceptRole);
prompt.setDefaultButton(prompt.addButton("Cancel", QMessageBox::RejectRole));
prompt.setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);
prompt.exec();
switch (prompt.buttonRole(prompt.clickedButton()))
{
case QMessageBox::AcceptRole:
{
Component::RecentProjectsComponent::registerProjectRemove(project_path);
QFile folder(project_path.c_str());
folder.moveToTrash();
break;
}
case QMessageBox::DestructiveRole:
default:
break;
}
Component::RecentProjectsComponent::buildRecentProjectsList(this);
}
void NoggitProjectSelectionWindow::handleContextMenuProjectListItemForget(std::string const& project_path)
{
QMessageBox prompt;
prompt.setWindowIcon(QIcon(":/icon"));
prompt.setWindowTitle("Forget Project");
prompt.setIcon(QMessageBox::Warning);
prompt.setWindowFlags(Qt::WindowStaysOnTopHint);
prompt.setText("Data on the disk will not be removed, this action will only hide the project. Continue?.");
prompt.addButton("Accept", QMessageBox::AcceptRole);
prompt.setDefaultButton(prompt.addButton("Cancel", QMessageBox::RejectRole));
prompt.setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);
prompt.exec();
switch (prompt.buttonRole(prompt.clickedButton()))
{
case QMessageBox::AcceptRole:
Component::RecentProjectsComponent::registerProjectRemove(project_path);
break;
case QMessageBox::DestructiveRole:
default:
break;
}
Component::RecentProjectsComponent::buildRecentProjectsList(this);
}
NoggitProjectSelectionWindow::~NoggitProjectSelectionWindow()
{
delete _ui;
}