aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2023-07-14 14:28:47 +0000
committerSaturneric <[email protected]>2023-07-14 14:28:47 +0000
commitd5b2b3f5d31d1ff2d013d0df4cf8fe138c94d315 (patch)
tree1ebd3944775d60594a0031a598c8a6992920f75a
parentfix: reduce debug log of core (diff)
downloadGpgFrontend-d5b2b3f5d31d1ff2d013d0df4cf8fe138c94d315.tar.gz
GpgFrontend-d5b2b3f5d31d1ff2d013d0df4cf8fe138c94d315.zip
fix: slove position and size resotre issues
-rw-r--r--src/ui/dialog/GeneralDialog.cpp184
-rw-r--r--src/ui/dialog/GeneralDialog.h24
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