KiCad PCB EDA Suite
Loading...
Searching...
No Matches
number_badge.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KICAD, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <gal/color4d.h>
26
27#include <algorithm>
28#include <kiplatform/ui.h>
29
30NUMBER_BADGE::NUMBER_BADGE( wxWindow* aParent, wxWindowID aId, const wxPoint& aPos,
31 const wxSize& aSize, int aStyles ) :
32 wxPanel( aParent, aId, aPos, aSize, aStyles ),
33 m_textSize( 10 ),
34 m_maxNumber( 1000 ),
35 m_currentNumber( 0 ),
36 m_showBadge( false )
37{
39 Bind( wxEVT_PAINT, &NUMBER_BADGE::onPaint, this );
40}
41
42
43void NUMBER_BADGE::UpdateNumber( int aNumber, SEVERITY aSeverity )
44{
45 m_showBadge = true;
46 m_currentNumber = aNumber;
47
48 // Choose the colors of the badge rectangle and font
49 if( aNumber < 0 )
50 {
51 m_showBadge = false;
52 }
53 else if( aNumber == 0 )
54 {
55 if( aSeverity == RPT_SEVERITY_ERROR || aSeverity == RPT_SEVERITY_WARNING )
56 {
58 m_textColour = *wxWHITE;
59 }
60 else
61 {
62 m_showBadge = false;
63 }
64 }
65 else
66 {
67 switch( aSeverity )
68 {
70 m_badgeColour = KIPLATFORM::UI::IsDarkTheme() ? wxColour( 240, 64, 64 ) : *wxRED;
71 m_textColour = *wxWHITE;
72 break;
73
75 m_badgeColour = *wxYELLOW;
76 m_textColour = *wxBLACK;
77 break;
78
81 m_textColour = *wxWHITE;
82 break;
83
86 default:
87 m_badgeColour = *wxLIGHT_GREY;
88 m_textColour = *wxBLACK;
89 break;
90 }
91 }
92
94
95 // Force the badge UI to refresh so the new number and color is displayed
96 Refresh();
97}
98
99
101{
102 m_maxNumber = aMax;
103}
104
105
107{
108 m_textSize = aSize;
109 computeSize();
110}
111
112
113// OSX has prevalent badges in the application bar at the bottom of the screen so we try to
114// match those. Other platforms may also need tweaks to spacing, fontweight, etc.
115#if defined( __WXMAC__ )
116#define BADGE_FONTWEIGHT wxFONTWEIGHT_NORMAL
117#define PLATFORM_FUDGE_X 0.92
118#define PLATFORM_FUDGE_Y 1.6
119#else
120#define BADGE_FONTWEIGHT wxFONTWEIGHT_BOLD
121#define PLATFORM_FUDGE_X 1.0
122#define PLATFORM_FUDGE_Y 1.0
123#endif
124
125
127{
128 wxClientDC dc( this );
129
130 wxString test = wxString::Format( wxT( "%d" ), m_currentNumber );
131 int len = test.length();
132
133 // Determine the size using the string "m999{+}" where the 'm' on the front serves as a margin
134 // so the number isn't too close to the curved edge.
135 test = wxS( "m" );
136 test.Pad( len, '9' );
137
139 test += wxS( "+" );
140
141 dc.SetFont( wxFont( m_textSize, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, BADGE_FONTWEIGHT ) );
142 wxSize size = dc.GetTextExtent( test );
143
144 size.y *= PLATFORM_FUDGE_Y;
145 size.x = std::max<int>( size.x * PLATFORM_FUDGE_X, size.y );
146
147 SetMinSize( size );
148 SetSize( size );
149}
150
151
152void NUMBER_BADGE::onPaint( wxPaintEvent& aEvt )
153{
154 // The drawing rectangle
155 wxSize clientSize = GetSize();
156 wxPaintDC dc( this );
157 wxString text;
158 wxBrush brush;
159
160 // Give the badge a transparent background to show the panel underneath
161 dc.SetBackground( *wxTRANSPARENT_BRUSH );
162 dc.Clear();
163
164 // We always draw a transparent background, but only draw the badge when it is needed
165 if( !m_showBadge )
166 return;
167
168 // The rectangle the color is drawn in needs to be shrunk by 1px on each axis because for some
169 // reason it seems to be padded out by 1px and is cutoff otherwise.
170 wxRect rect( wxPoint( 0, 0 ), clientSize - wxSize( 1, 1 ) );
171
172 brush.SetStyle( wxBRUSHSTYLE_SOLID );
173 brush.SetColour( m_badgeColour );
174 dc.SetBrush( brush );
175 dc.SetPen( wxPen( m_badgeColour, 0 ) );
176 dc.DrawRoundedRectangle( rect, rect.height / 2 );
177
178 // Cap the number displayed and add the "+" to the end if required
180 text = wxString::Format( wxT( "%d+" ), m_maxNumber );
181 else
182 text = wxString::Format( wxT( "%d" ), m_currentNumber );
183
184 dc.SetFont( wxFont( m_textSize, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, BADGE_FONTWEIGHT ) );
185 dc.SetTextForeground( m_textColour );
186 dc.DrawLabel( text, wxRect( wxPoint( 0, 0 ), clientSize ),
187 wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL );
188}
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
wxColour ToColour() const
Definition: color4d.cpp:220
void SetMaximumNumber(int aMax)
Set the maximum number to be shown on the badge.
wxColour m_badgeColour
Definition: number_badge.h:94
void UpdateNumber(int aNumber, SEVERITY aSeverity)
Update the number displayed on the badge.
void computeSize()
Helper function to compute the size of the badge.
void SetTextSize(int aSize)
Set the text size to use on the badge.
int m_currentNumber
Definition: number_badge.h:92
wxColour m_textColour
Definition: number_badge.h:95
NUMBER_BADGE(wxWindow *aParent, wxWindowID aId, const wxPoint &aPos, const wxSize &aSize, int aStyles)
Create a number badge with 10pt font and a maximum number of 1000.
bool m_showBadge
Definition: number_badge.h:93
void onPaint(wxPaintEvent &aEvt)
Handler that actually paints the badge and the text.
@ GREEN
Definition: color4d.h:57
bool IsDarkTheme()
Determine if the desktop interface is currently using a dark theme or a light theme.
Definition: wxgtk/ui.cpp:48
#define BADGE_FONTWEIGHT
#define PLATFORM_FUDGE_X
#define PLATFORM_FUDGE_Y
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
SEVERITY
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_EXCLUSION
@ RPT_SEVERITY_INFO
@ RPT_SEVERITY_ACTION