mirror of https://github.com/KLayout/klayout.git
2737 lines
72 KiB
C++
2737 lines
72 KiB
C++
|
|
/*
|
|
|
|
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_layLayoutView
|
|
#define HDR_layLayoutView
|
|
|
|
#include "laybasicCommon.h"
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
#include <set>
|
|
#include <list>
|
|
#include <string>
|
|
|
|
#include <QFrame>
|
|
#include <QImage>
|
|
|
|
#include "layLayerProperties.h"
|
|
#include "layAnnotationShapes.h"
|
|
#include "layLayoutCanvas.h"
|
|
#include "layColorPalette.h"
|
|
#include "layStipplePalette.h"
|
|
#include "layLineStylePalette.h"
|
|
#include "layCellView.h"
|
|
#include "layViewOp.h"
|
|
#include "layEditable.h"
|
|
#include "layPlugin.h"
|
|
#include "layDisplayState.h"
|
|
#include "layBookmarkList.h"
|
|
#include "gsi.h"
|
|
#include "tlException.h"
|
|
#include "tlEvents.h"
|
|
#include "dbInstElement.h"
|
|
|
|
class QSpinBox;
|
|
|
|
namespace rdb {
|
|
class Database;
|
|
}
|
|
|
|
namespace db {
|
|
class Layout;
|
|
class Manager;
|
|
class SaveLayoutOptions;
|
|
}
|
|
|
|
namespace lay {
|
|
|
|
class AbstractMenu;
|
|
class LayerControlPanel;
|
|
class HierarchyControlPanel;
|
|
class MouseTracker;
|
|
class ZoomService;
|
|
class SelectionService;
|
|
class MoveService;
|
|
class Browser;
|
|
class ColorButton;
|
|
|
|
/**
|
|
* @brief Stores a layer reference to create layers which have been added by some action
|
|
*
|
|
* This object is delivered by LayoutView::layer_snapshot and can be used in add_missing_layers
|
|
* to create new layer views for layers which have been created between layer_snapshot and
|
|
* add_missing_layers.
|
|
*/
|
|
struct LayerState
|
|
{
|
|
/**
|
|
* @brief Constructor
|
|
*/
|
|
LayerState () { }
|
|
|
|
std::set<lay::ParsedLayerSource> present;
|
|
};
|
|
|
|
/**
|
|
* @brief A layer display properties structure
|
|
*
|
|
* The layer properties encapsulate the settings relevant for
|
|
* the display of a layer.
|
|
*
|
|
* "brightness" is a index that indicates how much to make the
|
|
* color brighter to darker rendering the effective color
|
|
* (eff_frame_color (), eff_fill_color ()). It's value is roughly between
|
|
* -255 and 255.
|
|
*/
|
|
struct LAYBASIC_PUBLIC LayerDisplayProperties
|
|
{
|
|
LayerDisplayProperties ();
|
|
|
|
bool operator== (const LayerDisplayProperties &d);
|
|
bool operator!= (const LayerDisplayProperties &d);
|
|
|
|
/**
|
|
* @brief render the effective frame color
|
|
*
|
|
* The effective frame color is computed from the frame color brightness and the
|
|
* frame color.
|
|
*/
|
|
color_t eff_frame_color () const;
|
|
|
|
/**
|
|
* @brief render the effective frame color
|
|
*
|
|
* The effective frame color is computed from the frame color brightness and the
|
|
* frame color.
|
|
*/
|
|
color_t eff_fill_color () const;
|
|
|
|
// display styles
|
|
color_t frame_color;
|
|
color_t fill_color;
|
|
int frame_brightness;
|
|
int fill_brightness;
|
|
unsigned int dither_pattern;
|
|
bool visible;
|
|
bool transparent;
|
|
int width;
|
|
bool marked;
|
|
int animation;
|
|
std::string name;
|
|
};
|
|
|
|
/**
|
|
* @brief The layout view object
|
|
*
|
|
* The layout view is responsible for displaying one or a set of layouts.
|
|
* It is composed of a canvas and controls to control the appearance.
|
|
* It manages the layer display list, bookmark list etc.
|
|
*/
|
|
class LAYBASIC_PUBLIC LayoutView
|
|
: public QFrame,
|
|
public lay::Editables,
|
|
public lay::Plugin
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
typedef lay::CellView::unspecific_cell_path_type cell_path_type;
|
|
typedef lay::CellView::cell_index_type cell_index_type;
|
|
typedef std::pair<std::string, DisplayState> bookmark_type;
|
|
|
|
/**
|
|
* @brief Define some options for the view
|
|
*/
|
|
enum options_type {
|
|
LV_Normal = 0,
|
|
LV_NoLayers = 1,
|
|
LV_NoHierarchyPanel = 2,
|
|
LV_Naked = 4,
|
|
LV_NoZoom = 8,
|
|
LV_NoGrid = 16,
|
|
LV_NoMove = 32,
|
|
LV_NoTracker = 64,
|
|
LV_NoSelection = 128,
|
|
LV_NoPlugins = 256,
|
|
LV_NoServices = LV_NoMove + LV_NoTracker + LV_NoSelection + LV_NoPlugins
|
|
};
|
|
|
|
enum drop_small_cells_cond_type { DSC_Max = 0, DSC_Min = 1, DSC_Sum = 2 };
|
|
|
|
/**
|
|
* @brief Constructor
|
|
*/
|
|
LayoutView (db::Manager *mgr, bool editable, lay::PluginRoot *root, QWidget *parent = 0, const char *name = "view", unsigned int options = (unsigned int) LV_Normal);
|
|
|
|
/**
|
|
* @brief Constructor (clone from another view)
|
|
*/
|
|
LayoutView (lay::LayoutView *source, db::Manager *mgr, bool editable, lay::PluginRoot *root, QWidget *parent = 0, const char *name = "view", unsigned int options = (unsigned int) LV_Normal);
|
|
|
|
/**
|
|
* @brief Destructor
|
|
*/
|
|
~LayoutView ();
|
|
|
|
/**
|
|
* @brief Makes this view the current one
|
|
*/
|
|
void set_current ();
|
|
|
|
/**
|
|
* @brief Makes the given view the current one
|
|
*
|
|
* The argument can be 0 which means there is no current view.
|
|
*/
|
|
static void set_current (LayoutView *);
|
|
|
|
/**
|
|
* @brief Gets the current view
|
|
*/
|
|
static LayoutView *current ();
|
|
|
|
/**
|
|
* @brief Determine if there is something to copy
|
|
*
|
|
* This reimplementation of the lay::Editables interface additionally
|
|
* looks for content providers in the tree views for example.
|
|
*/
|
|
bool has_selection ();
|
|
|
|
/**
|
|
* @brief Get the container with the layer control panel
|
|
*/
|
|
QWidget *layer_control_frame ()
|
|
{
|
|
return mp_control_frame;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the container with the hierarchy control panel
|
|
*/
|
|
QWidget *hierarchy_control_frame ()
|
|
{
|
|
return mp_hierarchy_frame;
|
|
}
|
|
|
|
/**
|
|
* @brief Paste from clipboard
|
|
*
|
|
* This reimplementation of the lay::Editables interface additionally
|
|
* looks for paste receivers in the tree views for example.
|
|
*/
|
|
void paste ();
|
|
|
|
/**
|
|
* @brief Copy to clipboard
|
|
*
|
|
* This reimplementation of the lay::Editables interface additionally
|
|
* looks for copy providers in the tree views for example.
|
|
*/
|
|
void copy ();
|
|
|
|
/**
|
|
* @brief Cut to clipboard
|
|
*
|
|
* This reimplementation of the lay::Editables interface additionally
|
|
* looks for cut & copy providers in the tree views for example.
|
|
*/
|
|
void cut ();
|
|
|
|
/**
|
|
* @brief Get the explicit title string of the view
|
|
*
|
|
* This is the one explicitly set, not the one displayed. The displayed text is composed of internal information
|
|
* if no title string is set.
|
|
*/
|
|
const std::string &title_string () const
|
|
{
|
|
return m_title;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the window title of the view
|
|
*/
|
|
std::string title () const;
|
|
|
|
/**
|
|
* @brief Set the window title to an explicit string
|
|
*/
|
|
void set_title (const std::string &t);
|
|
|
|
/**
|
|
* @brief Reset the explicit title and enable the automatic naming
|
|
*/
|
|
void reset_title ();
|
|
|
|
/**
|
|
* @brief Fill the layer properties for a new layer
|
|
*
|
|
* The layer's source must be set already to allow to compute the initial color.
|
|
* It is assumed that the layer is appended at the end of the layer list. This
|
|
* is important to set the dither pattern index accordingly.
|
|
*/
|
|
void init_layer_properties (LayerProperties &props) const;
|
|
|
|
/**
|
|
* @brief Create a set of new layers for the given layers of the given cellview
|
|
*/
|
|
void add_new_layers (const std::vector <unsigned int> &layer_ids, int cv_index);
|
|
|
|
/**
|
|
* @brief Set the layer properties of a layer with the given position (by iterator) for the current layer list
|
|
*
|
|
* @param iter Points to the layer to be replaced
|
|
* @param props The properties to replace the current properties
|
|
*/
|
|
void set_properties (const LayerPropertiesConstIterator &iter, const LayerProperties &props)
|
|
{
|
|
set_properties (current_layer_list (), iter, props);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the layer properties of a layer with the given position (by iterator) for the layer list with the given index
|
|
*
|
|
* @param index The layer list's index
|
|
* @param iter Points to the layer to be replaced
|
|
* @param props The properties to replace the current properties
|
|
*/
|
|
void set_properties (unsigned int index, const LayerPropertiesConstIterator &iter, const LayerProperties &props);
|
|
|
|
/**
|
|
* @brief Expand the layer properties of all tabs
|
|
*
|
|
* This method will replace the wildcard specifications in the layer properties of all
|
|
* tabs. All unspecific cv index specifications will be expanded to all cellviews, all
|
|
* layer and datatype specs will be expanded into all available (remaining) specs.
|
|
*/
|
|
void expand_properties ();
|
|
|
|
/**
|
|
* @brief Expand the layer properties for the given tab
|
|
*
|
|
* @param index The index of the tab to which to apply the expansion to.
|
|
*/
|
|
void expand_properties (unsigned int index);
|
|
|
|
/**
|
|
* @brief Expand the layer properties of all tabs with some options
|
|
*
|
|
* @param map_cv_index Maps a specified cv index to the one to use. Use -1 for the first entry to map any present cv index. Map to -1 to specify expansion to all available cv indices.
|
|
* @param add_default Set this parameter to true to implicitly add an entry for all "missing" layers.
|
|
*/
|
|
void expand_properties (const std::map<int, int> &map_cv_index, bool add_default);
|
|
|
|
/**
|
|
* @brief Expand the layer properties of the specified tab with some options
|
|
*
|
|
* @param index The index of the tab to which to apply the expansion to.
|
|
* @param map_cv_index Maps a specified cv index to the one to use. Use -1 for the first entry to map any present cv index. Map to -1 to specify expansion to all available cv indices.
|
|
* @param add_default Set this parameter to true to implicitly add an entry for all "missing" layers.
|
|
*/
|
|
void expand_properties (unsigned int index, const std::map<int, int> &map_cv_index, bool add_default);
|
|
|
|
/**
|
|
* @brief Replace the layer node with a new one for the current layer list
|
|
*/
|
|
void replace_layer_node (const LayerPropertiesConstIterator &iter, const LayerPropertiesNode &props)
|
|
{
|
|
replace_layer_node (current_layer_list (), iter, props);
|
|
}
|
|
|
|
/**
|
|
* @brief Replace the layer node with a new one for the layer list with the given index
|
|
*/
|
|
void replace_layer_node (unsigned int index, const LayerPropertiesConstIterator &iter, const LayerPropertiesNode &props);
|
|
|
|
/**
|
|
* @brief Insert the given layer properties node into the list for the current layer list
|
|
*
|
|
* This method returns a reference to the element created.
|
|
*/
|
|
const LayerPropertiesNode &insert_layer (const LayerPropertiesConstIterator &iter, const LayerPropertiesNode &props)
|
|
{
|
|
return insert_layer (current_layer_list (), iter, props);
|
|
}
|
|
|
|
/**
|
|
* @brief Insert the given layer properties node into the list before the given index
|
|
*
|
|
* This method returns a reference to the element created.
|
|
*/
|
|
const LayerPropertiesNode &insert_layer (unsigned int index, const LayerPropertiesConstIterator &iter, const LayerPropertiesNode &props);
|
|
|
|
/**
|
|
* @brief Delete the layer properties node for the current layer list
|
|
*
|
|
* This method deletes the object that the iterator points to and invalidates
|
|
* the iterator since the object that the iterator points to is no longer valid.
|
|
*/
|
|
void delete_layer (LayerPropertiesConstIterator &iter)
|
|
{
|
|
delete_layer (current_layer_list (), iter);
|
|
}
|
|
|
|
/**
|
|
* @brief Delete the layer properties node for the layer list with the given index
|
|
*
|
|
* This method deletes the object that the iterator points to and invalidates
|
|
* the iterator since the object that the iterator points to is no longer valid.
|
|
*/
|
|
void delete_layer (unsigned int index, LayerPropertiesConstIterator &iter);
|
|
|
|
/**
|
|
* @brief Begin iterator for the layers
|
|
*
|
|
* This iterator delivers recursively the layers of this view
|
|
*/
|
|
LayerPropertiesConstIterator begin_layers () const
|
|
{
|
|
return get_properties ().begin_const_recursive ();
|
|
}
|
|
|
|
/**
|
|
* @brief End iterator for the layers
|
|
*/
|
|
LayerPropertiesConstIterator end_layers () const
|
|
{
|
|
return get_properties ().end_const_recursive ();
|
|
}
|
|
|
|
/**
|
|
* @brief Begin iterator for the layers for a given list
|
|
*
|
|
* This iterator delivers recursively the layers of this view
|
|
*/
|
|
LayerPropertiesConstIterator begin_layers (unsigned int index) const
|
|
{
|
|
return get_properties (index).begin_const_recursive ();
|
|
}
|
|
|
|
/**
|
|
* @brief End iterator for the layers for a given list
|
|
*/
|
|
LayerPropertiesConstIterator end_layers (unsigned int index) const
|
|
{
|
|
return get_properties (index).end_const_recursive ();
|
|
}
|
|
|
|
/**
|
|
* @brief Replace the current layer properties list
|
|
*/
|
|
void set_properties (const LayerPropertiesList &list)
|
|
{
|
|
set_properties (current_layer_list (), list);
|
|
}
|
|
|
|
/**
|
|
* @brief Rename a layer properties list
|
|
*/
|
|
void rename_properties (unsigned int index, const std::string &new_name);
|
|
|
|
/**
|
|
* @brief Replace the specified layer properties list
|
|
*/
|
|
void set_properties (unsigned int index, const LayerPropertiesList &list);
|
|
|
|
/**
|
|
* @brief Clear the given layer view list
|
|
*/
|
|
void clear_layers (unsigned int index)
|
|
{
|
|
set_properties (index, LayerPropertiesList ());
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the current layer view list
|
|
*/
|
|
void clear_layers ()
|
|
{
|
|
set_properties (LayerPropertiesList ());
|
|
}
|
|
|
|
/**
|
|
* @brief Access the current layer properties list
|
|
*/
|
|
const LayerPropertiesList &get_properties () const
|
|
{
|
|
return get_properties (current_layer_list ());
|
|
}
|
|
|
|
/**
|
|
* @brief Access the specified layer properties list
|
|
*/
|
|
const LayerPropertiesList &get_properties (unsigned int index) const;
|
|
|
|
/**
|
|
* @brief Get the number of lists present in this view
|
|
*/
|
|
unsigned int layer_lists () const
|
|
{
|
|
return (unsigned int) m_layer_properties_lists.size ();
|
|
}
|
|
|
|
/**
|
|
* @brief Get the index of the current properties list
|
|
*/
|
|
unsigned int current_layer_list () const
|
|
{
|
|
return m_current_layer_list;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the index of the current properties list
|
|
*/
|
|
void set_current_layer_list (unsigned int index);
|
|
|
|
/**
|
|
* @brief Delete the specified layer properties list
|
|
*/
|
|
void delete_layer_list (unsigned int index);
|
|
|
|
/**
|
|
* @brief Insert the layer properties list at the given index and make it the current list.
|
|
*/
|
|
void insert_layer_list (unsigned int index, const LayerPropertiesList &props);
|
|
|
|
/**
|
|
* @brief Insert the layer properties list at the given index and make it the current list.
|
|
*/
|
|
void insert_layer_list (unsigned int index)
|
|
{
|
|
insert_layer_list (index, LayerPropertiesList ());
|
|
}
|
|
|
|
/**
|
|
* @brief Set the custom dither pattern
|
|
*/
|
|
void set_dither_pattern (const DitherPattern &pattern);
|
|
|
|
/**
|
|
* @brief Obtain the custom dither pattern
|
|
*/
|
|
const DitherPattern &dither_pattern () const
|
|
{
|
|
return mp_canvas->dither_pattern ();
|
|
}
|
|
|
|
/**
|
|
* @brief Set the custom line styles
|
|
*/
|
|
void set_line_styles (const LineStyles &styles);
|
|
|
|
/**
|
|
* @brief Obtain the custom line styles
|
|
*/
|
|
const LineStyles &line_styles () const
|
|
{
|
|
return mp_canvas->line_styles ();
|
|
}
|
|
|
|
/**
|
|
* @brief An event signalling the change in the number of hierarchy levels shown
|
|
*/
|
|
tl::Event hier_levels_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling a change in the annotations shape list
|
|
*
|
|
* If annotation shapes are added or removed, this event is triggered.
|
|
*/
|
|
tl::Event annotations_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling a change in the hierarchy of the layouts
|
|
*
|
|
* If the hierarchy of a layout is changed, this event is triggered.
|
|
* This may happen due to the removal or insertion of cells or instances.
|
|
*/
|
|
tl::Event hier_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling a change in the geometries of the layouts
|
|
*
|
|
* If something on the geometries of a cell in one the layouts changes, this
|
|
* event is triggered. This may happed due to the removal or insertion of shapes or cell instances.
|
|
* In general, this indicates the need for redrawing of the layout for example.
|
|
*/
|
|
tl::Event geom_changed_event;
|
|
|
|
/**
|
|
* @brief An event triggered before something on a cellview is changed
|
|
*
|
|
* This event is triggered before something on the cellview (i.e. the current cell of
|
|
* of set of the cellview) is changed. The argument is the index of the cell view to be
|
|
* changed.
|
|
* This event is followed by a corresponding cellview_changed event after the cellview
|
|
* has changed.
|
|
*/
|
|
tl::event<int> cellview_about_to_change_event;
|
|
|
|
/**
|
|
* @brief An event triggered before something on the cellviews is changed
|
|
*
|
|
* This event is triggered before something on the cellviews is changed, i.e. a cellview is deleted or inserted.
|
|
* Each of these events is followed by a cellviews_changed event after the change has been made.
|
|
*/
|
|
tl::Event cellviews_about_to_change_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the cell views have changed.
|
|
*
|
|
* When a cellview is added or removed, this event is triggered after the change has been made.
|
|
* The corresponding event that is triggered before the change is made is cellviews_about_to_change_event.
|
|
*/
|
|
tl::Event cellviews_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling a change in a cellview.
|
|
*
|
|
* If a cellview is changed (i.e. the cell is changed) this event is triggered.
|
|
* The integer argument will receive the index of the cellview that has changed.
|
|
* The corresponding event that is triggered before the change is made is cellview_about_to_change_event.
|
|
*/
|
|
tl::event<int> cellview_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling that a file has been loaded.
|
|
*
|
|
* If a new file is loaded, this event is triggered.
|
|
*/
|
|
tl::Event file_open_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the view is going to close
|
|
*/
|
|
tl::Event close_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the view is going to become visible
|
|
*/
|
|
tl::Event show_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the view is going to become invisible
|
|
*/
|
|
tl::Event hide_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the viewport has changed.
|
|
*
|
|
* If the viewport (the rectangle that is shown) changes, this event
|
|
* is triggered.
|
|
*/
|
|
tl::Event viewport_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the layer list has changed.
|
|
*
|
|
* If the layer list changes, this event is triggered with an integer argument.
|
|
* The arguments's bit 0 is set, if the properties have changed. If the arguments bit 1 is
|
|
* set, the hierarchy has changed. If the name of layer properties is changed, bit 2 is
|
|
* set.
|
|
*/
|
|
tl::event<int> layer_list_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling that a layer list was deleted.
|
|
*
|
|
* If a layer list is deleted from the layer list set, the event is triggered with
|
|
* the index of the deleted list as an integer parameter.
|
|
*/
|
|
tl::event<int> layer_list_deleted_event;
|
|
|
|
/**
|
|
* @brief An event signalling that a layer list was inserted.
|
|
*
|
|
* If a layer list is inserted into the layer list set, the event is triggered with
|
|
* the index of the new list as an integer parameter.
|
|
*/
|
|
tl::event<int> layer_list_inserted_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the current layer list has changed.
|
|
*
|
|
* If the current layer list is changed, this event is triggered.
|
|
*/
|
|
tl::event<int> current_layer_list_changed_event;
|
|
|
|
/**
|
|
* @brief An event signalling that the visibility of some cells has changed
|
|
*/
|
|
tl::Event cell_visibility_changed_event;
|
|
|
|
/**
|
|
* @brief An event triggered if the active cellview changes
|
|
* This event is triggered after the active cellview changed.
|
|
*/
|
|
tl::Event active_cellview_changed_event;
|
|
|
|
/**
|
|
* @brief An event triggered if the active cellview changes
|
|
* This event is triggered after the active cellview changed. The integer parameter is the index of the
|
|
* new cellview.
|
|
*/
|
|
tl::event<int> active_cellview_changed_with_index_event;
|
|
|
|
/**
|
|
* @brief Sets the currently active layer by layer properties and cell view index
|
|
*
|
|
* This method will look up that layer in the layer view tree and select that layer.
|
|
* This method will also select this layer.
|
|
*/
|
|
void set_current_layer (unsigned int cv_index, const db::LayerProperties &properties);
|
|
|
|
/**
|
|
* @brief Sets the currently active layer
|
|
*
|
|
* The active layer is the one that is active in the layer
|
|
* browser panel. This method will also select this layer.
|
|
*/
|
|
void set_current_layer (const lay::LayerPropertiesConstIterator &l);
|
|
|
|
/**
|
|
* @brief Retrieve the index of the currently active layer
|
|
*
|
|
* The active layer is the one that is active in the layer
|
|
* browser panel.
|
|
* This method returns a null iterator, if no layer is active.
|
|
*/
|
|
lay::LayerPropertiesConstIterator current_layer () const;
|
|
|
|
/**
|
|
* @brief Return the layers that are selected in the layer browser
|
|
*
|
|
* Returns an empty list if no layer is selected.
|
|
*/
|
|
std::vector<lay::LayerPropertiesConstIterator> selected_layers () const;
|
|
|
|
/**
|
|
* @brief Sets the layers that are selected in the layer browser
|
|
*/
|
|
void set_selected_layers (const std::vector<lay::LayerPropertiesConstIterator> &sel);
|
|
|
|
/**
|
|
* @brief Save the given cellview into the given file (with options)
|
|
* If "update" is true, the cell view's properties will be updated (options, filename etc.).
|
|
*/
|
|
void save_as (unsigned int index, const std::string &filename, tl::OutputStream::OutputStreamMode om, const db::SaveLayoutOptions &options, bool update);
|
|
|
|
/**
|
|
* @brief Implementation of the undo operations
|
|
*/
|
|
virtual void undo (db::Op *op);
|
|
|
|
/**
|
|
* @brief Implementation of the redo operations
|
|
*/
|
|
virtual void redo (db::Op *op);
|
|
|
|
/**
|
|
* @brief Set the cellview at the given index
|
|
*
|
|
* If cvindex is used as the cellview index to associate the
|
|
* layout with. As a side effect, this method will emit a
|
|
* title_changed signal, which means that the cellview passed
|
|
* should be correctly named before to reflect the correct
|
|
* title if no explicit title is set.
|
|
*/
|
|
void set_layout (const lay::CellView &cv, unsigned int cvindex);
|
|
|
|
/**
|
|
* @brief clear the cellviews
|
|
*/
|
|
void clear_cellviews ();
|
|
|
|
/**
|
|
* @brief erase one cellview with the given index
|
|
*/
|
|
void erase_cellview (unsigned int index);
|
|
|
|
/**
|
|
* @brief Save the layer properties
|
|
*/
|
|
void save_layer_props (const std::string &fn);
|
|
|
|
/**
|
|
* @brief Load the layer properties
|
|
*
|
|
* @param fn The file to load.
|
|
*/
|
|
void load_layer_props (const std::string &fn);
|
|
|
|
/**
|
|
* @brief Load the layer properties
|
|
*
|
|
* @param fn The file to load
|
|
*
|
|
* This version allows to specify whether defaults should be used for all other layers by
|
|
* setting add_default to true
|
|
*/
|
|
void load_layer_props (const std::string &fn, bool add_default);
|
|
|
|
/**
|
|
* @brief Load the layer properties
|
|
*
|
|
* @param fn The file to load
|
|
*
|
|
* This version allows to specify whether defaults should be used for all other layers by
|
|
* setting add_default to true. In addition, this version will apply the .lyp definitions
|
|
* to a specific cellview after removing all definitions for this one. If cv_index is set
|
|
* to -1, the .lyp file will be applied to each cellview. In any case, the cv index specs
|
|
* in the .lyp file will be overridden.
|
|
*/
|
|
void load_layer_props (const std::string &fn, int cv_index, bool add_default);
|
|
|
|
/**
|
|
* @brief Save the screen content to a file
|
|
*/
|
|
void save_screenshot (const std::string &fn);
|
|
|
|
/**
|
|
* @brief Get the screen content as a QImage object
|
|
*/
|
|
QImage get_screenshot ();
|
|
|
|
/**
|
|
* @brief Save an image file with the given width and height
|
|
*/
|
|
void save_image (const std::string &fn, unsigned int width, unsigned int height);
|
|
|
|
/**
|
|
* @brief Save an image file with some options
|
|
*
|
|
* @param fn The path of the file to write
|
|
* @param width The width of the image in pixels
|
|
* @param height The height of the image
|
|
* @param linewidth The width of a line in pixels (usually 1) or 0 for default
|
|
* @param oversampling The oversampling factor (1..3) or 0 for default
|
|
* @param resolution The resolution (pixel size compared to a screen pixel size, i.e 1/oversampling) or 0 for default
|
|
* @param background The background color or QColor() for default
|
|
* @param foreground The foreground color or QColor() for default
|
|
* @param active The active color or QColor() for default
|
|
* @param target_box The box to draw or db::DBox() for default
|
|
* @param monochrome If true, monochrome images will be produced
|
|
*/
|
|
void save_image_with_options (const std::string &fn, unsigned int width, unsigned int height, int linewidth, int oversampling, double resolution, QColor background, QColor foreground, QColor active_color, const db::DBox &target_box, bool monochrome);
|
|
|
|
/**
|
|
* @brief Get the screen content as a QImage object with the given width and height
|
|
*/
|
|
QImage get_image (unsigned int width, unsigned int height);
|
|
|
|
/**
|
|
* @brief Get the screen content as a QImage object with the given width and height
|
|
*
|
|
* @param width The width of the image in pixels
|
|
* @param height The height of the image
|
|
* @param linewidth The width of a line in pixels (usually 1) or 0 for default
|
|
* @param oversampling The oversampling factor (1..3) or 0 for default
|
|
* @param resolution The resolution (pixel size compared to a screen pixel size, i.e 1/oversampling) or 0 for default
|
|
* @param background The background color or QColor() for default
|
|
* @param foreground The foreground color or QColor() for default
|
|
* @param active The active color or QColor() for default
|
|
* @param target_box The box to draw or db::DBox() for default
|
|
* @param monochrome If true, monochrome images will be produced
|
|
*/
|
|
QImage get_image_with_options (unsigned int width, unsigned int height, int linewidth, int oversampling, double resolution, QColor background, QColor foreground, QColor active_color, const db::DBox &target_box, bool monochrome);
|
|
|
|
/**
|
|
* @brief Hierarchy level selection setter
|
|
*/
|
|
void set_hier_levels (std::pair<int, int> l);
|
|
|
|
/**
|
|
* @brief Hierarchy level selection setter
|
|
*/
|
|
void set_min_hier_levels (int l)
|
|
{
|
|
set_hier_levels (std::pair<int, int> (l, get_max_hier_levels ()));
|
|
}
|
|
|
|
/**
|
|
* @brief Hierarchy level selection setter
|
|
*/
|
|
void set_max_hier_levels (int l)
|
|
{
|
|
set_hier_levels (std::pair<int, int> (get_min_hier_levels (), l));
|
|
}
|
|
|
|
/**
|
|
* @brief Hierarchy level selection getter
|
|
*/
|
|
std::pair<int, int> get_hier_levels () const;
|
|
|
|
/**
|
|
* @brief Hierarchy level selection getter
|
|
*/
|
|
int get_min_hier_levels () const
|
|
{
|
|
return get_hier_levels ().first;
|
|
}
|
|
|
|
/**
|
|
* @brief Hierarchy level selection getter
|
|
*/
|
|
int get_max_hier_levels () const
|
|
{
|
|
return get_hier_levels ().second;
|
|
}
|
|
|
|
/**
|
|
* @brief Return true, if there is a "last" display state
|
|
*/
|
|
bool has_last_display_state ();
|
|
|
|
/**
|
|
* @brief Return true, if there is a "next" display state
|
|
*/
|
|
bool has_next_display_state ();
|
|
|
|
/**
|
|
* @brief Cell box/label color setter
|
|
*/
|
|
void cell_box_color (QColor c);
|
|
|
|
/**
|
|
* @brief Cell box/label getter
|
|
*/
|
|
QColor cell_box_color () const
|
|
{
|
|
return m_box_color;
|
|
}
|
|
|
|
/**
|
|
* @brief Transform label flag setter
|
|
*/
|
|
void cell_box_text_transform (bool xform);
|
|
|
|
/**
|
|
* @brief Transform label flag getter
|
|
*/
|
|
bool cell_box_text_transform () const
|
|
{
|
|
return m_box_text_transform;
|
|
}
|
|
|
|
/**
|
|
* @brief Label font setter
|
|
*/
|
|
void cell_box_text_font (unsigned int f);
|
|
|
|
/**
|
|
* @brief Label font setter
|
|
*/
|
|
unsigned int cell_box_text_font () const
|
|
{
|
|
return m_box_font;
|
|
}
|
|
|
|
/**
|
|
* @brief Visibility of cell boxes
|
|
*/
|
|
void cell_box_visible (bool vis);
|
|
|
|
/**
|
|
* @brief Visibility of cell boxes
|
|
*/
|
|
bool cell_box_visible () const
|
|
{
|
|
return m_cell_box_visible;
|
|
}
|
|
|
|
/**
|
|
* @brief Min instance label size setter
|
|
*/
|
|
void min_inst_label_size (int px);
|
|
|
|
/**
|
|
* @brief Min instance label size getter
|
|
*/
|
|
int min_inst_label_size () const
|
|
{
|
|
return m_min_size_for_label;
|
|
}
|
|
|
|
/**
|
|
* @brief Visibility of text objects
|
|
*/
|
|
void text_visible (bool vis);
|
|
|
|
/**
|
|
* @brief Visibility of text objects
|
|
*/
|
|
bool text_visible () const
|
|
{
|
|
return m_text_visible;
|
|
}
|
|
|
|
/**
|
|
* @brief Show properties
|
|
*/
|
|
void show_properties_as_text (bool sp);
|
|
|
|
/**
|
|
* @brief Show properties
|
|
*/
|
|
bool show_properties_as_text ()
|
|
{
|
|
return m_show_properties;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable or disable bitmap caching
|
|
*
|
|
* Bitmap caching is used to optimize drawing by storing bitmaps
|
|
* in a cache for each cell. Repeated cells will be drawn faster then.
|
|
*/
|
|
void bitmap_caching (bool en);
|
|
|
|
/**
|
|
* @brief Lazy rendering of text objects
|
|
*/
|
|
bool bitmap_caching ()
|
|
{
|
|
return m_bitmap_caching;
|
|
}
|
|
|
|
/**
|
|
* @brief Lazy rendering of text objects
|
|
*/
|
|
void text_lazy_rendering (bool lzy);
|
|
|
|
/**
|
|
* @brief Lazy rendering of text objects
|
|
*/
|
|
bool text_lazy_rendering ()
|
|
{
|
|
return m_text_lazy_rendering;
|
|
}
|
|
|
|
/**
|
|
* @brief Text object font setter
|
|
*/
|
|
void text_font (unsigned int f);
|
|
|
|
/**
|
|
* @brief Text object font getter
|
|
*/
|
|
unsigned int text_font () const
|
|
{
|
|
return m_text_font;
|
|
}
|
|
|
|
/**
|
|
* @brief The default text size property
|
|
*/
|
|
void default_text_size (double fs);
|
|
|
|
/**
|
|
* @brief The default text size property
|
|
*/
|
|
double default_text_size () const
|
|
{
|
|
return m_default_text_size;
|
|
}
|
|
|
|
/**
|
|
* @brief Don't show stipples
|
|
*/
|
|
void no_stipples (bool f);
|
|
|
|
/**
|
|
* @brief "Don't show stipples" property getter
|
|
*/
|
|
bool no_stipples () const
|
|
{
|
|
return m_no_stipples;
|
|
}
|
|
|
|
/**
|
|
* @brief Offset stipples property
|
|
*/
|
|
void offset_stipples (bool f);
|
|
|
|
/**
|
|
* @brief Offset stipples property getter
|
|
*/
|
|
bool offset_stipples () const
|
|
{
|
|
return m_stipple_offset;
|
|
}
|
|
|
|
/**
|
|
* @brief Apply text transformation property
|
|
*/
|
|
void apply_text_trans (bool f);
|
|
|
|
/**
|
|
* @brief Apply text transformation property
|
|
*/
|
|
bool apply_text_trans () const
|
|
{
|
|
return m_apply_text_trans;
|
|
}
|
|
|
|
/**
|
|
* @brief Text object color
|
|
*/
|
|
void text_color (QColor c);
|
|
|
|
/**
|
|
* @brief Text object color
|
|
*/
|
|
QColor text_color () const
|
|
{
|
|
return m_text_color;
|
|
}
|
|
|
|
/**
|
|
* @brief Clear all rulers if a new cell is selected (setter)
|
|
*
|
|
* If this property is set to true, all rulers are cleared
|
|
* if the cell is changed.
|
|
*/
|
|
void clear_ruler_new_cell (bool f);
|
|
|
|
/**
|
|
* @brief Clear all rulers if a new cell is selected (getter)
|
|
*
|
|
* If this property is set to true, all rulers are cleared
|
|
* if the cell is changed.
|
|
*/
|
|
bool clear_ruler_new_cell () const
|
|
{
|
|
return m_clear_ruler_new_cell;
|
|
}
|
|
|
|
/**
|
|
* @brief Switch new cell to full hierarchy property
|
|
*
|
|
* If this property is set to true, all hierarchy levels are selected
|
|
* if the cell is changed.
|
|
*/
|
|
void full_hier_new_cell (bool f);
|
|
|
|
/**
|
|
* @brief Switch new cell to full hierarchy property
|
|
*
|
|
* If this property is set to true, all hierarchy levels are selected
|
|
* if the cell is changed.
|
|
*/
|
|
bool full_hier_new_cell () const
|
|
{
|
|
return m_full_hier_new_cell;
|
|
}
|
|
|
|
/**
|
|
* @brief Fit new cell property
|
|
*
|
|
* If this property is set to false, the coordinate window is not
|
|
* changed if the cell is changed.
|
|
*/
|
|
void fit_new_cell (bool f);
|
|
|
|
/**
|
|
* @brief Fit new cell
|
|
*
|
|
* If this property is set to false, the coordinate window is not
|
|
* changed if the cell is changed.
|
|
*/
|
|
bool fit_new_cell () const
|
|
{
|
|
return m_fit_new_cell;
|
|
}
|
|
|
|
/**
|
|
* @brief The pan distance
|
|
*
|
|
* The pan distance is given relative to the current width and height.
|
|
*/
|
|
void pan_distance (double d);
|
|
|
|
/**
|
|
* @brief Gets the pan distance
|
|
*/
|
|
double pan_distance () const;
|
|
|
|
/**
|
|
* @brief Get the mouse wheel mode
|
|
*
|
|
* The mouse wheel mode determines how the wheel behaves. Mode 0 is the
|
|
* default mode, mode 1 is the alternative mode (default is up/down,
|
|
* shift is left/right, ctrl is zoom).
|
|
*/
|
|
int mouse_wheel_mode () const
|
|
{
|
|
return m_wheel_mode;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the mouse wheel mode
|
|
*
|
|
* The mouse wheel mode determines how the wheel behaves. Mode 0 is the
|
|
* default mode, mode 1 is the alternative mode (default is up/down,
|
|
* shift is left/right, ctrl is zoom).
|
|
*/
|
|
void mouse_wheel_mode (int m)
|
|
{
|
|
m_wheel_mode = m;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the color palette
|
|
*
|
|
* The color palette is used for coloring new layers and is shown in the
|
|
* layer toolbox.
|
|
*/
|
|
void set_palette (const lay::ColorPalette &);
|
|
|
|
/**
|
|
* @brief Gets the color palette
|
|
*/
|
|
const lay::ColorPalette &get_palette () const
|
|
{
|
|
return m_palette;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the stipple palette
|
|
*
|
|
* The stipple palette is used for selecting stipples for new layers and is shown in the
|
|
* layer toolbox.
|
|
*/
|
|
void set_palette (const lay::StipplePalette &);
|
|
|
|
/**
|
|
* @brief Gets the stipple palette
|
|
*/
|
|
const lay::StipplePalette &get_stipple_palette () const
|
|
{
|
|
return m_stipple_palette;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the line style palette
|
|
*
|
|
* The line style palette is used for selecting line styles and is shown in the
|
|
* layer toolbox.
|
|
*/
|
|
void set_palette (const lay::LineStylePalette &);
|
|
|
|
/**
|
|
* @brief Gets the line style palette
|
|
*/
|
|
const lay::LineStylePalette &get_line_style_palette () const
|
|
{
|
|
return m_line_style_palette;
|
|
}
|
|
|
|
/**
|
|
* @brief Reloads the given cellview into the current view
|
|
*
|
|
* The cellview is given by index in the current view's cellview list.
|
|
*/
|
|
void reload_layout (unsigned int cv_index);
|
|
|
|
/**
|
|
* @brief Load a (new) file into the layout
|
|
*
|
|
* The add_cellview param controls whether to create a new cellview
|
|
* or clear all cellviews before.
|
|
*
|
|
* The new layout will use the default technology.
|
|
*
|
|
* @return The index of the cellview loaded.
|
|
*/
|
|
unsigned int load_layout (const std::string &filename, bool add_cellview)
|
|
{
|
|
return load_layout (filename, std::string (), add_cellview);
|
|
}
|
|
|
|
/**
|
|
* @brief Load a (new) file into the layout associating it with the given technology
|
|
*
|
|
* The add_cellview param controls whether to create a new cellview
|
|
* or clear all cellviews before.
|
|
*
|
|
* @return The index of the cellview loaded.
|
|
*/
|
|
unsigned int load_layout (const std::string &filename, const std::string &technology, bool add_cellview);
|
|
|
|
/**
|
|
* @brief Load a (new) file into the layout with the options
|
|
*
|
|
* The add_cellview param controls whether to create a new cellview
|
|
* or clear all cellviews before.
|
|
*
|
|
* The new layout will use the default technology.
|
|
*
|
|
* @param options The options to use when loading.
|
|
* @param add_cellview_param See above.
|
|
* @return The index of the cellview loaded.
|
|
*/
|
|
unsigned int load_layout (const std::string &filename, const db::LoadLayoutOptions &options, bool add_cellview)
|
|
{
|
|
return load_layout (filename, options, std::string (), add_cellview);
|
|
}
|
|
|
|
/**
|
|
* @brief Load a (new) file into the layout with the options and using the specified technology
|
|
*
|
|
* The add_cellview param controls whether to create a new cellview
|
|
* or clear all cellviews before.
|
|
*
|
|
* @param options The options to use when loading.
|
|
* @param add_cellview_param See above.
|
|
* @return The index of the cellview loaded.
|
|
*/
|
|
unsigned int load_layout (const std::string &filename, const db::LoadLayoutOptions &options, const std::string &technology, bool add_cellview);
|
|
|
|
/**
|
|
* @brief Create a new, empty layout
|
|
*
|
|
* The add_cellview param controls whether to create a new cellview
|
|
* or clear all cellviews before.
|
|
*
|
|
* The new layout will use the default technology.
|
|
*
|
|
* @return The index of the cellview loaded.
|
|
*/
|
|
unsigned int create_layout (bool add_cellview)
|
|
{
|
|
return create_layout (std::string (), add_cellview, true);
|
|
}
|
|
|
|
/**
|
|
* @brief Create a new, empty layout using the specified technology
|
|
*
|
|
* The add_cellview param controls whether to create a new cellview
|
|
* or clear all cellviews before.
|
|
*
|
|
* @return The index of the cellview created.
|
|
*/
|
|
unsigned int create_layout (const std::string &technology, bool add_cellview)
|
|
{
|
|
return create_layout (technology, add_cellview, true);
|
|
}
|
|
|
|
/**
|
|
* @brief Create a new, empty layout using the specified technology
|
|
*
|
|
* The add_cellview param controls whether to create a new cellview
|
|
* or clear all cellviews before. This version allows to specify whether layer properties shall be created.
|
|
*
|
|
* @return The index of the cellview created.
|
|
*/
|
|
unsigned int create_layout (const std::string &technology, bool add_cellview, bool initialize_layers);
|
|
|
|
/**
|
|
* @brief Add an existing layout or replace the current cellview by the given layout
|
|
*
|
|
* The add_cellview param controls whether to add the layout as a new cellview
|
|
* or clear all cellviews before.
|
|
*
|
|
* The "initialize_layers" parameter allows to specify whether the layer properties shall be initialized.
|
|
*
|
|
* @return The index of the cellview loaded.
|
|
*/
|
|
unsigned int add_layout (lay::LayoutHandle *layout_handle, bool add_cellview, bool initialize_layers = true);
|
|
|
|
/**
|
|
* @brief Pass the current position from the mouse tracker to the status bar
|
|
*/
|
|
void current_pos (double x, double y);
|
|
|
|
/**
|
|
* @brief Get the index of the active cellview (shown in hierarchy browser)
|
|
*/
|
|
int active_cellview_index () const;
|
|
|
|
/**
|
|
* @brief Get the index of the active cellview (shown in hierarchy browser)
|
|
*/
|
|
const lay::CellView &active_cellview () const;
|
|
|
|
/**
|
|
* @brief Gets a cellview reference to the active cellview
|
|
*/
|
|
lay::CellViewRef active_cellview_ref ();
|
|
|
|
/**
|
|
* @brief Select a certain cellview for the active one
|
|
*/
|
|
void set_active_cellview_index (int index);
|
|
|
|
/**
|
|
* @brief Cell paths of the selected cells
|
|
*
|
|
* The current cell is the one highlighted in the browser with the focus rectangle. The
|
|
* current path is returned for the cellview given by cv_index.
|
|
*/
|
|
void selected_cells_paths (int cv_index, std::vector<cell_path_type> &paths) const;
|
|
|
|
/**
|
|
* @brief Cell path of the current cell
|
|
*
|
|
* The current cell is the one highlighted in the browser with the focus rectangle. The
|
|
* current path is returned for the cellview given by cv_index.
|
|
*/
|
|
void current_cell_path (int cv_index, cell_path_type &path) const;
|
|
|
|
/**
|
|
* @brief Cell path of the current cell
|
|
*
|
|
* This method version is provided for automation purposes mainly.
|
|
*/
|
|
cell_path_type get_current_cell_path (int cv_index) const
|
|
{
|
|
cell_path_type r;
|
|
current_cell_path (cv_index, r);
|
|
return r;
|
|
}
|
|
|
|
/**
|
|
* @brief Cell path of the current cell in the active cellview
|
|
*
|
|
* This is a convenience function returning the path for the active cellview.
|
|
*/
|
|
void current_cell_path (cell_path_type &path) const
|
|
{
|
|
current_cell_path (active_cellview_index (), path);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the path to the current cell
|
|
*
|
|
* The current cell is the one highlighted in the browser with the focus rectangle. The
|
|
* cell given by the path is hightlighted and scrolled into view.
|
|
*/
|
|
void set_current_cell_path (int cv_index, const cell_path_type &path);
|
|
|
|
/**
|
|
* @brief Set the path to the current cell is the current cellview
|
|
*
|
|
* This is a convenience function setting the path for the active cellview.
|
|
*/
|
|
void set_current_cell_path (const cell_path_type &path)
|
|
{
|
|
set_current_cell_path (active_cellview_index (), path);
|
|
}
|
|
|
|
/**
|
|
* @brief Obtain the number of cellviews
|
|
*/
|
|
unsigned int cellviews () const
|
|
{
|
|
return (unsigned int) m_cellviews.size ();
|
|
}
|
|
|
|
/**
|
|
* @brief Obtain the cellviews as a vector
|
|
*/
|
|
const std::list<lay::CellView> &cellview_list () const
|
|
{
|
|
return m_cellviews;
|
|
}
|
|
|
|
/**
|
|
* @brief Obtain the cell view reference for an index
|
|
*
|
|
* If the index is invalid, an empty cell view reference is returned
|
|
*/
|
|
const CellView &cellview (unsigned int index) const;
|
|
|
|
/**
|
|
* @brief Gets a cellview reference to the active cellview
|
|
*/
|
|
lay::CellViewRef cellview_ref (unsigned int index);
|
|
|
|
/**
|
|
* @brief Gets the index of the given cellview
|
|
* Based on the pointer passed to the function, the index of the respective cellview
|
|
* will be returned. If a null pointer is given or the pointer is not a valid cellview,
|
|
* -1 will be returned.
|
|
*/
|
|
int index_of_cellview (const lay::CellView *cv) const;
|
|
|
|
/**
|
|
* @brief Obtain the list of annotation shapes
|
|
*/
|
|
const lay::AnnotationShapes &annotation_shapes () const
|
|
{
|
|
return m_annotation_shapes;
|
|
}
|
|
|
|
/**
|
|
* @brief Obtain the list of annotation shapes (non-const version)
|
|
*/
|
|
lay::AnnotationShapes &annotation_shapes ()
|
|
{
|
|
return m_annotation_shapes;
|
|
}
|
|
|
|
/**
|
|
* @brief Select the list of cellviews for this window and fit cell
|
|
*
|
|
* Warning: use with care!
|
|
*/
|
|
void select_cellviews_fit (const std::list <CellView> &cvs);
|
|
|
|
/**
|
|
* @brief Select the list of cellviews for this window
|
|
*
|
|
* Warning: use with care!
|
|
*/
|
|
void select_cellviews (const std::list <CellView> &cvs);
|
|
|
|
/**
|
|
* @brief Configures the cellview with the given index
|
|
* @param index Index of the cellview to configure
|
|
* @param cv The cellview that provides the new configuration
|
|
*/
|
|
void select_cellview (int index, const CellView &cv);
|
|
|
|
/**
|
|
* @brief Shift and scale the window
|
|
*/
|
|
void shift_window (double f, double dx, double dy);
|
|
|
|
/**
|
|
* @brief Goto window
|
|
*
|
|
* Position the window to the new position x and y with a size of s (approximately).
|
|
* If s is negative or zero, the windows is just shifted.
|
|
*/
|
|
void goto_window (const db::DPoint &p, double s = -1.0);
|
|
|
|
/**
|
|
* @brief Return the displayed window
|
|
*/
|
|
db::DBox box () const;
|
|
|
|
/**
|
|
* @brief Display a status message
|
|
*/
|
|
void message (const std::string &s = "", int timeout = 10);
|
|
|
|
/**
|
|
* @brief Create a new cell with the given in the given cellview
|
|
*
|
|
* @param cv_index The index of the cellview where to create the cell
|
|
* @param cell_name The name of the cell (an exception is thrown if a cell of that name already exists)
|
|
* @return The index of the new cell
|
|
*/
|
|
db::cell_index_type new_cell (int cv_index, const std::string &cell_name);
|
|
|
|
/**
|
|
* @brief Bookmark the current view under the given name
|
|
*/
|
|
void bookmark_view (const std::string &name);
|
|
|
|
/**
|
|
* @brief Show the bookmark management form
|
|
*/
|
|
void manage_bookmarks ();
|
|
|
|
/**
|
|
* @brief Obtain the bookmarks list
|
|
*/
|
|
const BookmarkList &bookmarks () const
|
|
{
|
|
return m_bookmarks;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the bookmarks list
|
|
*/
|
|
void bookmarks (const BookmarkList &b);
|
|
|
|
std::pair <bool, std::string> redo_available ();
|
|
std::pair <bool, std::string> undo_available ();
|
|
|
|
/**
|
|
* @brief Select a certain mode (by index)
|
|
*/
|
|
void mode (int m);
|
|
|
|
/**
|
|
* @brief Test, if the view is currently in move mode.
|
|
*/
|
|
bool is_move_mode () const;
|
|
|
|
/**
|
|
* @brief Test, if the view is currently in selection mode.
|
|
*/
|
|
bool is_selection_mode () const;
|
|
|
|
/**
|
|
* @brief Query the intrinsic mouse modes available
|
|
*/
|
|
static unsigned int intrinsic_mouse_modes (std::vector<std::string> *descriptions);
|
|
|
|
/**
|
|
* @brief Perform the layout view's initialisations on the main menu
|
|
*/
|
|
static void init_menu (lay::AbstractMenu &menu);
|
|
|
|
/**
|
|
* @brief Query the default mode
|
|
*/
|
|
static int default_mode ();
|
|
|
|
/**
|
|
* @brief Get a list of cellview index and transform variants
|
|
*/
|
|
std::set< std::pair<db::DCplxTrans, int> > cv_transform_variants () const;
|
|
|
|
/**
|
|
* @brief Get the global transform variants for a given cellview index
|
|
*/
|
|
std::vector<db::DCplxTrans> cv_transform_variants (int cv_index) const;
|
|
|
|
/**
|
|
* @brief Get the global transform variants for a given cellview index and layer
|
|
*/
|
|
std::vector<db::DCplxTrans> cv_transform_variants (int cv_index, unsigned int layer) const;
|
|
|
|
/**
|
|
* @brief Get the transformation variants for a given cellview index ordered by layer
|
|
*/
|
|
std::map<unsigned int, std::vector<db::DCplxTrans> > cv_transform_variants_by_layer (int cv_index) const;
|
|
|
|
/**
|
|
* @brief Access to the hidden cell list
|
|
*/
|
|
const std::vector <std::set <cell_index_type> > &hidden_cells () const
|
|
{
|
|
return m_hidden_cells;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the "dbu_coordinates" flag
|
|
*
|
|
* If this flag is true, the property dialogs and other display functions should use
|
|
* database units to display coordinates etc.
|
|
*/
|
|
bool dbu_coordinates () const
|
|
{
|
|
return m_dbu_coordinates;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the "dbu_coordinates" flag
|
|
*
|
|
* If this flag is true, the property dialogs and other display functions should use
|
|
* database units to display coordinates etc.
|
|
*/
|
|
void dbu_coordinates (bool f);
|
|
|
|
/**
|
|
* @brief Get the "absolute_coordinates" flag
|
|
*
|
|
* If this flag is true, the property dialogs and other display functions should use
|
|
* absolute (on top level) coordinates for points etc.
|
|
* "absolute" may as well refer to orientation, not only to coordinates,
|
|
* if transformations are considered.
|
|
*/
|
|
bool absolute_coordinates () const
|
|
{
|
|
return m_absolute_coordinates;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the "absolute_coordinates" flag
|
|
*
|
|
* If this flag is true, the property dialogs and other display functions should use
|
|
* absolute (on top level) coordinates for points etc.
|
|
* "absolute" may as well refer to orientation, not only to coordinates,
|
|
* if transformations are considered.
|
|
*/
|
|
void absolute_coordinates (bool f);
|
|
|
|
/**
|
|
* @brief Get the view object widget
|
|
*
|
|
* This method intentionally delivers the ViewObjectWidget, not the
|
|
* LayoutCanvas to emphasize that the LayoutCanvas object shall not
|
|
* be modified.
|
|
*/
|
|
lay::ViewObjectWidget *view_object_widget ()
|
|
{
|
|
return mp_canvas;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the current viewport
|
|
*/
|
|
const lay::Viewport &viewport () const
|
|
{
|
|
return mp_canvas->viewport ();
|
|
}
|
|
|
|
/**
|
|
* @brief Background color property
|
|
*/
|
|
QColor background_color () const
|
|
{
|
|
return mp_canvas->background_color ();
|
|
}
|
|
|
|
/**
|
|
* @brief Foreground color property
|
|
*/
|
|
QColor foreground_color () const
|
|
{
|
|
return mp_canvas->foreground_color ();
|
|
}
|
|
|
|
/**
|
|
* @brief Active color property
|
|
*/
|
|
QColor active_color () const
|
|
{
|
|
return mp_canvas->active_color ();
|
|
}
|
|
|
|
/**
|
|
* @brief Write accessor to the "drop small cells" flag
|
|
*/
|
|
void drop_small_cells (bool m);
|
|
|
|
/**
|
|
* @brief Read accessor to the "drop small cells" flag
|
|
*/
|
|
bool drop_small_cells () const
|
|
{
|
|
return m_drop_small_cells;
|
|
}
|
|
|
|
/**
|
|
* @brief Write accessor to the "drop small cells" value
|
|
*/
|
|
void drop_small_cells_value (unsigned int s);
|
|
|
|
/**
|
|
* @brief Read accessor to the "drop small cells" value
|
|
*/
|
|
unsigned int drop_small_cells_value () const
|
|
{
|
|
return m_drop_small_cells_value;
|
|
}
|
|
|
|
/**
|
|
* @brief Write accessor to the "drop small cells" condition
|
|
*/
|
|
void drop_small_cells_cond (drop_small_cells_cond_type t);
|
|
|
|
/**
|
|
* @brief Read accessor to the "drop small cells" condition
|
|
*/
|
|
drop_small_cells_cond_type drop_small_cells_cond () const
|
|
{
|
|
return m_drop_small_cells_cond;
|
|
}
|
|
|
|
/**
|
|
* @brief Gets a value indicating whether guiding shapes are visible
|
|
*/
|
|
bool guiding_shapes_visible () const
|
|
{
|
|
return m_guiding_shape_visible;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets a value indicating whether guiding shapes are visible
|
|
*/
|
|
void guiding_shapes_visible (bool v);
|
|
|
|
/**
|
|
* @brief Gets the guiding shapes color
|
|
*/
|
|
QColor guiding_shapes_color () const
|
|
{
|
|
return m_guiding_shape_color;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the guiding shapes color
|
|
*/
|
|
void guiding_shapes_color (QColor c);
|
|
|
|
/**
|
|
* @brief Gets the guiding shapes line width
|
|
*/
|
|
int guiding_shapes_line_width () const
|
|
{
|
|
return m_guiding_shape_line_width;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the guiding shapes line width
|
|
*/
|
|
void guiding_shapes_line_width (int lw);
|
|
|
|
/**
|
|
* @brief Gets the guiding shapes vertex size
|
|
*/
|
|
int guiding_shapes_vertex_size () const
|
|
{
|
|
return m_guiding_shape_vertex_size;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the guiding shapes vertex size
|
|
*/
|
|
void guiding_shapes_vertex_size (int lw);
|
|
|
|
/**
|
|
* @brief Read accessor to the "abstract mode width" property.
|
|
*
|
|
* The abstract mode width enables abstract mode (for values > 0) and
|
|
* specifies the border to search for touching shapes.
|
|
*/
|
|
double abstract_mode_width () const
|
|
{
|
|
return m_abstract_mode_enabled ? m_abstract_mode_width : 0.0;
|
|
}
|
|
|
|
/**
|
|
* @brief Read accessor to the "child context enabled" property.
|
|
*
|
|
* If child context is enabled, a third set of bit planes must be created by the redraw thread
|
|
* containing the shapes for the below-top-level objects.
|
|
*/
|
|
bool child_context_enabled () const
|
|
{
|
|
return m_child_ctx_enabled;
|
|
}
|
|
|
|
/**
|
|
* @brief Write accessor to the "draw array border instances" flag
|
|
*/
|
|
void draw_array_border_instances (bool m);
|
|
|
|
/**
|
|
* @brief Read accessor to the "draw array border instances" flag
|
|
*/
|
|
bool draw_array_border_instances () const
|
|
{
|
|
return m_draw_array_border_instances;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the Drawings interface
|
|
*
|
|
* Although the Drawings interface is implemented by LayoutCanvas,
|
|
* it is a different interface from ViewObjectWidget.
|
|
*/
|
|
lay::Drawings *drawings ()
|
|
{
|
|
return mp_canvas;
|
|
}
|
|
|
|
/**
|
|
* @brief Select synchronous mode or deselect it
|
|
*/
|
|
void set_synchronous (bool sync_mode);
|
|
|
|
/**
|
|
* @brief Tell the state of synchronous mode
|
|
*/
|
|
bool synchronous () const
|
|
{
|
|
return m_synchronous;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the number of drawing workers (if not synchronous)
|
|
*/
|
|
void set_drawing_workers (int workers);
|
|
|
|
/**
|
|
* @brief Get the number of drawing workers
|
|
*/
|
|
int drawing_workers () const
|
|
{
|
|
return m_drawing_workers;
|
|
}
|
|
|
|
/**
|
|
* @brief Localize a plugin by name
|
|
*
|
|
* This method will return 0, if no such plugin is registered
|
|
*/
|
|
Plugin *get_plugin_by_name (const std::string &name) const;
|
|
|
|
/**
|
|
* @brief Localize the plugin of the given Type
|
|
*
|
|
* This method will return 0, if no such plugin is registered
|
|
*/
|
|
template <class PI>
|
|
PI *get_plugin () const
|
|
{
|
|
PI *pi = 0;
|
|
for (std::vector<lay::Plugin *>::const_iterator p = mp_plugins.begin (); p != mp_plugins.end () && !pi; ++p) {
|
|
pi = dynamic_cast<PI *> (*p);
|
|
}
|
|
return pi;
|
|
}
|
|
|
|
/**
|
|
* @brief Localize the plugins of the given Type
|
|
*
|
|
* This method will return 0, if no such plugin is registered
|
|
*/
|
|
template <class PI>
|
|
std::vector<PI *> get_plugins () const
|
|
{
|
|
std::vector<PI *> pi;
|
|
for (std::vector<lay::Plugin *>::const_iterator p = mp_plugins.begin (); p != mp_plugins.end (); ++p) {
|
|
if (dynamic_cast<PI *> (*p) != 0) {
|
|
pi.push_back (dynamic_cast<PI *> (*p));
|
|
}
|
|
}
|
|
return pi;
|
|
}
|
|
|
|
/**
|
|
* @brief Create a plugin of the given type
|
|
*
|
|
* This method can be used to selectively create plugins when the NoPlugin option
|
|
* is used. If no such plugin is registered, no plugin is created.
|
|
* If a plugin with that name is already registered, it is not created again.
|
|
* PD is the type of the declaration.
|
|
*/
|
|
template <class PD>
|
|
void create_plugin (lay::PluginRoot *root)
|
|
{
|
|
for (std::vector<lay::Plugin *>::const_iterator p = mp_plugins.begin (); p != mp_plugins.end (); ++p) {
|
|
if (dynamic_cast <const PD *> ((*p)->plugin_declaration ()) != 0) {
|
|
return;
|
|
}
|
|
}
|
|
for (tl::Registrar<lay::PluginDeclaration>::iterator cls = tl::Registrar<lay::PluginDeclaration>::begin (); cls != tl::Registrar<lay::PluginDeclaration>::end (); ++cls) {
|
|
if (dynamic_cast <const PD *> (&*cls) != 0) {
|
|
create_plugin (root, &*cls);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief Enable or disable the actions for edit functions
|
|
*
|
|
* This method is used by non-modal dialogs that want to suppress any editing
|
|
* activities (like browsers) while they are open.
|
|
*
|
|
* This method can be called multiple times and will count the enable/disable
|
|
* transitions. Each disable will cancel on enable call.
|
|
*/
|
|
void enable_edits (bool enable);
|
|
|
|
/**
|
|
* @brief Gets a value indicating whether edits are enabled or not
|
|
*
|
|
* "enable_edits" will change this value.
|
|
*/
|
|
bool edits_enabled () const
|
|
{
|
|
return m_disabled_edits <= 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Rename the given cellview to the given name
|
|
*
|
|
* The name of the cell view is shown in the title
|
|
*/
|
|
void rename_cellview (const std::string &name, int cellview_index);
|
|
|
|
/**
|
|
* @brief Descend into the hierarchy along the given specific path for the given cellview
|
|
*/
|
|
void descend (const std::vector<db::InstElement> &path, int cellview_index);
|
|
|
|
/**
|
|
* @brief Ascend one level in the hierarchy for the given cellview
|
|
*
|
|
* @return The instance element removed by ascending the path
|
|
*/
|
|
db::InstElement ascend (int cellview_index);
|
|
|
|
/**
|
|
* @brief Select a cell by path for a certain cell view and fit cell
|
|
*/
|
|
void select_cell_fit (const cell_path_type &path, int cellview_index);
|
|
|
|
/**
|
|
* @brief Select a cell by index for a certain cell view and fit cell
|
|
*/
|
|
void select_cell_fit (cell_index_type index, int cellview_index);
|
|
|
|
/**
|
|
* @brief Select a cell by path for a certain cell view
|
|
*/
|
|
void select_cell (const cell_path_type &path, int cellview_index);
|
|
|
|
/**
|
|
* @brief Select a cell by index for a certain cell view
|
|
*/
|
|
void select_cell (cell_index_type index, int cellview_index);
|
|
|
|
/**
|
|
* @brief Check if a cell is hidden
|
|
*/
|
|
bool is_cell_hidden (cell_index_type ci, int cellview_index) const;
|
|
|
|
/**
|
|
* @brief Get the hidden cells for a certain cellview
|
|
*/
|
|
const std::set<cell_index_type> &hidden_cells (int cellview_index) const;
|
|
|
|
/**
|
|
* @brief Add a cell to the hidden cell list
|
|
*/
|
|
void hide_cell (cell_index_type ci, int cellview_index);
|
|
|
|
/**
|
|
* @brief Remove a cell from the hidden cell list
|
|
*/
|
|
void show_cell (cell_index_type ci, int cellview_index);
|
|
|
|
/**
|
|
* @brief Clears the hidden cell list
|
|
*/
|
|
void show_all_cells ();
|
|
|
|
/**
|
|
* @brief Clears the hidden cell list for the given cellview
|
|
*/
|
|
void show_all_cells (int cv_index);
|
|
|
|
/**
|
|
* @brief Update the layout view to the current state
|
|
*
|
|
* This method must be called in order to trigger the update of
|
|
* the contents. It will be known, what needs to be updated.
|
|
*/
|
|
void update_content ();
|
|
|
|
/**
|
|
* @brief Force an unconditional update
|
|
*
|
|
* This method is supposed to be used to ensure everything is updated.
|
|
* TODO: this method should become obsolete once there is a consistent
|
|
* signalling of states implemented.
|
|
*/
|
|
void force_update_content ();
|
|
|
|
/**
|
|
* @brief Create a set of initial layer properties for the given cellview
|
|
*
|
|
* @param cv_index The cellview for which to produce a set of layer properties
|
|
* @param lyp_file The layer properties file to load or empty if no file should be loaded
|
|
* @param add_missing True, if missing layers should be added (ignored if lyp_file is empty)
|
|
*/
|
|
void create_initial_layer_props (int cv_index, const std::string &lyp_file, bool add_missing);
|
|
|
|
/**
|
|
* @brief Merges the given properties into the cell properties of this view
|
|
*/
|
|
void merge_layer_props (const std::vector<lay::LayerPropertiesList> &props);
|
|
|
|
/**
|
|
* @brief Internal method: check, if the layer tree is and an consistent state.
|
|
*
|
|
* This method is used by the layer tree model to check, if the tree has been brought into
|
|
* a consistent state.
|
|
* HINT: for the layout this is solved more consistently with the "under construction" attribute
|
|
* of the layout. There is no equivalent object for the layer tree currently.
|
|
*/
|
|
bool layer_model_updated ();
|
|
|
|
/**
|
|
* @brief Get the "select inside PCell's" selection mode
|
|
*
|
|
* @return true, objects inside PCell's can be selected
|
|
*/
|
|
bool select_inside_pcells_mode () const
|
|
{
|
|
return m_sel_inside_pcells;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the transient selection mode
|
|
*
|
|
* @return true, if transient (hover) selection mode is enabled
|
|
*/
|
|
bool transient_selection_mode () const
|
|
{
|
|
return m_transient_selection_mode;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the default color for markers
|
|
*/
|
|
QColor default_marker_color () const
|
|
{
|
|
return m_marker_color;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the default line width for markers
|
|
*/
|
|
int default_marker_line_width () const
|
|
{
|
|
return m_marker_line_width;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the default marker dither pattern index
|
|
*/
|
|
int default_dither_pattern () const
|
|
{
|
|
return m_marker_dither_pattern;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the default marker line style index
|
|
*/
|
|
int default_line_style () const
|
|
{
|
|
return m_marker_line_style;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the default vertex size for markers
|
|
*/
|
|
int default_marker_vertex_size () const
|
|
{
|
|
return m_marker_vertex_size;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the default halo flag for markers
|
|
*/
|
|
int default_marker_halo () const
|
|
{
|
|
return m_marker_halo;
|
|
}
|
|
|
|
/**
|
|
* @brief Return true, if any cellview is editable
|
|
*/
|
|
bool is_editable () const;
|
|
|
|
/**
|
|
* @brief Get the view_op's for rendering the layers
|
|
*/
|
|
const std::vector <lay::ViewOp> &get_view_ops () const
|
|
{
|
|
return mp_canvas->get_view_ops ();
|
|
}
|
|
|
|
/**
|
|
* @brief Get the redraw layer info vector
|
|
*/
|
|
const std::vector <lay::RedrawLayerInfo> &get_redraw_layers () const
|
|
{
|
|
return mp_canvas->get_redraw_layers ();
|
|
}
|
|
|
|
/**
|
|
* @brief Add missing layers
|
|
*/
|
|
void add_missing_layers ();
|
|
|
|
/**
|
|
* @brief Add layers which are not part of the LayerState
|
|
*/
|
|
void add_new_layers (const LayerState &snapshot);
|
|
|
|
/**
|
|
* @brief Gets a snapshot of the current layers (can be used for add_missing_layers later)
|
|
*/
|
|
LayerState layer_snapshot () const;
|
|
|
|
/**
|
|
* @brief Remove unused layers
|
|
*/
|
|
void remove_unused_layers ();
|
|
|
|
/**
|
|
* @brief Returns true, if the layer shource shall be shown always in the layer properties tree
|
|
*/
|
|
bool always_show_source () const
|
|
{
|
|
return m_always_show_source;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns true, if the layer/datatype shall be shown always in the layer properties tree
|
|
*/
|
|
bool always_show_ld () const
|
|
{
|
|
return m_always_show_ld;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns true, if the layout index shall be shown always in the layer properties tree
|
|
*/
|
|
bool always_show_layout_index () const
|
|
{
|
|
return m_always_show_layout_index;
|
|
}
|
|
|
|
/**
|
|
* @brief Add a marker database
|
|
*
|
|
* The layout view will become owner of the database.
|
|
*
|
|
* @param rdb The database to add
|
|
* @return The index of the database
|
|
*/
|
|
unsigned int add_rdb (rdb::Database *rdb);
|
|
|
|
/**
|
|
* @brief Get the marker database by index
|
|
*
|
|
* @param index The index of the database
|
|
* @return A pointer to the database or 0 if the index was not valid.
|
|
*/
|
|
rdb::Database *get_rdb (int index);
|
|
|
|
/**
|
|
* @brief Get the marker database by index (const version)
|
|
*
|
|
* @param index The index of the database
|
|
* @return A pointer to the database or 0 if the index was not valid.
|
|
*/
|
|
const rdb::Database *get_rdb (int index) const;
|
|
|
|
/**
|
|
* @brief Open the RDB browser for a given database and associated cv index
|
|
*/
|
|
void open_rdb_browser (int rdb_index, int cv_index);
|
|
|
|
/**
|
|
* @brief Remove the marker database with the given index
|
|
*
|
|
* This will release the marker database at the given index. The list
|
|
* will be reduced by that element. This means, that the following elements
|
|
* will have different indicies.
|
|
*/
|
|
void remove_rdb (unsigned int index);
|
|
|
|
/**
|
|
* @brief Get the number of databases
|
|
*/
|
|
unsigned int num_rdbs () const
|
|
{
|
|
return (unsigned int) m_rdbs.size ();
|
|
}
|
|
|
|
/**
|
|
* @brief An event signalling a change in the marker database list
|
|
*
|
|
* If marker databases are added or removed, this event is triggered.
|
|
*/
|
|
tl::Event rdb_list_changed_event;
|
|
|
|
/**
|
|
* @brief Deliver a size hint (reimplementation of QWidget)
|
|
*/
|
|
QSize sizeHint () const;
|
|
|
|
/**
|
|
* @brief Ensure the given box is visible
|
|
*/
|
|
void ensure_visible (const db::DBox &b);
|
|
|
|
/**
|
|
* @brief Specify the global transformation
|
|
*/
|
|
void set_global_trans (const db::DCplxTrans &b);
|
|
|
|
/**
|
|
* @brief Gets the global transformation
|
|
*/
|
|
const db::DCplxTrans &global_trans () const
|
|
{
|
|
return mp_canvas->global_trans ();
|
|
}
|
|
|
|
/**
|
|
* @brief Zoom the given box into view
|
|
*/
|
|
void zoom_box (const db::DBox &b);
|
|
|
|
/**
|
|
* @brief Specify the transformation explicitly
|
|
*/
|
|
void zoom_trans (const db::DCplxTrans &b);
|
|
|
|
/**
|
|
* @brief Move the viewport such that the given point is at the center of the viewport
|
|
*/
|
|
void pan_center (const db::DPoint &p);
|
|
|
|
/**
|
|
* @brief Goto a position/cell view that was saved with save_view
|
|
*/
|
|
void goto_view (const DisplayState &state);
|
|
|
|
/**
|
|
* @brief Save a position/cell view that can be used for "goto_view"
|
|
*/
|
|
void save_view (DisplayState &state) const;
|
|
|
|
// access to the basic services
|
|
lay::MouseTracker *mouse_tracker () const { return mp_tracker; }
|
|
lay::ZoomService *zoom_service () const { return mp_zoom_service; }
|
|
lay::SelectionService *selection_service () const { return mp_selection_service; }
|
|
lay::MoveService *move_service () const { return mp_move_service; }
|
|
|
|
/**
|
|
* @brief Create all plugins
|
|
*
|
|
* If plugins already exist, they are deleted and created again
|
|
*/
|
|
void create_plugins (lay::PluginRoot *root, const lay::PluginDeclaration *except_this = 0);
|
|
|
|
public slots:
|
|
/**
|
|
* @brief Store the current state on the "last states" stack
|
|
*/
|
|
void store_state ();
|
|
|
|
/**
|
|
* @brief Cancel all edit operations and clear the selection
|
|
*/
|
|
void cancel ();
|
|
|
|
/**
|
|
* @brief Cancel all edit operations but leave selection
|
|
*/
|
|
void cancel_edits ();
|
|
|
|
/**
|
|
* @brief Select all levels of hierarchy available
|
|
*/
|
|
void max_hier ();
|
|
|
|
/**
|
|
* @brief Stop activities like shape browser and redrawing thread
|
|
*/
|
|
void stop ();
|
|
|
|
/**
|
|
* @brief Stop redrawing thread
|
|
*/
|
|
void stop_redraw ();
|
|
|
|
/**
|
|
* @brief Select last display state
|
|
*/
|
|
void last_display_state ();
|
|
|
|
/**
|
|
* @brief Select next display state
|
|
*/
|
|
void next_display_state ();
|
|
|
|
/**
|
|
* @brief Ensure the selection is visible
|
|
*/
|
|
void ensure_selection_visible ();
|
|
|
|
/**
|
|
* @brief Select a cell by index for a certain cell view
|
|
*
|
|
* This will be forwarded to select_cell or select_cell_fit depending
|
|
* on the m_fit_new_cell flag.
|
|
*/
|
|
void select_cell_dispatch (const cell_path_type &path, int cellview_index);
|
|
|
|
/**
|
|
* @brief The active cellview has changed
|
|
*
|
|
* This signal is forwarded to the active_cellview_changed event
|
|
*/
|
|
void active_cellview_changed (int index)
|
|
{
|
|
active_cellview_changed_event ();
|
|
active_cellview_changed_with_index_event (index);
|
|
}
|
|
|
|
/**
|
|
* @brief Gets the full field box
|
|
*
|
|
* This is the box to which the view will zoom on zoom_fit().
|
|
* This box is supposed to cover everything inside the view.
|
|
*/
|
|
db::DBox full_box () const;
|
|
|
|
// zoom slots
|
|
void zoom_fit ();
|
|
void zoom_fit_sel ();
|
|
void zoom_in ();
|
|
void zoom_out ();
|
|
void pan_left ();
|
|
void pan_up ();
|
|
void pan_right ();
|
|
void pan_down ();
|
|
|
|
// menu callbacks
|
|
void cm_new_layer ();
|
|
void cm_clear_layer ();
|
|
void cm_delete_layer ();
|
|
void cm_copy_layer ();
|
|
void cm_align_cell_origin ();
|
|
void cm_edit_layer ();
|
|
void cm_lay_convert_to_static ();
|
|
void cm_lay_flip_x ();
|
|
void cm_lay_flip_y ();
|
|
void cm_lay_rot_cw ();
|
|
void cm_lay_rot_ccw ();
|
|
void cm_lay_free_rot ();
|
|
void cm_lay_scale ();
|
|
void cm_lay_move ();
|
|
void cm_sel_flip_x ();
|
|
void cm_sel_flip_y ();
|
|
void cm_sel_rot_cw ();
|
|
void cm_sel_rot_ccw ();
|
|
void cm_sel_free_rot ();
|
|
void cm_sel_scale ();
|
|
void cm_sel_move ();
|
|
void cm_sel_move_to ();
|
|
|
|
// forwarded to the layer control panel
|
|
void cm_new_tab ();
|
|
void cm_rename_tab ();
|
|
void cm_remove_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 cm_layer_copy ();
|
|
void cm_layer_cut ();
|
|
void cm_layer_paste ();
|
|
|
|
// forwarded to the cell control panel
|
|
void cm_cell_user_properties ();
|
|
void cm_cell_flatten ();
|
|
void cm_cell_rename ();
|
|
void cm_cell_replace ();
|
|
void cm_cell_delete ();
|
|
void cm_cell_select ();
|
|
void cm_open_current_cell ();
|
|
void cm_cell_hide ();
|
|
void cm_cell_show ();
|
|
void cm_cell_show_all ();
|
|
void cm_cell_copy ();
|
|
void cm_cell_cut ();
|
|
void cm_cell_paste ();
|
|
void cm_cell_convert_to_static ();
|
|
|
|
// called by children and owner
|
|
void redraw ();
|
|
void redraw_layer (unsigned int index);
|
|
void redraw_deco_layer ();
|
|
void redraw_cell_boxes ();
|
|
void layer_tab_changed ();
|
|
void layer_order_changed ();
|
|
void timer ();
|
|
void menu_activated (const std::string &symbol);
|
|
void deactivate_all_browsers ();
|
|
void min_hier_changed (int i);
|
|
void max_hier_changed (int i);
|
|
|
|
// event handlers used to connect to the layout object's events
|
|
void signal_hier_changed ();
|
|
void signal_bboxes_from_layer_changed (unsigned int cv_index, unsigned int layer_index);
|
|
void signal_bboxes_changed ();
|
|
void signal_prop_ids_changed ();
|
|
void signal_layer_properties_changed ();
|
|
void signal_cell_name_changed ();
|
|
void signal_annotations_changed ();
|
|
void signal_plugin_enabled_changed ();
|
|
void signal_apply_technology (lay::LayoutHandle *layout_handle);
|
|
|
|
signals:
|
|
/**
|
|
* @brief This signal is emitted when the title changes
|
|
*/
|
|
void title_changed ();
|
|
|
|
/**
|
|
* @brief This signal is emitted when the view wants to show a message for the given time (of infinitely for ms == 0)
|
|
*/
|
|
void show_message (const std::string &s, int ms);
|
|
|
|
/**
|
|
* @brief This signal is emitted when the view wants to indicate a mouse position change
|
|
*/
|
|
void current_pos_changed (double x, double y, bool dbu_units);
|
|
|
|
/**
|
|
* @brief This signal is emitted when the view wants to clear the mouse position
|
|
*/
|
|
void clear_current_pos ();
|
|
|
|
/**
|
|
* @brief This signal is sent when the "edits_enabled" state has changed
|
|
*/
|
|
void edits_enabled_changed ();
|
|
|
|
protected:
|
|
/**
|
|
* @brief Establish the view operations
|
|
*/
|
|
void set_view_ops ();
|
|
|
|
/**
|
|
* @brief Deactivate the view
|
|
*
|
|
* A view gets "deactivated" if it is no longer the current one.
|
|
* This is the opposite operation than activation.
|
|
*/
|
|
void deactivate ();
|
|
|
|
/**
|
|
* @brief Activate the view
|
|
*
|
|
* This method gets called when the view becomes the current one.
|
|
*/
|
|
void activate ();
|
|
|
|
private:
|
|
bool m_editable;
|
|
int m_disabled_edits;
|
|
unsigned int m_options;
|
|
QTimer *mp_timer;
|
|
lay::LayoutCanvas *mp_canvas;
|
|
QFrame *mp_left_frame;
|
|
lay::LayerControlPanel *mp_control_panel;
|
|
lay::HierarchyControlPanel *mp_hierarchy_panel;
|
|
QWidget *mp_control_frame, *mp_hierarchy_frame;
|
|
QSpinBox *mp_min_hier_spbx;
|
|
QSpinBox *mp_max_hier_spbx;
|
|
std::list <CellView> m_cellviews;
|
|
lay::AnnotationShapes m_annotation_shapes;
|
|
std::vector <std::set <cell_index_type> > m_hidden_cells;
|
|
std::string m_title;
|
|
tl::vector <rdb::Database *> m_rdbs;
|
|
std::string m_def_lyp_file;
|
|
bool m_add_other_layers;
|
|
bool m_always_show_source;
|
|
bool m_always_show_ld;
|
|
bool m_always_show_layout_index;
|
|
bool m_synchronous;
|
|
int m_drawing_workers;
|
|
|
|
int m_from_level, m_to_level;
|
|
double m_pan_distance;
|
|
int m_paste_display_mode;
|
|
int m_wheel_mode;
|
|
bool m_guiding_shape_visible;
|
|
QColor m_guiding_shape_color;
|
|
int m_guiding_shape_line_width;
|
|
int m_guiding_shape_vertex_size;
|
|
|
|
QColor m_ctx_color;
|
|
int m_ctx_dimming;
|
|
bool m_ctx_hollow;
|
|
|
|
QColor m_child_ctx_color;
|
|
int m_child_ctx_dimming;
|
|
bool m_child_ctx_hollow;
|
|
bool m_child_ctx_enabled;
|
|
|
|
double m_abstract_mode_width;
|
|
bool m_abstract_mode_enabled;
|
|
|
|
QColor m_box_color;
|
|
bool m_box_text_transform;
|
|
unsigned int m_box_font;
|
|
int m_min_size_for_label;
|
|
bool m_cell_box_visible;
|
|
|
|
QColor m_marker_color;
|
|
int m_marker_line_width;
|
|
int m_marker_vertex_size;
|
|
int m_marker_dither_pattern;
|
|
int m_marker_line_style;
|
|
bool m_marker_halo;
|
|
|
|
bool m_transient_selection_mode;
|
|
bool m_sel_inside_pcells;
|
|
|
|
int m_default_font_size;
|
|
bool m_text_visible;
|
|
bool m_text_lazy_rendering;
|
|
bool m_bitmap_caching;
|
|
bool m_show_properties;
|
|
QColor m_text_color;
|
|
bool m_apply_text_trans;
|
|
double m_default_text_size;
|
|
unsigned int m_text_font;
|
|
bool m_no_stipples;
|
|
bool m_stipple_offset;
|
|
|
|
bool m_drop_small_cells;
|
|
unsigned int m_drop_small_cells_value;
|
|
drop_small_cells_cond_type m_drop_small_cells_cond;
|
|
|
|
bool m_draw_array_border_instances;
|
|
|
|
bool m_fit_new_cell;
|
|
bool m_full_hier_new_cell;
|
|
bool m_clear_ruler_new_cell;
|
|
bool m_dbu_coordinates;
|
|
bool m_absolute_coordinates;
|
|
|
|
bool m_activated;
|
|
bool m_animated;
|
|
unsigned int m_phase;
|
|
|
|
lay::ColorPalette m_palette;
|
|
lay::StipplePalette m_stipple_palette;
|
|
lay::LineStylePalette m_line_style_palette;
|
|
|
|
std::vector <DisplayState> m_display_states;
|
|
unsigned int m_display_state_ptr;
|
|
|
|
std::vector<lay::LayerPropertiesList *> m_layer_properties_lists;
|
|
unsigned int m_current_layer_list;
|
|
|
|
BookmarkList m_bookmarks;
|
|
|
|
// service and editable management
|
|
int m_mode;
|
|
|
|
// services & editables
|
|
lay::MouseTracker *mp_tracker;
|
|
lay::ZoomService *mp_zoom_service;
|
|
lay::SelectionService *mp_selection_service;
|
|
lay::MoveService *mp_move_service;
|
|
|
|
std::vector<lay::Plugin *> mp_plugins;
|
|
|
|
db::LayerProperties m_new_layer_props;
|
|
db::DVector m_move_dist;
|
|
int m_move_to_origin_mode_x, m_move_to_origin_mode_y;
|
|
int m_align_cell_origin_mode_x, m_align_cell_origin_mode_y;
|
|
bool m_align_cell_origin_visible_layers;
|
|
bool m_align_cell_adjust_parents;
|
|
int m_del_cell_mode;
|
|
int m_layer_hier_mode;
|
|
int m_duplicate_hier_mode;
|
|
bool m_clear_before;
|
|
int m_copy_cva, m_copy_cvr;
|
|
int m_copy_layera, m_copy_layerr;
|
|
|
|
bool m_visibility_changed;
|
|
tl::DeferredMethod<lay::LayoutView> dm_prop_changed;
|
|
|
|
void init (db::Manager *mgr, lay::PluginRoot *root, QWidget *parent);
|
|
|
|
void do_prop_changed ();
|
|
void do_redraw (int layer);
|
|
void do_redraw ();
|
|
void do_transform (const db::DCplxTrans &tr);
|
|
void transform_layout (const db::DCplxTrans &tr);
|
|
|
|
void background_color (QColor c);
|
|
void ctx_color (QColor c);
|
|
void ctx_dimming (int percent);
|
|
void ctx_hollow (bool h);
|
|
void child_ctx_color (QColor c);
|
|
void child_ctx_dimming (int percent);
|
|
void child_ctx_hollow (bool h);
|
|
void child_ctx_enabled (bool e);
|
|
void abstract_mode_width (double w);
|
|
void abstract_mode_enabled (bool e);
|
|
bool has_max_hier () const;
|
|
int max_hier_level () const;
|
|
|
|
void update_event_handlers ();
|
|
void viewport_changed ();
|
|
|
|
bool configure (const std::string &name, const std::string &value);
|
|
|
|
void do_load_layer_props (const std::string &fn, bool map_cv, int cv_index, bool add_default);
|
|
void finish_cellviews_changed ();
|
|
void init_layer_properties (LayerProperties &props, const LayerPropertiesList &lp_list) const;
|
|
void merge_dither_pattern (lay::LayerPropertiesList &props);
|
|
|
|
// overrides Editables method to display a message
|
|
void signal_selection_changed ();
|
|
|
|
bool eventFilter(QObject *obj, QEvent *ev);
|
|
void showEvent (QShowEvent *);
|
|
void hideEvent (QHideEvent *);
|
|
|
|
lay::Plugin *create_plugin (lay::PluginRoot *root, const lay::PluginDeclaration *cls);
|
|
|
|
std::list<lay::CellView>::iterator cellview_iter (int cv_index);
|
|
std::list<lay::CellView>::const_iterator cellview_iter (int cv_index) const;
|
|
};
|
|
|
|
}
|
|
|
|
namespace tl {
|
|
template <> struct type_traits<lay::LayoutView> : public type_traits<void> {
|
|
typedef tl::false_tag has_copy_constructor;
|
|
typedef tl::false_tag has_default_constructor;
|
|
};
|
|
}
|
|
|
|
#endif
|
|
|