diff options
author | Saturneric <[email protected]> | 2023-07-14 14:28:47 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2023-07-14 14:28:47 +0000 |
commit | d5b2b3f5d31d1ff2d013d0df4cf8fe138c94d315 (patch) | |
tree | 1ebd3944775d60594a0031a598c8a6992920f75a | |
parent | fix: reduce debug log of core (diff) | |
download | GpgFrontend-d5b2b3f5d31d1ff2d013d0df4cf8fe138c94d315.tar.gz GpgFrontend-d5b2b3f5d31d1ff2d013d0df4cf8fe138c94d315.zip |
fix: slove position and size resotre issues
-rw-r--r-- | src/ui/dialog/GeneralDialog.cpp | 184 | ||||
-rw-r--r-- | src/ui/dialog/GeneralDialog.h | 24 |
2 files changed, 122 insertions, 86 deletions
diff --git a/src/ui/dialog/GeneralDialog.cpp b/src/ui/dialog/GeneralDialog.cpp index 90c56b8a..71a8f5c7 100644 --- a/src/ui/dialog/GeneralDialog.cpp +++ b/src/ui/dialog/GeneralDialog.cpp @@ -39,37 +39,37 @@ GpgFrontend::UI::GeneralDialog::~GeneralDialog() = default; void GpgFrontend::UI::GeneralDialog::slot_restore_settings() noexcept { try { - SettingsObject general_windows_state(name_ + "_dialog_state"); + update_rect_cache(); - bool window_save = general_windows_state.Check("window_save", true); + SettingsObject general_windows_state(name_ + "_dialog_state"); + bool window_save = general_windows_state.Check("window_save", false); // 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); + int x = general_windows_state.Check("window_pos").Check("x", 0), + y = general_windows_state.Check("window_pos").Check("y", 0); + SPDLOG_DEBUG("stored dialog pos, x: {}, y: {}", x, y); - pos_ = {x, y}; + QPoint relative_pos = {x, y}; + QPoint pos = parent_rect_.topLeft() + relative_pos; + SPDLOG_DEBUG("relative dialog pos, x: {}, y: {}", relative_pos.x(), + relative_pos.y()); - int width = - general_windows_state.Check("window_size").Check("width", 400), + int width = general_windows_state.Check("window_size").Check("width", 0), height = - general_windows_state.Check("window_size").Check("height", 247); - - size_ = {width, height}; + general_windows_state.Check("window_size").Check("height", 0); + SPDLOG_DEBUG("stored dialog size, width: {}, height: {}", width, height); // check for valid - if (!pos_.isNull() && pos_.x() > 50 && pos_.y() > 50 && size_.isValid()) { - this->move(pos_); - this->resize(size_); - return; + if (width > 0 && height > 0) { + this->resize(width, height); + this->move(pos); + this->rect_restored_ = true; } } - // default action - movePosition2CenterOfParent(); - } catch (...) { - SPDLOG_ERROR(name_, "error"); + SPDLOG_ERROR("error at restoring settings"); } } @@ -77,15 +77,22 @@ 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_rect_cache(); + + SPDLOG_DEBUG("dialog pos, x: {}, y: {}", rect_.x(), rect_.y()); + SPDLOG_DEBUG("dialog size, width: {}, height: {}", rect_.width(), + rect_.height()); - // update size of current dialog - size_ = this->size(); + // window position relative to parent + auto relative_pos = rect_.topLeft() - parent_rect_.topLeft(); + SPDLOG_DEBUG("store dialog pos, x: {}, y: {}", relative_pos.x(), + relative_pos.y()); - general_windows_state["window_size"]["width"] = size_.width(); - general_windows_state["window_size"]["height"] = size_.height(); + general_windows_state["window_pos"]["x"] = relative_pos.x(); + general_windows_state["window_pos"]["y"] = relative_pos.y(); + + general_windows_state["window_size"]["width"] = rect_.width(); + general_windows_state["window_size"]["height"] = rect_.height(); general_windows_state["window_save"] = true; } catch (...) { @@ -102,9 +109,9 @@ void GpgFrontend::UI::GeneralDialog::setPosCenterOfScreen() { 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_); + // update rect of current dialog + rect_ = this->geometry(); + this->move(geo.center() - rect_.center()); } /** @@ -112,71 +119,84 @@ void GpgFrontend::UI::GeneralDialog::setPosCenterOfScreen() { * */ void GpgFrontend::UI::GeneralDialog::movePosition2CenterOfParent() { + // update cache + update_rect_cache(); + + // log for debug + SPDLOG_DEBUG("parent pos x: {} y: {}", parent_rect_.x(), parent_rect_.y()); + SPDLOG_DEBUG("parent size width: {}, height: {}", parent_rect_.width(), + parent_rect_.height()); + SPDLOG_DEBUG("parent center pos x: {}, y: {}", parent_rect_.center().x(), + parent_rect_.center().y()); + SPDLOG_DEBUG("dialog pos x: {} y: {}", rect_.x(), rect_.y()); + SPDLOG_DEBUG("dialog size width: {} height: {}", rect_.width(), + rect_.height()); + + if (parent_rect_.topLeft() != QPoint{0, 0} && + parent_rect_.size() != QSize{0, 0}) { + if (rect_.width() <= 0) rect_.setWidth(100); + if (rect_.height() <= 0) rect_.setHeight(100); + + QPoint target_position = + parent_rect_.center() - QPoint(rect_.width() / 2, rect_.height() / 2); + + SPDLOG_DEBUG("update position to parent's center, target pos, x:{}, y: {}", + target_position.x(), target_position.y()); + + this->move(target_position); + } else { + setPosCenterOfScreen(); + } +} + +/** + * + */ +void GpgFrontend::UI::GeneralDialog::update_rect_cache() { + // update size of current dialog + rect_ = this->geometry(); + // read pos and size from parent if (this->parent() != nullptr) { - QPoint parent_pos = {0, 0}; - QSize parent_size = {0, 0}; + QRect parent_rect; auto *parent_widget = qobject_cast<QWidget *>(this->parent()); if (parent_widget != nullptr) { - parent_pos = parent_widget->pos(); - parent_size = parent_widget->size(); - } - - auto *parent_dialog = qobject_cast<QDialog *>(this->parent()); - if (parent_dialog != nullptr) { - parent_pos = parent_dialog->pos(); - parent_size = parent_dialog->size(); - } - - auto *parent_window = qobject_cast<QMainWindow *>(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()); - - if (parent_pos != QPoint{0, 0}) { - QPoint parent_center{parent_pos.x() + parent_size.width() / 2, - parent_pos.y() + parent_size.height() / 2}; - - pos_ = {parent_center.x() - size_.width() / 2, - parent_center.y() - size_.height() / 2}; - - // record parent_pos_ - this->parent_pos_ = parent_pos; - this->parent_size_ = parent_size; + parent_rect = parent_widget->geometry(); + } else { + auto *parent_dialog = qobject_cast<QDialog *>(this->parent()); + if (parent_dialog != nullptr) { + parent_rect = parent_dialog->geometry(); + } else { + auto *parent_window = qobject_cast<QMainWindow *>(this->parent()); + if (parent_window != nullptr) { + parent_rect = parent_window->geometry(); + } + } } + parent_rect_ = parent_rect; } else { // reset parent's pos and size - this->parent_pos_ = QPoint{0, 0}; - this->parent_size_ = QSize{0, 0}; + this->parent_rect_ = QRect{0, 0, 0, 0}; } +} - // log for debug - SPDLOG_DEBUG("parent pos x: {} y: {}", parent_pos_.x(), parent_pos_.y()); - SPDLOG_DEBUG("parent size width: {}", parent_size_.width(), - "height:", parent_size_.height()); +/** + * @brief + * + */ +bool GpgFrontend::UI::GeneralDialog::isRectRestored() { return rect_restored_; } - 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}; +/** + * @brief + * + */ +void GpgFrontend::UI::GeneralDialog::showEvent(QShowEvent *event) { + SPDLOG_DEBUG("General Dialog named {} is about to show, caught show event", + name_); - // update size of current dialog - size_ = this->size(); + // default position strategy + if (!isRectRestored()) movePosition2CenterOfParent(); - pos_ = {parent_center.x() - size_.width() / 2, - parent_center.y() - size_.height() / 2}; - this->move(pos_); - } else { - setPosCenterOfScreen(); - } + QWidget::showEvent(event); }
\ No newline at end of file diff --git a/src/ui/dialog/GeneralDialog.h b/src/ui/dialog/GeneralDialog.h index 41018105..1e265a8e 100644 --- a/src/ui/dialog/GeneralDialog.h +++ b/src/ui/dialog/GeneralDialog.h @@ -57,6 +57,18 @@ class GeneralDialog : public QDialog { */ void movePosition2CenterOfParent(); + /** + * @brief + * + */ + [[nodiscard]] bool isRectRestored(); + + /** + * @brief + * + */ + void showEvent(QShowEvent* event) override; + private slots: /** * @@ -69,11 +81,15 @@ class GeneralDialog : public QDialog { void slot_save_settings() noexcept; private: + /** + * + */ + void update_rect_cache(); + std::string name_; ///< - QPoint pos_; ///< - QSize size_; ///< - QPoint parent_pos_; - QSize parent_size_; + QRect rect_; + QRect parent_rect_; + bool rect_restored_ = false; }; } // namespace GpgFrontend::UI |