diff --git a/src/edt/edt/edtEditorOptionsPages.h b/src/edt/edt/edtEditorOptionsPages.h index 5080c2dfe..c2056e2c9 100644 --- a/src/edt/edt/edtEditorOptionsPages.h +++ b/src/edt/edt/edtEditorOptionsPages.h @@ -26,6 +26,7 @@ #define HDR_edtEditorOptionsPages #include "layEditorOptionsPage.h" +#include "layEditorOptionsPageWidget.h" #include diff --git a/src/edt/edt/edtRecentConfigurationPage.h b/src/edt/edt/edtRecentConfigurationPage.h index dd6ff0e96..5e53d2ec6 100644 --- a/src/edt/edt/edtRecentConfigurationPage.h +++ b/src/edt/edt/edtRecentConfigurationPage.h @@ -26,7 +26,7 @@ #define HDR_edtRecentConfigurationPage #include "edtCommon.h" -#include "layEditorOptionsPage.h" +#include "layEditorOptionsPageWidget.h" #include "tlObject.h" #include "tlDeferredExecution.h" diff --git a/src/laybasic/laybasic/layEditorOptionsPage.cc b/src/laybasic/laybasic/layEditorOptionsPage.cc index 739f27c07..c3955809d 100644 --- a/src/laybasic/laybasic/layEditorOptionsPage.cc +++ b/src/laybasic/laybasic/layEditorOptionsPage.cc @@ -23,14 +23,28 @@ #include "tlInternational.h" #include "layEditorOptionsPage.h" #include "layLayoutViewBase.h" +#include "tlClassRegistry.h" #include "tlExceptions.h" -#include -#include - namespace lay { +// ------------------------------------------------------------------ +// EditorOptionsFactoryBase implementation + +lay::EditorOptionsPage * +EditorOptionsPageFactoryBase::create_page_by_name (const std::string &name, lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) +{ + auto reg = tl::Registrar::get_instance (); + for (auto i = reg->begin (); i != reg->end (); ++i) { + if (i.current_name () == name) { + return i->create_page (view, dispatcher); + } + } + + return 0; +} + // ------------------------------------------------------------------ // EditorOptionsPageCollection implementation @@ -136,119 +150,5 @@ EditorOptionsPage::activate (bool active) } } -#if defined(HAVE_QT) - -// ------------------------------------------------------------------ -// EditorOptionsPage implementation - -EditorOptionsPageWidget::EditorOptionsPageWidget (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) - : QWidget (0), EditorOptionsPage (view, dispatcher) -{ - init (view, dispatcher); -} - -EditorOptionsPageWidget::EditorOptionsPageWidget () - : QWidget (0), EditorOptionsPage () -{ - // .. nothing yet .. -} - -EditorOptionsPageWidget::~EditorOptionsPageWidget () -{ - set_owner (0); -} - -void -EditorOptionsPageWidget::edited () -{ - apply (dispatcher ()); -} - -static bool is_parent_widget (QWidget *w, QWidget *parent) -{ - while (w && w != parent) { - w = dynamic_cast (w->parent ()); - } - return w == parent; -} - -bool -EditorOptionsPageWidget::focusNextPrevChild (bool next) -{ - bool res = QWidget::focusNextPrevChild (next); - - // Stop making the focus leave the page - this way we can jump back to the - // view on "enter" - if (res && ! is_modal_page () && ! is_parent_widget (QApplication::focusWidget (), this) && focusWidget ()) { - focusWidget ()->setFocus (); - } - - return res; -} - -void -EditorOptionsPageWidget::keyPressEvent (QKeyEvent *event) -{ -BEGIN_PROTECTED - if (! is_modal_page () && - event->modifiers () == Qt::NoModifier && - (event->key () == Qt::Key_Return || event->key () == Qt::Key_Enter || event->key () == Qt::Key_Escape)) { - if (event->key () == Qt::Key_Escape) { - // The Escape key creates a call to cancel() - cancel (); - } else { - // The Return key on a non-modal page commits the values and gives back the focus - // to the view - commit (dispatcher ()); - } - view ()->set_focus (); - event->accept (); - } else { - QWidget::keyPressEvent (event); - } -END_PROTECTED -} - -bool -EditorOptionsPageWidget::event (QEvent *event) -{ - if (event->type () == QEvent::ShortcutOverride) { - QKeyEvent *ke = dynamic_cast (event); - if (ke->key () == Qt::Key_Escape || - ke->key () == Qt::Key_Tab || - ke->key () == Qt::Key_Enter || - ke->key () == Qt::Key_Return || - ke->key () == Qt::Key_Backtab) { - // accept the shortcut override event for some keys, so we can handle - // it in keyPressEvent - ke->accept (); - } - } - return QWidget::event (event); -} - -void -EditorOptionsPageWidget::set_focus () -{ - if (isVisible ()) { - setFocus (Qt::TabFocusReason); - QWidget::focusNextPrevChild (true); - } -} - -void -EditorOptionsPageWidget::set_visible (bool visible) -{ - setVisible (visible); -} - -bool -EditorOptionsPageWidget::is_visible () const -{ - return isVisible (); -} - -#endif - } diff --git a/src/laybasic/laybasic/layEditorOptionsPage.h b/src/laybasic/laybasic/layEditorOptionsPage.h index f1d1fa12d..1b0e604a2 100644 --- a/src/laybasic/laybasic/layEditorOptionsPage.h +++ b/src/laybasic/laybasic/layEditorOptionsPage.h @@ -27,10 +27,6 @@ #include "tlObject.h" -#if defined(HAVE_QT) -# include -#endif - namespace db { struct LayerProperties; @@ -149,34 +145,48 @@ private: void attach_events (); }; -#if defined(HAVE_QT) /** - * @brief The base class for a object properties page + * @brief A basic factory class for editor options pages + * + * We will use it later to provide a registration-based specialized factory + * for Qt-enabled option pages, which we should not link here. */ -class LAYBASIC_PUBLIC EditorOptionsPageWidget - : public QWidget, public EditorOptionsPage +class LAYBASIC_PUBLIC EditorOptionsPageFactoryBase { -Q_OBJECT - public: - EditorOptionsPageWidget (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher); - EditorOptionsPageWidget (); - virtual ~EditorOptionsPageWidget (); + EditorOptionsPageFactoryBase () { } + virtual ~EditorOptionsPageFactoryBase () { } - virtual void set_focus (); - virtual bool is_visible () const; - virtual void set_visible (bool visible); - virtual EditorOptionsPageWidget *widget () { return this; } + virtual lay::EditorOptionsPage *create_page (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) = 0; -protected slots: - void edited (); - -protected: - virtual bool focusNextPrevChild (bool next); - virtual void keyPressEvent (QKeyEvent *event); - virtual bool event (QEvent *event); + static lay::EditorOptionsPage *create_page_by_name (const std::string &name, lay::LayoutViewBase *view, lay::Dispatcher *dispatcher); +}; + +/** + * @brief A specialized editor options page factory class for a specific type + * + * Register the factory using: + * + * #include "tlClassRegistry.h" + * static tl::RegisteredClass s_factory (new lay::EditorOptionsPageFactory (), 0, "MyClass"); + * + * Later you can create a page from "MyName" using + * + * page = EditorOptionsPageFactoryBase::create_page_by_name ("MyClass", view, dispatcher); + */ +template +class LAYBASIC_PUBLIC_TEMPLATE EditorOptionsPageFactory + : public EditorOptionsPageFactoryBase +{ +public: + EditorOptionsPageFactory () { } + virtual ~EditorOptionsPageFactory () { } + + virtual lay::EditorOptionsPage *create_page (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) + { + return new T (view, dispatcher); + } }; -#endif // defined(HAVE_QT) } diff --git a/src/laybasic/laybasic/layMove.cc b/src/laybasic/laybasic/layMove.cc index 0adad09d3..56087a660 100644 --- a/src/laybasic/laybasic/layMove.cc +++ b/src/laybasic/laybasic/layMove.cc @@ -37,9 +37,9 @@ namespace lay { -const std::string move_editor_options_name ("move-editor-options"); -const std::string move_function_name ("move-execute"); -const std::string move_distance_setter_name ("move-distance"); +LAYBASIC_PUBLIC std::string move_editor_options_name ("move-editor-options"); +LAYBASIC_PUBLIC std::string move_function_name ("move-execute"); +LAYBASIC_PUBLIC std::string move_distance_setter_name ("move-distance"); // ------------------------------------------------------------- // MoveService implementation @@ -451,90 +451,6 @@ MoveService::finish () // ---------------------------------------------------------------------------- -#if defined(HAVE_QT) -namespace { - -class MoveToolboxPage - : public lay::EditorOptionsPageWidget -{ -public: - MoveToolboxPage (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) - : lay::EditorOptionsPageWidget (view, dispatcher) - { - mp_layout = new QHBoxLayout (this); - - mp_x_le = new QLineEdit (this); - mp_layout->addWidget (mp_x_le); - mp_y_le = new QLineEdit (this); - mp_layout->addWidget (mp_y_le); - mp_layout->addStretch (1); - - hide (); - - set_focus_page (true); - set_toolbox_widget (true); - } - - virtual std::string title () const - { - return "Move Options"; - } - - virtual const char *name () const - { - return move_editor_options_name.c_str (); - } - - virtual int order () const - { - return 0; - } - - virtual void deactivated () - { - hide (); - } - - virtual void commit (lay::Dispatcher *dispatcher) - { - try { - - double dx = 0.0, dy = 0.0; - - tl::from_string (tl::to_string (mp_x_le->text ()), dx); - tl::from_string (tl::to_string (mp_y_le->text ()), dy); - - dispatcher->call_function (move_function_name, db::DVector (dx, dy).to_string ()); - - } catch (...) { - } - } - - virtual void configure (const std::string &name, const std::string &value) - { - if (name == move_distance_setter_name && ! mp_x_le->hasFocus () && ! mp_y_le->hasFocus ()) { - - try { - - db::DVector mv; - tl::from_string (value, mv); - - mp_x_le->setText (tl::to_qstring (tl::micron_to_string (mv.x ()))); - mp_y_le->setText (tl::to_qstring (tl::micron_to_string (mv.y ()))); - - } catch (...) { - } - } - } - -private: - QHBoxLayout *mp_layout; - QLineEdit *mp_x_le, *mp_y_le; -}; - -} -#endif - class MoveServiceDeclaration : public lay::PluginDeclaration { @@ -550,13 +466,13 @@ public: return new MoveService (view); } -#if defined(HAVE_QT) virtual void get_editor_options_pages (std::vector &pages, lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) const { - pages.push_back (new MoveToolboxPage (view, dispatcher)); - pages.back ()->set_plugin_declaration (this); + lay::EditorOptionsPage *page = lay::EditorOptionsPageFactoryBase::create_page_by_name (move_editor_options_name, view, dispatcher); + if (page) { + pages.push_back (page); + } } -#endif }; static tl::RegisteredClass move_service_decl (new MoveServiceDeclaration (), -970, "laybasic::MoveServicePlugin"); diff --git a/src/laybasic/laybasic/layMove.h b/src/laybasic/laybasic/layMove.h index b487a22d8..b2c08f306 100644 --- a/src/laybasic/laybasic/layMove.h +++ b/src/laybasic/laybasic/layMove.h @@ -31,6 +31,10 @@ namespace lay { +LAYBASIC_PUBLIC extern std::string move_editor_options_name; +LAYBASIC_PUBLIC extern std::string move_function_name; +LAYBASIC_PUBLIC extern std::string move_distance_setter_name; + class LayoutViewBase; class LAYBASIC_PUBLIC MoveService : diff --git a/src/layui/layui/layWidgets.cc b/src/layui/layui/layWidgets.cc index d05eeef6b..e2264921e 100644 --- a/src/layui/layui/layWidgets.cc +++ b/src/layui/layui/layWidgets.cc @@ -1473,6 +1473,9 @@ DecoratedLineEdit::DecoratedLineEdit (QWidget *parent) mp_clear_label->setCursor (Qt::ArrowCursor); mp_clear_label->setPixmap (QString::fromUtf8 (":/clear_edit_16px@2x.png")); + mp_front_label = new QLabel (this); + mp_front_label->hide (); + QMargins margins = textMargins (); m_default_left_margin = margins.left (); m_default_right_margin = margins.right (); @@ -1535,43 +1538,57 @@ bool DecoratedLineEdit::focusNextPrevChild (bool next) return QLineEdit::focusNextPrevChild (next); } +void DecoratedLineEdit::set_margins () +{ + int right_margin = m_default_right_margin; + int left_margin = m_default_left_margin; + + // right parts + if (m_clear_button_enabled) { + right_margin += mp_clear_label->sizeHint ().width () + le_decoration_space; + } + + // left parts + if (! m_label.empty ()) { + left_margin += mp_front_label->sizeHint ().width () + le_decoration_space; + } + if (m_options_button_enabled) { + left_margin += mp_options_label->sizeHint ().width () + le_decoration_space; + } + + QMargins margins = textMargins (); + margins.setRight (right_margin); + margins.setLeft (left_margin); + setTextMargins (margins); + + resizeEvent (0); +} + void DecoratedLineEdit::set_clear_button_enabled (bool en) { if (en != m_clear_button_enabled) { - m_clear_button_enabled = en; mp_clear_label->setVisible (en); - - QMargins margins = textMargins (); - if (! en) { - margins.setRight (m_default_right_margin); - } else { - margins.setRight (m_default_right_margin + mp_clear_label->sizeHint ().width () + le_decoration_space); - } - setTextMargins (margins); - - resizeEvent (0); - + set_margins (); } } void DecoratedLineEdit::set_options_button_enabled (bool en) { if (en != m_options_button_enabled) { - m_options_button_enabled = en; mp_options_label->setVisible (en); + set_margins (); + } +} - QMargins margins = textMargins (); - if (! en) { - margins.setLeft (m_default_left_margin); - } else { - margins.setLeft (m_default_left_margin + mp_options_label->sizeHint ().width () + le_decoration_space); - } - setTextMargins (margins); - - resizeEvent (0); - +void DecoratedLineEdit::set_label (const std::string &label) +{ + if (label != m_label) { + m_label = label; + mp_front_label->setVisible (! label.empty ()); + mp_front_label->setText (tl::to_qstring (label)); + set_margins (); } } @@ -1621,17 +1638,27 @@ void DecoratedLineEdit::mousePressEvent (QMouseEvent *event) void DecoratedLineEdit::resizeEvent (QResizeEvent *event) { int fw = hasFrame () ? le_frame_width : 0; + QRect r = geometry (); - if (m_clear_button_enabled) { - QSize label_size = mp_clear_label->sizeHint (); - QRect r = geometry (); - mp_clear_label->setGeometry (r.width () - fw - label_size.width (), 0, label_size.width (), r.height ()); - } + int left = fw, right = r.width () - fw; if (m_options_button_enabled) { QSize label_size = mp_options_label->sizeHint (); - QRect r = geometry (); - mp_options_label->setGeometry (fw, 0, label_size.width (), r.height ()); + mp_options_label->setGeometry (left, 0, label_size.width (), r.height ()); + left += label_size.width () + le_decoration_space; + } + + if (! m_label.empty ()) { + QSize label_size = mp_front_label->sizeHint (); + mp_front_label->setGeometry (left, 0, label_size.width (), r.height ()); + left += label_size.width () + le_decoration_space; + } + + if (m_clear_button_enabled) { + QSize label_size = mp_clear_label->sizeHint (); + right -= label_size.width (); + mp_clear_label->setGeometry (right, 0, label_size.width (), r.height ()); + right -= le_decoration_space; } QLineEdit::resizeEvent (event); diff --git a/src/layui/layui/layWidgets.h b/src/layui/layui/layWidgets.h index ccba0d32c..f3e667020 100644 --- a/src/layui/layui/layWidgets.h +++ b/src/layui/layui/layWidgets.h @@ -566,6 +566,19 @@ public: return m_tab_signal_enabled; } + /** + * @brief Sets a label in front of the line edit + */ + void set_label (const std::string &label); + + /** + * @brief Gets the label + */ + const std::string &label () const + { + return m_label; + } + signals: void options_button_clicked (); void esc_pressed (); @@ -588,8 +601,12 @@ private: bool m_tab_signal_enabled; QLabel *mp_options_label; QLabel *mp_clear_label; + QLabel *mp_front_label; QMenu *mp_options_menu; int m_default_left_margin, m_default_right_margin; + std::string m_label; + + void set_margins (); }; /** diff --git a/src/layview/layview/layEditorOptionsPageWidget.cc b/src/layview/layview/layEditorOptionsPageWidget.cc new file mode 100644 index 000000000..34914c61c --- /dev/null +++ b/src/layview/layview/layEditorOptionsPageWidget.cc @@ -0,0 +1,171 @@ + +/* + + KLayout Layout Viewer + Copyright (C) 2006-2025 Matthias Koefferlein + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include "layEditorOptionsPageWidget.h" +#include "layLayoutViewBase.h" +#include "tlExceptions.h" + +#include +#include + +namespace lay +{ + +// ------------------------------------------------------------------ +// EditorOptionsPageWidget implementation + +EditorOptionsPageWidget::EditorOptionsPageWidget (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) + : QWidget (0), EditorOptionsPage (view, dispatcher), m_is_transparent (false) +{ + init (view, dispatcher); +} + +EditorOptionsPageWidget::EditorOptionsPageWidget () + : QWidget (0), EditorOptionsPage () +{ + // .. nothing yet .. +} + +EditorOptionsPageWidget::~EditorOptionsPageWidget () +{ + set_owner (0); +} + +void +EditorOptionsPageWidget::edited () +{ + apply (dispatcher ()); +} + +static bool is_parent_widget (QWidget *w, QWidget *parent) +{ + while (w && w != parent) { + w = dynamic_cast (w->parent ()); + } + return w == parent; +} + +bool +EditorOptionsPageWidget::focusNextPrevChild (bool next) +{ + bool res = QWidget::focusNextPrevChild (next); + + // Stop making the focus leave the page - this way we can jump back to the + // view on "enter" + if (res && ! is_modal_page () && ! is_parent_widget (QApplication::focusWidget (), this) && focusWidget ()) { + focusWidget ()->setFocus (); + } + + return res; +} + +void +EditorOptionsPageWidget::keyPressEvent (QKeyEvent *event) +{ +BEGIN_PROTECTED + if (! is_modal_page () && + event->modifiers () == Qt::NoModifier && + (event->key () == Qt::Key_Return || event->key () == Qt::Key_Enter || event->key () == Qt::Key_Escape)) { + if (event->key () == Qt::Key_Escape) { + // The Escape key creates a call to cancel() + cancel (); + } else { + // The Return key on a non-modal page commits the values and gives back the focus + // to the view + commit (dispatcher ()); + } + view ()->set_focus (); + event->accept (); + } else { + QWidget::keyPressEvent (event); + } +END_PROTECTED +} + +bool +EditorOptionsPageWidget::event (QEvent *event) +{ + if (event->type () == QEvent::ShortcutOverride) { + QKeyEvent *ke = dynamic_cast (event); + if (ke->key () == Qt::Key_Escape || + ke->key () == Qt::Key_Tab || + ke->key () == Qt::Key_Enter || + ke->key () == Qt::Key_Return || + ke->key () == Qt::Key_Backtab) { + // accept the shortcut override event for some keys, so we can handle + // it in keyPressEvent + ke->accept (); + } + } + return QWidget::event (event); +} + +void +EditorOptionsPageWidget::resizeEvent (QResizeEvent *e) +{ + // makes the widget transparent + // see https://stackoverflow.com/questions/27855137/how-to-disable-the-delivery-of-mouse-events-to-the-widget-but-not-its-children-i + if (e) { + QWidget::resizeEvent (e); + } + + if (m_is_transparent) { + QRegion reg (frameGeometry ()); + reg -= QRegion (geometry ()); + reg += childrenRegion (); + setMask (reg); + } else { + clearMask (); + } +} + +void +EditorOptionsPageWidget::set_transparent (bool f) +{ + if (f != m_is_transparent) { + m_is_transparent = f; + resizeEvent (0); + } +} + +void +EditorOptionsPageWidget::set_focus () +{ + if (isVisible ()) { + setFocus (Qt::TabFocusReason); + QWidget::focusNextPrevChild (true); + } +} + +void +EditorOptionsPageWidget::set_visible (bool visible) +{ + setVisible (visible); +} + +bool +EditorOptionsPageWidget::is_visible () const +{ + return isVisible (); +} + +} diff --git a/src/layview/layview/layEditorOptionsPageWidget.h b/src/layview/layview/layEditorOptionsPageWidget.h new file mode 100644 index 000000000..65c7bd314 --- /dev/null +++ b/src/layview/layview/layEditorOptionsPageWidget.h @@ -0,0 +1,70 @@ + +/* + + KLayout Layout Viewer + Copyright (C) 2006-2025 Matthias Koefferlein + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#ifndef HDR_layEditorOptionsPageWidget +#define HDR_layEditorOptionsPageWidget + +#include + +#include "layviewCommon.h" +#include "layEditorOptionsPage.h" + +namespace lay +{ + +/** + * @brief The base class for a object properties page + */ +class LAYVIEW_PUBLIC EditorOptionsPageWidget + : public QWidget, public EditorOptionsPage +{ +Q_OBJECT + +public: + EditorOptionsPageWidget (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher); + EditorOptionsPageWidget (); + virtual ~EditorOptionsPageWidget (); + + virtual void set_focus (); + virtual bool is_visible () const; + virtual void set_visible (bool visible); + virtual EditorOptionsPageWidget *widget () { return this; } + + void set_transparent (bool f); + bool is_transparent () const { return m_is_transparent; } + +protected slots: + void edited (); + +protected: + virtual bool focusNextPrevChild (bool next); + virtual void keyPressEvent (QKeyEvent *event); + virtual void resizeEvent (QResizeEvent *e); + virtual bool event (QEvent *event); + + bool m_is_transparent; +}; + +} + +#endif + diff --git a/src/layview/layview/layEditorOptionsPages.cc b/src/layview/layview/layEditorOptionsPages.cc index a36190106..4c33c1c83 100644 --- a/src/layview/layview/layEditorOptionsPages.cc +++ b/src/layview/layview/layEditorOptionsPages.cc @@ -22,6 +22,7 @@ #include "tlInternational.h" #include "layEditorOptionsPages.h" +#include "layEditorOptionsPageWidget.h" #include "tlExceptions.h" #include "layPlugin.h" #include "layLayoutViewBase.h" diff --git a/src/layview/layview/layLayoutView_qt.cc b/src/layview/layview/layLayoutView_qt.cc index d1f43c998..894da7c33 100644 --- a/src/layview/layview/layLayoutView_qt.cc +++ b/src/layview/layview/layLayoutView_qt.cc @@ -76,6 +76,7 @@ #include "layBookmarksView.h" #include "layEditorOptionsFrame.h" #include "layEditorOptionsPages.h" +#include "layEditorOptionsPageWidget.h" #include "layUtils.h" #include "layPropertiesDialog.h" #include "layQtTools.h" diff --git a/src/layview/layview/layMoveEditorOptionsPage.cc b/src/layview/layview/layMoveEditorOptionsPage.cc new file mode 100644 index 000000000..7b79ba97f --- /dev/null +++ b/src/layview/layview/layMoveEditorOptionsPage.cc @@ -0,0 +1,117 @@ + +/* + + KLayout Layout Viewer + Copyright (C) 2006-2025 Matthias Koefferlein + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include "layMoveEditorOptionsPage.h" +#include "layWidgets.h" +#include "layDispatcher.h" + +#include +#include + +namespace lay +{ + +MoveEditorOptionsPage::MoveEditorOptionsPage (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher) + : lay::EditorOptionsPageWidget (view, dispatcher) +{ + mp_layout = new QHBoxLayout (this); + + mp_x_le = new lay::DecoratedLineEdit (this); + mp_x_le->set_label ("dx:"); + mp_layout->addWidget (mp_x_le); + + mp_y_le = new lay::DecoratedLineEdit (this); + mp_y_le->set_label ("dy:"); + mp_layout->addWidget (mp_y_le); + + mp_layout->addStretch (1); + + hide (); + + set_focus_page (true); + set_toolbox_widget (true); + set_transparent (true); +} + +std::string +MoveEditorOptionsPage::title () const +{ + return "Move Options"; +} + +const char * +MoveEditorOptionsPage::name () const +{ + return move_editor_options_name.c_str (); +} + +int +MoveEditorOptionsPage::order () const +{ + return 0; +} + +void +MoveEditorOptionsPage::deactivated () +{ + hide (); +} + +void +MoveEditorOptionsPage::commit (lay::Dispatcher *dispatcher) +{ + try { + + double dx = 0.0, dy = 0.0; + + tl::from_string (tl::to_string (mp_x_le->text ()), dx); + tl::from_string (tl::to_string (mp_y_le->text ()), dy); + + dispatcher->call_function (move_function_name, db::DVector (dx, dy).to_string ()); + + } catch (...) { + } +} + +void +MoveEditorOptionsPage::configure (const std::string &name, const std::string &value) +{ + if (name == move_distance_setter_name && ! mp_x_le->hasFocus () && ! mp_y_le->hasFocus ()) { + + try { + + db::DVector mv; + tl::from_string (value, mv); + + mp_x_le->setText (tl::to_qstring (tl::micron_to_string (mv.x ()))); + mp_y_le->setText (tl::to_qstring (tl::micron_to_string (mv.y ()))); + + } catch (...) { + } + + } +} + +// registers the factory for the move plugin +static tl::RegisteredClass s_factory (new lay::EditorOptionsPageFactory (), 0, move_editor_options_name.c_str ()); + +} diff --git a/src/layview/layview/layMoveEditorOptionsPage.h b/src/layview/layview/layMoveEditorOptionsPage.h new file mode 100644 index 000000000..21bf6f28c --- /dev/null +++ b/src/layview/layview/layMoveEditorOptionsPage.h @@ -0,0 +1,59 @@ + +/* + + KLayout Layout Viewer + Copyright (C) 2006-2025 Matthias Koefferlein + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#ifndef HDR_layMoveEditorOptionsPage +#define HDR_layMoveEditorOptionsPage + +#include "layviewCommon.h" +#include "layEditorOptionsPageWidget.h" +#include "layMove.h" + +class QHBoxLayout; + +namespace lay { + class DecoratedLineEdit; +} + +namespace lay { + +class MoveEditorOptionsPage + : public lay::EditorOptionsPageWidget +{ +public: + MoveEditorOptionsPage (lay::LayoutViewBase *view, lay::Dispatcher *dispatcher); + + virtual std::string title () const; + virtual const char *name () const; + virtual int order () const; + virtual void deactivated (); + virtual void commit (lay::Dispatcher *dispatcher); + virtual void configure (const std::string &name, const std::string &value); + +private: + QHBoxLayout *mp_layout; + lay::DecoratedLineEdit *mp_x_le, *mp_y_le; +}; + +} + +#endif + diff --git a/src/layview/layview/layview.pro b/src/layview/layview/layview.pro index 3d5ab457a..3d20f19e6 100644 --- a/src/layview/layview/layview.pro +++ b/src/layview/layview/layview.pro @@ -9,17 +9,21 @@ DEFINES += MAKE_LAYVIEW_LIBRARY RESOURCES = \ SOURCES = \ + layEditorOptionsPageWidget.cc \ layGridNet.cc \ layEditorOptionsFrame.cc \ layEditorOptionsPages.cc \ + layMoveEditorOptionsPage.cc \ layviewForceLink.cc \ gsiDeclLayAdditional.cc \ HEADERS = \ + layEditorOptionsPageWidget.h \ layGridNet.h \ layEditorOptionsFrame.h \ layEditorOptionsPages.h \ layLayoutView.h \ + layMoveEditorOptionsPage.h \ layviewForceLink.h \ !equals(HAVE_QT, "0") {