KiCad PCB EDA Suite
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 (C) 2020 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>
25 #include <widgets/number_badge.h>
26 
27 #include <algorithm>
28 
29 
30 NUMBER_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 {
38  computeSize();
39  Bind( wxEVT_PAINT, &NUMBER_BADGE::onPaint, this );
40 }
41 
42 
43 void 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  {
57  m_badgeColour = KIGFX::COLOR4D( GREEN ).ToColour();
58  m_textColour = *wxWHITE;
59  }
60  else
61  {
62  m_showBadge = false;
63  }
64  }
65  else
66  {
67  switch( aSeverity )
68  {
69  case RPT_SEVERITY_ERROR:
70  m_badgeColour = *wxRED;
71  m_textColour = *wxWHITE;
72  break;
73 
75  m_badgeColour = *wxYELLOW;
76  m_textColour = *wxBLACK;
77  break;
78 
80  m_badgeColour = KIGFX::COLOR4D( GREEN ).ToColour();
81  m_textColour = *wxWHITE;
82  break;
83 
85  case RPT_SEVERITY_INFO:
86  default:
87  m_badgeColour = *wxLIGHT_GREY;
88  m_textColour = *wxBLACK;
89  break;
90  }
91  }
92 
93  // Force the badge UI to refresh so the new number and color is displayed
94  Refresh();
95 }
96 
97 
99 {
100  m_maxNumber = aMax;
101  computeSize();
102 }
103 
104 
105 void NUMBER_BADGE::SetTextSize( int aSize )
106 {
107  m_textSize = aSize;
108  computeSize();
109 }
110 
111 
112 // OSX has prevalent badges in the application bar at the bottom of the screen so we try to
113 // match those. Other platforms may also need tweaks to spacing, fontweight, etc.
114 #ifdef __WXMAC__
115 #define BADGE_FONTWEIGHT wxFONTWEIGHT_NORMAL
116 #define PLATFORM_FUDGE_X 0.8
117 #define PLATFORM_FUDGE_Y 1.6
118 #endif
119 
120 #ifdef __WXGTK__
121 #define BADGE_FONTWEIGHT wxFONTWEIGHT_BOLD
122 #define PLATFORM_FUDGE_X 1.0
123 #define PLATFORM_FUDGE_Y 1.0
124 #endif
125 
126 #ifdef __WXMSW__
127 #define BADGE_FONTWEIGHT wxFONTWEIGHT_BOLD
128 #define PLATFORM_FUDGE_X 1.0
129 #define PLATFORM_FUDGE_Y 1.0
130 #endif
131 
133 {
134  wxClientDC dc( this );
135 
136  wxString test = wxString::Format( wxT( "%d" ), m_maxNumber );
137  int len = test.length();
138 
139  // Determine the size using the string "-999+" where the - on the front is for spacing from
140  // the start of the rectangle so the number isn't close to the curved edge.
141  test = "-";
142  test.Pad( len, '9' );
143  test += "+";
144 
145  dc.SetFont( wxFont( m_textSize, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, BADGE_FONTWEIGHT ) );
146  wxSize size = dc.GetTextExtent( test );
147 
148  size.y *= PLATFORM_FUDGE_Y;
149  size.x = std::max<int>( size.x * PLATFORM_FUDGE_X, size.y );
150 
151  SetMinSize( size );
152  SetSize( size );
153 }
154 
155 
156 void NUMBER_BADGE::onPaint( wxPaintEvent& aEvt )
157 {
158  // The drawing rectangle
159  wxSize clientSize = GetSize();
160  wxPaintDC dc( this );
161  wxString text;
162  wxBrush brush;
163 
164  // Give the badge a transparent background to show the panel underneath
165  dc.SetBackground( *wxTRANSPARENT_BRUSH );
166  dc.Clear();
167 
168  // We always draw a transparent background, but only draw the badge when it is needed
169  if( !m_showBadge )
170  return;
171 
172  // The rectangle the color is drawn in needs to be shrunk by 1px on each axis because for some
173  // reason it seems to be padded out by 1px and is cutoff otherwise.
174  wxRect rect( wxPoint( 0, 0 ), clientSize - wxSize( 1, 1 ) );
175 
176  brush.SetStyle( wxBRUSHSTYLE_SOLID );
177  brush.SetColour( m_badgeColour );
178  dc.SetBrush( brush );
179  dc.SetPen( wxPen( m_badgeColour, 0 ) );
180  dc.DrawRoundedRectangle( rect, rect.height / 2 );
181 
182  // Cap the number displayed and add the "+" to the end if required
184  text = wxString::Format( wxT( "%d+" ), m_maxNumber );
185  else
186  text = wxString::Format( wxT( "%d" ), m_currentNumber );
187 
188  dc.SetFont( wxFont( m_textSize, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, BADGE_FONTWEIGHT ) );
189  dc.SetTextForeground( m_textColour );
190  dc.DrawLabel( text, wxRect( wxPoint( 0, 0 ), clientSize ), wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL );
191 }
void computeSize()
Helper function to compute the size of the badge.
SEVERITY
Definition: ui_common.h:83
void onPaint(wxPaintEvent &aEvt)
Handler that actually paints the badge and the text.
void UpdateNumber(int aNumber, SEVERITY aSeverity)
Update the number displayed on the badge.
int m_currentNumber
Definition: number_badge.h:89
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
Definition: color4d.h:57
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.
void SetTextSize(int aSize)
Set the text size to use on the badge.
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
wxColour m_textColour
Definition: number_badge.h:92
wxColour m_badgeColour
Definition: number_badge.h:91
bool m_showBadge
Definition: number_badge.h:90
void SetMaximumNumber(int aMax)
Set the maximum number to be shown on the badge.
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:98