From 4ffae9668e34e42b85699e56949f9bb63b311634 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 10 Aug 2020 19:51:36 +0200 Subject: [PATCH] WIP: reworked drag&drop from library view into canvas - now will switch to instance mode and take parameters from the instance options rather than popping up a PCell dialog and using mag 1, no mirror, no rotation etc. --- src/edt/edt/edt.pro | 2 - src/edt/edt/edtPCellParametersDialog.cc | 65 ------------ src/edt/edt/edtPCellParametersDialog.h | 86 --------------- src/edt/edt/edtServiceImpl.cc | 133 +++++++----------------- src/edt/edt/edtServiceImpl.h | 4 - 5 files changed, 39 insertions(+), 251 deletions(-) delete mode 100644 src/edt/edt/edtPCellParametersDialog.cc delete mode 100644 src/edt/edt/edtPCellParametersDialog.h diff --git a/src/edt/edt/edt.pro b/src/edt/edt/edt.pro index d78982deb..613c92dc3 100644 --- a/src/edt/edt/edt.pro +++ b/src/edt/edt/edt.pro @@ -21,7 +21,6 @@ HEADERS = \ edtServiceImpl.h \ edtUtils.h \ edtCommon.h \ - edtPCellParametersDialog.h \ edtDistribute.h FORMS = \ @@ -61,7 +60,6 @@ SOURCES = \ edtServiceImpl.cc \ edtUtils.cc \ gsiDeclEdt.cc \ - edtPCellParametersDialog.cc \ edtDistribute.cc INCLUDEPATH += $$TL_INC $$GSI_INC $$LAYBASIC_INC $$DB_INC diff --git a/src/edt/edt/edtPCellParametersDialog.cc b/src/edt/edt/edtPCellParametersDialog.cc deleted file mode 100644 index bdb33b47f..000000000 --- a/src/edt/edt/edtPCellParametersDialog.cc +++ /dev/null @@ -1,65 +0,0 @@ - -/* - - KLayout Layout Viewer - Copyright (C) 2006-2020 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 "edtPCellParametersDialog.h" - -#include - -namespace edt -{ - -PCellParametersDialog::PCellParametersDialog (QWidget *parent) - : QDialog (parent) -{ - setupUi (this); - - connect (buttons->button (QDialogButtonBox::Apply), SIGNAL (clicked ()), this, SLOT (apply_pressed ())); -} - -void -PCellParametersDialog::apply_pressed () -{ - emit parameters_changed (); - parameters_changed_event (); -} - -std::vector -PCellParametersDialog::get_parameters () -{ - return parameters->get_parameters (); -} - -void -PCellParametersDialog::set_parameters (const std::vector &p) -{ - parameters->set_parameters (p); -} - -int -PCellParametersDialog::exec (const db::Layout *layout, lay::LayoutView *view, int cv_index, const db::PCellDeclaration *pcell_decl, const db::pcell_parameters_type &p) -{ - parameters->setup (layout, view, cv_index, pcell_decl, p); - return QDialog::exec (); -} - -} diff --git a/src/edt/edt/edtPCellParametersDialog.h b/src/edt/edt/edtPCellParametersDialog.h deleted file mode 100644 index 2a977a4cd..000000000 --- a/src/edt/edt/edtPCellParametersDialog.h +++ /dev/null @@ -1,86 +0,0 @@ - -/* - - KLayout Layout Viewer - Copyright (C) 2006-2020 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_edtPCellParametersDialog -#define HDR_edtPCellParametersDialog - -#include "dbPCellDeclaration.h" -#include "ui_PCellParametersDialog.h" - -#include - -namespace lay -{ - class LayoutView; -} - -namespace edt -{ - -/** - * @brief A QScrollArea that displays and allows editing PCell parameters - */ -class PCellParametersDialog - : public QDialog, private Ui::PCellParametersDialog -{ -Q_OBJECT - -public: - /** - * @brief Constructor: create a dialog showing the given parameters - * @param parent The parent widget - */ - PCellParametersDialog (QWidget *parent); - - /** - * @brief Executes the parameter dialog - * @param layout The layout in which the PCell instance resides - * @param view The layout view from which to take layers for example - * @param cv_index The index of the cellview in "view" - * @param pcell_decl The PCell declaration - * @param parameters The parameter values to show (if empty, the default values are used) - */ - int exec (const db::Layout *layout, lay::LayoutView *view, int cv_index, const db::PCellDeclaration *pcell_decl, const db::pcell_parameters_type &p); - - /** - * @brief Get the current parameters - */ - std::vector get_parameters (); - - /** - * @brief Sets the given parameters as values - */ - void set_parameters (const std::vector &values); - - tl::Event parameters_changed_event; - -signals: - void parameters_changed (); - -private slots: - void apply_pressed (); -}; - -} - -#endif diff --git a/src/edt/edt/edtServiceImpl.cc b/src/edt/edt/edtServiceImpl.cc index 7a7ff40bf..c3779c76e 100644 --- a/src/edt/edt/edtServiceImpl.cc +++ b/src/edt/edt/edtServiceImpl.cc @@ -25,7 +25,6 @@ #include "edtServiceImpl.h" #include "edtPropertiesPages.h" #include "edtInstPropertiesPage.h" -#include "edtPCellParametersDialog.h" #include "edtService.h" #include "dbEdge.h" #include "dbLibrary.h" @@ -1130,17 +1129,14 @@ InstService::get_default_layer_for_pcell () bool InstService::drag_enter_event (const db::DPoint &p, const lay::DragDropDataBase *data) -{ +{ const lay::CellDragDropData *cd = dynamic_cast (data); if (view ()->is_editable () && cd && (cd->layout () == & view ()->active_cellview ()->layout () || cd->library ())) { view ()->cancel (); - set_edit_marker (0); - m_cv_index = view ()->active_cellview_index (); - m_in_drag_drop = true; - + // configure from the drag/drop data if (cd->library ()) { if (m_lib_name != cd->library ()->get_name ()) { m_lib_name = cd->library ()->get_name (); @@ -1155,38 +1151,45 @@ InstService::drag_enter_event (const db::DPoint &p, const lay::DragDropDataBase if (cd->is_pcell ()) { const db::PCellDeclaration *pcell_decl = cd->layout ()->pcell_declaration (cd->cell_index ()); - if (pcell_decl) { + if (! pcell_decl) { + return false; + } - if (m_cell_or_pcell_name != pcell_decl->name ()) { - m_cell_or_pcell_name = pcell_decl->name (); - m_pcell_parameters.clear (); + if (m_cell_or_pcell_name != pcell_decl->name ()) { + m_cell_or_pcell_name = pcell_decl->name (); + m_pcell_parameters.clear (); + } + + m_is_pcell = true; + + // NOTE: we reuse previous parameters for convenience unless PCell or library has changed + const std::vector &pd = pcell_decl->parameter_declarations(); + for (std::vector::const_iterator i = pd.begin (); i != pd.end (); ++i) { + if (i->get_type () == db::PCellParameterDeclaration::t_layer && !i->is_hidden () && !i->is_readonly () && i->get_default ().is_nil ()) { + m_pcell_parameters.insert (std::make_pair (i->get_name (), get_default_layer_for_pcell ())); + } else { + m_pcell_parameters.insert (std::make_pair (i->get_name (), i->get_default ())); } - - m_is_pcell = true; - - // NOTE: we reuse previous parameters for convenience unless PCell or library has changed - const std::vector &pd = pcell_decl->parameter_declarations(); - for (std::vector::const_iterator i = pd.begin (); i != pd.end (); ++i) { - if (i->get_type () == db::PCellParameterDeclaration::t_layer && !i->is_hidden () && !i->is_readonly () && i->get_default ().is_nil ()) { - m_pcell_parameters.insert (std::make_pair (i->get_name (), get_default_layer_for_pcell ())); - } else { - m_pcell_parameters.insert (std::make_pair (i->get_name (), i->get_default ())); - } - } - - do_begin_edit (p); - return true; - } } else if (cd->layout ()->is_valid_cell_index (cd->cell_index ())) { m_cell_or_pcell_name = cd->layout ()->cell_name (cd->cell_index ()); - do_begin_edit (p); - return true; + } else { + return false; } + sync_to_config (); + m_in_drag_drop = true; + + view ()->switch_mode (plugin_declaration ()->id ()); + + do_begin_edit (p); + + // action taken. + return true; + } return false; @@ -1203,7 +1206,7 @@ InstService::drag_move_event (const db::DPoint &p, const lay::DragDropDataBase * } } -void +void InstService::drag_leave_event () { if (m_in_drag_drop) { @@ -1212,7 +1215,7 @@ InstService::drag_leave_event () } } -bool +bool InstService::selection_applies (const lay::ObjectInstPath &sel) const { return sel.is_cell_inst (); @@ -1221,53 +1224,8 @@ InstService::selection_applies (const lay::ObjectInstPath &sel) const bool InstService::drop_event (const db::DPoint & /*p*/, const lay::DragDropDataBase * /*data*/) { - if (m_in_drag_drop) { - - const lay::CellView &cv = view ()->cellview (m_cv_index); - if (! cv.is_valid ()) { - return false; - } - - make_cell (cv); - - bool accepted = true; - - if (m_has_valid_cell && mp_pcell_decl) { - - std::vector pv = mp_pcell_decl->map_parameters (m_pcell_parameters); - - // Turn off the drag cursor for the modal dialog - QApplication::restoreOverrideCursor (); - - // for PCells dragged show the parameter dialog for a chance to edit the initial parameters - if (! mp_pcell_parameters_dialog.get ()) { - mp_pcell_parameters_dialog.reset (new edt::PCellParametersDialog (view ())); - mp_pcell_parameters_dialog->parameters_changed_event.add (this, &InstService::apply_edits); - } - - if (! mp_pcell_parameters_dialog->exec (mp_current_layout, view (), m_cv_index, mp_pcell_decl, pv)) { - accepted = false; - } else { - m_has_valid_cell = false; - m_pcell_parameters = mp_pcell_decl->named_parameters (mp_pcell_parameters_dialog->get_parameters ()); - } - - } - - set_edit_marker (0); - - if (accepted) { - do_finish_edit (); - } else { - do_cancel_edit (); - } - - sync_to_config (); - return true; - - } else { - return false; - } + m_in_drag_drop = false; + return false; } void @@ -1538,6 +1496,8 @@ InstService::do_cancel_edit () m_has_valid_cell = false; m_in_drag_drop = false; + set_edit_marker (0); + // clean up any proxy cells created so far const lay::CellView &cv = view ()->cellview (m_cv_index); if (cv.is_valid ()) { @@ -1651,16 +1611,6 @@ InstService::config_finalize () edt::Service::config_finalize (); } -void -InstService::apply_edits() -{ - if (mp_pcell_decl && mp_pcell_parameters_dialog.get ()) { - m_pcell_parameters = mp_pcell_decl->named_parameters (mp_pcell_parameters_dialog->get_parameters ()); - } - - sync_to_config (); -} - void InstService::update_marker () { @@ -1685,14 +1635,9 @@ InstService::get_inst (db::CellInstArray &inst) // compute the instance's transformation db::VCplxTrans pt = (db::CplxTrans (cv->layout ().dbu ()) * m_trans).inverted (); - db::ICplxTrans trans; - if (m_in_drag_drop) { - trans = db::ICplxTrans (1.0, 0.0, false, pt * m_disp - db::Point ()); - } else { - trans = db::ICplxTrans (m_scale, m_angle, m_mirror, pt * m_disp - db::Point ()); - } + db::ICplxTrans trans = db::ICplxTrans (m_scale, m_angle, m_mirror, pt * m_disp - db::Point ()); - if (! m_in_drag_drop && m_array && m_rows > 0 && m_columns > 0) { + if (m_array && m_rows > 0 && m_columns > 0) { db::Vector row = db::Vector (pt * db::DVector (m_row_x, m_row_y)); db::Vector column = db::Vector (pt * db::DVector (m_column_x, m_column_y)); inst = db::CellInstArray (db::CellInst (ci.second), trans, row, column, m_rows, m_columns); diff --git a/src/edt/edt/edtServiceImpl.h b/src/edt/edt/edtServiceImpl.h index 3fdad1ef2..048b117a1 100644 --- a/src/edt/edt/edtServiceImpl.h +++ b/src/edt/edt/edtServiceImpl.h @@ -38,8 +38,6 @@ namespace lay namespace edt { -class PCellParametersDialog; - /** * @brief Implementation of the edt::Service for generic shape editing */ @@ -245,10 +243,8 @@ private: const db::PCellDeclaration *mp_pcell_decl; int m_cv_index; db::ICplxTrans m_trans; - std::auto_ptr mp_pcell_parameters_dialog; void update_marker (); - void apply_edits (); bool get_inst (db::CellInstArray &inst); std::pair make_cell (const lay::CellView &cv); tl::Variant get_default_layer_for_pcell ();