This commit is contained in:
Matthias Koefferlein 2026-01-13 18:29:32 +01:00
parent c2aa597022
commit e058c47c02
15 changed files with 562 additions and 264 deletions

View File

@ -26,6 +26,7 @@
#define HDR_edtEditorOptionsPages
#include "layEditorOptionsPage.h"
#include "layEditorOptionsPageWidget.h"
#include <tlVariant.h>

View File

@ -26,7 +26,7 @@
#define HDR_edtRecentConfigurationPage
#include "edtCommon.h"
#include "layEditorOptionsPage.h"
#include "layEditorOptionsPageWidget.h"
#include "tlObject.h"
#include "tlDeferredExecution.h"

View File

@ -23,14 +23,28 @@
#include "tlInternational.h"
#include "layEditorOptionsPage.h"
#include "layLayoutViewBase.h"
#include "tlClassRegistry.h"
#include "tlExceptions.h"
#include <QApplication>
#include <QKeyEvent>
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<lay::EditorOptionsPageFactoryBase>::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<QWidget *> (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<QKeyEvent *> (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
}

View File

@ -27,10 +27,6 @@
#include "tlObject.h"
#if defined(HAVE_QT)
# include <QWidget>
#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<lay::EditorOptionsPageFactoryBase> s_factory (new lay::EditorOptionsPageFactory<MyClass> (), 0, "MyClass");
*
* Later you can create a page from "MyName" using
*
* page = EditorOptionsPageFactoryBase::create_page_by_name ("MyClass", view, dispatcher);
*/
template <class T>
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)
}

View File

@ -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<lay::EditorOptionsPage *> &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<lay::PluginDeclaration> move_service_decl (new MoveServiceDeclaration (), -970, "laybasic::MoveServicePlugin");

View File

@ -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 :

View File

@ -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);

View File

@ -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 ();
};
/**

View File

@ -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 <QApplication>
#include <QKeyEvent>
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<QWidget *> (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<QKeyEvent *> (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 ();
}
}

View File

@ -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 <QWidget>
#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

View File

@ -22,6 +22,7 @@
#include "tlInternational.h"
#include "layEditorOptionsPages.h"
#include "layEditorOptionsPageWidget.h"
#include "tlExceptions.h"
#include "layPlugin.h"
#include "layLayoutViewBase.h"

View File

@ -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"

View File

@ -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 <QHBoxLayout>
#include <QLineEdit>
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<lay::EditorOptionsPageFactoryBase> s_factory (new lay::EditorOptionsPageFactory<MoveEditorOptionsPage> (), 0, move_editor_options_name.c_str ());
}

View File

@ -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

View File

@ -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") {