From 3642cff1206b3d8654ee2dbf782405bd93dbe9c3 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 5 Aug 2023 23:20:46 +0200 Subject: [PATCH] Implemented relative mode for marker browser config. Can read existing config. --- src/laybasic/laybasic/layMargin.cc | 16 +++-- src/laybasic/laybasic/layMargin.h | 13 ++++ src/layui/layui/MarkerBrowserConfigPage.ui | 48 ++++++-------- src/layui/layui/layWidgets.cc | 75 ++++++++++++++++++++++ src/layui/layui/layWidgets.h | 27 ++++++++ src/layui/layui/rdbMarkerBrowser.cc | 16 ++--- src/layui/layui/rdbMarkerBrowserDialog.cc | 5 +- src/layui/layui/rdbMarkerBrowserDialog.h | 3 +- src/layui/layui/rdbMarkerBrowserPage.cc | 10 +-- src/layui/layui/rdbMarkerBrowserPage.h | 5 +- 10 files changed, 169 insertions(+), 49 deletions(-) diff --git a/src/laybasic/laybasic/layMargin.cc b/src/laybasic/laybasic/layMargin.cc index f6e88b22b..f03b193d4 100644 --- a/src/laybasic/laybasic/layMargin.cc +++ b/src/laybasic/laybasic/layMargin.cc @@ -28,6 +28,8 @@ namespace lay { +static const double delta = 1e-10; + Margin::Margin (double value, bool relative) : m_relative_value (0.0), m_absolute_value (0.0), m_relative_mode (relative) { @@ -38,21 +40,27 @@ Margin::Margin (double value, bool relative) } } +bool +Margin::operator== (const lay::Margin &other) const +{ + return m_relative_mode == other.m_relative_mode && + fabs (m_absolute_value - other.m_absolute_value) < delta && + fabs (m_relative_value - other.m_relative_value) < delta; +} + std::string Margin::to_string () const { - const double min_value = 1e-10; - std::string res; if (m_relative_mode) { res = std::string ("*") + tl::to_string (m_relative_value); - if (fabs (m_absolute_value) > min_value) { + if (fabs (m_absolute_value) > delta) { res += " "; res += tl::to_string (m_absolute_value); } } else { res = tl::to_string (m_absolute_value); - if (fabs (m_relative_value) > min_value) { + if (fabs (m_relative_value) > delta) { res += " *"; res += tl::to_string (m_relative_value); } diff --git a/src/laybasic/laybasic/layMargin.h b/src/laybasic/laybasic/layMargin.h index 5b8959dd4..a971f0c47 100644 --- a/src/laybasic/laybasic/layMargin.h +++ b/src/laybasic/laybasic/layMargin.h @@ -49,6 +49,19 @@ public: */ Margin (double value = 0.0, bool relative = false); + /** + * @brief Equality + */ + bool operator== (const lay::Margin &other) const; + + /** + * @brief Inequality + */ + bool operator!= (const lay::Margin &other) const + { + return ! operator== (other); + } + /** * @brief Gets the relative value */ diff --git a/src/layui/layui/MarkerBrowserConfigPage.ui b/src/layui/layui/MarkerBrowserConfigPage.ui index 7b05fea4e..227942cc4 100644 --- a/src/layui/layui/MarkerBrowserConfigPage.ui +++ b/src/layui/layui/MarkerBrowserConfigPage.ui @@ -17,7 +17,7 @@ 6 - + 9 @@ -26,14 +26,15 @@ Marker Browser - - 9 - 6 - - + + + + Maximum number of markers to show + + @@ -87,7 +88,7 @@ - + @@ -116,20 +117,6 @@ - - - - false - - - - - - - Maximum number of markers to show - - - @@ -137,12 +124,11 @@ - - - - µm - - + + + + + @@ -150,6 +136,14 @@ + + + lay::MarginWidget + QWidget +
layWidgets.h
+ 1 +
+
diff --git a/src/layui/layui/layWidgets.cc b/src/layui/layui/layWidgets.cc index fafdf6b53..ea442974c 100644 --- a/src/layui/layui/layWidgets.cc +++ b/src/layui/layui/layWidgets.cc @@ -1077,6 +1077,81 @@ ColorButton::browse_selected () } } +// ------------------------------------------------------------- +// MarginWidget implementation + +MarginWidget::MarginWidget (QWidget *parent, const char *name) + : QFrame (parent) +{ + if (name) { + setObjectName (name); + } + + setFrameStyle (QFrame::NoFrame); + + QHBoxLayout *layout = new QHBoxLayout (this); + layout->setMargin (0); + + QLineEdit *le = new QLineEdit (this); + mp_abs_edit = le; + le->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Preferred)); + layout->addWidget (le); + + le = new QLineEdit (this); + mp_rel_edit = le; + le->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Preferred)); + layout->addWidget (le); + + QComboBox *mode = new QComboBox (this); + mode->addItem (tl::to_qstring ("µm")); + mode->addItem (tl::to_qstring ("%")); + mode->setCurrentIndex (0); + mp_mode_cb = mode; + layout->addWidget (mode); + + connect (mode, SIGNAL (currentIndexChanged (int)), this, SLOT (mode_selection_changed ())); + + mode_selection_changed (); +} + +lay::Margin +MarginWidget::get_margin () const +{ + bool rel_mode = mp_mode_cb->currentIndex () == 1; + double rel = 0.0, abs = 0.0; + tl::from_string (tl::to_string (mp_rel_edit->text ()), rel); + tl::from_string (tl::to_string (mp_abs_edit->text ()), abs); + + lay::Margin m; + m.set_relative_mode (rel_mode); + m.set_absolute_value (abs); + m.set_relative_value (rel * 0.01); + return m; +} + +void +MarginWidget::set_margin (const lay::Margin &margin) +{ + mp_abs_edit->setText (tl::to_qstring (tl::to_string (margin.absolute_value ()))); + mp_rel_edit->setText (tl::to_qstring (tl::to_string (margin.relative_value () * 100.0))); + mp_mode_cb->setCurrentIndex (margin.relative_mode () ? 1 : 0); + mode_selection_changed (); +} + +void +MarginWidget::mode_selection_changed () +{ + bool rel_mode = mp_mode_cb->currentIndex () == 1; + // NOTE: first hiding and then showing avoids layout flicker .. + mp_rel_edit->hide (); + mp_abs_edit->hide (); + if (rel_mode) { + mp_rel_edit->show (); + } else { + mp_abs_edit->show (); + } +} + // ------------------------------------------------------------- // DecoratedLineEdit implementation diff --git a/src/layui/layui/layWidgets.h b/src/layui/layui/layWidgets.h index 8fc1a8a1e..27efab690 100644 --- a/src/layui/layui/layWidgets.h +++ b/src/layui/layui/layWidgets.h @@ -26,6 +26,7 @@ #define HDR_layWidgets #include "layuiCommon.h" +#include "layMargin.h" #include "tlObject.h" #include "tlDeferredExecution.h" @@ -316,6 +317,32 @@ private slots: virtual void selected (); }; +/** + * @brief Margin edit box + * + * This class implements a special widget to edit a lay::Margin object. + * This object allows specification of a relative or absolute margin. + */ +class LAYUI_PUBLIC MarginWidget + : public QFrame +{ +Q_OBJECT + +public: + MarginWidget (QWidget *parent, const char *name = 0); + + lay::Margin get_margin () const; + void set_margin (const lay::Margin &margin); + +protected slots: + void mode_selection_changed (); + +private: + QLineEdit *mp_abs_edit; + QLineEdit *mp_rel_edit; + QComboBox *mp_mode_cb; +}; + /** * @brief Color chooser button * diff --git a/src/layui/layui/rdbMarkerBrowser.cc b/src/layui/layui/rdbMarkerBrowser.cc index e7bc8e8e3..95af622e7 100644 --- a/src/layui/layui/rdbMarkerBrowser.cc +++ b/src/layui/layui/rdbMarkerBrowser.cc @@ -28,6 +28,7 @@ #include "layConverters.h" #include "layDispatcher.h" #include "layUtils.h" +#include "layMargin.h" #include "ui_MarkerBrowserConfigPage.h" #include "ui_MarkerBrowserConfigPage2.h" @@ -159,9 +160,11 @@ MarkerBrowserConfigPage::setup (lay::Dispatcher *root) mp_ui->cbx_window->setCurrentIndex (int (wmode)); // window dimension - double wdim = 1.0; - root->config_get (cfg_rdb_window_dim, wdim); - mp_ui->le_window->setText (tl::to_qstring (tl::to_string (wdim))); + lay::Margin wdim (1.0); + std::string wdim_str = wdim.to_string (); + root->config_get (cfg_rdb_window_dim, wdim_str); + wdim = lay::Margin::from_string (wdim_str); + mp_ui->mgn_window->set_margin (wdim); // max. marker count unsigned int max_marker_count = 1000; @@ -175,21 +178,18 @@ MarkerBrowserConfigPage::setup (lay::Dispatcher *root) void MarkerBrowserConfigPage::window_changed (int m) { - mp_ui->le_window->setEnabled (m == int (rdb::FitMarker) || m == int (rdb::CenterSize)); + mp_ui->mgn_window->setEnabled (m == int (rdb::FitMarker) || m == int (rdb::CenterSize)); } void MarkerBrowserConfigPage::commit (lay::Dispatcher *root) { - double dim = 1.0; - tl::from_string_ext (tl::to_string (mp_ui->le_window->text ()), dim); - unsigned int max_markers_count = 1000; tl::from_string_ext (tl::to_string (mp_ui->le_max_markers->text ()), max_markers_count); root->config_set (cfg_rdb_context_mode, rdb::context_mode_type (mp_ui->cbx_context->currentIndex ()), MarkerBrowserContextModeConverter ()); root->config_set (cfg_rdb_window_mode, rdb::window_type (mp_ui->cbx_window->currentIndex ()), MarkerBrowserWindowModeConverter ()); - root->config_set (cfg_rdb_window_dim, dim); + root->config_set (cfg_rdb_window_dim, mp_ui->mgn_window->get_margin ().to_string ()); root->config_set (cfg_rdb_max_marker_count, max_markers_count); } diff --git a/src/layui/layui/rdbMarkerBrowserDialog.cc b/src/layui/layui/rdbMarkerBrowserDialog.cc index 6855ddd25..ed0dd5c45 100644 --- a/src/layui/layui/rdbMarkerBrowserDialog.cc +++ b/src/layui/layui/rdbMarkerBrowserDialog.cc @@ -470,9 +470,8 @@ MarkerBrowserDialog::configure (const std::string &name, const std::string &valu } else if (name == cfg_rdb_window_dim) { - double wdim = m_window_dim; - tl::from_string (value, wdim); - if (fabs (wdim - m_window_dim) > 1e-6) { + lay::Margin wdim = lay::Margin::from_string (value); + if (wdim != m_window_dim) { m_window_dim = wdim; need_update = true; } diff --git a/src/layui/layui/rdbMarkerBrowserDialog.h b/src/layui/layui/rdbMarkerBrowserDialog.h index 3991b6b65..56990e5e5 100644 --- a/src/layui/layui/rdbMarkerBrowserDialog.h +++ b/src/layui/layui/rdbMarkerBrowserDialog.h @@ -27,6 +27,7 @@ #include "layuiCommon.h" #include "layBrowser.h" +#include "layMargin.h" #include "tlColor.h" #include "rdbMarkerBrowser.h" @@ -78,7 +79,7 @@ private: Ui::MarkerBrowserDialog *mp_ui; context_mode_type m_context; window_type m_window; - double m_window_dim; + lay::Margin m_window_dim; unsigned int m_max_marker_count; tl::Color m_marker_color; int m_marker_line_width; diff --git a/src/layui/layui/rdbMarkerBrowserPage.cc b/src/layui/layui/rdbMarkerBrowserPage.cc index 822d19572..e9cab1a57 100644 --- a/src/layui/layui/rdbMarkerBrowserPage.cc +++ b/src/layui/layui/rdbMarkerBrowserPage.cc @@ -1838,7 +1838,7 @@ MarkerBrowserPage::marker_double_clicked (const QModelIndex &) } void -MarkerBrowserPage::set_window (rdb::window_type window, double window_dim, rdb::context_mode_type context) +MarkerBrowserPage::set_window (rdb::window_type window, const lay::Margin &window_dim, rdb::context_mode_type context) { if (window != m_window || window_dim != m_window_dim || context != m_context) { m_window = window; @@ -2280,15 +2280,17 @@ MarkerBrowserPage::do_update_markers () if (mp_view && ! m_markers_bbox.empty ()) { + double wdim = m_window_dim.get (m_markers_bbox); + if (m_window == FitCell) { mp_view->zoom_fit (); } else if (m_window == FitMarker) { - mp_view->zoom_box (m_markers_bbox.enlarged (db::DVector (m_window_dim, m_window_dim))); + mp_view->zoom_box (m_markers_bbox.enlarged (db::DVector (wdim, wdim))); } else if (m_window == Center) { mp_view->pan_center (m_markers_bbox.p1 () + (m_markers_bbox.p2 () - m_markers_bbox.p1 ()) * 0.5); } else if (m_window == CenterSize) { - double w = std::max (m_markers_bbox.width (), m_window_dim); - double h = std::max (m_markers_bbox.height (), m_window_dim); + double w = std::max (m_markers_bbox.width (), wdim); + double h = std::max (m_markers_bbox.height (), wdim); db::DPoint center (m_markers_bbox.p1 () + (m_markers_bbox.p2 () - m_markers_bbox.p1 ()) * 0.5); db::DVector d (w * 0.5, h * 0.5); mp_view->zoom_box (db::DBox (center - d, center + d)); diff --git a/src/layui/layui/rdbMarkerBrowserPage.h b/src/layui/layui/rdbMarkerBrowserPage.h index 68832f04c..d9c1cb080 100644 --- a/src/layui/layui/rdbMarkerBrowserPage.h +++ b/src/layui/layui/rdbMarkerBrowserPage.h @@ -27,6 +27,7 @@ #include "ui_MarkerBrowserPage.h" #include "rdbMarkerBrowser.h" +#include "layMargin.h" #include "tlDeferredExecution.h" #include "tlColor.h" #include "dbBox.h" @@ -137,7 +138,7 @@ public: /** * @brief Set the window type and window dimensions */ - void set_window (rdb::window_type window_type, double window_dim, rdb::context_mode_type context); + void set_window (rdb::window_type window_type, const lay::Margin &window_dim, rdb::context_mode_type context); /** * @brief Set the maximum number of markers shown in the marker selection list @@ -212,7 +213,7 @@ private: bool m_in_directory_selection_change; rdb::context_mode_type m_context; rdb::window_type m_window; - double m_window_dim; + lay::Margin m_window_dim; size_t m_max_marker_count; tl::Color m_marker_color; int m_marker_line_width;