mirror of https://github.com/KLayout/klayout.git
WIP: refactoring for more comfortable net browser
This commit is contained in:
parent
fd5c659ea6
commit
03bf0a557e
File diff suppressed because it is too large
Load Diff
|
|
@ -92,86 +92,12 @@ private:
|
|||
// NetlistBrowserModel definition
|
||||
|
||||
class NetlistBrowserModel;
|
||||
|
||||
/**
|
||||
* @brief A base class for the item data object
|
||||
*/
|
||||
class NetlistModelItemData
|
||||
: public tl::list_node<NetlistModelItemData>
|
||||
{
|
||||
public:
|
||||
typedef tl::list<NetlistModelItemData>::iterator iterator;
|
||||
|
||||
NetlistModelItemData ()
|
||||
: mp_parent (0), m_children_made (false), m_index (0)
|
||||
{ }
|
||||
|
||||
NetlistModelItemData (NetlistModelItemData *parent)
|
||||
: mp_parent (parent), m_children_made (false), m_index (0)
|
||||
{ }
|
||||
|
||||
virtual int children () = 0;
|
||||
virtual NetlistModelItemData *parent () { return mp_parent; }
|
||||
|
||||
virtual QIcon icon () = 0;
|
||||
virtual QString text (int column, NetlistBrowserModel *model) = 0;
|
||||
virtual QString search_text () = 0;
|
||||
virtual std::string tooltip (NetlistBrowserModel *model) = 0;
|
||||
virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model) = 0;
|
||||
|
||||
void ensure_children (NetlistBrowserModel *model)
|
||||
{
|
||||
if (! m_children_made) {
|
||||
|
||||
m_children.clear ();
|
||||
m_children_per_index.clear ();
|
||||
|
||||
do_ensure_children (model);
|
||||
|
||||
size_t n = 0;
|
||||
for (iterator i = begin (); i != end (); ++i) {
|
||||
++n;
|
||||
}
|
||||
m_children_per_index.reserve (n);
|
||||
|
||||
size_t index = 0;
|
||||
for (iterator i = begin (); i != end (); ++i) {
|
||||
m_children_per_index.push_back (i.operator-> ());
|
||||
i->set_index (index++);
|
||||
}
|
||||
|
||||
m_children_made = true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void push_back (NetlistModelItemData *child)
|
||||
{
|
||||
m_children.push_back (child);
|
||||
}
|
||||
|
||||
iterator begin () { return m_children.begin (); }
|
||||
iterator end () { return m_children.end (); }
|
||||
|
||||
size_t child_count () { return m_children_per_index.size (); }
|
||||
size_t index () { return m_index; }
|
||||
|
||||
NetlistModelItemData *child (size_t n)
|
||||
{
|
||||
return (n < m_children_per_index.size () ? m_children_per_index [n] : 0);
|
||||
}
|
||||
|
||||
private:
|
||||
NetlistModelItemData *mp_parent;
|
||||
tl::list<NetlistModelItemData> m_children;
|
||||
std::vector<NetlistModelItemData *> m_children_per_index;
|
||||
bool m_children_made;
|
||||
size_t m_index;
|
||||
|
||||
void set_index (size_t index) { m_index = index; }
|
||||
|
||||
virtual void do_ensure_children (NetlistBrowserModel *model) = 0;
|
||||
};
|
||||
class NetlistModelItemData;
|
||||
class RootItemData;
|
||||
class CircuitItemData;
|
||||
class CircuitNetItemData;
|
||||
class CircuitDeviceItemData;
|
||||
class CircuitSubCircuitItemData;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -186,6 +112,58 @@ namespace tl {
|
|||
namespace lay
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief A base class for the item data object
|
||||
*/
|
||||
class NetlistModelItemData
|
||||
: public tl::list_node<NetlistModelItemData>
|
||||
{
|
||||
public:
|
||||
typedef tl::list<NetlistModelItemData>::iterator iterator;
|
||||
|
||||
NetlistModelItemData ();
|
||||
NetlistModelItemData (NetlistModelItemData *parent);
|
||||
|
||||
virtual ~NetlistModelItemData ();
|
||||
|
||||
virtual NetlistModelItemData *parent () { return mp_parent; }
|
||||
|
||||
virtual QIcon icon (NetlistBrowserModel *model) = 0;
|
||||
virtual QString text (int column, NetlistBrowserModel *model) = 0;
|
||||
virtual QString search_text () = 0;
|
||||
virtual std::string tooltip (NetlistBrowserModel *model) = 0;
|
||||
virtual db::NetlistCrossReference::Status status (NetlistBrowserModel *model) = 0;
|
||||
|
||||
void ensure_children (NetlistBrowserModel *model);
|
||||
|
||||
void push_back (NetlistModelItemData *child);
|
||||
|
||||
iterator begin () { return m_children.begin (); }
|
||||
iterator end () { return m_children.end (); }
|
||||
|
||||
size_t child_count () { return m_children_per_index.size (); }
|
||||
size_t index () { return m_index; }
|
||||
|
||||
NetlistModelItemData *child (size_t n);
|
||||
|
||||
virtual std::pair<const db::Circuit *, const db::Circuit *> circuits ();
|
||||
virtual std::pair<const db::Device *, const db::Device *> devices ();
|
||||
virtual std::pair<const db::Pin *, const db::Pin *> pins ();
|
||||
virtual std::pair<const db::SubCircuit *, const db::SubCircuit *> subcircuits ();
|
||||
virtual std::pair<const db::Net *, const db::Net *> nets ();
|
||||
|
||||
private:
|
||||
NetlistModelItemData *mp_parent;
|
||||
tl::list<NetlistModelItemData> m_children;
|
||||
std::vector<NetlistModelItemData *> m_children_per_index;
|
||||
bool m_children_made;
|
||||
size_t m_index;
|
||||
|
||||
void set_index (size_t index) { m_index = index; }
|
||||
|
||||
virtual void do_ensure_children (NetlistBrowserModel *model) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief The NetlistBrowserModel
|
||||
*
|
||||
|
|
@ -250,24 +228,30 @@ public:
|
|||
return mp_indexer.get ();
|
||||
}
|
||||
|
||||
std::pair<const db::Net *, const db::Net *> net_from_index (const QModelIndex &index) const;
|
||||
QModelIndex index_from_net (const std::pair<const db::Net *, const db::Net *> &net) const;
|
||||
QModelIndex index_from_net (const db::Net *net) const;
|
||||
std::pair<const db::Circuit *, const db::Circuit *> circuit_from_index (const QModelIndex &index) const;
|
||||
QModelIndex index_from_circuit (const std::pair<const db::Circuit *, const db::Circuit *> &circuit) const;
|
||||
QModelIndex index_from_circuit (const db::Circuit *circuit) const;
|
||||
std::pair<const db::Net *, const db::Net *> net_from_index (const QModelIndex &index);
|
||||
QModelIndex index_from_net (const std::pair<const db::Net *, const db::Net *> &net);
|
||||
QModelIndex index_from_net (const db::Net *net);
|
||||
std::pair<const db::Circuit *, const db::Circuit *> circuit_from_index (const QModelIndex &index);
|
||||
QModelIndex index_from_circuit (const std::pair<const db::Circuit *, const db::Circuit *> &circuit);
|
||||
QModelIndex index_from_circuit (const db::Circuit *circuit);
|
||||
|
||||
std::pair<const db::SubCircuit *, const db::SubCircuit *> subcircuit_from_index (const QModelIndex &index) const;
|
||||
std::pair<const db::SubCircuit *, const db::SubCircuit *> subcircuit_from_index (const QModelIndex &index);
|
||||
|
||||
std::pair<const db::Device *, const db::Device *> device_from_index (const QModelIndex &index) const;
|
||||
|
||||
bool is_circuit_index (const QModelIndex &index) const
|
||||
{
|
||||
return is_id_circuit (index.internalPointer ());
|
||||
}
|
||||
std::pair<const db::Device *, const db::Device *> device_from_index (const QModelIndex &index);
|
||||
|
||||
void set_item_visibility (QTreeView *view, bool show_all, bool with_warnings);
|
||||
|
||||
QString make_link_to (const std::pair<const db::Net *, const db::Net *> &nets, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::Device *, const db::Device *> &devices, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::Pin *, const db::Pin *> &pins, const std::pair<const db::Circuit *, const db::Circuit *> &circuits, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::Circuit *, const db::Circuit *> &circuits, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::SubCircuit *, const db::SubCircuit *> &sub_circuits, int column = 0) const;
|
||||
|
||||
bool is_valid_net_pair (const std::pair<const db::Net *, const db::Net *> &net) const;
|
||||
|
||||
QIcon icon_for_nets (const std::pair<const db::Net *, const db::Net *> &net) const;
|
||||
QIcon icon_for_connection (const std::pair<const db::Net *, const db::Net *> &net) const;
|
||||
|
||||
private slots:
|
||||
void colors_changed ();
|
||||
|
||||
|
|
@ -275,73 +259,17 @@ private:
|
|||
NetlistBrowserModel (const NetlistBrowserModel &);
|
||||
NetlistBrowserModel &operator= (const NetlistBrowserModel &);
|
||||
|
||||
void *make_id_circuit (size_t circuit_index) const;
|
||||
void *make_id_circuit_pin (size_t circuit_index, size_t pin_index) const;
|
||||
void *make_id_circuit_pin_net (size_t circuit_index, size_t pin_index, size_t net_index) const;
|
||||
void *make_id_circuit_net (size_t circuit_index, size_t net_index) const;
|
||||
void *make_id_circuit_net_device_terminal (size_t circuit_index, size_t net_index, size_t terminal_ref_index) const;
|
||||
void *make_id_circuit_net_device_terminal_others (size_t circuit_index, size_t net_index, size_t terminal_ref_index, size_t other_index) const;
|
||||
void *make_id_circuit_net_pin (size_t circuit_index, size_t net_index, size_t pin_index) const;
|
||||
void *make_id_circuit_net_subcircuit_pin (size_t circuit_index, size_t net_index, size_t pin_ref_index) const;
|
||||
void *make_id_circuit_net_subcircuit_pin_others (size_t circuit_index, size_t net_index, size_t pin_ref_index, size_t other_index) const;
|
||||
void *make_id_circuit_subcircuit (size_t circuit_index, size_t subcircuit_index) const;
|
||||
void *make_id_circuit_subcircuit_pin (size_t circuit_index, size_t subcircuit_index, size_t pin_index) const;
|
||||
void *make_id_circuit_device (size_t circuit_index, size_t device_index) const;
|
||||
void *make_id_circuit_device_terminal (size_t circuit_index, size_t device_index, size_t terminal_index) const;
|
||||
bool is_id_circuit (void *id) const;
|
||||
bool is_id_circuit_pin (void *id) const;
|
||||
bool is_id_circuit_pin_net (void *id) const;
|
||||
bool is_id_circuit_net (void *id) const;
|
||||
bool is_id_circuit_net_device_terminal (void *id) const;
|
||||
bool is_id_circuit_net_device_terminal_others (void *id) const;
|
||||
bool is_id_circuit_net_pin (void *id) const;
|
||||
bool is_id_circuit_net_subcircuit_pin (void *id) const;
|
||||
bool is_id_circuit_net_subcircuit_pin_others (void *id) const;
|
||||
bool is_id_circuit_subcircuit (void *id) const;
|
||||
bool is_id_circuit_subcircuit_pin (void *id) const;
|
||||
bool is_id_circuit_device (void *id) const;
|
||||
bool is_id_circuit_device_terminal (void *id) const;
|
||||
size_t circuit_index_from_id (void *id) const;
|
||||
size_t circuit_pin_index_from_id (void *id) const;
|
||||
size_t circuit_device_index_from_id (void *id) const;
|
||||
size_t circuit_device_terminal_index_from_id (void *id) const;
|
||||
size_t circuit_subcircuit_index_from_id (void *id) const;
|
||||
size_t circuit_subcircuit_pin_index_from_id (void *id) const;
|
||||
size_t circuit_net_index_from_id (void *id) const;
|
||||
size_t circuit_net_pin_index_from_id (void *id) const;
|
||||
size_t circuit_net_subcircuit_pin_index_from_id (void *id) const;
|
||||
size_t circuit_net_subcircuit_pin_other_index_from_id (void *id) const;
|
||||
size_t circuit_net_device_terminal_index_from_id (void *id) const;
|
||||
size_t circuit_net_device_terminal_other_index_from_id (void *id) const;
|
||||
std::pair<const db::Circuit *, const db::Circuit *> circuits_from_id (void *id) const;
|
||||
std::pair<const db::Net *, const db::Net *> nets_from_id (void *id) const;
|
||||
std::pair<const db::NetSubcircuitPinRef *, const db::NetSubcircuitPinRef *> net_subcircuit_pinrefs_from_id (void *id) const;
|
||||
std::pair<const db::NetTerminalRef *, const db::NetTerminalRef *> net_terminalrefs_from_id (void *id) const;
|
||||
std::pair<const db::NetPinRef *, const db::NetPinRef *> net_pinrefs_from_id (void *id) const;
|
||||
std::pair<const db::Device *, const db::Device *> devices_from_id (void *id) const;
|
||||
std::pair<const db::Pin *, const db::Pin *> pins_from_id (void *id) const;
|
||||
std::pair<const db::SubCircuit *, const db::SubCircuit *> subcircuits_from_id (void *id) const;
|
||||
QString text (const QModelIndex &index) const;
|
||||
QVariant tooltip (const QModelIndex &index) const;
|
||||
QString search_text (const QModelIndex &index) const;
|
||||
db::NetlistCrossReference::Status status (const QModelIndex &index) const;
|
||||
QIcon icon (const QModelIndex &index) const;
|
||||
QString make_link_to (const std::pair<const db::Net *, const db::Net *> &nets, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::Device *, const db::Device *> &devices, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::Pin *, const db::Pin *> &pins, const std::pair<const db::Circuit *, const db::Circuit *> &circuits, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::Circuit *, const db::Circuit *> &circuits, int column = 0) const;
|
||||
QString make_link_to (const std::pair<const db::SubCircuit *, const db::SubCircuit *> &sub_circuits, int column = 0) const;
|
||||
|
||||
std::pair<const db::Netlist *, const db::Netlist *> netlists () const
|
||||
{
|
||||
return std::pair<const db::Netlist *, const db::Netlist *> (mp_l2ndb->netlist (), (const db::Netlist *)0);
|
||||
}
|
||||
|
||||
bool is_valid_net_pair (const std::pair<const db::Net *, const db::Net *> &net) const;
|
||||
|
||||
QIcon icon_for_nets (const std::pair<const db::Net *, const db::Net *> &net) const;
|
||||
QIcon icon_for_connection (const std::pair<const db::Net *, const db::Net *> &net) const;
|
||||
|
||||
void show_or_hide_items (QTreeView *view, const QModelIndex &parent, bool show_all, bool with_warnings, bool with_children);
|
||||
|
||||
db::LayoutToNetlist *mp_l2ndb;
|
||||
|
|
@ -354,7 +282,9 @@ private:
|
|||
int m_status_column;
|
||||
int m_first_column;
|
||||
int m_second_column;
|
||||
std::auto_ptr<NetlistModelItemData> m_root;
|
||||
std::auto_ptr<NetlistModelItemData> mp_root;
|
||||
|
||||
RootItemData *root ();
|
||||
};
|
||||
|
||||
} // namespace lay
|
||||
|
|
|
|||
|
|
@ -411,7 +411,7 @@ NetlistBrowserPage::selected_circuits ()
|
|||
|
||||
QModelIndexList selection = directory_tree->selectionModel ()->selectedIndexes ();
|
||||
for (QModelIndexList::const_iterator i = selection.begin (); i != selection.end (); ++i) {
|
||||
if (i->column () == 0 && model->is_circuit_index (*i)) {
|
||||
if (i->column () == 0) {
|
||||
const db::Circuit *circuit = model->circuit_from_index (*i).first;
|
||||
if (circuit) {
|
||||
circuits.push_back (circuit);
|
||||
|
|
|
|||
Loading…
Reference in New Issue