summaryrefslogtreecommitdiff
path: root/pcbnew/class_pcb_layer_widget.h
blob: 7908d80e7b20897df8243f8b2b451f2702f2917d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2004-2015 Jean-Pierre Charras, jean-pierre.charras@gpisa-lab.inpg.fr
 * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
 * Copyright (C) 2010-2015 KiCad Developers, see change_log.txt for contributors.
 *
 * 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, you may find one here:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */


/************************************************************/
/* class_pcb_layer_widget.h : header for the layers manager */
/************************************************************/

#ifndef CLASS_PCB_LAYER_WIDGET_H_
#define CLASS_PCB_LAYER_WIDGET_H_

#include <layer_widget.h>

/**
 * Class PCB_LAYER_WIDGET
 * is here to implement the abstract functions of LAYER_WIDGET so they
 * may be tied into the PCB_EDIT_FRAME's data and so we can add a popup
 * menu which is specific to PCBNEW's needs.
 */
class PCB_LAYER_WIDGET : public LAYER_WIDGET
{
public:

    /**
     * Constructor
     * @param aParent is the parent window
     * @param aFocusOwner is the window that should be sent the focus after
     * @param aPointSize is the font point size to use within the widget.  This
     *  effectively sets the overall size of the widget via the row height and bitmap
     *  button sizes.
     * @param aFpEditorMode false for the board editor (default), true for fp editor
     *  when true, some options or layers which cannot be used in editor mode are not
     * displayed
     */
    PCB_LAYER_WIDGET( PCB_BASE_FRAME* aParent, wxWindow* aFocusOwner,
                      int aPointSize = 10, bool aFpEditorMode = false );

    void ReFill();

    /**
     * Function ReFillRender
     * rebuilds Render for instance after the config is read
     */
    void ReFillRender();

    /**
     * Function SyncRenderStates
     * updates the checkboxes (checked or not) to be consistent with the current state
     * of the visibility of the visible rendering elements.
     */
    void SyncRenderStates();

    /**
     * Function SyncLayerVisibilities
     * updates each "Layer" checkbox in this layer widget according
     * to each layer's current visibility determined by IsLayerVisible(), and is
     * helpful immediately after loading a BOARD which may have state information in it.
     */
    void SyncLayerVisibilities();

    /**
     * Function SetLayersManagerTabsText
     * Update the layer manager tabs labels
     * Useful when changing Language or to set labels to a non default value
     */
    void SetLayersManagerTabsText();

    //-----<implement LAYER_WIDGET abstract callback functions>-----------
    void OnLayerColorChange( int aLayer, EDA_COLOR_T aColor );
    bool OnLayerSelect( int aLayer );
    void OnLayerVisible( int aLayer, bool isVisible, bool isFinal );
    void OnRenderColorChange( int aId, EDA_COLOR_T aColor );
    void OnRenderEnable( int aId, bool isEnabled );
    //-----</implement LAYER_WIDGET abstract callback functions>----------

    /**
     * Function OnLayerSelected
     * ensure the active layer is visible, and other layers not visible
     * when m_alwaysShowActiveLayer is true
     * Otherwise do nothing.
     * @return true m_alwaysShowActiveLayer is true and the canvas is refreshed,
     * and false if do nothing
     */
    bool OnLayerSelected();     // postprocess after an active layer selection
                                // ensure active layer visible if
                                // m_alwaysShowActiveCopperLayer is true;


protected:

    static const LAYER_WIDGET::ROW  s_render_rows[];
    bool m_alwaysShowActiveCopperLayer;         // If true: Only shows the current active layer
                                                // even if it is changed
    bool m_fp_editor_mode;

    PCB_BASE_FRAME* myframe;

    // popup menu ids.
#define ID_SHOW_ALL_COPPERS                     wxID_HIGHEST
#define ID_SHOW_NO_COPPERS                      (wxID_HIGHEST+1)
#define ID_SHOW_NO_COPPERS_BUT_ACTIVE           (wxID_HIGHEST+2)
#define ID_ALWAYS_SHOW_NO_COPPERS_BUT_ACTIVE    (wxID_HIGHEST+3)

    /**
     * Function isAllowedInFpMode
     * @return true if item aId has meaning in footprint editor mode.
     * and therefore is shown in render panel
     */
    bool isAllowedInFpMode( int aId );

    /**
     * Function isLayerAllowedInFpMode
     *
     * User layers, which are not paired, are not shown in layers manager.  However a not
     * listed layer can be reachable in the graphic item properties dialog.
     *
     * @param aLayer is the layer id to test
     * @return true if LAYER_ID aLayer has meaning in footprint editor mode.
     * and therefore is shown in render panel
     */
    bool isLayerAllowedInFpMode( LAYER_ID aLayer );

    /**
     * Function OnRightDownLayers
     * puts up a popup menu for the layer panel.
     */
    void onRightDownLayers( wxMouseEvent& event );

    void onPopupSelection( wxCommandEvent& event );

    /// this is for the popup menu, the right click handler has to be installed
    /// on every child control within the layer panel.
    void installRightLayerClickHandler();
};

#endif  // CLASS_PCB_LAYER_WIDGET_H_