Experimental: do not list cells starting with underscore in library view

This commit is contained in:
Matthias Koefferlein 2026-02-06 23:24:05 +01:00
parent 2221efd96e
commit c15e24025e
6 changed files with 61 additions and 31 deletions

View File

@ -226,7 +226,7 @@ BEGIN_PROTECTED
layout = &cv->layout ();
}
lay::LibraryCellSelectionForm form (this, layout, "browse_lib_cell", false, lib != 0 /*for libs show top cells only*/);
lay::LibraryCellSelectionForm form (this, layout, "browse_lib_cell", false, lib != 0 /*for libs show top cells only*/, lib != 0 /*for libs hide private cells*/);
if (lib) {
form.setWindowTitle (tl::to_qstring (tl::to_string (QObject::tr ("Select Cell - Library: ")) + lib->get_description ()));
}

View File

@ -550,7 +550,7 @@ CellSelectionForm::hide_cell ()
// ------------------------------------------------------------
LibraryCellSelectionForm::LibraryCellSelectionForm (QWidget *parent, db::Layout *layout, const char *name, bool all_cells, bool top_cells_only)
LibraryCellSelectionForm::LibraryCellSelectionForm (QWidget *parent, db::Layout *layout, const char *name, bool all_cells, bool top_cells_only, bool hide_private)
: QDialog (parent),
mp_lib (0), mp_layout (layout),
m_name_cb_enabled (true),
@ -559,7 +559,8 @@ LibraryCellSelectionForm::LibraryCellSelectionForm (QWidget *parent, db::Layout
m_pcell_id (-1),
m_is_pcell (false),
m_all_cells (all_cells),
m_top_cells_only (top_cells_only)
m_top_cells_only (top_cells_only),
m_hide_private (hide_private)
{
mp_ui = new Ui::LibraryCellSelectionForm ();
setObjectName (QString::fromUtf8 (name));
@ -586,7 +587,7 @@ LibraryCellSelectionForm::LibraryCellSelectionForm (QWidget *parent, db::Layout
update_cell_list ();
}
LibraryCellSelectionForm::LibraryCellSelectionForm (QWidget *parent, const char *name, bool all_cells, bool top_cells_only)
LibraryCellSelectionForm::LibraryCellSelectionForm (QWidget *parent, const char *name, bool all_cells, bool top_cells_only, bool hide_private)
: QDialog (parent),
mp_lib (0), mp_layout (0),
m_name_cb_enabled (true),
@ -595,7 +596,8 @@ LibraryCellSelectionForm::LibraryCellSelectionForm (QWidget *parent, const char
m_pcell_id (-1),
m_is_pcell (false),
m_all_cells (all_cells),
m_top_cells_only (top_cells_only)
m_top_cells_only (top_cells_only),
m_hide_private (hide_private)
{
mp_ui = new Ui::LibraryCellSelectionForm ();
@ -704,6 +706,9 @@ LibraryCellSelectionForm::update_cell_list ()
if (m_top_cells_only) {
flags |= lay::CellTreeModel::TopCells;
}
if (m_hide_private) {
flags |= lay::CellTreeModel::HidePrivate;
}
}
// TODO: get rid of that const_cast

View File

@ -122,18 +122,22 @@ public:
*
* This version does not provide library selection. \get_current_library will
* always return 0.
* If all_cells is true, all cells (not just top cells and basic cells) are shown.
* If top_cells_only is false, child cells are shown as well.
*
* If all_cells is true, all cells are shown. That includes proxies.
* If all_cells is false, proxies are not shown, but PCells are included.
* If all_cells is false, then also:
* Only top cells are shown if top_cells_only is true. PCells are always shown.
* Private cells (names start with underscore) or private PCells are not shown if hide_private is false
* top_cells_only and hide_private have no effect if all_cells is true.
*/
LibraryCellSelectionForm (QWidget *parent, db::Layout *layout, const char *name, bool all_cells = false, bool top_cells_only = true);
LibraryCellSelectionForm (QWidget *parent, db::Layout *layout, const char *name, bool all_cells = false, bool top_cells_only = true, bool hide_private = false);
/**
* @brief Create a selection form for cells plus the library
*
* If all_cells is true, all cells (not only top cells and basic cells) are shown.
* If top_cells_only is false, child cells are shown as well.
* See above for the description of "all_cells", "top_cells_only" and "hide_private".
*/
LibraryCellSelectionForm (QWidget *parent, const char *name, bool all_cells = false, bool top_cells_only = true);
LibraryCellSelectionForm (QWidget *parent, const char *name, bool all_cells = false, bool top_cells_only = true, bool hide_private = false);
/**
* @brief Set the selected library
@ -200,6 +204,7 @@ private:
bool m_is_pcell;
bool m_all_cells;
bool m_top_cells_only;
bool m_hide_private;
void select_entry (db::cell_index_type n);
void select_pcell_entry (db::pcell_id_type n);

View File

@ -569,8 +569,10 @@ CellTreeModel::build_top_level ()
if (mp_base) {
m_toplevel.reserve (mp_base->child_cells ());
for (db::Cell::child_cell_iterator child = mp_base->begin_child_cells (); ! child.at_end (); ++child) {
CellTreeItem *item = new CellTreeItem (mp_layout, false, *child, true, m_sorting);
m_toplevel.push_back (item);
if (name_selected (mp_layout->cell_name (*child))) {
CellTreeItem *item = new CellTreeItem (mp_layout, false, *child, true, m_sorting);
m_toplevel.push_back (item);
}
}
}
@ -581,8 +583,10 @@ CellTreeModel::build_top_level ()
if (mp_base) {
m_toplevel.reserve (mp_base->parent_cells ());
for (db::Cell::parent_cell_iterator parent = mp_base->begin_parent_cells (); parent != mp_base->end_parent_cells (); ++parent) {
CellTreeItem *item = new CellTreeItem (mp_layout, false, *parent, true, m_sorting);
m_toplevel.push_back (item);
if (name_selected (mp_layout->cell_name (*parent))) {
CellTreeItem *item = new CellTreeItem (mp_layout, false, *parent, true, m_sorting);
m_toplevel.push_back (item);
}
}
}
@ -595,7 +599,9 @@ CellTreeModel::build_top_level ()
db::Layout::top_down_const_iterator top = mp_layout->begin_top_down ();
while (top != mp_layout->end_top_down ()) {
if (m_flat) {
if (! name_selected (mp_layout->cell_name (*top))) {
// ignore cell
} else if (m_flat) {
if ((m_flags & BasicCells) == 0 || ! mp_layout->cell (*top).is_proxy ()) {
CellTreeItem *item = new CellTreeItem (mp_layout, false, *top, true, m_sorting);
m_toplevel.push_back (item);
@ -617,22 +623,28 @@ CellTreeModel::build_top_level ()
for (db::Layout::pcell_iterator pc = mp_layout->begin_pcells (); pc != mp_layout->end_pcells (); ++pc) {
CellTreeItem *item = new CellTreeItem (mp_layout, true, pc->second, true, m_sorting);
m_toplevel.push_back (item);
const auto *pcell_decl = mp_layout->pcell_declaration (pc->second);
if (name_selected (pcell_decl->name ())) {
if ((m_flags & WithVariants) != 0) {
CellTreeItem *item = new CellTreeItem (mp_layout, true, pc->second, true, m_sorting);
m_toplevel.push_back (item);
const db::PCellHeader *pcell_header = mp_layout->pcell_header (pc->second);
for (db::PCellHeader::variant_iterator v = pcell_header->begin (); v != pcell_header->end (); ++v) {
if (mp_library && mp_library->is_retired (v->second->cell_index ())) {
// skip retired cells - this means we won't show variants which are just kept
// as shadow variants for the transactions.
} else {
item->add_child (new CellTreeItem (mp_layout, false, v->second->cell_index (), true, m_sorting));
if ((m_flags & WithVariants) != 0) {
const auto *pcell_header = mp_layout->pcell_header (pc->second);
for (db::PCellHeader::variant_iterator v = pcell_header->begin (); v != pcell_header->end (); ++v) {
if (mp_library && mp_library->is_retired (v->second->cell_index ())) {
// skip retired cells - this means we won't show variants which are just kept
// as shadow variants for the transactions.
} else {
item->add_child (new CellTreeItem (mp_layout, false, v->second->cell_index (), true, m_sorting));
}
}
}
item->finish_children ();
item->finish_children ();
}
}
@ -649,6 +661,12 @@ CellTreeModel::build_top_level ()
}
}
bool
CellTreeModel::name_selected (const std::string &name) const
{
return ((m_flags & HidePrivate) == 0 || (! name.empty () && *name.begin () != '_'));
}
Qt::ItemFlags
CellTreeModel::flags (const QModelIndex &index) const
{

View File

@ -69,7 +69,8 @@ public:
BasicCells = 16, // show basic cells (PCells included, no proxies)
WithVariants = 32, // show PCell variants below PCells
WithIcons = 64, // show icons for the top level cell type
NoPadding = 128 // disable padding of display string with a blank at the beginning and end
NoPadding = 128, // disable padding of display string with a blank at the beginning and end
HidePrivate = 256 // hide cells whose name starts with an underscore
};
enum Sorting {
@ -273,6 +274,7 @@ private:
void clear_top_level ();
bool search_children (const tl::GlobPattern &pattern, CellTreeItem *item);
void do_configure (db::Layout *layout, db::Library *library, LayoutViewBase *view, int cv_index, unsigned int flags, const db::Cell *base, Sorting sorting);
bool name_selected (const std::string &name) const;
};
/**

View File

@ -634,7 +634,7 @@ LibrariesView::do_update_content (int lib_index)
LibraryTreeWidget *cell_list = new LibraryTreeWidget (cl_frame, "tree", mp_view->canvas ()->widget ());
cl_ly->addWidget (cell_list);
cell_list->setModel (new CellTreeModel (cell_list, m_libraries [i].get (), CellTreeModel::Flat | CellTreeModel::TopCells | CellTreeModel::BasicCells | CellTreeModel::WithVariants | CellTreeModel::WithIcons, 0));
cell_list->setModel (new CellTreeModel (cell_list, m_libraries [i].get (), CellTreeModel::Flat | CellTreeModel::TopCells | CellTreeModel::BasicCells | CellTreeModel::HidePrivate | CellTreeModel::WithVariants | CellTreeModel::WithIcons, 0));
cell_list->setUniformRowHeights (true);
pl = cell_list->palette ();
@ -707,7 +707,7 @@ LibrariesView::do_update_content (int lib_index)
CellTreeModel *model = dynamic_cast <CellTreeModel *> (mp_cell_lists [i]->model ());
if (model) {
model->configure (m_libraries [i].get (), CellTreeModel::Flat | CellTreeModel::TopCells | CellTreeModel::BasicCells | CellTreeModel::WithVariants | CellTreeModel::WithIcons, 0);
model->configure (m_libraries [i].get (), CellTreeModel::Flat | CellTreeModel::TopCells | CellTreeModel::BasicCells | CellTreeModel::HidePrivate | CellTreeModel::WithVariants | CellTreeModel::WithIcons, 0);
}
}