diff --git a/src/lay/lay/layMainWindow.cc b/src/lay/lay/layMainWindow.cc index 6102aaadf..9f50edaa5 100644 --- a/src/lay/lay/layMainWindow.cc +++ b/src/lay/lay/layMainWindow.cc @@ -837,6 +837,7 @@ MainWindow::init_menu () MenuLayoutEntry ("show_grid", tl::to_string (QObject::tr ("Show Grid")), std::make_pair (cfg_grid_visible, "?")), MenuLayoutEntry ("default_grid:default_grids_group", tl::to_string (QObject::tr ("Grid")), empty_menu), MenuLayoutEntry::separator ("layout_group"), + MenuLayoutEntry ("show_markers", tl::to_string (QObject::tr ("Show Markers")), std::make_pair (cfg_markers_visible, "?")), MenuLayoutEntry ("show_texts", tl::to_string (QObject::tr ("Show Texts")), std::make_pair (cfg_text_visible, "?")), MenuLayoutEntry ("show_cell_boxes", tl::to_string (QObject::tr ("Show Cell Frames")), std::make_pair (cfg_cell_box_visible, "?")), MenuLayoutEntry ("no_stipples", tl::to_string (QObject::tr ("Show Layers Without Fill")), std::make_pair (cfg_no_stipple, "?")), @@ -1307,6 +1308,18 @@ MainWindow::about_to_exec () } } + f = false; + config_get (cfg_markers_visible, f); + if (! f) { + TipDialog td (this, + tl::to_string (QObject::tr ("Markers are not visible because they have been turned off.\nYou may not see markers when using the marker browser feature.\n\nTo turn markers on, check \"Show Markers\" in the \"View\" menu.")), + "show-markers"); + if (td.exec_dialog ()) { + // Don't bother the user with more dialogs. + return; + } + } + f = false; config_get (cfg_hide_empty_layers, f); if (f) { diff --git a/src/laybasic/laybasic/gsiDeclLayMarker.cc b/src/laybasic/laybasic/gsiDeclLayMarker.cc index e489b9252..574f7a89f 100644 --- a/src/laybasic/laybasic/gsiDeclLayMarker.cc +++ b/src/laybasic/laybasic/gsiDeclLayMarker.cc @@ -164,6 +164,18 @@ Class decl_Marker ("Marker", "@brief Returns a value indicating whether the marker has a specific frame color\n" "The set method has been added in version 0.20.\n" ) + + gsi::method ("dismissable=", &lay::DMarker::set_dismissable, + "@brief Sets a value indicating whether the marker can be hidden\n" + "@args flag\n" + "Dismissable markers can be hidden setting \"View/Show Markers\" to \"off\". " + "The default setting is \"false\" meaning the marker can't be hidden.\n" + "\n" + "This attribute has been introduced in version 0.25.4." + ) + + gsi::method ("dismissable?", &lay::DMarker::get_dismissable, + "@brief Gets a value indicating whether the marker can be hidden\n" + "See \\dismissable= for a description of this predicate." + ) + gsi::method ("line_width=", &lay::DMarker::set_line_width, "@brief Sets the line width of the marker\n" "@args width\n" diff --git a/src/laybasic/laybasic/layLayoutView.cc b/src/laybasic/laybasic/layLayoutView.cc index fc06d5685..acba07305 100644 --- a/src/laybasic/laybasic/layLayoutView.cc +++ b/src/laybasic/laybasic/layLayoutView.cc @@ -378,6 +378,7 @@ LayoutView::init (db::Manager *mgr, lay::PluginRoot *root, QWidget * /*parent*/) m_apply_text_trans = true; m_default_text_size = 0.1; m_text_font = 0; + m_show_markers = true; m_no_stipples = false; m_stipple_offset = true; m_fit_new_cell = true; @@ -1149,6 +1150,13 @@ LayoutView::configure (const std::string &name, const std::string &value) apply_text_trans (flag); return true; + } else if (name == cfg_markers_visible) { + + bool flag; + tl::from_string (value, flag); + mp_canvas->set_dismiss_view_objects (! flag); + return true; + } else if (name == cfg_no_stipple) { bool flag; @@ -4917,7 +4925,16 @@ LayoutView::no_stipples (bool f) } } -void +void +LayoutView::show_markers (bool f) +{ + if (m_show_markers != f) { + m_show_markers = f; + mp_canvas->update_image (); + } +} + +void LayoutView::text_color (QColor c) { if (m_text_color != c) { diff --git a/src/laybasic/laybasic/layLayoutView.h b/src/laybasic/laybasic/layLayoutView.h index 5d5d2e4c3..a9e3ff5aa 100644 --- a/src/laybasic/laybasic/layLayoutView.h +++ b/src/laybasic/laybasic/layLayoutView.h @@ -1062,6 +1062,19 @@ public: return m_default_text_size; } + /** + * @brief Show or hide markers + */ + void show_markers (bool f); + + /** + * @brief "show_markers" property getter + */ + bool show_markers () const + { + return m_show_markers; + } + /** * @brief Don't show stipples */ @@ -2671,6 +2684,7 @@ private: bool m_apply_text_trans; double m_default_text_size; unsigned int m_text_font; + bool m_show_markers; bool m_no_stipples; bool m_stipple_offset; diff --git a/src/laybasic/laybasic/layLayoutViewConfigPages.cc b/src/laybasic/laybasic/layLayoutViewConfigPages.cc index 9cfb81595..fb4436e1a 100644 --- a/src/laybasic/laybasic/layLayoutViewConfigPages.cc +++ b/src/laybasic/laybasic/layLayoutViewConfigPages.cc @@ -1510,6 +1510,7 @@ public: options.push_back (std::pair (cfg_stipple_offset, "true")); options.push_back (std::pair (cfg_line_style_palette, lay::LineStylePalette ().to_string ())); options.push_back (std::pair (cfg_no_stipple, "false")); + options.push_back (std::pair (cfg_markers_visible, "true")); } virtual std::vector > config_pages (QWidget *parent) const diff --git a/src/laybasic/laybasic/layMarker.cc b/src/laybasic/laybasic/layMarker.cc index 80bd67f96..45a3d1554 100644 --- a/src/laybasic/laybasic/layMarker.cc +++ b/src/laybasic/laybasic/layMarker.cc @@ -270,7 +270,7 @@ MarkerBase::set_line_style (int line_style) } } -void +void MarkerBase::get_bitmaps (const Viewport & /*vp*/, ViewObjectCanvas &canvas, lay::CanvasPlane *&fill, lay::CanvasPlane *&contour, lay::CanvasPlane *&vertex, lay::CanvasPlane *&text) { double resolution = canvas.resolution (); diff --git a/src/laybasic/laybasic/layViewObject.cc b/src/laybasic/laybasic/layViewObject.cc index 600b10cc5..ce90bb93f 100644 --- a/src/laybasic/laybasic/layViewObject.cc +++ b/src/laybasic/laybasic/layViewObject.cc @@ -165,7 +165,7 @@ BackgroundViewObject::z_order (int z) // ViewObject implementation ViewObject::ViewObject (ViewObjectWidget *widget, bool _static) - : mp_widget (widget), m_static (_static), m_visible (true) + : mp_widget (widget), m_static (_static), m_visible (true), m_dismissable (false) { if (widget) { widget->m_objects.push_back (this); @@ -178,6 +178,15 @@ ViewObject::~ViewObject () redraw (); } +void +ViewObject::set_dismissable (bool dismissable) +{ + if (m_dismissable != dismissable) { + m_dismissable = dismissable; + redraw (); + } +} + void ViewObject::visible (bool vis) { @@ -251,6 +260,7 @@ ViewService::set_cursor (lay::Cursor::cursor_shape cursor) ViewObjectWidget::ViewObjectWidget (QWidget *parent, const char *name) : QWidget (parent), + m_view_objects_dismissed (false), m_needs_update_static (false), m_needs_update_bg (false), mp_active_service (0), @@ -888,7 +898,7 @@ ViewObjectWidget::do_render (const lay::Viewport &vp, lay::ViewObjectCanvas &can } for (object_iterator obj = begin_objects (); obj != end_objects (); ++obj) { - if (obj->m_static == st && obj->is_visible ()) { + if (obj->m_static == st && obj->is_visible () && (! m_view_objects_dismissed || ! obj->get_dismissable ())) { BEGIN_PROTECTED_SILENT obj->render (vp, canvas); END_PROTECTED_SILENT @@ -963,6 +973,16 @@ ViewObjectWidget::touch_bg () } } +void +ViewObjectWidget::set_dismiss_view_objects (bool dismiss) +{ + if (dismiss != m_view_objects_dismissed) { + m_view_objects_dismissed = dismiss; + touch (); + update (); + } +} + void ViewObjectWidget::objects_changed () { diff --git a/src/laybasic/laybasic/layViewObject.h b/src/laybasic/laybasic/layViewObject.h index 2d4087919..6a274aab8 100644 --- a/src/laybasic/laybasic/layViewObject.h +++ b/src/laybasic/laybasic/layViewObject.h @@ -513,6 +513,23 @@ public: return const_cast (mp_widget.get()); } + /** + * @brief Gets a value indicating whether the marker can be dismissed (made invisible) + * + * Markers with this flag set to true can be hidden by using ViewObjectCanvas::show_markers. + */ + bool get_dismissable () const + { + return m_dismissable; + } + + /** + * @brief Sets a value indicating whether the marker can be dismissed (made invisible) + * + * See \\get_dismissable for details. + */ + void set_dismissable (bool f); + /** * @brief Set the visibility state of the view object * @@ -561,6 +578,7 @@ private: tl::weak_ptr mp_widget; bool m_static; bool m_visible; + bool m_dismissable; }; /** @@ -905,6 +923,21 @@ public: */ void set_default_cursor (lay::Cursor::cursor_shape cursor); + /** + * @brief Sets a value indicating whether dismissable view objects shall be drawn or not + * + * Markers with dismissable = false are always drawn. The default value is "false". + */ + void set_dismiss_view_objects (bool dismissed); + + /** + * @brief Gets a value indicating whether dismissable markers shall be drawn or not + */ + bool dismiss_view_objects () const + { + return m_view_objects_dismissed; + } + protected: /** * @brief Qt focus event handler @@ -985,6 +1018,7 @@ private: tl::weak_collection m_background_objects; std::list m_services; std::list m_grabbed; + bool m_view_objects_dismissed; bool m_needs_update_static; bool m_needs_update_bg; lay::ViewService *mp_active_service; diff --git a/src/laybasic/laybasic/laybasicConfig.h b/src/laybasic/laybasic/laybasicConfig.h index 4926e8ca3..6f8aafaed 100644 --- a/src/laybasic/laybasic/laybasicConfig.h +++ b/src/laybasic/laybasic/laybasicConfig.h @@ -70,6 +70,8 @@ static const std::string cfg_sel_line_style ("sel-line-style"); static const std::string cfg_sel_transient_mode ("sel-transient-mode"); static const std::string cfg_sel_inside_pcells_mode ("sel-inside-pcells-mode"); +static const std::string cfg_markers_visible ("markers-visible"); + static const std::string cfg_min_inst_label_size ("min-inst-label-size"); static const std::string cfg_cell_box_text_font ("inst-label-font"); static const std::string cfg_cell_box_text_transform ("inst-label-transform"); diff --git a/src/laybasic/laybasic/rdbMarkerBrowserPage.cc b/src/laybasic/laybasic/rdbMarkerBrowserPage.cc index c43b5d060..b90dcf7a4 100644 --- a/src/laybasic/laybasic/rdbMarkerBrowserPage.cc +++ b/src/laybasic/laybasic/rdbMarkerBrowserPage.cc @@ -2177,36 +2177,42 @@ MarkerBrowserPage::do_update_markers () mp_markers.push_back (new lay::DMarker (mp_view)); mp_markers.back ()->set (trans * polygon_value->value ()); + mp_markers.back ()->set_dismissable (true); m_markers_bbox += trans * polygon_value->value ().box (); } else if (edge_pair_value) { mp_markers.push_back (new lay::DMarker (mp_view)); mp_markers.back ()->set (trans * edge_pair_value->value ()); + mp_markers.back ()->set_dismissable (true); m_markers_bbox += trans * db::DBox (edge_pair_value->value ().bbox ()); } else if (edge_value) { mp_markers.push_back (new lay::DMarker (mp_view)); mp_markers.back ()->set (trans * edge_value->value ()); + mp_markers.back ()->set_dismissable (true); m_markers_bbox += trans * db::DBox (edge_value->value ().bbox ()); } else if (box_value) { mp_markers.push_back (new lay::DMarker (mp_view)); mp_markers.back ()->set (trans * box_value->value ()); + mp_markers.back ()->set_dismissable (true); m_markers_bbox += trans * box_value->value (); } else if (text_value) { mp_markers.push_back (new lay::DMarker (mp_view)); mp_markers.back ()->set (trans * text_value->value ()); + mp_markers.back ()->set_dismissable (true); m_markers_bbox += trans * text_value->value ().box (); } else if (path_value) { mp_markers.push_back (new lay::DMarker (mp_view)); mp_markers.back ()->set (trans * path_value->value ()); + mp_markers.back ()->set_dismissable (true); m_markers_bbox += trans * path_value->value ().box (); }