File: bitmap_button.h

package info (click to toggle)
kicad 9.0.7%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 771,448 kB
  • sloc: cpp: 969,355; ansic: 121,001; xml: 66,428; python: 18,387; sh: 1,010; awk: 301; asm: 292; makefile: 228; javascript: 167; perl: 10
file content (180 lines) | stat: -rw-r--r-- 5,429 bytes parent folder | download | duplicates (4)
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * This program source code file is part of KICAD, a free EDA CAD application.
 *
 * Copyright (C) 2020 Ian McInerney <ian.s.mcinerney at ieee dot org>
 * Copyright The KiCad Developers, see AUTHORS.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
 */

#ifndef BITMAP_BUTTON_H_
#define BITMAP_BUTTON_H_

#include <kicommon.h>
#include <wx/bmpbndl.h>
#include <wx/panel.h>
#include <wx/colour.h>


/**
 * A bitmap button widget that behaves like an AUI toolbar item's button when it is drawn.
 * Specifically:
 *     * It has no border
 *     * It has a rectangle highlight when the mouse is hovering/pressed
 *     * It has the ability to be checked/toggled
 */
class KICOMMON_API BITMAP_BUTTON : public wxPanel
{
public:
    BITMAP_BUTTON( wxWindow* aParent, wxWindowID aId, const wxPoint& aPos = wxDefaultPosition,
                   const wxSize& aSize = wxDefaultSize,
                   int aStyles = wxBORDER_NONE | wxTAB_TRAVERSAL );

    // For use with wxFormBuilder on a sub-classed wxBitmapButton
    BITMAP_BUTTON( wxWindow* aParent, wxWindowID aId, const wxBitmap& aDummyBitmap,
                   const wxPoint& aPos = wxDefaultPosition, const wxSize& aSize = wxDefaultSize,
                   int aStyles = wxBORDER_NONE | wxTAB_TRAVERSAL );

    ~BITMAP_BUTTON();

    /**
     * Set the amount of padding present on each side of the bitmap.
     *
     * @param aPadding is the amount in px of padding for each side.
     */
    void SetPadding( int aPadding );

    /**
     * Set the bitmap shown when the button is enabled.
     *
     * @param aBmp is the enabled bitmap.
     */
    void SetBitmap( const wxBitmapBundle& aBmp );

    /**
     * Set the bitmap shown when the button is disabled.
     *
     * @param aBmp is the disabled bitmap.
     */
    void SetDisabledBitmap( const wxBitmapBundle& aBmp );

    /**
     * Enable the button.
     */
    bool Enable( bool aEnable = true ) override;

    /**
     * Setup the control as a two-state button (checked or unchecked).
     */
    void SetIsCheckButton();

    void SetIsRadioButton();

    /**
     * Check the control. This is the equivalent to toggling a toolbar button.
     */
    void Check( bool aCheck = true );

    bool IsChecked() const;

    /**
     * Render button as a toolbar separator.
     *
     * Also disables the button.  Bitmap, if set, is ignored.
     */
    void SetIsSeparator();

    /**
     * Accept mouse-up as click even if mouse-down happened outside of the control
     *
     * @param aAcceptDragIn is true to allow drag in, false to ignore lone mouse-up events
     */
    void AcceptDragInAsClick( bool aAcceptDragIn = true );

    void SetShowBadge( bool aShowBadge ) { m_showBadge = aShowBadge; }

    void SetBadgeText( const wxString& aText ) { m_badgeText = aText; }

    void SetBadgeColors( const wxColor& aBadgeColor, const wxColor& aBadgeTextColor )
    {
        m_badgeColor = aBadgeColor;
        m_badgeTextColor = aBadgeTextColor;
    }

    void SetBitmapCentered( bool aCentered = true )
    {
        m_centerBitmap = aCentered;
    }

    void SetIsToolbarButton( bool aIsToolbar = true ) { m_isToolbarButton = aIsToolbar; }
    bool IsToolbarButton() const { return m_isToolbarButton; }

protected:
    void setupEvents();

    void OnMouseLeave( wxEvent& aEvent );
    void OnMouseEnter( wxEvent& aEvent );
    void OnKillFocus( wxEvent& aEvent );
    void OnSetFocus( wxEvent& aEvent );
    void OnLeftButtonUp( wxMouseEvent& aEvent );
    void OnLeftButtonDown( wxMouseEvent& aEvent );
    void OnPaint( wxPaintEvent& aEvent );
    void OnDPIChanged( wxDPIChangedEvent& aEvent );

    virtual wxSize DoGetBestSize() const override;

    void setFlag( int aFlag )
    {
        m_buttonState |= aFlag;
    }

    void clearFlag( int aFlag )
    {
        m_buttonState &= ~aFlag;
    }

    bool hasFlag( int aFlag ) const
    {
        return m_buttonState & aFlag;
    }

    void invalidateBestSize();

private:
    wxBitmapBundle m_normalBitmap;
    wxBitmapBundle m_disabledBitmap;

    bool      m_isRadioButton;
    bool      m_showBadge;
    wxString  m_badgeText;
    wxColor   m_badgeColor;
    wxColor   m_badgeTextColor;
    wxFont    m_badgeFont;
    int       m_buttonState;
    int       m_padding;
    wxSize    m_unadjustedMinSize;
    bool      m_isToolbarButton;

    /// Accept mouse-up as click even if mouse-down happened outside of the control.
    bool      m_acceptDraggedInClicks;

    /// Draw bitmap centered in the control.
    bool      m_centerBitmap;
};

#endif /*BITMAP_BUTTON_H_*/