Netlist browser - some bugfixes, multiple selection of nets, colorizing

This commit is contained in:
Matthias Koefferlein 2019-04-28 16:28:39 +02:00
parent f8d09a642b
commit bfea3fdc2f
5 changed files with 415 additions and 217 deletions

View File

@ -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>

View File

@ -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;
}
}

View File

@ -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

View File

@ -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)
{

View File

@ -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);