WIP: started integrating log view in netlist browser

This commit is contained in:
Matthias Koefferlein 2022-08-07 22:02:22 +02:00
parent 2e7524a0fe
commit 8029302e08
3 changed files with 746 additions and 290 deletions

View File

@ -149,36 +149,6 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>32</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QRadioButton" name="show_netlist">
<property name="text">
<string>Netlist</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="show_xref">
<property name="text">
<string>Cross-Ref</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
@ -251,95 +221,365 @@
</widget>
</item>
<item>
<widget class="QFrame" name="frame_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
<widget class="QTabWidget" name="mode_tab">
<property name="currentIndex">
<number>1</number>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeView" name="hierarchy_tree">
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Netlist</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="QFrame" name="frame_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeView" name="nl_hierarchy_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
</widget>
<widget class="QTreeView" name="nl_directory_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QTreeView" name="directory_tree">
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Schematic</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="QFrame" name="frame_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeView" name="sch_hierarchy_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
</widget>
<widget class="QTreeView" name="sch_directory_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Page</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="QFrame" name="frame_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitter_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeView" name="xref_hierarchy_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
</widget>
<widget class="QTreeView" name="xref_directory_tree">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>Log</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="QTreeView" name="log_view"/>
</item>
</layout>
</widget>
</widget>
</item>
<item>
@ -436,60 +676,9 @@
<tabstop>info_button</tabstop>
<tabstop>find_text</tabstop>
<tabstop>find_button</tabstop>
<tabstop>hierarchy_tree</tabstop>
<tabstop>directory_tree</tabstop>
</tabstops>
<resources>
<include location="../../lay/lay/layResources.qrc"/>
</resources>
<connections>
<connection>
<sender>actionCollapseAll</sender>
<signal>triggered()</signal>
<receiver>directory_tree</receiver>
<slot>collapseAll()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>324</x>
<y>281</y>
</hint>
</hints>
</connection>
<connection>
<sender>actionExpandAll</sender>
<signal>triggered()</signal>
<receiver>directory_tree</receiver>
<slot>expandAll()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>324</x>
<y>281</y>
</hint>
</hints>
</connection>
<connection>
<sender>actionUnselectAll</sender>
<signal>triggered()</signal>
<receiver>directory_tree</receiver>
<slot>clearSelection()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>324</x>
<y>289</y>
</hint>
</hints>
</connection>
</connections>
<connections/>
</ui>

View File

@ -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<QTreeView *> (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<NetlistBrowserModel *> (directory_tree->model ());
QTreeView *directory_tree = current_directory_tree ();
NetlistBrowserModel *netlist_model = 0;
if (directory_tree) {
netlist_model = dynamic_cast<NetlistBrowserModel *> (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<NetlistBrowserModel *> (directory_tree->model ());
NetlistBrowserModel *model;
model = dynamic_cast<NetlistBrowserModel *> (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<NetlistBrowserModel *> (sch_directory_tree->model ());
tl_assert (model != 0);
sch_directory_tree->setCurrentIndex (model->index_from_net (net));
model = dynamic_cast<NetlistBrowserModel *> (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<NetlistBrowserModel *> (directory_tree->model ());
NetlistBrowserModel *model;
model = dynamic_cast<NetlistBrowserModel *> (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<NetlistBrowserModel *> (sch_directory_tree->model ());
tl_assert (model != 0);
sch_directory_tree->setCurrentIndex (model->index_from_path (path));
model = dynamic_cast<NetlistBrowserModel *> (xref_directory_tree->model ());
tl_assert (model != 0);
xref_directory_tree->setCurrentIndex (model->index_from_path (path));
}
}
std::vector<const db::Net *>
NetlistBrowserPage::selected_nets ()
{
std::vector<const db::Net *> nets;
QTreeView *directory_tree = current_directory_tree ();
if (! directory_tree) {
return nets;
}
NetlistBrowserModel *model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
tl_assert (model != 0);
std::vector<const db::Net *> 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<const db::Circuit *>
NetlistBrowserPage::selected_circuits ()
{
std::vector<const db::Circuit *> circuits;
QTreeView *directory_tree = current_directory_tree ();
if (! directory_tree) {
return circuits;
}
NetlistBrowserModel *model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
tl_assert (model != 0);
std::vector<const db::Circuit *> 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<const db::SubCircuit *>
NetlistBrowserPage::selected_subcircuits ()
{
std::vector<const db::SubCircuit *> subcircuits;
QTreeView *directory_tree = current_directory_tree ();
if (! directory_tree) {
return subcircuits;
}
NetlistBrowserModel *model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
tl_assert (model != 0);
std::vector<const db::SubCircuit *> 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<const db::Device *>
NetlistBrowserPage::selected_devices ()
{
std::vector<const db::Device *> devices;
QTreeView *directory_tree = current_directory_tree ();
if (! directory_tree) {
return devices;
}
NetlistBrowserModel *model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
tl_assert (model != 0);
std::vector<const db::Device *> 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<NetlistBrowserModel *> (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<NetlistBrowserModel *> (directory_tree->model ());
NetlistBrowserModel *model = dynamic_cast<NetlistBrowserModel *> (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<db::LayoutVsSchematic *> (l2ndb);
db::LayoutVsSchematic *lvsdb = dynamic_cast<db::LayoutVsSchematic *> (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 ());

View File

@ -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<db::DCplxTrans> &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<const db::Net *> *nets);
};