mirror of https://github.com/KLayout/klayout.git
Netlist browser - some bugfixes, multiple selection of nets, colorizing
This commit is contained in:
parent
f8d09a642b
commit
bfea3fdc2f
|
|
@ -6,8 +6,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>571</width>
|
||||
<height>331</height>
|
||||
<width>649</width>
|
||||
<height>333</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
|
@ -89,76 +89,120 @@ brightness of the color used.</string>
|
|||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="0" colspan="6">
|
||||
<item row="3" column="0" colspan="4">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Net coloring</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="4">
|
||||
<widget class="QFrame" name="frame_4">
|
||||
<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>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="lay::ColorButton" name="color_pb">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>The color in which the rulers are drawn</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>or</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="brightness_sb">
|
||||
<property name="minimum">
|
||||
<number>-100</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>% intensity increase</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>201</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="4">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Net highlighting</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>or</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>% intensity increase</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="5">
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>201</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="3" column="3" colspan="3">
|
||||
<item row="5" column="1" colspan="3">
|
||||
<widget class="QFrame" name="frame_3">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
|
|
@ -182,6 +226,53 @@ brightness of the color used.</string>
|
|||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="4">
|
||||
<widget class="QFrame" name="frame_5">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<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>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cycle_colors_cb">
|
||||
<property name="text">
|
||||
<string>Auto-color with palette</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc0">
|
||||
<property name="text">
|
||||
|
|
@ -196,27 +287,6 @@ brightness of the color used.</string>
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc2">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc3">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc4">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc5">
|
||||
<property name="text">
|
||||
|
|
@ -231,6 +301,13 @@ brightness of the color used.</string>
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc3">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc7">
|
||||
<property name="text">
|
||||
|
|
@ -238,6 +315,20 @@ brightness of the color used.</string>
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc4">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="cc2">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
|
|
@ -254,49 +345,6 @@ brightness of the color used.</string>
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="cycle_colors_cb">
|
||||
<property name="text">
|
||||
<string>Auto-color with palette</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="6">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Net coloring</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QSpinBox" name="brightness_sb">
|
||||
<property name="minimum">
|
||||
<number>-100</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="lay::ColorButton" name="color_pb">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>The color in which the rulers are drawn</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include <QUrl>
|
||||
#include <QPainter>
|
||||
#include <QColorDialog>
|
||||
|
||||
namespace lay
|
||||
{
|
||||
|
|
@ -89,6 +90,8 @@ static size_t index_from_attr (const Attr *attr, const Iter &begin, const Iter &
|
|||
NetColorizer::NetColorizer ()
|
||||
{
|
||||
m_auto_colors_enabled = false;
|
||||
m_update_needed = false;
|
||||
m_signals_enabled = true;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -102,21 +105,27 @@ NetColorizer::configure (const QColor &marker_color, const lay::ColorPalette *au
|
|||
m_auto_colors_enabled = false;
|
||||
}
|
||||
|
||||
emit colors_changed ();
|
||||
emit_colors_changed ();
|
||||
}
|
||||
|
||||
bool
|
||||
NetColorizer::has_color_for_net (const db::Net *net)
|
||||
{
|
||||
return m_auto_colors_enabled || m_custom_color.find (net) != m_custom_color.end ();
|
||||
}
|
||||
|
||||
void
|
||||
NetColorizer::set_color_of_net (const db::Net *net, const QColor &color)
|
||||
{
|
||||
m_custom_color[net] = color;
|
||||
emit colors_changed ();
|
||||
emit_colors_changed ();
|
||||
}
|
||||
|
||||
void
|
||||
NetColorizer::reset_color_of_net (const db::Net *net)
|
||||
{
|
||||
m_custom_color.erase (net);
|
||||
emit colors_changed ();
|
||||
emit_colors_changed ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -124,7 +133,38 @@ NetColorizer::clear ()
|
|||
{
|
||||
m_net_index_by_object.clear ();
|
||||
m_custom_color.clear ();
|
||||
emit colors_changed ();
|
||||
emit_colors_changed ();
|
||||
}
|
||||
|
||||
void
|
||||
NetColorizer::begin_changes ()
|
||||
{
|
||||
if (m_signals_enabled) {
|
||||
m_update_needed = false;
|
||||
m_signals_enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NetColorizer::end_changes ()
|
||||
{
|
||||
if (! m_signals_enabled) {
|
||||
m_signals_enabled = true;
|
||||
if (m_update_needed) {
|
||||
emit colors_changed ();
|
||||
}
|
||||
m_update_needed = false;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NetColorizer::emit_colors_changed ()
|
||||
{
|
||||
if (! m_signals_enabled) {
|
||||
m_update_needed = true;
|
||||
} else {
|
||||
emit colors_changed ();
|
||||
}
|
||||
}
|
||||
|
||||
QColor
|
||||
|
|
@ -907,7 +947,7 @@ static QIcon net_icon_with_color (const QColor &color)
|
|||
QIcon
|
||||
NetlistBrowserModel::icon_for_net (const db::Net *net) const
|
||||
{
|
||||
if (mp_colorizer) {
|
||||
if (mp_colorizer && mp_colorizer->has_color_for_net (net)) {
|
||||
|
||||
QColor color = mp_colorizer->color_of_net (net);
|
||||
|
||||
|
|
@ -1097,7 +1137,7 @@ NetlistBrowserModel::index (int row, int column, const QModelIndex &parent) cons
|
|||
void
|
||||
NetlistBrowserModel::colors_changed ()
|
||||
{
|
||||
// @@@ TODO: refresh colors of nets
|
||||
emit dataChanged (index (0, 0, QModelIndex ()), index (rowCount (QModelIndex()) - 1, 0, QModelIndex ()));
|
||||
}
|
||||
|
||||
const db::Net *
|
||||
|
|
@ -1481,12 +1521,23 @@ NetlistBrowserPage::NetlistBrowserPage (QWidget * /*parent*/)
|
|||
{
|
||||
Ui::NetlistBrowserPage::setupUi (this);
|
||||
|
||||
// @@@ insert into menu
|
||||
m_show_all_action = new QAction (QObject::tr ("Show All"), this);
|
||||
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);
|
||||
|
||||
directory_tree->addAction (actionCollapseAll);
|
||||
directory_tree->addAction (actionExpandAll);
|
||||
QAction *sep;
|
||||
sep = new QAction (directory_tree);
|
||||
sep->setSeparator (true);
|
||||
directory_tree->addAction (sep);
|
||||
directory_tree->addAction (color_action);
|
||||
|
||||
lay::HTMLItemDelegate *delegate;
|
||||
|
||||
|
|
@ -1581,10 +1632,67 @@ NetlistBrowserPage::current_index_changed (const QModelIndex &index)
|
|||
void *id = index.internalPointer ();
|
||||
add_to_history (id, true);
|
||||
|
||||
NetlistBrowserModel *model = dynamic_cast<NetlistBrowserModel *> (directory_tree->model ());
|
||||
tl_assert (model != 0);
|
||||
show_net (model->net_from_index (index));
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<const db::Net *>
|
||||
NetlistBrowserPage::selected_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) {
|
||||
const db::Net *net = model->net_from_index (*i);
|
||||
if (net) {
|
||||
nets.push_back (net);
|
||||
}
|
||||
}
|
||||
|
||||
return nets;
|
||||
}
|
||||
|
||||
void
|
||||
NetlistBrowserPage::net_selection_changed ()
|
||||
{
|
||||
highlight_nets (selected_nets ());
|
||||
}
|
||||
|
||||
void
|
||||
NetlistBrowserPage::set_color_for_selected_nets (const QColor &color)
|
||||
{
|
||||
std::vector<const db::Net *> nets = selected_nets ();
|
||||
|
||||
m_colorizer.begin_changes ();
|
||||
for (std::vector<const db::Net *>::const_iterator n = nets.begin (); n != nets.end (); ++n) {
|
||||
if (color.isValid ()) {
|
||||
m_colorizer.set_color_of_net (*n, color);
|
||||
} else {
|
||||
m_colorizer.reset_color_of_net (*n);
|
||||
}
|
||||
}
|
||||
m_colorizer.end_changes ();
|
||||
|
||||
update_highlights ();
|
||||
}
|
||||
|
||||
void
|
||||
NetlistBrowserPage::browse_color_for_net ()
|
||||
{
|
||||
QColor c = QColorDialog::getColor (QColor (), this);
|
||||
if (c.isValid ()) {
|
||||
set_color_for_selected_nets (c);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
NetlistBrowserPage::select_color_for_net ()
|
||||
{
|
||||
QAction *action = dynamic_cast<QAction *> (sender ());
|
||||
if (action) {
|
||||
set_color_for_selected_nets (action->data ().value<QColor> ());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1610,7 +1718,7 @@ NetlistBrowserPage::navigate_to (void *id, bool fwd)
|
|||
|
||||
add_to_history (id, fwd);
|
||||
|
||||
show_net (model->net_from_index (index));
|
||||
net_selection_changed ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -1697,7 +1805,7 @@ NetlistBrowserPage::set_l2ndb (db::LayoutToNetlist *database)
|
|||
|
||||
mp_database.reset (database);
|
||||
clear_markers ();
|
||||
show_net (0);
|
||||
highlight_nets (std::vector<const db::Net *> ());
|
||||
|
||||
if (! database) {
|
||||
directory_tree->setModel (0);
|
||||
|
|
@ -1709,6 +1817,7 @@ NetlistBrowserPage::set_l2ndb (db::LayoutToNetlist *database)
|
|||
|
||||
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 (net_selection_changed ()));
|
||||
|
||||
directory_tree->header ()->setSortIndicatorShown (true);
|
||||
|
||||
|
|
@ -1718,14 +1827,14 @@ NetlistBrowserPage::set_l2ndb (db::LayoutToNetlist *database)
|
|||
}
|
||||
|
||||
void
|
||||
NetlistBrowserPage::show_net (const db::Net *net)
|
||||
NetlistBrowserPage::highlight_nets (const std::vector<const db::Net *> &nets)
|
||||
{
|
||||
if (net != mp_current_net) {
|
||||
if (nets != m_current_nets) {
|
||||
|
||||
mp_current_net = net;
|
||||
m_current_nets = nets;
|
||||
clear_markers ();
|
||||
|
||||
if (net) {
|
||||
if (! nets.empty ()) {
|
||||
adjust_view ();
|
||||
update_highlights ();
|
||||
}
|
||||
|
|
@ -1753,7 +1862,7 @@ NetlistBrowserPage::enable_updates (bool f)
|
|||
void
|
||||
NetlistBrowserPage::adjust_view ()
|
||||
{
|
||||
if (! mp_database.get () || ! mp_view || ! mp_current_net || ! mp_current_net->circuit ()) {
|
||||
if (! mp_database.get () || ! mp_view) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1771,28 +1880,36 @@ NetlistBrowserPage::adjust_view ()
|
|||
return;
|
||||
}
|
||||
|
||||
db::cell_index_type cell_index = mp_current_net->circuit ()->cell_index ();
|
||||
size_t cluster_id = mp_current_net->cluster_id ();
|
||||
|
||||
db::DBox bbox;
|
||||
|
||||
// @@@std::map<unsigned int, std::vector<db::DCplxTrans> > tv_by_layer = mp_view->cv_transform_variants_by_layer (m_cv_index);
|
||||
std::vector<db::DCplxTrans> tv = mp_view->cv_transform_variants (m_cv_index);
|
||||
for (std::vector<const db::Net *>::const_iterator net = m_current_nets.begin (); net != m_current_nets.end (); ++net) {
|
||||
|
||||
const db::Connectivity &conn = mp_database->connectivity ();
|
||||
for (db::Connectivity::layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) {
|
||||
|
||||
// @@@ TODO: how to get the original layer?
|
||||
|
||||
db::Box layer_bbox;
|
||||
db::recursive_cluster_shape_iterator<db::PolygonRef> shapes (mp_database->net_clusters (), *layer, cell_index, cluster_id);
|
||||
while (! shapes.at_end ()) {
|
||||
layer_bbox += shapes.trans () * shapes->box ();
|
||||
++shapes;
|
||||
if (! (*net)->circuit ()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (std::vector<db::DCplxTrans>::const_iterator t = tv.begin (); t != tv.end (); ++t) {
|
||||
bbox += *t * db::CplxTrans (layout->dbu ()) * layer_bbox;
|
||||
db::cell_index_type cell_index = (*net)->circuit ()->cell_index ();
|
||||
size_t cluster_id = (*net)->cluster_id ();
|
||||
|
||||
// @@@std::map<unsigned int, std::vector<db::DCplxTrans> > tv_by_layer = mp_view->cv_transform_variants_by_layer (m_cv_index);
|
||||
std::vector<db::DCplxTrans> tv = mp_view->cv_transform_variants (m_cv_index);
|
||||
|
||||
const db::Connectivity &conn = mp_database->connectivity ();
|
||||
for (db::Connectivity::layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) {
|
||||
|
||||
// @@@ TODO: how to get the original layer?
|
||||
|
||||
db::Box layer_bbox;
|
||||
db::recursive_cluster_shape_iterator<db::PolygonRef> shapes (mp_database->net_clusters (), *layer, cell_index, cluster_id);
|
||||
while (! shapes.at_end ()) {
|
||||
layer_bbox += shapes.trans () * shapes->box ();
|
||||
++shapes;
|
||||
}
|
||||
|
||||
for (std::vector<db::DCplxTrans>::const_iterator t = tv.begin (); t != tv.end (); ++t) {
|
||||
bbox += *t * db::CplxTrans (layout->dbu ()) * layer_bbox;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1830,7 +1947,7 @@ NetlistBrowserPage::update_highlights ()
|
|||
|
||||
clear_markers ();
|
||||
|
||||
if (! mp_database.get () || ! mp_view || ! mp_current_net || ! mp_current_net->circuit ()) {
|
||||
if (! mp_database.get () || ! mp_view) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1839,64 +1956,73 @@ NetlistBrowserPage::update_highlights ()
|
|||
return;
|
||||
}
|
||||
|
||||
db::cell_index_type cell_index = mp_current_net->circuit ()->cell_index ();
|
||||
size_t cluster_id = mp_current_net->cluster_id ();
|
||||
|
||||
// @@@std::map<unsigned int, std::vector<db::DCplxTrans> > tv_by_layer = mp_view->cv_transform_variants_by_layer (m_cv_index);
|
||||
std::vector<db::DCplxTrans> tv = mp_view->cv_transform_variants (m_cv_index);
|
||||
|
||||
size_t n_markers = 0;
|
||||
QColor net_color = m_colorizer.color_of_net (mp_current_net);
|
||||
|
||||
const db::Connectivity &conn = mp_database->connectivity ();
|
||||
for (db::Connectivity::layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) {
|
||||
for (std::vector<const db::Net *>::const_iterator net = m_current_nets.begin (); net != m_current_nets.end (); ++net) {
|
||||
|
||||
// @@@ TODO: how to get the original layer?
|
||||
if (! (*net)->circuit ()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
db::recursive_cluster_shape_iterator<db::PolygonRef> shapes (mp_database->net_clusters (), *layer, cell_index, cluster_id);
|
||||
while (! shapes.at_end () && n_markers < m_max_shape_count) {
|
||||
db::cell_index_type cell_index = (*net)->circuit ()->cell_index ();
|
||||
size_t cluster_id = (*net)->cluster_id ();
|
||||
|
||||
mp_markers.push_back (new lay::Marker (mp_view, m_cv_index));
|
||||
mp_markers.back ()->set (*shapes, shapes.trans (), tv);
|
||||
QColor net_color = m_colorizer.color_of_net (*net);
|
||||
|
||||
#if 0
|
||||
// @@@
|
||||
if (! original.at_end ()) {
|
||||
mp_markers.back ()->set_line_width (original->width (true));
|
||||
mp_markers.back ()->set_vertex_size (1);
|
||||
mp_markers.back ()->set_dither_pattern (original->dither_pattern (true));
|
||||
if (view ()->background_color ().green () < 128) {
|
||||
mp_markers.back ()->set_color (original->eff_fill_color_brighter (true, (m_marker_intensity * 255) / 100));
|
||||
mp_markers.back ()->set_frame_color (original->eff_frame_color_brighter (true, (m_marker_intensity * 255) / 100));
|
||||
} else {
|
||||
mp_markers.back ()->set_color (original->eff_fill_color_brighter (true, (-m_marker_intensity * 255) / 100));
|
||||
mp_markers.back ()->set_frame_color (original->eff_frame_color_brighter (true, (-m_marker_intensity * 255) / 100));
|
||||
const db::Connectivity &conn = mp_database->connectivity ();
|
||||
for (db::Connectivity::layer_iterator layer = conn.begin_layers (); layer != conn.end_layers (); ++layer) {
|
||||
|
||||
// @@@ TODO: how to get the original layer?
|
||||
|
||||
db::recursive_cluster_shape_iterator<db::PolygonRef> shapes (mp_database->net_clusters (), *layer, cell_index, cluster_id);
|
||||
while (! shapes.at_end () && n_markers < m_max_shape_count) {
|
||||
|
||||
mp_markers.push_back (new lay::Marker (mp_view, m_cv_index));
|
||||
mp_markers.back ()->set (*shapes, shapes.trans (), tv);
|
||||
|
||||
#if 0
|
||||
// @@@
|
||||
if (! original.at_end ()) {
|
||||
mp_markers.back ()->set_line_width (original->width (true));
|
||||
mp_markers.back ()->set_vertex_size (1);
|
||||
mp_markers.back ()->set_dither_pattern (original->dither_pattern (true));
|
||||
if (view ()->background_color ().green () < 128) {
|
||||
mp_markers.back ()->set_color (original->eff_fill_color_brighter (true, (m_marker_intensity * 255) / 100));
|
||||
mp_markers.back ()->set_frame_color (original->eff_frame_color_brighter (true, (m_marker_intensity * 255) / 100));
|
||||
} else {
|
||||
mp_markers.back ()->set_color (original->eff_fill_color_brighter (true, (-m_marker_intensity * 255) / 100));
|
||||
mp_markers.back ()->set_frame_color (original->eff_frame_color_brighter (true, (-m_marker_intensity * 255) / 100));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// @@@
|
||||
mp_markers.back ()->set_color (net_color);
|
||||
mp_markers.back ()->set_frame_color (net_color);
|
||||
// @@@
|
||||
#endif
|
||||
// @@@
|
||||
mp_markers.back ()->set_color (net_color);
|
||||
mp_markers.back ()->set_frame_color (net_color);
|
||||
// @@@
|
||||
|
||||
if (m_marker_line_width >= 0) {
|
||||
mp_markers.back ()->set_line_width (m_marker_line_width);
|
||||
}
|
||||
if (m_marker_line_width >= 0) {
|
||||
mp_markers.back ()->set_line_width (m_marker_line_width);
|
||||
}
|
||||
|
||||
if (m_marker_vertex_size >= 0) {
|
||||
mp_markers.back ()->set_vertex_size (m_marker_vertex_size);
|
||||
}
|
||||
if (m_marker_vertex_size >= 0) {
|
||||
mp_markers.back ()->set_vertex_size (m_marker_vertex_size);
|
||||
}
|
||||
|
||||
if (m_marker_halo >= 0) {
|
||||
mp_markers.back ()->set_halo (m_marker_halo);
|
||||
}
|
||||
if (m_marker_halo >= 0) {
|
||||
mp_markers.back ()->set_halo (m_marker_halo);
|
||||
}
|
||||
|
||||
if (m_marker_dither_pattern >= 0) {
|
||||
mp_markers.back ()->set_dither_pattern (m_marker_dither_pattern);
|
||||
}
|
||||
if (m_marker_dither_pattern >= 0) {
|
||||
mp_markers.back ()->set_dither_pattern (m_marker_dither_pattern);
|
||||
}
|
||||
|
||||
++shapes;
|
||||
++n_markers;
|
||||
++shapes;
|
||||
++n_markers;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,12 +55,16 @@ public:
|
|||
NetColorizer ();
|
||||
|
||||
void configure (const QColor &marker_color, const lay::ColorPalette *auto_colors);
|
||||
bool has_color_for_net (const db::Net *net);
|
||||
void set_color_of_net (const db::Net *net, const QColor &color);
|
||||
void reset_color_of_net (const db::Net *net);
|
||||
void clear ();
|
||||
|
||||
QColor color_of_net (const db::Net *net) const;
|
||||
|
||||
void begin_changes ();
|
||||
void end_changes ();
|
||||
|
||||
signals:
|
||||
void colors_changed ();
|
||||
|
||||
|
|
@ -69,7 +73,11 @@ private:
|
|||
lay::ColorPalette m_auto_colors;
|
||||
bool m_auto_colors_enabled;
|
||||
std::map<const db::Net *, QColor> m_custom_color;
|
||||
bool m_update_needed;
|
||||
bool m_signals_enabled;
|
||||
mutable std::map<const db::Net *, size_t> m_net_index_by_object;
|
||||
|
||||
void emit_colors_changed ();
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
|
|
@ -295,6 +303,9 @@ private slots:
|
|||
void navigate_back ();
|
||||
void navigate_forward ();
|
||||
void current_index_changed (const QModelIndex &index);
|
||||
void net_selection_changed ();
|
||||
void browse_color_for_net ();
|
||||
void select_color_for_net ();
|
||||
|
||||
private:
|
||||
bool m_show_all;
|
||||
|
|
@ -318,13 +329,15 @@ private:
|
|||
std::vector <lay::Marker *> mp_markers;
|
||||
bool m_enable_updates;
|
||||
bool m_update_needed;
|
||||
const db::Net *mp_current_net;
|
||||
std::vector<const db::Net *> m_current_nets;
|
||||
|
||||
void add_to_history (void *id, bool fwd);
|
||||
void navigate_to (void *id, bool forward = true);
|
||||
void adjust_view ();
|
||||
void clear_markers ();
|
||||
void show_net (const db::Net *net);
|
||||
void highlight_nets (const std::vector<const db::Net *> &nets);
|
||||
std::vector<const db::Net *> selected_nets ();
|
||||
void set_color_for_selected_nets (const QColor &color);
|
||||
};
|
||||
|
||||
} // namespace lay
|
||||
|
|
|
|||
|
|
@ -815,14 +815,18 @@ const char *color_icon =
|
|||
"xxxxE44ExxD33Dxxxx"
|
||||
"xxxxxeexxxxddxxxxx";
|
||||
|
||||
void
|
||||
ColorButton::build_menu ()
|
||||
void
|
||||
ColorButton::build_color_menu (QMenu *menu, QObject *receiver, const char *browse_slot, const char *selected_slot)
|
||||
{
|
||||
menu ()->clear ();
|
||||
tl_assert (selected_slot != 0);
|
||||
|
||||
menu ()->addAction (QObject::tr ("Automatic"), this, SLOT (menu_selected ()))->setData (QVariant (QColor ()));
|
||||
menu ()->addAction (QObject::tr ("Choose ..."), this, SLOT (browse_selected ()));
|
||||
menu ()->addSeparator ();
|
||||
menu->clear ();
|
||||
|
||||
menu->addAction (QObject::tr ("Automatic"), receiver, selected_slot)->setData (QVariant (QColor ()));
|
||||
if (browse_slot) {
|
||||
menu->addAction (QObject::tr ("Choose ..."), receiver, browse_slot);
|
||||
}
|
||||
menu->addSeparator ();
|
||||
|
||||
try {
|
||||
|
||||
|
|
@ -858,7 +862,7 @@ ColorButton::build_menu ()
|
|||
}
|
||||
}
|
||||
|
||||
submenu = menu ()->addMenu (QPixmap::fromImage (icon), tl::to_qstring (tl::sprintf ("#%d .. %d", i + 1, std::min (i + 6, palette.colors ()))));
|
||||
submenu = menu->addMenu (QPixmap::fromImage (icon), tl::to_qstring (tl::sprintf ("#%d .. %d", i + 1, std::min (i + 6, palette.colors ()))));
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -868,13 +872,19 @@ ColorButton::build_menu ()
|
|||
QPixmap icon (16, 16);
|
||||
icon.fill (color);
|
||||
|
||||
submenu->addAction (QIcon (icon), tl::to_qstring (name), this, SLOT (menu_selected ()))->setData (QVariant (color));
|
||||
submenu->addAction (QIcon (icon), tl::to_qstring (name), receiver, selected_slot)->setData (QVariant (color));
|
||||
|
||||
}
|
||||
|
||||
} catch (...) { }
|
||||
}
|
||||
|
||||
void
|
||||
ColorButton::build_menu ()
|
||||
{
|
||||
build_color_menu (menu (), this, SLOT (browse_selected ()), SLOT (menu_selected ()));
|
||||
}
|
||||
|
||||
void
|
||||
ColorButton::set_color (QColor c)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -325,6 +325,7 @@ public:
|
|||
ColorButton (QWidget *parent, const char *name = 0);
|
||||
|
||||
QColor get_color () const;
|
||||
static void build_color_menu (QMenu *menu, QObject *receiver, const char *browse_slot, const char *selected_slot);
|
||||
|
||||
signals:
|
||||
void color_changed (QColor color);
|
||||
|
|
|
|||
Loading…
Reference in New Issue