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 #include <kiplatform/ui.h>
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 = 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 
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.
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.
bool IsDarkTheme()
Determine if the desktop interface is currently using a dark theme or a light theme.
Definition: gtk/ui.cpp:31
int m_currentNumber
Definition: number_badge.h:91
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.
SEVERITY
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:94
wxColour m_badgeColour
Definition: number_badge.h:93
bool m_showBadge
Definition: number_badge.h:92
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:103