diff --git a/src/layui/layui/NetlistBrowserPage.ui b/src/layui/layui/NetlistBrowserPage.ui index 19d7438c1..ca6fba4bd 100644 --- a/src/layui/layui/NetlistBrowserPage.ui +++ b/src/layui/layui/NetlistBrowserPage.ui @@ -149,36 +149,6 @@ - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 32 - 20 - - - - - - - - Netlist - - - - - - - Cross-Ref - - - @@ -251,95 +221,365 @@ - - - - 0 - 1 - + + + 1 - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - + + + Netlist + + + + 4 + + + 4 + + + 4 + + + 4 + + + - + 0 - 0 + 1 - - 100 - + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + 0 + 0 + + + + 100 + + + + + + 1 + 0 + + + + + 0 + 0 + + + + Qt::ActionsContextMenu + + + QAbstractItemView::ExtendedSelection + + + QAbstractItemView::SelectRows + + + true + + + true + + + true + + + false + + + false + + + false + + + false + + + + + - + + + + + + Schematic + + + + 4 + + + 4 + + + 4 + + + 4 + + + - - 1 - 0 + + 0 + 1 - - - 0 - 0 - + + QFrame::NoFrame - - Qt::ActionsContextMenu + + QFrame::Raised - - QAbstractItemView::ExtendedSelection - - - QAbstractItemView::SelectRows - - - true - - - true - - - true - - - false - - - false - - - false - - - false - + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + 0 + 0 + + + + 100 + + + + + + 1 + 0 + + + + + 0 + 0 + + + + Qt::ActionsContextMenu + + + QAbstractItemView::ExtendedSelection + + + QAbstractItemView::SelectRows + + + true + + + true + + + true + + + false + + + false + + + false + + + false + + + + + - - - + + + + + + Page + + + + 4 + + + 4 + + + 4 + + + 4 + + + + + + 0 + 1 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + 0 + 0 + + + + 100 + + + + + + 1 + 0 + + + + + 0 + 0 + + + + Qt::ActionsContextMenu + + + QAbstractItemView::ExtendedSelection + + + QAbstractItemView::SelectRows + + + true + + + true + + + true + + + false + + + false + + + false + + + false + + + + + + + + + + + + Log + + + + 4 + + + 4 + + + 4 + + + 4 + + + + + + @@ -436,60 +676,9 @@ info_button find_text find_button - hierarchy_tree - directory_tree - - - actionCollapseAll - triggered() - directory_tree - collapseAll() - - - -1 - -1 - - - 324 - 281 - - - - - actionExpandAll - triggered() - directory_tree - expandAll() - - - -1 - -1 - - - 324 - 281 - - - - - actionUnselectAll - triggered() - directory_tree - clearSelection() - - - -1 - -1 - - - 324 - 289 - - - - + diff --git a/src/layui/layui/layNetlistBrowserPage.cc b/src/layui/layui/layNetlistBrowserPage.cc index b22b0eb6c..42d67ec2c 100644 --- a/src/layui/layui/layNetlistBrowserPage.cc +++ b/src/layui/layui/layNetlistBrowserPage.cc @@ -138,48 +138,64 @@ NetlistBrowserPage::NetlistBrowserPage (QWidget * /*parent*/) m_show_all_action->setCheckable (true); m_show_all_action->setChecked (m_show_all); - QAction *color_action = new QAction (QObject::tr ("Colorize Nets"), directory_tree); - QMenu *menu = new QMenu (directory_tree); - lay::ColorButton::build_color_menu (menu, this, SLOT (browse_color_for_net ()), SLOT (select_color_for_net ())); - color_action->setMenu (menu); + QTreeView *dt[] = { nl_directory_tree, sch_directory_tree, xref_directory_tree }; - QAction *sep; - directory_tree->addAction (m_show_all_action); - directory_tree->addAction (actionCollapseAll); - // TODO: this gives a too big tree - confine to single branches? - // directory_tree->addAction (actionExpandAll); - sep = new QAction (directory_tree); - sep->setSeparator (true); - directory_tree->addAction (sep); - directory_tree->addAction (actionUnselectAll); - sep = new QAction (directory_tree); - sep->setSeparator (true); - directory_tree->addAction (sep); - directory_tree->addAction (color_action); - sep = new QAction (directory_tree); - sep->setSeparator (true); - directory_tree->addAction (sep); - directory_tree->addAction (actionExportSelected); - directory_tree->addAction (actionExportAll); + for (int m = 0; m < sizeof (dt) / sizeof (dt[0]); ++m) { - directory_tree->header ()->setDefaultSectionSize (150); + QTreeView *directory_tree = dt[m]; - lay::HTMLItemDelegate *delegate; + QAction *color_action = new QAction (QObject::tr ("Colorize Nets"), directory_tree); + QMenu *menu = new QMenu (directory_tree); + lay::ColorButton::build_color_menu (menu, this, SLOT (browse_color_for_net ()), SLOT (select_color_for_net ())); + color_action->setMenu (menu); + + QAction *sep; + directory_tree->addAction (m_show_all_action); + directory_tree->addAction (actionCollapseAll); + // TODO: this gives a too big tree - confine to single branches? + // directory_tree->addAction (actionExpandAll); + sep = new QAction (directory_tree); + sep->setSeparator (true); + directory_tree->addAction (sep); + directory_tree->addAction (actionUnselectAll); + sep = new QAction (directory_tree); + sep->setSeparator (true); + directory_tree->addAction (sep); + directory_tree->addAction (color_action); + sep = new QAction (directory_tree); + sep->setSeparator (true); + directory_tree->addAction (sep); + directory_tree->addAction (actionExportSelected); + directory_tree->addAction (actionExportAll); + + directory_tree->header ()->setDefaultSectionSize (150); + + for (int i = 0; i < 4; ++i) { + lay::HTMLItemDelegate *delegate = new lay::HTMLItemDelegate (this); + delegate->set_text_margin (2); + delegate->set_anchors_clickable (true); + connect (delegate, SIGNAL (anchor_clicked (const QString &)), this, SLOT (anchor_clicked (const QString &))); + directory_tree->setItemDelegateForColumn (i, delegate); + } + + directory_tree->installEventFilter (this); - for (int i = 0; i < 4; ++i) { - delegate = new lay::HTMLItemDelegate (this); - delegate->set_text_margin (2); - delegate->set_anchors_clickable (true); - connect (delegate, SIGNAL (anchor_clicked (const QString &)), this, SLOT (anchor_clicked (const QString &))); - directory_tree->setItemDelegateForColumn (i, delegate); } - for (int i = 0; i < 2; ++i) { - delegate = new lay::HTMLItemDelegate (this); - delegate->set_text_margin (2); - delegate->set_anchors_clickable (true); - connect (delegate, SIGNAL (anchor_clicked (const QString &)), this, SLOT (anchor_clicked (const QString &))); - hierarchy_tree->setItemDelegateForColumn (i, delegate); + QTreeView *ht[] = { nl_hierarchy_tree, sch_hierarchy_tree, xref_hierarchy_tree }; + + for (int m = 0; m < sizeof (ht) / sizeof (ht[0]); ++m) { + + QTreeView *hierarchy_tree = ht[m]; + + for (int i = 0; i < 2; ++i) { + lay::HTMLItemDelegate *delegate = new lay::HTMLItemDelegate (this); + delegate->set_text_margin (2); + delegate->set_anchors_clickable (true); + connect (delegate, SIGNAL (anchor_clicked (const QString &)), this, SLOT (anchor_clicked (const QString &))); + hierarchy_tree->setItemDelegateForColumn (i, delegate); + } + } QMenu *find_edit_menu = new QMenu (find_text); @@ -200,16 +216,14 @@ NetlistBrowserPage::NetlistBrowserPage (QWidget * /*parent*/) connect (forward, SIGNAL (clicked ()), this, SLOT (navigate_forward ())); connect (backward, SIGNAL (clicked ()), this, SLOT (navigate_back ())); - connect (show_netlist, SIGNAL (clicked ()), this, SLOT (mode_changed ())); - connect (show_xref, SIGNAL (clicked ()), this, SLOT (mode_changed ())); +// @@@ connect (show_netlist, SIGNAL (clicked ()), this, SLOT (mode_changed ())); +// @@@ connect (show_xref, SIGNAL (clicked ()), this, SLOT (mode_changed ())); connect (actionExportAll, SIGNAL (triggered ()), this, SLOT (export_all ())); connect (actionExportSelected, SIGNAL (triggered ()), this, SLOT (export_selected ())); forward->setEnabled (false); backward->setEnabled (false); - - directory_tree->installEventFilter (this); } NetlistBrowserPage::~NetlistBrowserPage () @@ -220,7 +234,7 @@ NetlistBrowserPage::~NetlistBrowserPage () bool NetlistBrowserPage::is_netlist_mode () { - return show_netlist->isChecked (); + return mode_tab->currentIndex () == 0; // @@@ } void @@ -285,7 +299,8 @@ NetlistBrowserPage::set_max_shape_count (size_t max_shape_count) bool NetlistBrowserPage::eventFilter (QObject *watched, QEvent *event) { - if (watched != directory_tree) { + QTreeView *tree = dynamic_cast (watched); + if (tree != nl_directory_tree && tree != sch_directory_tree && tree != xref_directory_tree) { return false; } @@ -295,7 +310,7 @@ NetlistBrowserPage::eventFilter (QObject *watched, QEvent *event) } if (ke->key () == Qt::Key_Escape) { - directory_tree->clearSelection (); + tree->clearSelection (); return true; } else { return false; @@ -308,17 +323,69 @@ NetlistBrowserPage::layer_list_changed (int) dm_update_highlights (); } +QTreeView * +NetlistBrowserPage::current_hierarchy_tree () +{ + switch (mode_tab->currentIndex ()) { + case 0: + return nl_hierarchy_tree; + case 1: + return sch_hierarchy_tree; + case 2: + return xref_hierarchy_tree; + default: + return 0; + } +} + +QTreeView * +NetlistBrowserPage::current_directory_tree () +{ + switch (mode_tab->currentIndex ()) { + case 0: + return nl_directory_tree; + case 1: + return sch_directory_tree; + case 2: + return xref_directory_tree; + default: + return 0; + } +} + void NetlistBrowserPage::anchor_clicked (const QString &a) { - NetlistBrowserModel *netlist_model = dynamic_cast (directory_tree->model ()); + QTreeView *directory_tree = current_directory_tree (); + NetlistBrowserModel *netlist_model = 0; + if (directory_tree) { + netlist_model = dynamic_cast (directory_tree->model ()); + } if (netlist_model) { navigate_to (netlist_model->index_from_url (a), true); } } void -NetlistBrowserPage::current_tree_index_changed (const QModelIndex &index) +NetlistBrowserPage::nl_current_tree_index_changed (const QModelIndex &index) +{ + current_tree_index_changed (nl_hierarchy_tree, nl_directory_tree, index); +} + +void +NetlistBrowserPage::sch_current_tree_index_changed (const QModelIndex &index) +{ + current_tree_index_changed (sch_hierarchy_tree, sch_directory_tree, index); +} + +void +NetlistBrowserPage::xref_current_tree_index_changed (const QModelIndex &index) +{ + current_tree_index_changed (xref_hierarchy_tree, xref_directory_tree, index); +} + +void +NetlistBrowserPage::current_tree_index_changed (QTreeView *hierarchy_tree, QTreeView *directory_tree, const QModelIndex &index) { if (index.isValid () && m_signals_enabled) { @@ -340,7 +407,25 @@ NetlistBrowserPage::current_tree_index_changed (const QModelIndex &index) } void -NetlistBrowserPage::current_index_changed (const QModelIndex &index) +NetlistBrowserPage::nl_current_index_changed (const QModelIndex &index) +{ + current_index_changed (nl_hierarchy_tree, nl_directory_tree, index); +} + +void +NetlistBrowserPage::sch_current_index_changed (const QModelIndex &index) +{ + current_index_changed (sch_hierarchy_tree, sch_directory_tree, index); +} + +void +NetlistBrowserPage::xref_current_index_changed (const QModelIndex &index) +{ + current_index_changed (xref_hierarchy_tree, xref_directory_tree, index); +} + +void +NetlistBrowserPage::current_index_changed (QTreeView *hierarchy_tree, QTreeView *directory_tree, const QModelIndex &index) { if (index.isValid () && m_signals_enabled) { @@ -366,11 +451,27 @@ void NetlistBrowserPage::select_net (const db::Net *net) { if (! net || ! net->circuit ()) { - directory_tree->clearSelection (); + + nl_directory_tree->clearSelection (); + sch_directory_tree->clearSelection (); + xref_directory_tree->clearSelection (); + } else { - NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); + + NetlistBrowserModel *model; + + model = dynamic_cast (nl_directory_tree->model ()); tl_assert (model != 0); - directory_tree->setCurrentIndex (model->index_from_net (net)); + nl_directory_tree->setCurrentIndex (model->index_from_net (net)); + + model = dynamic_cast (sch_directory_tree->model ()); + tl_assert (model != 0); + sch_directory_tree->setCurrentIndex (model->index_from_net (net)); + + model = dynamic_cast (xref_directory_tree->model ()); + tl_assert (model != 0); + xref_directory_tree->setCurrentIndex (model->index_from_net (net)); + } } @@ -378,22 +479,43 @@ void NetlistBrowserPage::select_path (const lay::NetlistObjectsPath &path) { if (path.is_null ()) { - directory_tree->clearSelection (); + + nl_directory_tree->clearSelection (); + sch_directory_tree->clearSelection (); + xref_directory_tree->clearSelection (); + } else { - NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); + + NetlistBrowserModel *model; + + model = dynamic_cast (nl_directory_tree->model ()); tl_assert (model != 0); - directory_tree->setCurrentIndex (model->index_from_path (path)); + nl_directory_tree->setCurrentIndex (model->index_from_path (path)); + + model = dynamic_cast (sch_directory_tree->model ()); + tl_assert (model != 0); + sch_directory_tree->setCurrentIndex (model->index_from_path (path)); + + model = dynamic_cast (xref_directory_tree->model ()); + tl_assert (model != 0); + xref_directory_tree->setCurrentIndex (model->index_from_path (path)); + } } std::vector NetlistBrowserPage::selected_nets () { + std::vector nets; + + QTreeView *directory_tree = current_directory_tree (); + if (! directory_tree) { + return nets; + } + NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); tl_assert (model != 0); - std::vector nets; - QModelIndexList selection = directory_tree->selectionModel ()->selectedIndexes (); for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { if (i->column () == 0) { @@ -410,11 +532,16 @@ NetlistBrowserPage::selected_nets () std::vector NetlistBrowserPage::selected_circuits () { + std::vector circuits; + + QTreeView *directory_tree = current_directory_tree (); + if (! directory_tree) { + return circuits; + } + NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); tl_assert (model != 0); - std::vector circuits; - QModelIndexList selection = directory_tree->selectionModel ()->selectedIndexes (); for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { if (i->column () == 0) { @@ -431,11 +558,16 @@ NetlistBrowserPage::selected_circuits () std::vector NetlistBrowserPage::selected_subcircuits () { + std::vector subcircuits; + + QTreeView *directory_tree = current_directory_tree (); + if (! directory_tree) { + return subcircuits; + } + NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); tl_assert (model != 0); - std::vector subcircuits; - QModelIndexList selection = directory_tree->selectionModel ()->selectedIndexes (); for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { if (i->column () == 0) { @@ -452,11 +584,16 @@ NetlistBrowserPage::selected_subcircuits () std::vector NetlistBrowserPage::selected_devices () { + std::vector devices; + + QTreeView *directory_tree = current_directory_tree (); + if (! directory_tree) { + return devices; + } + NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); tl_assert (model != 0); - std::vector devices; - QModelIndexList selection = directory_tree->selectionModel ()->selectedIndexes (); for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) { if (i->column () == 0) { @@ -471,7 +608,25 @@ NetlistBrowserPage::selected_devices () } void -NetlistBrowserPage::selection_changed () +NetlistBrowserPage::nl_selection_changed () +{ + selection_changed (nl_hierarchy_tree, nl_directory_tree); +} + +void +NetlistBrowserPage::sch_selection_changed () +{ + selection_changed (sch_hierarchy_tree, sch_directory_tree); +} + +void +NetlistBrowserPage::xref_selection_changed () +{ + selection_changed (xref_hierarchy_tree, xref_directory_tree); +} + +void +NetlistBrowserPage::selection_changed (QTreeView * /*hierarchy_tree*/, QTreeView *directory_tree) { NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); tl_assert (model != 0); @@ -531,11 +686,37 @@ NetlistBrowserPage::select_color_for_net () void NetlistBrowserPage::navigate_to (const QModelIndex &index, bool fwd) { - if (! index.isValid ()) { + if (! index.isValid () || ! index.model ()) { + return; + } + + QTreeView *directory_tree = 0; + QTreeView *hierarchy_tree = 0; + + if (index.model () == nl_directory_tree->model ()) { + + directory_tree = nl_directory_tree; + hierarchy_tree = nl_hierarchy_tree; + mode_tab->setCurrentIndex (0); + + } else if (index.model () == sch_directory_tree->model ()) { + + directory_tree = sch_directory_tree; + hierarchy_tree = sch_hierarchy_tree; + mode_tab->setCurrentIndex (1); + + } else if (index.model () == xref_directory_tree->model ()) { + + directory_tree = xref_directory_tree; + hierarchy_tree = xref_hierarchy_tree; + mode_tab->setCurrentIndex (2); + + } else { return; } m_signals_enabled = false; + try { directory_tree->setCurrentIndex (index); @@ -557,7 +738,7 @@ NetlistBrowserPage::navigate_to (const QModelIndex &index, bool fwd) add_to_history (index, fwd); - selection_changed (); + selection_changed (directory_tree, hierarchy_tree); } void @@ -643,7 +824,7 @@ NetlistBrowserPage::info_button_pressed () void NetlistBrowserPage::mode_changed () { - setup_trees (); + // @@@ setup_trees (); } static QModelIndex find_next (QTreeView *view, QAbstractItemModel *model, const QRegExp &to_find, const QModelIndex &from) @@ -739,6 +920,11 @@ NetlistBrowserPage::find_button_pressed () actionCaseSensitive->isChecked () ? Qt::CaseSensitive : Qt::CaseInsensitive, actionUseRegularExpressions->isChecked () ? QRegExp::RegExp : QRegExp::FixedString); + QTreeView *directory_tree = current_directory_tree (); + if (! directory_tree) { + return; + } + QModelIndex next = find_next (directory_tree, directory_tree->model (), re, directory_tree->currentIndex ()); if (next.isValid ()) { navigate_to (next); @@ -761,9 +947,9 @@ NetlistBrowserPage::show_all (bool f) m_show_all = f; m_show_all_action->setChecked (f); - NetlistBrowserModel *model = dynamic_cast (directory_tree->model ()); + NetlistBrowserModel *model = dynamic_cast (xref_directory_tree->model ()); if (model) { - model->set_item_visibility (directory_tree, m_show_all, false /*show warnings only with 'show all'*/); + model->set_item_visibility (xref_directory_tree, m_show_all, false /*show warnings only with 'show all'*/); } } @@ -799,14 +985,11 @@ NetlistBrowserPage::set_db (db::LayoutToNetlist *l2ndb) rerun_button->setToolTip (QString ()); } - show_netlist->setVisible (lvsdb != 0); - show_xref->setVisible (lvsdb != 0); - - bool se = m_signals_enabled; - m_signals_enabled = false; - show_netlist->setChecked (lvsdb == 0); - show_xref->setChecked (lvsdb != 0); - m_signals_enabled = se; + bool is_lvsdb = (lvsdb != 0); + mode_tab->widget (0)->setVisible (true); + mode_tab->widget (1)->setVisible (is_lvsdb); + mode_tab->widget (2)->setVisible (is_lvsdb); + mode_tab->widget (3)->setVisible (is_lvsdb); clear_highlights (); @@ -819,84 +1002,157 @@ NetlistBrowserPage::set_db (db::LayoutToNetlist *l2ndb) return true; } +static void +set_abstract_tree_model (QTreeView *view, QAbstractItemModel *new_model) +{ + int columns = view->model () ? view->model ()->columnCount (QModelIndex ()) : 0; + int new_columns = new_model->columnCount (QModelIndex ()); + + delete view->model (); + view->setModel (new_model); + + view->header ()->show (); + view->header ()->setStretchLastSection (true); + view->header ()->setMinimumSectionSize (25); + + if (columns < new_columns) { + // makes sure new columns are properly size-adjusted + for (int i = std::max (0, columns - 1); i < new_columns; ++i) { + view->header ()->resizeSection (i, i == 1 ? view->header ()->minimumSectionSize () : view->header ()->defaultSectionSize ()); + } + } +} + +static void +set_tree_model (QTreeView *view, NetlistBrowserModel *new_model) +{ + set_abstract_tree_model (view, new_model); + + // hide the status column if not needed + view->header ()->setSectionHidden (1, new_model->status_column () < 0); +} + +static void +set_tree_model (QTreeView *view, NetlistBrowserTreeModel *new_model) +{ + set_abstract_tree_model (view, new_model); + + // hide the status column if not needed + view->header ()->setSectionHidden (1, new_model->status_column () < 0); +} + void NetlistBrowserPage::setup_trees () { if (! mp_database.get ()) { - delete directory_tree->model (); - directory_tree->setModel (0); - delete hierarchy_tree->model (); - hierarchy_tree->setModel (0); + delete nl_directory_tree->model (); + nl_directory_tree->setModel (0); + delete sch_directory_tree->model (); + sch_directory_tree->setModel (0); + delete xref_directory_tree->model (); + xref_directory_tree->setModel (0); + delete nl_hierarchy_tree->model (); + nl_hierarchy_tree->setModel (0); + delete sch_hierarchy_tree->model (); + sch_hierarchy_tree->setModel (0); + delete xref_hierarchy_tree->model (); + xref_hierarchy_tree->setModel (0); return; } db::LayoutToNetlist *l2ndb = mp_database.get (); - db::LayoutVsSchematic *lvsdb = show_netlist->isChecked () ? 0 : dynamic_cast (l2ndb); + db::LayoutVsSchematic *lvsdb = dynamic_cast (l2ndb); { // NOTE: with the tree as the parent, the tree will take over ownership of the model - NetlistBrowserModel *new_model = 0; - if (lvsdb) { - new_model = new NetlistBrowserModel (directory_tree, lvsdb, &m_colorizer); - } else { - new_model = new NetlistBrowserModel (directory_tree, l2ndb, &m_colorizer); - } + NetlistBrowserModel *new_model = new NetlistBrowserModel (nl_directory_tree, l2ndb, &m_colorizer); - int columns = directory_tree->model () ? directory_tree->model ()->columnCount (QModelIndex ()) : 0; - int new_columns = new_model->columnCount (QModelIndex ()); + set_tree_model (nl_directory_tree, new_model); - delete directory_tree->model (); - directory_tree->setModel (new_model); - connect (directory_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_index_changed (const QModelIndex &))); - connect (directory_tree->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (selection_changed ())); - - directory_tree->header ()->show (); - directory_tree->header ()->setStretchLastSection (true); - directory_tree->header ()->setMinimumSectionSize (25); - - if (columns < new_columns) { - // makes sure new columns are properly size-adjusted - for (int i = std::max (0, columns - 1); i < new_columns; ++i) { - directory_tree->header ()->resizeSection (i, i == 1 ? directory_tree->header ()->minimumSectionSize () : directory_tree->header ()->defaultSectionSize ()); - } - } - - // hide the status column if not needed - directory_tree->header ()->setSectionHidden (1, new_model->status_column () < 0); + connect (nl_directory_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (nl_current_index_changed (const QModelIndex &))); + connect (nl_directory_tree->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (nl_selection_changed ())); // establish visibility according to "show all" - new_model->set_item_visibility (directory_tree, m_show_all, false /*show warnings only with 'show all'*/); + new_model->set_item_visibility (nl_directory_tree, m_show_all, false /*show warnings only with 'show all'*/); + } + + if (lvsdb) { + + // NOTE: with the tree as the parent, the tree will take over ownership of the model + // @@@ should be schematic + NetlistBrowserModel *new_model = new NetlistBrowserModel (sch_directory_tree, l2ndb, &m_colorizer); + + set_tree_model (nl_directory_tree, new_model); + + connect (sch_directory_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (sch_current_index_changed (const QModelIndex &))); + connect (sch_directory_tree->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (sch_selection_changed ())); + + // establish visibility according to "show all" + new_model->set_item_visibility (sch_directory_tree, m_show_all, false /*show warnings only with 'show all'*/); + + } else { + + delete sch_directory_tree->model (); + sch_directory_tree->setModel (0); + + } + + if (lvsdb) { + + // NOTE: with the tree as the parent, the tree will take over ownership of the model + NetlistBrowserModel *new_model = new NetlistBrowserModel (xref_directory_tree, lvsdb, &m_colorizer); + + set_tree_model (nl_directory_tree, new_model); + + connect (xref_directory_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (xref_current_index_changed (const QModelIndex &))); + connect (xref_directory_tree->selectionModel (), SIGNAL (selectionChanged (const QItemSelection &, const QItemSelection &)), this, SLOT (xref_selection_changed ())); + + // establish visibility according to "show all" + new_model->set_item_visibility (xref_directory_tree, m_show_all, false /*show warnings only with 'show all'*/); + + } else { + + delete xref_directory_tree->model (); + xref_directory_tree->setModel (0); + } { // NOTE: with the tree as the parent, the tree will take over ownership of the model - NetlistBrowserTreeModel *new_hierarchy_model = 0; - if (lvsdb) { - new_hierarchy_model = new NetlistBrowserTreeModel (hierarchy_tree, lvsdb); - } else { - new_hierarchy_model = new NetlistBrowserTreeModel (hierarchy_tree, l2ndb); - } + NetlistBrowserTreeModel *new_hierarchy_model = new NetlistBrowserTreeModel (nl_hierarchy_tree, l2ndb); + set_tree_model (nl_directory_tree, new_hierarchy_model); - int columns = hierarchy_tree->model () ? hierarchy_tree->model ()->columnCount (QModelIndex ()) : 0; - int new_columns = new_hierarchy_model->columnCount (QModelIndex ()); + connect (nl_hierarchy_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (nl_current_tree_index_changed (const QModelIndex &))); + } - delete hierarchy_tree->model (); - hierarchy_tree->setModel (new_hierarchy_model); - connect (hierarchy_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_tree_index_changed (const QModelIndex &))); + if (lvsdb) { - hierarchy_tree->header ()->show (); - hierarchy_tree->header ()->setStretchLastSection (true); - hierarchy_tree->header ()->setMinimumSectionSize (25); + // NOTE: with the tree as the parent, the tree will take over ownership of the model + NetlistBrowserTreeModel *new_hierarchy_model = new NetlistBrowserTreeModel (sch_hierarchy_tree, l2ndb); + set_tree_model (sch_directory_tree, new_hierarchy_model); - if (columns < new_columns) { - // makes sure new columns are properly size-adjusted - for (int i = std::max (0, columns - 1); i < new_columns; ++i) { - hierarchy_tree->header ()->resizeSection (i, i == 1 ? hierarchy_tree->header ()->minimumSectionSize () : hierarchy_tree->header ()->defaultSectionSize ()); - } - } + connect (sch_hierarchy_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (sch_current_tree_index_changed (const QModelIndex &))); + + } else { + + delete sch_hierarchy_tree->model (); + sch_hierarchy_tree->setModel (0); + + } + + if (lvsdb) { + + // NOTE: with the tree as the parent, the tree will take over ownership of the model + NetlistBrowserTreeModel *new_hierarchy_model = new NetlistBrowserTreeModel (xref_hierarchy_tree, lvsdb); + set_tree_model (xref_directory_tree, new_hierarchy_model); + + connect (xref_hierarchy_tree->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (xref_current_tree_index_changed (const QModelIndex &))); + + } else { + + delete xref_hierarchy_tree->model (); + xref_hierarchy_tree->setModel (0); - // hide the status column if not needed - hierarchy_tree->header ()->setSectionHidden (1, new_hierarchy_model->status_column () < 0); } find_text->setText (QString ()); diff --git a/src/layui/layui/layNetlistBrowserPage.h b/src/layui/layui/layNetlistBrowserPage.h index d70410cb7..73cf003d6 100644 --- a/src/layui/layui/layNetlistBrowserPage.h +++ b/src/layui/layui/layNetlistBrowserPage.h @@ -202,9 +202,15 @@ private slots: void anchor_clicked (const QString &url); void navigate_back (); void navigate_forward (); - void current_index_changed (const QModelIndex &index); - void current_tree_index_changed (const QModelIndex &index); - void selection_changed (); + void nl_current_index_changed (const QModelIndex &index); + void sch_current_index_changed (const QModelIndex &index); + void xref_current_index_changed (const QModelIndex &index); + void nl_current_tree_index_changed (const QModelIndex &index); + void sch_current_tree_index_changed (const QModelIndex &index); + void xref_current_tree_index_changed (const QModelIndex &index); + void nl_selection_changed (); + void sch_selection_changed (); + void xref_selection_changed (); void browse_color_for_net (); void select_color_for_net (); void mode_changed (); @@ -262,6 +268,11 @@ private: bool produce_highlights_for_circuit (const db::Circuit *circuit, size_t &n_markers, const std::vector &tv); void configure_marker (lay::Marker *marker, bool with_fill); void rerun_macro (); + void selection_changed (QTreeView *hierarchy_tree, QTreeView *directory_tree); + void current_tree_index_changed (QTreeView *hierarchy_tree, QTreeView *directory_tree, const QModelIndex &index); + void current_index_changed (QTreeView *hierarchy_tree, QTreeView *directory_tree, const QModelIndex &index); + QTreeView *current_hierarchy_tree (); + QTreeView *current_directory_tree (); void export_nets (const std::vector *nets); };