mirror of https://github.com/KLayout/klayout.git
366 lines
8.6 KiB
C
366 lines
8.6 KiB
C
|
|
|
||
|
|
/*
|
||
|
|
|
||
|
|
KLayout Layout Viewer
|
||
|
|
Copyright (C) 2006-2016 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_layLayerControlPanel
|
||
|
|
#define HDR_layLayerControlPanel
|
||
|
|
|
||
|
|
|
||
|
|
#include <vector>
|
||
|
|
#include <string>
|
||
|
|
#include <set>
|
||
|
|
#include <algorithm>
|
||
|
|
|
||
|
|
#include <QFrame>
|
||
|
|
#include <QLabel>
|
||
|
|
#include <QPainter>
|
||
|
|
#include <QPaintEvent>
|
||
|
|
#include <QTreeView>
|
||
|
|
|
||
|
|
#include "layCanvasPlane.h"
|
||
|
|
#include "layViewOp.h"
|
||
|
|
#include "layLayoutView.h"
|
||
|
|
#include "layColorPalette.h"
|
||
|
|
#include "layStipplePalette.h"
|
||
|
|
#include "layDitherPattern.h"
|
||
|
|
#include "layLayerProperties.h"
|
||
|
|
#include "layLayerTreeModel.h"
|
||
|
|
#include "dbObject.h"
|
||
|
|
#include "tlDeferredExecution.h"
|
||
|
|
|
||
|
|
class QTreeView;
|
||
|
|
class QModelIndex;
|
||
|
|
class QMenu;
|
||
|
|
class QLabel;
|
||
|
|
class QTabBar;
|
||
|
|
|
||
|
|
namespace lay
|
||
|
|
{
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief A layer tree widget helper class
|
||
|
|
*
|
||
|
|
* A specialization of the TreeView that allows us to control
|
||
|
|
* sizeHint which otherwise is pretty large (around 100 pixel per column)
|
||
|
|
* and attaches the layer tree model to the view.
|
||
|
|
*/
|
||
|
|
|
||
|
|
class LCPTreeWidget : public QTreeView
|
||
|
|
{
|
||
|
|
Q_OBJECT
|
||
|
|
|
||
|
|
public:
|
||
|
|
LCPTreeWidget (QWidget *parent, lay::LayerTreeModel *model, const char *name);
|
||
|
|
~LCPTreeWidget ();
|
||
|
|
|
||
|
|
virtual QSize sizeHint () const;
|
||
|
|
|
||
|
|
// overload the double click event, because the default behaviour is
|
||
|
|
// expanding/collapsing the items
|
||
|
|
virtual void mouseDoubleClickEvent (QMouseEvent *event);
|
||
|
|
|
||
|
|
void set_selection (const std::vector<lay::LayerPropertiesConstIterator> &sel);
|
||
|
|
void set_current (const lay::LayerPropertiesConstIterator &sel);
|
||
|
|
void collapse_all ();
|
||
|
|
void expand_all ();
|
||
|
|
|
||
|
|
signals:
|
||
|
|
void double_clicked (const QModelIndex &, Qt::KeyboardModifiers);
|
||
|
|
|
||
|
|
private:
|
||
|
|
lay::LayerTreeModel *mp_model;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief The layer control panel
|
||
|
|
*
|
||
|
|
* The layer control panel has a layer list and four panels
|
||
|
|
* for colors, dither pattern and visibility.
|
||
|
|
*
|
||
|
|
* The class communicates with a Layout interface for
|
||
|
|
* retrieval and changing of layer properties.
|
||
|
|
*/
|
||
|
|
class LayerControlPanel
|
||
|
|
: public QFrame,
|
||
|
|
public db::Object,
|
||
|
|
public tl::Object
|
||
|
|
{
|
||
|
|
Q_OBJECT
|
||
|
|
|
||
|
|
public:
|
||
|
|
enum SortOrder { ByName, ByIndexLayerDatatype, ByIndexDatatypeLayer, ByLayerDatatypeIndex, ByDatatypeLayerIndex };
|
||
|
|
enum RegroupMode { RegroupByIndex, RegroupByDatatype, RegroupByLayer, RegroupFlatten };
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Constructor
|
||
|
|
*
|
||
|
|
* @param layout The Layout interface that the layer
|
||
|
|
* control panel is attached to
|
||
|
|
* @param parent The Qt parent widget
|
||
|
|
* @param name The layer control panel's widget name
|
||
|
|
*/
|
||
|
|
LayerControlPanel (lay::LayoutView *view, db::Manager *manager, QWidget *parent = 0, const char *name = "control_panel");
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Destructor
|
||
|
|
*/
|
||
|
|
~LayerControlPanel ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Return true, if the tree view has the focus
|
||
|
|
*/
|
||
|
|
bool has_focus () const;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Perform the layer control panel's initialisations on the main menu
|
||
|
|
*/
|
||
|
|
static void init_menu (lay::AbstractMenu &menu);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Tell, if there is something to copy
|
||
|
|
*/
|
||
|
|
bool has_selection () const;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Cut to clipboards
|
||
|
|
*/
|
||
|
|
void cut ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Copy to clipboards
|
||
|
|
*/
|
||
|
|
void copy ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Paste from clipboard
|
||
|
|
*/
|
||
|
|
void paste ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Enable or disable stipples
|
||
|
|
*/
|
||
|
|
void set_no_stipples (bool ns);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Changing of the background color
|
||
|
|
*/
|
||
|
|
void set_background_color (QColor c);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Changing of the text color
|
||
|
|
*/
|
||
|
|
void set_text_color (QColor c);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Set the "hide empty layers" flag
|
||
|
|
*
|
||
|
|
* If this flag is set, empty layers (either completely empty or no shapes in view - depending on the test_shapes_in_view flag)
|
||
|
|
* are not shown. Otherwise they are shown "faded".
|
||
|
|
*/
|
||
|
|
void set_hide_empty_layers (bool f);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get the "hide empty layers" flag
|
||
|
|
*/
|
||
|
|
bool hide_empty_layers ()
|
||
|
|
{
|
||
|
|
return m_hide_empty_layers;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Set the "test_shapes_in_view" flag
|
||
|
|
*
|
||
|
|
* If this flag is set, layers without a shape in the viewport are shown "empty".
|
||
|
|
*/
|
||
|
|
void set_test_shapes_in_view (bool f);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get the "test shapes in view" flag
|
||
|
|
*/
|
||
|
|
bool test_shapes_in_view ()
|
||
|
|
{
|
||
|
|
return m_test_shapes_in_view;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Set the animation phase
|
||
|
|
*/
|
||
|
|
void set_phase (int phase);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Tell, if the model has been updated already (true) or if it is still under construction (false)
|
||
|
|
*/
|
||
|
|
bool model_updated ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Inform of coming changes
|
||
|
|
*
|
||
|
|
* This method may be called before changes are made to the cell list.
|
||
|
|
* "end_updates" resets this state.
|
||
|
|
*/
|
||
|
|
void begin_updates ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Cancel the "begin_update" state
|
||
|
|
*/
|
||
|
|
void cancel_updates ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Tells that updates started with begin_updates() have been finished
|
||
|
|
*
|
||
|
|
* In result, this method will perform all actions to update the display
|
||
|
|
* and reset the "in_update" state.
|
||
|
|
*/
|
||
|
|
void end_updates ();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Return the selected layers
|
||
|
|
*/
|
||
|
|
std::vector<lay::LayerPropertiesConstIterator> selected_layers () const;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Make the given layers selected
|
||
|
|
*/
|
||
|
|
void set_selection (const std::vector<lay::LayerPropertiesConstIterator> &new_sel);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Sets the current layer
|
||
|
|
*
|
||
|
|
* This will also select this layer.
|
||
|
|
*/
|
||
|
|
void set_current_layer (const lay::LayerPropertiesConstIterator &l) const;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Return the current layer index
|
||
|
|
*
|
||
|
|
* Will return a "null" iterator if no layer is selected currently.
|
||
|
|
*/
|
||
|
|
lay::LayerPropertiesConstIterator current_layer () const;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Sort the layer list in the given order
|
||
|
|
*/
|
||
|
|
void sort_layers (SortOrder order);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Regroup the layer list in the given way
|
||
|
|
*/
|
||
|
|
void regroup_layers (RegroupMode mode);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Implementation of the undo operations
|
||
|
|
*/
|
||
|
|
virtual void undo (db::Op *op);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Implementation of the redo operations
|
||
|
|
*/
|
||
|
|
virtual void redo (db::Op *op);
|
||
|
|
|
||
|
|
using QFrame::setGeometry;
|
||
|
|
|
||
|
|
signals:
|
||
|
|
void order_changed ();
|
||
|
|
void tab_changed ();
|
||
|
|
|
||
|
|
public slots:
|
||
|
|
void cm_new_tab ();
|
||
|
|
void cm_remove_tab ();
|
||
|
|
void cm_rename_tab ();
|
||
|
|
void cm_select_all ();
|
||
|
|
void cm_make_valid ();
|
||
|
|
void cm_make_invalid ();
|
||
|
|
void cm_hide ();
|
||
|
|
void cm_hide_all ();
|
||
|
|
void cm_show ();
|
||
|
|
void cm_show_all ();
|
||
|
|
void cm_show_only ();
|
||
|
|
void cm_rename ();
|
||
|
|
void cm_delete ();
|
||
|
|
void cm_insert ();
|
||
|
|
void cm_group ();
|
||
|
|
void cm_ungroup ();
|
||
|
|
void cm_source ();
|
||
|
|
void cm_sort_by_name ();
|
||
|
|
void cm_sort_by_ild ();
|
||
|
|
void cm_sort_by_idl ();
|
||
|
|
void cm_sort_by_ldi ();
|
||
|
|
void cm_sort_by_dli ();
|
||
|
|
void cm_regroup_by_index ();
|
||
|
|
void cm_regroup_by_datatype ();
|
||
|
|
void cm_regroup_by_layer ();
|
||
|
|
void cm_regroup_flatten ();
|
||
|
|
void cm_expand_all ();
|
||
|
|
void cm_add_missing ();
|
||
|
|
void cm_remove_unused ();
|
||
|
|
void tab_selected (int index);
|
||
|
|
void double_clicked (const QModelIndex &index, Qt::KeyboardModifiers modifiers);
|
||
|
|
void context_menu (const QPoint &pt);
|
||
|
|
void tab_context_menu (const QPoint &pt);
|
||
|
|
void group_collapsed (const QModelIndex &index);
|
||
|
|
void group_expanded (const QModelIndex &index);
|
||
|
|
void up_clicked ();
|
||
|
|
void upup_clicked ();
|
||
|
|
void down_clicked ();
|
||
|
|
void downdown_clicked ();
|
||
|
|
|
||
|
|
private:
|
||
|
|
QTabBar *mp_tab_bar;
|
||
|
|
LCPTreeWidget *mp_layer_list;
|
||
|
|
LayerTreeModel *mp_model;
|
||
|
|
lay::LayoutView *mp_view;
|
||
|
|
bool m_needs_update;
|
||
|
|
bool m_tabs_need_update;
|
||
|
|
bool m_force_update_hidden_flags;
|
||
|
|
bool m_in_update;
|
||
|
|
std::vector<size_t> m_new_sel;
|
||
|
|
int m_phase;
|
||
|
|
tl::DeferredMethod<LayerControlPanel> m_do_update_content_dm;
|
||
|
|
bool m_hide_empty_layers;
|
||
|
|
bool m_test_shapes_in_view;
|
||
|
|
std::set<unsigned int> m_expanded;
|
||
|
|
bool m_no_stipples;
|
||
|
|
QLabel *m_no_stipples_label;
|
||
|
|
|
||
|
|
void clear_selection ();
|
||
|
|
|
||
|
|
void restore_expanded ();
|
||
|
|
|
||
|
|
void update_required (int f);
|
||
|
|
void signal_ll_changed (int index);
|
||
|
|
void signal_li_changed (int index);
|
||
|
|
void signal_cv_changed ();
|
||
|
|
void signal_cv_changed_with_int (int index);
|
||
|
|
void signal_vp_changed ();
|
||
|
|
|
||
|
|
void do_update_content ();
|
||
|
|
void do_delete ();
|
||
|
|
void do_copy ();
|
||
|
|
void recover ();
|
||
|
|
void do_move (int mode);
|
||
|
|
};
|
||
|
|
|
||
|
|
} // namespace
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|