/* * Copyright (c) 2022. Saturneric * * This file is part of GpgFrontend. * * GpgFrontend is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GpgFrontend is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GpgFrontend. If not, see . * * The initial version of the source code is inherited from * the gpg4usb project, which is under GPL-3.0-or-later. * * All the source code of GpgFrontend was modified and released by * Saturneric starting on May 12, 2021. * * SPDX-License-Identifier: GPL-3.0-or-later */ #include "GeneralDialog.h" #include #include "spdlog/spdlog.h" #include "ui/struct/SettingsObject.h" GpgFrontend::UI::GeneralDialog::GeneralDialog(std::string name, QWidget *parent) : name_(std::move(name)), QDialog(parent) { slot_restore_settings(); connect(this, &QDialog::finished, this, &GeneralDialog::slot_save_settings); } GpgFrontend::UI::GeneralDialog::~GeneralDialog() = default; void GpgFrontend::UI::GeneralDialog::slot_restore_settings() noexcept { try { SettingsObject general_windows_state(name_ + "_dialog_state"); bool window_save = general_windows_state.Check("window_save", true); // Restore window size & location if (window_save) { int x = general_windows_state.Check("window_pos").Check("x", 100), y = general_windows_state.Check("window_pos").Check("y", 100); pos_ = {x, y}; int width = general_windows_state.Check("window_size").Check("width", 400), height = general_windows_state.Check("window_size").Check("height", 300); size_ = {width, height}; if (this->parent() != nullptr) { QPoint parent_pos = {0, 0}; QSize parent_size = {0, 0}; auto *parent_widget = qobject_cast(this->parent()); if (parent_widget != nullptr) { parent_pos = parent_widget->pos(); parent_size = parent_widget->size(); } auto *parent_dialog = qobject_cast(this->parent()); if (parent_dialog != nullptr) { parent_pos = parent_dialog->pos(); parent_size = parent_dialog->size(); } auto *parent_window = qobject_cast(this->parent()); if (parent_window != nullptr) { parent_pos = parent_window->pos(); parent_size = parent_window->size(); } SPDLOG_DEBUG("parent pos x: {} y: {}", parent_pos.x(), parent_pos.y()); SPDLOG_DEBUG("parent size width: {} height: {}", parent_size.width(), parent_size.height()); SPDLOG_DEBUG("this dialog size width: {} height: {}", size_.width(), size_.height()); } // By default move to center of parent // Or, move to center of screen if (parent() != nullptr) { movePos2CenterOfParent(); } else { movePos2CenterOfScreen(); } this->resize(size_); } } catch (...) { SPDLOG_ERROR(name_, "error"); } } void GpgFrontend::UI::GeneralDialog::slot_save_settings() noexcept { try { SettingsObject general_windows_state(name_ + "_dialog_state"); // window position and size general_windows_state["window_pos"]["x"] = pos().x(); general_windows_state["window_pos"]["y"] = pos().y(); // update size of current dialog size_ = this->size(); general_windows_state["window_size"]["width"] = size_.width(); general_windows_state["window_size"]["height"] = size_.height(); general_windows_state["window_save"] = true; } catch (...) { SPDLOG_ERROR(name_, "error"); } } void GpgFrontend::UI::GeneralDialog::movePos2CenterOfScreen() { auto *screen = QGuiApplication::primaryScreen(); QRect geo = screen->availableGeometry(); int screen_width = geo.width(); int screen_height = geo.height(); SPDLOG_DEBUG("primary screen available geometry", screen_width, screen_height); pos_ = QPoint((screen_width - QWidget::width()) / 2, (screen_height - QWidget::height()) / 2); this->move(pos_); } /** * @brief * */ void GpgFrontend::UI::GeneralDialog::movePos2CenterOfParent() { try { SPDLOG_DEBUG("parent pos x: {} y: {}", parent_pos_.x(), parent_pos_.y()); SPDLOG_DEBUG("parent size width: {}, height: {}", parent_size_.width(), parent_size_.height()); if (parent_pos_ != QPoint{0, 0} && parent_size_ != QSize{0, 0}) { SPDLOG_DEBUG("update current dialog position now"); QPoint parent_center{parent_pos_.x() + parent_size_.width() / 2, parent_pos_.y() + parent_size_.height() / 2}; // update size of current dialog size_ = this->size(); pos_ = {parent_center.x() - size_.width() / 2, parent_center.y() - size_.height() / 2}; SPDLOG_DEBUG("target dialog position, x: {}, y: {}", pos_.x(), pos_.y()); this->move(pos_); } } catch (std::exception &e) { SPDLOG_WARN( "error occurred when move to poition of center of parent, exception: " "{}", e.what()); } catch (...) { SPDLOG_WARN("error occurred when move to poition of center of parent."); } }