- allow to favorite a project and auto load it

- added menu button to exit to project selection
- re ordered settings tabs
This commit is contained in:
T1ti
2024-04-25 23:42:50 +02:00
parent b334b8e39f
commit c9ed5891a6
12 changed files with 801 additions and 601 deletions

View File

@@ -55,7 +55,7 @@ int main(int argc, char *argv[])
noggit->initalize(argc, argv, Command);
auto project_selection = new Noggit::Ui::Windows::NoggitProjectSelectionWindow(noggit);
project_selection->show();
// project_selection->show();
return q_application.exec();
}

View File

@@ -140,8 +140,6 @@ namespace Noggit::Application
);
}
LogError << "std::terminate: " << reason << std::endl;
CloseLogging();
}
bool NoggitApplication::GetCommand(int index)

View File

@@ -46,6 +46,7 @@ namespace Noggit::Application {
}
BlizzardArchive::ClientData* clientData() { return _client_data.get(); }
bool hasClientData() { return _client_data != nullptr; }
void setClientData(std::shared_ptr<BlizzardArchive::ClientData> data) { _client_data = data; }
void initalize(int argc, char* argv[], std::vector<bool> Parser);

View File

@@ -117,6 +117,16 @@ namespace Noggit::Ui::Windows
}
);
auto proj_selec_action(file_menu->addAction("Exit to Project Selection"));
QObject::connect(proj_selec_action, &QAction::triggered, [this]
{
auto noggit = Noggit::Application::NoggitApplication::instance();
auto project_selection = new Noggit::Ui::Windows::NoggitProjectSelectionWindow(noggit);
project_selection->show();
close();
}
);
_menuBar->adjustSize();
_buildMapListComponent = std::make_unique<Component::BuildMapListComponent>();

View File

@@ -23,6 +23,73 @@ NoggitProjectSelectionWindow::NoggitProjectSelectionWindow(Noggit::Application::
{
setWindowFlags(Qt::Window | Qt::MSWindowsFixedSizeDialogHint);
////////////////////////////
// auto load favorite project
QSettings settings;
int favorite_proj_idx = settings.value("favorite_project", -1).toInt();
bool load_favorite = settings.value("auto_load_fav_project", true).toBool();
// if it has client data, it means it already loaded before and we exited through the menu, skip autoloading favorite
if (noggit_app->hasClientData())
load_favorite = false;
if (load_favorite && favorite_proj_idx != -1)
{
Log << "Auto loading favorite project index : " << favorite_proj_idx << std::endl;
int size = settings.beginReadArray("recent_projects");
QString project_final_path;
// for (int i = 0; i < size; ++i)
if (size > favorite_proj_idx)
{
settings.setArrayIndex(favorite_proj_idx);
std::filesystem::path project_path = settings.value("project_path").toString().toStdString().c_str();
if (std::filesystem::exists(project_path) && std::filesystem::is_directory(project_path))
{
auto project_reader = Noggit::Project::ApplicationProjectReader();
auto project = project_reader.readProject(project_path);
if (project.has_value())
{
// project->projectVersion;
// project_directory = QString::fromStdString(project_path.generic_string());
// auto project_name = QString::fromStdString(project->ProjectName);
project_final_path = QString(project_path.string().c_str());
}
}
}
settings.endArray();
if (!project_final_path.isEmpty())
{
auto selected_project = _load_project_component->loadProject(this, project_final_path);
if (!selected_project)
{
LogError << "Selected Project is null, favorite loading failed." << std::endl;
}
else
{
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();
return;
}
}
}
///////////////////////////
_ui->setupUi(this);
_ui->label->setObjectName("title");
@@ -70,6 +137,7 @@ NoggitProjectSelectionWindow::NoggitProjectSelectionWindow(Noggit::Application::
return;
Component::CreateProjectComponent::createProject(this, project_reference);
resetFavoriteProject();
Component::RecentProjectsComponent::buildRecentProjectsList(this);
});
@@ -163,7 +231,7 @@ NoggitProjectSelectionWindow::NoggitProjectSelectionWindow(Noggit::Application::
});
}*/
auto _set = new QSettings(this);
// auto _set = new QSettings(this);
//auto first_changelog = _set->value("first_changelog", false);
// force-changelog
@@ -178,7 +246,7 @@ NoggitProjectSelectionWindow::NoggitProjectSelectionWindow(Noggit::Application::
_set->sync();
}
}*/
show();
}
void NoggitProjectSelectionWindow::handleContextMenuProjectListItemDelete(std::string const& project_path)
@@ -208,6 +276,7 @@ void NoggitProjectSelectionWindow::handleContextMenuProjectListItemDelete(std::s
default:
break;
}
resetFavoriteProject();
Component::RecentProjectsComponent::buildRecentProjectsList(this);
}
@@ -236,9 +305,25 @@ void NoggitProjectSelectionWindow::handleContextMenuProjectListItemForget(std::s
break;
}
resetFavoriteProject();
Component::RecentProjectsComponent::buildRecentProjectsList(this);
}
void Noggit::Ui::Windows::NoggitProjectSelectionWindow::handleContextMenuProjectListItemFavorite(int index)
{
QSettings settings;
settings.sync();
settings.setValue("favorite_project", index);
Component::RecentProjectsComponent::buildRecentProjectsList(this);
}
void Noggit::Ui::Windows::NoggitProjectSelectionWindow::resetFavoriteProject()
{
QSettings settings;
settings.sync();
settings.setValue("favorite_project", -1);
}
NoggitProjectSelectionWindow::~NoggitProjectSelectionWindow()
{
delete _ui;

View File

@@ -56,6 +56,9 @@ namespace Noggit::Ui::Windows
void handleContextMenuProjectListItemDelete(std::string const& project_path);
void handleContextMenuProjectListItemForget(std::string const& project_path);
void handleContextMenuProjectListItemFavorite(int index);
void resetFavoriteProject();
};
}
#endif // NOGGITREDPROJECTPAGE_H

View File

@@ -21,12 +21,22 @@ namespace Noggit::Ui::Component
friend Windows::NoggitProjectSelectionWindow;
public:
std::shared_ptr<Project::NoggitProject> loadProject(Noggit::Ui::Windows::NoggitProjectSelectionWindow* parent)
std::shared_ptr<Project::NoggitProject> loadProject(Noggit::Ui::Windows::NoggitProjectSelectionWindow* parent, QString force_project_path = "")
{
QString project_path;
if (!force_project_path.isEmpty())
project_path = force_project_path;
else
{
QModelIndex index = parent->_ui->listView->currentIndex();
project_path = index.data(Qt::UserRole).toString();
}
auto application_configuration = parent->_noggit_application->getConfiguration();
auto application_projects_folder_path = std::filesystem::path(application_configuration->ApplicationProjectPath);
QString project_path = index.data(Qt::UserRole).toString();
// auto application_projects_folder_path = std::filesystem::path(application_configuration->ApplicationProjectPath);
auto application_project_service = Noggit::Project::ApplicationProject(application_configuration);
if (!QDir(project_path).exists())

View File

@@ -5,6 +5,7 @@
#include <QList>
#include <filesystem>
#include <QDesktopServices>
#include <QSettings>
using namespace Noggit::Ui::Component;
@@ -13,9 +14,11 @@ void RecentProjectsComponent::buildRecentProjectsList(Noggit::Ui::Windows::Noggi
{
parent->_ui->listView->clear();
auto application_configuration = parent->_noggit_application->getConfiguration();
// auto application_configuration = parent->_noggit_application->getConfiguration();
QSettings settings;
settings.sync();
int favorite_proj_idx = settings.value("favorite_project", -1).toInt();
int size = settings.beginReadArray("recent_projects");
for (int i = 0; i < size; ++i)
@@ -40,6 +43,7 @@ void RecentProjectsComponent::buildRecentProjectsList(Noggit::Ui::Windows::Noggi
project_data.project_directory = QString::fromStdString(project_path.generic_string());
project_data.project_name = QString::fromStdString(project->ProjectName);
project_data.project_last_edited = QDateTime::currentDateTime().date().toString();
project_data.is_favorite = favorite_proj_idx == i ? true : false;
auto project_list_item = new Noggit::Ui::Widget::ProjectListItem(project_data, parent->_ui->listView);
@@ -93,6 +97,48 @@ void RecentProjectsComponent::buildRecentProjectsList(Noggit::Ui::Windows::Noggi
});
context_menu.addAction(&action_4);
// if (!project_data.is_favorite)
QAction action_5("Favorite Project(auto load)", project_list_item);
auto fav_icon = QIcon();
fav_icon.addPixmap(FontAwesomeIcon(FontAwesome::star).pixmap(QSize(16, 16)));
action_5.setIcon(fav_icon);
if (project_data.is_favorite)
action_5.setText("Unfavorite Project");
QObject::connect(&action_5, &QAction::triggered, [=]()
{
if (!project_data.is_favorite)
parent->handleContextMenuProjectListItemFavorite(i);
else
parent->handleContextMenuProjectListItemFavorite(-1);
// QSettings settings;
// if (!project_data.is_favorite)
// settings.setValue("favorite_project", i);
// else
// settings.setValue("favorite_project", -1);
// buildRecentProjectsList(parent);
});
context_menu.addAction(&action_5);
// else
// {
// QAction action_6("Unfavorite Project", project_list_item);
// auto fav_icon = QIcon();
// fav_icon.addPixmap(FontAwesomeIcon(FontAwesome::star).pixmap(QSize(16, 16)));
// action_6.setIcon(fav_icon);
//
// QObject::connect(&action_6, &QAction::triggered, [=]()
// {
// // TODO
// // parent->handleContextMenuProjectListItemFavorite();
// QSettings settings;
// settings.setValue("favorite_project", -1);
// // project_data.is_favorite = false;
// });
// context_menu.addAction(&action_6);
// }
/////
context_menu.exec(project_list_item->mapToGlobal(pos));
});

View File

@@ -27,6 +27,7 @@ namespace Noggit::Ui::Widget
_project_directory_label->setGeometry(48, 20, max_width, 20);
_project_directory_label->setObjectName("project-information");
_project_directory_label->setStyleSheet("QLabel#project-information { font-size: 10px; }");
_project_directory_label->setToolTip(data.project_directory);
auto directory_effect = new QGraphicsOpacityEffect(this);
directory_effect->setOpacity(0.5);
@@ -64,6 +65,25 @@ namespace Noggit::Ui::Widget
_project_last_edited_label->setGraphicsEffect(last_edited_effect);
_project_last_edited_label->setAutoFillBackground(true);
if (data.is_favorite)
{
_project_favorite_icon = new QLabel("", this);
_project_favorite_icon->setPixmap(FontAwesomeIcon(FontAwesome::star).pixmap(QSize(16, 16)));
_project_favorite_icon->setGeometry(max_width-10, 10, 125, 20);
_project_favorite_icon->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
_project_favorite_icon->setObjectName("project-favorite");
_project_favorite_icon->setStyleSheet("QLabel#project-information { font-size: 10px; }");
auto colour = new QGraphicsColorizeEffect(this);
colour->setColor(QColor(255, 204, 0));
colour->setStrength(1.0f);
_project_favorite_icon->setGraphicsEffect(colour);
_project_favorite_icon->setAutoFillBackground(true);
layout.addWidget(_project_favorite_icon);
}
setContextMenuPolicy(Qt::CustomContextMenu);
layout.addWidget(_project_version_icon);

View File

@@ -17,6 +17,7 @@ namespace Noggit::Ui::Widget
QString project_directory;
QString project_last_edited;
Project::ProjectVersion project_version;
bool is_favorite;
};
class ProjectListItem : public QWidget
@@ -28,6 +29,7 @@ namespace Noggit::Ui::Widget
QLabel* _project_directory_label;
QLabel* _project_version_label;
QLabel* _project_last_edited_label;
QLabel* _project_favorite_icon;
public:
ProjectListItem(const ProjectListItemData& data, QWidget* parent);
QSize minimumSizeHint() const override;

View File

@@ -192,6 +192,7 @@ namespace Noggit
ui->_adt_unload_dist->setValue(_settings->value("unload_dist", 5).toInt());
ui->_adt_unload_check_interval->setValue(_settings->value("unload_interval", 5).toInt());
ui->_uid_cb->setChecked(_settings->value("uid_startup_check", true).toBool());
ui->_load_fav_cb->setChecked(_settings->value("auto_load_fav_project", true).toBool());
ui->_systemWindowFrame->setChecked(_settings->value("systemWindowFrame", true).toBool());
ui->_nativeMenubar->setChecked(_settings->value("nativeMenubar", true).toBool());
ui->_classic_ui->setChecked(_settings->value("classicUI", false).toBool());
@@ -275,6 +276,7 @@ namespace Noggit
_settings->setValue("unload_dist", ui->_adt_unload_dist->value());
_settings->setValue("unload_interval", ui->_adt_unload_check_interval->value());
_settings->setValue("uid_startup_check", ui->_uid_cb->isChecked());
_settings->setValue("auto_load_fav_project", ui->_load_fav_cb->isChecked());
_settings->setValue("additional_file_loading_log", ui->_additional_file_loading_log->isChecked());
_settings->setValue("keyboard_locale", ui->_keyboard_locale->currentText());
_settings->setValue("systemWindowFrame", ui->_systemWindowFrame->isChecked());

File diff suppressed because it is too large Load Diff