24#include "wx/artprov.h"
25#include <wx/aui/framemanager.h>
26#include <wx/bmpbuttn.h>
28#include <wx/hyperlink.h>
29#include <wx/infobar.h>
31#include <wx/stattext.h>
33#include <wx/dcclient.h>
44BEGIN_EVENT_TABLE(
WX_INFOBAR, wxInfoBarGeneric )
55 : wxInfoBarGeneric( aParent, aWinid ),
66 SetBackgroundColour( bg );
67 SetForegroundColour( fg );
71 SetShowHideEffects( wxSHOW_EFFECT_ROLL_TO_BOTTOM, wxSHOW_EFFECT_ROLL_TO_TOP );
72 SetEffectDuration( 200 );
75 SetShowHideEffects( wxSHOW_EFFECT_NONE, wxSHOW_EFFECT_NONE );
85 wxSizer* sizer = GetSizer();
86 wxSize iconSize = wxArtProvider::GetSizeHint( wxART_BUTTON );
97 sizer->SetItemMinSize( (
size_t) 0, iconSize.x, sy );
126 wxCommandEvent* evt =
new wxCommandEvent( KIEVT_SHOW_INFOBAR );
128 evt->SetString( aMessage.c_str() );
129 evt->SetInt( aFlags );
131 GetEventHandler()->QueueEvent( evt );
137 wxCommandEvent* evt =
new wxCommandEvent( KIEVT_DISMISS_INFOBAR );
139 GetEventHandler()->QueueEvent( evt );
168 wxInfoBarGeneric::ShowMessage(
m_message, aFlags );
195 if( !IsShownOnScreen() )
204 wxInfoBarGeneric::Dismiss();
220 SetBackgroundColour( bg );
221 SetForegroundColour( fg );
225 wxString tooltip = btn->GetToolTipText();
234 int barWidth = GetSize().GetWidth();
235 wxSizer* sizer = GetSizer();
242 #if wxCHECK_VERSION( 3, 3, 0 )
243 wxSizerItem* outerSizer = sizer->GetItem( (
size_t) 0 );
244 wxSizerItem* textSizer =
nullptr;
246 if (outerSizer->IsSizer())
248 wxBoxSizer* innerSizer1 =
dynamic_cast<wxBoxSizer*
>( outerSizer->GetSizer() );
249 wxBoxSizer* innerSizer2 =
250 dynamic_cast<wxBoxSizer*
>( innerSizer1->GetItem((
size_t)0)->GetSizer() );
253 textSizer = innerSizer2->GetItem( 1 );
256 wxSizerItem* textSizer = sizer->GetItem( 1 );
261 if( wxStaticText* textCtrl =
dynamic_cast<wxStaticText*
>( textSizer->GetWindow() ) )
269 int parentWidth = m_parent->GetClientSize().GetWidth();
275 if( barWidth != parentWidth )
276 SetSize( parentWidth, GetSize().GetHeight() );
280 if( wxStaticText* textCtrl =
dynamic_cast<wxStaticText*
>( textSizer->GetWindow() ) )
288 textCtrl->Wrap( -1 );
289 wxString wrapped_text = textCtrl->GetLabel();
290 int line_count = wrapped_text.Freq(
'\n' ) + 1;
292 wxWindowDC dc( textCtrl );
293 dc.GetTextExtent( wxT(
"Xp" ), &txt_h, &txt_v );
295 int height = txt_v * line_count;
296 int margins = txt_v - 1;
297 SetMinSize( wxSize( GetSize().GetWidth(), height + margins ) );
299 textCtrl->Wrap( -1 );
329 wxButton* button =
new wxButton(
this, aId, aLabel );
337 wxSizer* sizer = GetSizer();
344 aButton->SetWindowVariant( wxWINDOW_VARIANT_SMALL );
347 auto element = sizer->Add( aButton, wxSizerFlags( 0 ).Centre().Border( wxRIGHT ) );
349 element->SetFlag( wxSTRETCH_MASK );
351 if( IsShownOnScreen() )
358 wxSizer* sizer = GetSizer();
360 wxASSERT( aHypertextButton );
362 sizer->Add( aHypertextButton, wxSizerFlags().Centre().Border( wxRIGHT ).Shaped() );
364 if( IsShownOnScreen() )
371 wxBitmapButton* button = wxBitmapButton::NewCloseButton(
this,
ID_CLOSE_INFOBAR );
373 button->SetToolTip( aTooltip );
381 wxSizer* sizer = GetSizer();
383 if( sizer->GetItemCount() == 0 )
387 if( sizer->GetItem( sizer->GetItemCount() - 1 )->IsSpacer() )
390 for(
int i = sizer->GetItemCount() - 1; i >= 0; i-- )
392 wxSizerItem* sItem = sizer->GetItem( i );
395 if( sItem->IsSpacer() )
398 delete sItem->GetWindow();
411 wxSizer* sizer = GetSizer();
416 if( sizer->GetItemCount() == 0 )
419 if( sizer->GetItem( sizer->GetItemCount() - 1 )->IsSpacer() )
422 wxSizerItem* item = sizer->GetItem( sizer->GetItemCount() - 1 );
424 if( item && item->GetWindow() && item->GetWindow()->GetId() ==
ID_CLOSE_INFOBAR )
425 return static_cast<wxBitmapButton*
>( item->GetWindow() );
435 ShowMessage( aEvent.GetString(), aEvent.GetInt() );
462 const wxSize& aSize,
long aStyle,
const wxString& aName )
463 : wxPanel( aParent, aId, aPos, aSize, aStyle, aName )
476 wxASSERT( aInfoBar );
478 aInfoBar->Reparent(
this );
486 wxASSERT( aOtherItem );
488 aOtherItem->Reparent(
this );
498 m_message.reset(
new wxString( aText ) );
522 int icon = wxICON_NONE;
Class to handle configuration and automatic determination of the DPI scale to use for canvases.
double GetContentScaleFactor() const override
Get the content scale factor, which may be different from the scale factor on some platforms.
The base frame for deriving all KiCad main window classes.
EDA_INFOBAR_PANEL(wxWindow *aParent, wxWindowID aId=wxID_ANY, const wxPoint &aPos=wxDefaultPosition, const wxSize &aSize=wxSize(-1,-1), long aStyle=wxTAB_TRAVERSAL, const wxString &aName=wxEmptyString)
wxFlexGridSizer * m_mainSizer
void AddInfoBar(WX_INFOBAR *aInfoBar)
Add the given infobar object to the panel.
void AddOtherItem(wxWindow *aOtherItem)
Add the other item to the panel.
void Finalize()
Update the infobar with the reported text.
REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED) override
Report a string with a given severity.
std::unique_ptr< wxString > m_message
bool HasMessage() const override
Returns true if any messages were reported.
A modified version of the wxInfoBar class that allows us to:
void SetShowTime(int aTime)
Set the time period to show the infobar.
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
bool HasCloseButton() const
MESSAGE_TYPE m_type
The type of message being displayed.
void updateAuiLayout(bool aShow)
Update the AUI pane to show or hide this infobar.
std::optional< std::function< void(void)> > m_callback
Optional callback made when closing infobar.
wxString m_message
The original message without wrapping.
int m_showTime
The time to show the infobar. 0 = don't auto hide.
bool m_updateLock
True if this infobar requested the UI update.
void onShowInfoBar(wxCommandEvent &aEvent)
Event handler for showing the infobar using a wxCommandEvent of the type KIEVT_SHOW_INFOBAR.
void onDismissInfoBar(wxCommandEvent &aEvent)
Event handler for dismissing the infobar using a wxCommandEvent of the type KIEVT_DISMISS_INFOBAR.
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
MESSAGE_TYPE
Sets the type of message for special handling if needed.
@ GENERIC
GENERIC Are messages that do not have special handling.
void QueueShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION)
Send the infobar an event telling it to show a message.
WX_INFOBAR(wxWindow *aParent, wxAuiManager *aMgr=nullptr, wxWindowID aWinid=wxID_ANY)
Construct an infobar that can exist inside an AUI managed frame.
void onCloseButton(wxCommandEvent &aEvent)
Event handler for the close button.
wxBitmapButton * GetCloseButton() const
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
void onThemeChange(wxSysColourChangedEvent &aEvent)
Event handler for the color theme change event.
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
wxTimer * m_showTimer
The timer counting the autoclose period.
void onTimer(wxTimerEvent &aEvent)
Event handler for the automatic closing timer.
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
wxAuiManager * m_auiManager
The AUI manager that contains this infobar.
void onSize(wxSizeEvent &aEvent)
void QueueDismiss()
Send the infobar an event telling it to hide itself.
Base window classes and related definitions.
wxDEFINE_EVENT(KIEVT_SHOW_INFOBAR, wxCommandEvent)
@ ID_CLOSE_INFOBAR
ID for the close button on the frame's infobar.