mirror of https://github.com/KLayout/klayout.git
Bugfixed search function for cells.
This commit is contained in:
parent
c64dad0b3a
commit
71f64f5f63
|
|
@ -318,6 +318,7 @@ CellTreeModel::CellTreeModel (QWidget *parent, lay::LayoutView *view, int cv_ind
|
||||||
m_flat = ((flags & Flat) != 0) && ((flags & TopCells) == 0);
|
m_flat = ((flags & Flat) != 0) && ((flags & TopCells) == 0);
|
||||||
m_pad = ((flags & NoPadding) == 0);
|
m_pad = ((flags & NoPadding) == 0);
|
||||||
m_filter_mode = false;
|
m_filter_mode = false;
|
||||||
|
m_is_filtered = false;
|
||||||
|
|
||||||
mp_layout = & view->cellview (cv_index)->layout ();
|
mp_layout = & view->cellview (cv_index)->layout ();
|
||||||
mp_library = 0;
|
mp_library = 0;
|
||||||
|
|
@ -877,13 +878,23 @@ CellTreeModel::rowCount (const QModelIndex &parent) const
|
||||||
} else if (! item->is_valid ()) {
|
} else if (! item->is_valid ()) {
|
||||||
// for safety we return 0 children for invalid cells
|
// for safety we return 0 children for invalid cells
|
||||||
return 0;
|
return 0;
|
||||||
} else if (m_filter_mode && ! m_visible_cell_set.empty ()) {
|
} else if (m_filter_mode && m_is_filtered) {
|
||||||
return int (item->children_in (m_visible_cell_set));
|
return int (item->children_in (m_visible_cell_set));
|
||||||
} else {
|
} else {
|
||||||
return int (item->children ());
|
return int (item->children ());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return int (m_toplevel.size ());
|
if (m_filter_mode && m_is_filtered) {
|
||||||
|
size_t n = 0;
|
||||||
|
for (std::vector <CellTreeItem *>::const_iterator i = m_toplevel.begin (); i != m_toplevel.end (); ++i) {
|
||||||
|
if (m_visible_cell_set.find (*i) != m_visible_cell_set.end ()) {
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
} else {
|
||||||
|
return int (m_toplevel.size ());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -899,13 +910,25 @@ CellTreeModel::index (int row, int column, const QModelIndex &parent) const
|
||||||
} else if (! item->is_valid ()) {
|
} else if (! item->is_valid ()) {
|
||||||
// for safety we don't return valid child indexes for invalid cells
|
// for safety we don't return valid child indexes for invalid cells
|
||||||
return QModelIndex ();
|
return QModelIndex ();
|
||||||
} else if (m_filter_mode && ! m_visible_cell_set.empty ()) {
|
} else if (m_filter_mode && m_is_filtered) {
|
||||||
return createIndex (row, column, item->child_in (m_visible_cell_set, row));
|
return createIndex (row, column, item->child_in (m_visible_cell_set, row));
|
||||||
} else {
|
} else {
|
||||||
return createIndex (row, column, item->child (row));
|
return createIndex (row, column, item->child (row));
|
||||||
}
|
}
|
||||||
} else if (row >= 0 && row < int (m_toplevel.size ())) {
|
} else if (row >= 0 && row < int (m_toplevel.size ())) {
|
||||||
return createIndex (row, column, m_toplevel [row]);
|
if (m_filter_mode && m_is_filtered) {
|
||||||
|
int n = row;
|
||||||
|
for (std::vector <CellTreeItem *>::const_iterator i = m_toplevel.begin (); i != m_toplevel.end (); ++i) {
|
||||||
|
if (m_visible_cell_set.find (*i) != m_visible_cell_set.end ()) {
|
||||||
|
if (n-- == 0) {
|
||||||
|
return createIndex (row, column, *i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QModelIndex ();
|
||||||
|
} else {
|
||||||
|
return createIndex (row, column, m_toplevel [row]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return QModelIndex ();
|
return QModelIndex ();
|
||||||
}
|
}
|
||||||
|
|
@ -927,7 +950,7 @@ CellTreeModel::parent (const QModelIndex &index) const
|
||||||
|
|
||||||
CellTreeItem *pitem = item->parent ();
|
CellTreeItem *pitem = item->parent ();
|
||||||
if (pitem) {
|
if (pitem) {
|
||||||
if (m_filter_mode && ! m_visible_cell_set.empty ()) {
|
if (m_filter_mode && m_is_filtered) {
|
||||||
if (pitem->tree_index () == std::numeric_limits<size_t>::max ()) {
|
if (pitem->tree_index () == std::numeric_limits<size_t>::max ()) {
|
||||||
// WARNING: invisible item!
|
// WARNING: invisible item!
|
||||||
return QModelIndex ();
|
return QModelIndex ();
|
||||||
|
|
@ -967,7 +990,7 @@ CellTreeModel::model_index (CellTreeItem *item) const
|
||||||
{
|
{
|
||||||
if (mp_layout->under_construction () || (mp_layout->manager () && mp_layout->manager ()->transacting ())) {
|
if (mp_layout->under_construction () || (mp_layout->manager () && mp_layout->manager ()->transacting ())) {
|
||||||
return QModelIndex ();
|
return QModelIndex ();
|
||||||
} else if (m_filter_mode && ! m_visible_cell_set.empty ()) {
|
} else if (m_filter_mode && m_is_filtered) {
|
||||||
if (item->tree_index () == std::numeric_limits<size_t>::max ()) {
|
if (item->tree_index () == std::numeric_limits<size_t>::max ()) {
|
||||||
// WARNING: invisible item!
|
// WARNING: invisible item!
|
||||||
return QModelIndex ();
|
return QModelIndex ();
|
||||||
|
|
@ -1043,6 +1066,7 @@ CellTreeModel::clear_locate ()
|
||||||
{
|
{
|
||||||
m_selected_indexes.clear ();
|
m_selected_indexes.clear ();
|
||||||
m_visible_cell_set.clear ();
|
m_visible_cell_set.clear ();
|
||||||
|
m_is_filtered = false;
|
||||||
m_current_index = m_selected_indexes.begin ();
|
m_current_index = m_selected_indexes.begin ();
|
||||||
m_selected_indexes_set.clear ();
|
m_selected_indexes_set.clear ();
|
||||||
|
|
||||||
|
|
@ -1202,6 +1226,7 @@ CellTreeModel::locate (const char *name, bool glob_pattern, bool case_sensitive,
|
||||||
|
|
||||||
m_selected_indexes.clear ();
|
m_selected_indexes.clear ();
|
||||||
m_visible_cell_set.clear ();
|
m_visible_cell_set.clear ();
|
||||||
|
m_is_filtered = true;
|
||||||
|
|
||||||
tl::GlobPattern p = tl::GlobPattern (std::string (name));
|
tl::GlobPattern p = tl::GlobPattern (std::string (name));
|
||||||
p.set_case_sensitive (case_sensitive);
|
p.set_case_sensitive (case_sensitive);
|
||||||
|
|
@ -1220,7 +1245,7 @@ CellTreeModel::locate (const char *name, bool glob_pattern, bool case_sensitive,
|
||||||
m_selected_indexes.push_back (model_index (*lc));
|
m_selected_indexes.push_back (model_index (*lc));
|
||||||
visible = true;
|
visible = true;
|
||||||
}
|
}
|
||||||
if (! top_only && search_children (p, *lc)) {
|
if (! top_only && ! m_flat && search_children (p, *lc)) {
|
||||||
(*lc)->set_tree_index (ti);
|
(*lc)->set_tree_index (ti);
|
||||||
visible = true;
|
visible = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -252,7 +252,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_flat, m_pad, m_filter_mode;
|
bool m_flat, m_pad;
|
||||||
|
bool m_filter_mode, m_is_filtered;
|
||||||
unsigned int m_flags;
|
unsigned int m_flags;
|
||||||
Sorting m_sorting;
|
Sorting m_sorting;
|
||||||
QWidget *mp_parent;
|
QWidget *mp_parent;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue