/* KLayout Layout Viewer Copyright (C) 2006-2017 Matthias Koefferlein This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef HDR_layLayerTreeModel #define HDR_layLayerTreeModel #include "dbBox.h" #include #include #include #include #include namespace db { class Layout; } namespace lay { class LayoutView; class LayerPropertiesConstIterator; /** * @brief A helper class implementing a cache for the "test shapes in view" feature */ class EmptyWithinViewCache { public: EmptyWithinViewCache(); void clear(); bool is_empty_within_view(const db::Layout *layout, unsigned int cell_index, const db::Box &box, unsigned int layer); private: typedef std::pair, db::Box> cache_key_t; typedef std::map > cache_t; cache_t m_cache; std::vector m_cells_done; void determine_empty_layers(const db::Layout *layout, unsigned int cell_index, const db::Box &box, std::vector &layers); }; /** * @brief The layer tree model * * This model delivers data of the cell tree forming either a flat * representation or a hierarchical one. */ class LayerTreeModel : public QAbstractItemModel { Q_OBJECT public: /** * @brief Constructor * * The LayoutView reference is required to obtain hidden cell state and current state flags. */ LayerTreeModel (QWidget *parent, lay::LayoutView *view); /** * @brief Dtor */ ~LayerTreeModel (); // Implementation of the QAbstractItemModel interface virtual Qt::ItemFlags flags (const QModelIndex &index) const; virtual int columnCount (const QModelIndex &) const; virtual QVariant data (const QModelIndex &index, int role) const; virtual QVariant headerData (int /*section*/, Qt::Orientation /*orientation*/, int /*role*/) const; virtual int rowCount (const QModelIndex &parent) const; virtual QModelIndex index (int row, int column, const QModelIndex &parent) const; virtual QModelIndex parent (const QModelIndex &index) const; /** * @brief Convert a lay::LayerPropertiesConstIterator to a QModelIndex */ QModelIndex index (lay::LayerPropertiesConstIterator iter, int column) const; /** * @brief Convert a QModelIndex to an iterator */ lay::LayerPropertiesConstIterator iterator (const QModelIndex &index) const; /** * @brief Get a flag indicating that a layer is empty */ bool empty_predicate (const QModelIndex &index) const; /** * @brief Get a flag indicating that a layer does not have shapes within the shown area */ bool empty_within_view_predicate (const QModelIndex &index) const; /** * @brief Set the non-empty layers (the "uint" for the layer iterators) for the "test shapes is view" mode * * @return True, if a change has been made. */ bool set_non_empty_layers (const std::set &non_empty_layers); /** * @brief Set the animation phase */ void set_phase (unsigned int ph); /** * @brief Obtain the upperLeft index */ QModelIndex upperLeft () const; /** * @brief Obtain the lowerRight index */ QModelIndex bottomRight () const; /** * @brief Set the font to use for text display */ void set_font (const QFont &font); /** * @brief Set the text color to use for text display */ void set_text_color (QColor color); /** * @brief Set the background color to use for text display */ void set_background_color (QColor background); /** * @brief emit a dataChanged signal */ void signal_data_changed (); /** * @brief Set the test_shapes_in_view flag * * This method does not issue a data changed signal. This has to be done somewhere else. */ void set_test_shapes_in_view (bool f) { m_test_shapes_in_view = f; } /** * @brief emit a layoutAboutToBeChanged signal */ void signal_begin_layer_changed (); /** * @brief emit a layoutChanged signal */ void signal_layer_changed (); signals: void dataChanged (const QModelIndex & topLeft, const QModelIndex & bottomRight ); void layoutAboutToBeChanged (); void layoutChanged (); private: lay::LayoutView *mp_view; size_t m_id_start, m_id_end; unsigned int m_phase; bool m_test_shapes_in_view; QFont m_font; QColor m_text_color, m_background_color; mutable EmptyWithinViewCache m_test_shapes_cache; }; } #endif