From 0fddf7f389cb2de7a837ca1d4d2c2c7d10e14878 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 16 Dec 2020 23:52:58 +0100 Subject: [PATCH] WIP: text edit feature for layer mapping edit widget. --- src/buddies/src/bd/bdReaderOptions.cc | 2 +- src/db/db/dbStreamLayers.cc | 33 ++- src/db/db/dbStreamLayers.h | 16 ++ src/laybasic/laybasic/LayerMappingWidget.ui | 210 ++++++++++-------- .../laybasic/layLayerMappingWidget.cc | 49 +++- src/laybasic/laybasic/layLayerMappingWidget.h | 3 + 6 files changed, 199 insertions(+), 114 deletions(-) diff --git a/src/buddies/src/bd/bdReaderOptions.cc b/src/buddies/src/bd/bdReaderOptions.cc index 8a331dda6..dec684c29 100644 --- a/src/buddies/src/bd/bdReaderOptions.cc +++ b/src/buddies/src/bd/bdReaderOptions.cc @@ -604,7 +604,7 @@ void GenericReaderOptions::set_layer_map (const std::string &lm) int l = 0; while (! ex.at_end ()) { - m_layer_map.map_expr (ex, l); + m_layer_map.add_expr (ex, l); ex.test ("//"); ++l; } diff --git a/src/db/db/dbStreamLayers.cc b/src/db/db/dbStreamLayers.cc index f86db8273..eb1260601 100644 --- a/src/db/db/dbStreamLayers.cc +++ b/src/db/db/dbStreamLayers.cc @@ -738,6 +738,7 @@ LayerMap::unmap (const LDPair &p1, const LDPair &p2) } } + void LayerMap::unmap_expr (const std::string &expr) { @@ -838,6 +839,26 @@ LayerMap::to_string_file_format () const return os.str (); } +void +LayerMap::add_expr (const std::string &expr, unsigned int l) +{ + tl::Extractor ex (expr.c_str ()); + add_expr (ex, l); + ex.expect_end (); +} + +void +LayerMap::add_expr (tl::Extractor &ex, unsigned int l) +{ + if (ex.test ("+")) { + mmap_expr (ex, l); + } else if (ex.test ("-")) { + unmap_expr (ex); + } else { + map_expr (ex, l); + } +} + db::LayerMap LayerMap::from_string_file_format (const std::string &s) { @@ -860,13 +881,7 @@ LayerMap::from_string_file_format (const std::string &s) } else { if (! ex.at_end ()) { - if (ex.test ("+")) { - lm.mmap_expr (ex, l); - } else if (ex.test ("-")) { - lm.unmap_expr (ex); - } else { - lm.map_expr (ex, l); - } + lm.add_expr (ex, l); if (ex.test ("#") || ex.test ("//")) { // ignore comments } else { @@ -901,7 +916,7 @@ namespace tl while (! ex.test (")") && ! ex.at_end ()) { std::string m; ex.read_word_or_quoted (m); - t.map_expr (m, l); + t.add_expr (m, l); ++l; ex.test (";"); } @@ -921,7 +936,7 @@ namespace tl while (! ex.test (")") && ! ex.at_end ()) { std::string m; ex.read_word_or_quoted (m); - t.map_expr (m, l); + t.add_expr (m, l); ++l; ex.test (";"); } diff --git a/src/db/db/dbStreamLayers.h b/src/db/db/dbStreamLayers.h index 26c15804a..61eaad77a 100644 --- a/src/db/db/dbStreamLayers.h +++ b/src/db/db/dbStreamLayers.h @@ -521,6 +521,22 @@ public: */ void unmap_expr (tl::Extractor &ex); + /** + * @brief Generic expression mapping + * + * This generic mapping function takes a mapping expression. If it starts with "+", + * "mmap" is used, if it starts with "-", "unmap" is used. Otherwise, "map" is used. + */ + void add_expr (const std::string &expr, unsigned int l); + + /** + * @brief Generic expression mapping + * + * This generic mapping function takes a mapping expression. If it starts with "+", + * "mmap" is used, if it starts with "-", "unmap" is used. Otherwise, "map" is used. + */ + void add_expr (tl::Extractor &ex, unsigned int l); + /** * @brief Prepares a layer mapping object for reading * diff --git a/src/laybasic/laybasic/LayerMappingWidget.ui b/src/laybasic/laybasic/LayerMappingWidget.ui index a343b33ce..5fd4d65d7 100644 --- a/src/laybasic/laybasic/LayerMappingWidget.ui +++ b/src/laybasic/laybasic/LayerMappingWidget.ui @@ -6,8 +6,8 @@ 0 0 - 446 - 205 + 536 + 290 @@ -29,6 +29,19 @@ 6 + + + + + 0 + 0 + + + + Load File + + + @@ -45,103 +58,114 @@ - - - - - 0 - 0 - - - - Load File - - - - - - - - 0 - 0 - - - - true - - - QAbstractItemView::InternalMove - - - QAbstractItemView::ExtendedSelection - - - true - - - false - - - - - - - Add a new layer to the list - - - Add - - - - :/add.png:/add.png - - - - - - - Delete the selected layers from the list - - - Delete - - - - :/clear.png:/clear.png - - - - - - - Qt::Vertical - - - - 20 - 5 - - - - - - - - Edit the current layer - - - Edit - - - - :/edit.png:/edit.png + + + + 1 + + + List + + + + + + + 0 + 0 + + + + true + + + QAbstractItemView::InternalMove + + + QAbstractItemView::ExtendedSelection + + + true + + + false + + + + + + + Add a new layer to the list + + + Add + + + + :/add.png:/add.png + + + + + + + Delete the selected layers from the list + + + Delete + + + + :/clear.png:/clear.png + + + + + + + Edit the current layer + + + Edit + + + + :/edit.png:/edit.png + + + + + + + Qt::Vertical + + + + 20 + 5 + + + + + + + + + Text + + + + + + + - + diff --git a/src/laybasic/laybasic/layLayerMappingWidget.cc b/src/laybasic/laybasic/layLayerMappingWidget.cc index c5c243e77..e14dadcc7 100644 --- a/src/laybasic/laybasic/layLayerMappingWidget.cc +++ b/src/laybasic/laybasic/layLayerMappingWidget.cc @@ -53,6 +53,8 @@ LayerMappingWidget::LayerMappingWidget (QWidget *parent) mp_ui->layer_lv->viewport ()->acceptDrops (); + connect (mp_ui->tabs, SIGNAL (currentChanged (int)), this, SLOT (current_tab_changed (int))); + mp_layer_table_file_dialog = new lay::FileDialog (this, tl::to_string (QObject::tr ("Load Layer Table")), tl::to_string (QObject::tr ("Layer properties and text files (*.lyp *.txt);;Layer properties files (*.lyp);;Text files (*.txt);;All files (*)"))); @@ -72,6 +74,8 @@ LayerMappingWidget::set_layer_map (const db::LayerMap &lm) { std::vector layer_ids = lm.get_layers (); + mp_ui->text_edit->setPlainText (tl::to_qstring (lm.to_string_file_format ())); + mp_ui->layer_lv->reset (); mp_ui->layer_lv->clear (); @@ -88,16 +92,31 @@ LayerMappingWidget::set_layer_map (const db::LayerMap &lm) db::LayerMap LayerMappingWidget::get_layer_map () const +{ + return get_layer_map_from_tab (mp_ui->tabs->currentIndex ()); +} + +db::LayerMap +LayerMappingWidget::get_layer_map_from_tab (int tab) const { db::LayerMap lm; - for (int i = 0; i < mp_ui->layer_lv->count (); ++i) { - std::string t = tl::to_string (mp_ui->layer_lv->item (i)->data (Qt::DisplayRole).toString ()); - try { - lm.map_expr (t, (unsigned int) i); - } catch (...) { - mp_ui->layer_lv->setCurrentItem (mp_ui->layer_lv->item (i)); - throw; + + if (tab == 0) { + + for (int i = 0; i < mp_ui->layer_lv->count (); ++i) { + std::string t = tl::to_string (mp_ui->layer_lv->item (i)->data (Qt::DisplayRole).toString ()); + try { + lm.add_expr (t, (unsigned int) i); + } catch (...) { + mp_ui->layer_lv->setCurrentItem (mp_ui->layer_lv->item (i)); + throw; + } } + + } else { + + lm = db::LayerMap::from_string_file_format (tl::to_string (mp_ui->text_edit->toPlainText ())); + } return lm; @@ -128,17 +147,19 @@ LayerMappingWidget::load_button_pressed () mp_ui->layer_lv->reset (); mp_ui->layer_lv->clear (); + db::LayerMap lm; + // use those layers which have cellview index 0 + unsigned int n = 0; for (LayerPropertiesConstIterator lay_iter = props.begin_const_recursive (); ! lay_iter.at_end (); ++lay_iter) { if (! lay_iter->has_children () && lay_iter->source (true /*=real*/).cv_index () == 0) { db::LayerProperties db_lp = lay_iter->source (true /*=real*/).layer_props (); - QListWidgetItem *item = new QListWidgetItem (mp_ui->layer_lv); - item->setData (Qt::DisplayRole, tl::to_qstring (db_lp.to_string ())); - item->setFlags (item->flags () | Qt::ItemIsEditable); - mp_ui->layer_lv->addItem (item); + lm.map (db_lp, (unsigned int) n++); } } + set_layer_map (lm); + // if successful, stop now. success = true; @@ -230,5 +251,11 @@ LayerMappingWidget::edit_button_pressed () END_PROTECTED } +void +LayerMappingWidget::current_tab_changed (int index) +{ + set_layer_map (get_layer_map_from_tab (1 - index)); +} + } diff --git a/src/laybasic/laybasic/layLayerMappingWidget.h b/src/laybasic/laybasic/layLayerMappingWidget.h index 9252e8bb7..4c0bac3a4 100644 --- a/src/laybasic/laybasic/layLayerMappingWidget.h +++ b/src/laybasic/laybasic/layLayerMappingWidget.h @@ -84,11 +84,14 @@ private slots: void add_button_pressed (); void delete_button_pressed (); void edit_button_pressed (); + void current_tab_changed (int tab); private: lay::FileDialog *mp_layer_table_file_dialog; std::string m_layer_table_file; Ui::LayerMappingWidget *mp_ui; + + db::LayerMap get_layer_map_from_tab (int tab) const; }; } // namespace lay