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>
43BEGIN_EVENT_TABLE(
WX_INFOBAR, wxInfoBarGeneric )
54 : wxInfoBarGeneric( aParent, aWinid ),
56 m_updateLock( false ),
57 m_showTimer(
nullptr ),
65 SetBackgroundColour( bg );
66 SetForegroundColour( fg );
70 SetShowHideEffects( wxSHOW_EFFECT_ROLL_TO_BOTTOM, wxSHOW_EFFECT_ROLL_TO_TOP );
71 SetEffectDuration( 200 );
74 SetShowHideEffects( wxSHOW_EFFECT_NONE, wxSHOW_EFFECT_NONE );
84 wxSizer* sizer = GetSizer();
85 wxSize iconSize = wxArtProvider::GetSizeHint( wxART_BUTTON );
96 sizer->SetItemMinSize( (
size_t) 0, iconSize.x, sy );
125 wxCommandEvent* evt =
new wxCommandEvent( KIEVT_SHOW_INFOBAR );
127 evt->SetString( aMessage.c_str() );
128 evt->SetInt( aFlags );
130 GetEventHandler()->QueueEvent( evt );
136 wxCommandEvent* evt =
new wxCommandEvent( KIEVT_DISMISS_INFOBAR );
138 GetEventHandler()->QueueEvent( evt );
167 wxInfoBarGeneric::ShowMessage(
m_message, aFlags );
194 if( !IsShownOnScreen() )
203 wxInfoBarGeneric::Dismiss();
219 SetBackgroundColour( bg );
220 SetForegroundColour( fg );
224 wxString tooltip = btn->GetToolTipText();
233 int barWidth = GetSize().GetWidth();
234 wxSizer* sizer = GetSizer();
241 #if wxCHECK_VERSION( 3, 3, 0 )
242 wxSizerItem* outerSizer = sizer->GetItem( (
size_t) 0 );
243 wxSizerItem*
text =
nullptr;
244 if (outerSizer->IsSizer())
246 wxBoxSizer* innerSizer1 =
dynamic_cast<wxBoxSizer*
>( outerSizer->GetSizer() );
247 wxBoxSizer* innerSizer2 =
248 dynamic_cast<wxBoxSizer*
>( innerSizer1->GetItem((
size_t)0)->GetSizer() );
251 text = innerSizer2->GetItem( 1 );
254 wxSizerItem*
text = sizer->GetItem( 1 );
259 if(
auto textCtrl =
dynamic_cast<wxStaticText*
>(
text->GetWindow() ) )
267 int parentWidth = m_parent->GetClientSize().GetWidth();
273 if( barWidth != parentWidth )
274 SetSize( parentWidth, GetSize().GetHeight() );
278 if(
auto textCtrl =
dynamic_cast<wxStaticText*
>(
text->GetWindow() ) )
286 textCtrl->Wrap( -1 );
287 wxString wrapped_text = textCtrl->GetLabel();
288 int height = ( wrapped_text.Freq(
'\n' ) + 1 ) *
text->GetMinSize().GetHeight();
289 int margins =
text->GetMinSize().GetHeight() - 1;
290 SetMinSize( wxSize( GetSize().GetWidth(), height + margins ) );
291 textCtrl->Wrap( -1 );
321 wxButton* button =
new wxButton(
this, aId, aLabel );
329 wxSizer* sizer = GetSizer();
336 aButton->SetWindowVariant( wxWINDOW_VARIANT_SMALL );
339 auto element = sizer->Add( aButton, wxSizerFlags( 0 ).Centre().Border( wxRIGHT ) );
341 element->SetFlag( wxSTRETCH_MASK );
343 if( IsShownOnScreen() )
350 wxSizer* sizer = GetSizer();
352 wxASSERT( aHypertextButton );
354 sizer->Add( aHypertextButton, wxSizerFlags().Centre().Border( wxRIGHT ).Shaped() );
356 if( IsShownOnScreen() )
363 wxBitmapButton* button = wxBitmapButton::NewCloseButton(
this,
ID_CLOSE_INFOBAR );
365 button->SetToolTip( aTooltip );
373 wxSizer* sizer = GetSizer();
375 if( sizer->GetItemCount() == 0 )
379 if( sizer->GetItem( sizer->GetItemCount() - 1 )->IsSpacer() )
382 for(
int i = sizer->GetItemCount() - 1; i >= 0; i-- )
384 wxSizerItem* sItem = sizer->GetItem( i );
387 if( sItem->IsSpacer() )
390 delete sItem->GetWindow();
403 wxSizer* sizer = GetSizer();
408 if( sizer->GetItemCount() == 0 )
411 if( sizer->GetItem( sizer->GetItemCount() - 1 )->IsSpacer() )
414 wxSizerItem* item = sizer->GetItem( sizer->GetItemCount() - 1 );
416 if( item && item->GetWindow() && item->GetWindow()->GetId() ==
ID_CLOSE_INFOBAR )
417 return static_cast<wxBitmapButton*
>( item->GetWindow() );
427 ShowMessage( aEvent.GetString(), aEvent.GetInt() );
454 const wxSize& aSize,
long aStyle,
const wxString& aName )
455 : wxPanel( aParent, aId, aPos, aSize, aStyle, aName )
468 wxASSERT( aInfoBar );
470 aInfoBar->Reparent(
this );
478 wxASSERT( aOtherItem );
480 aOtherItem->Reparent(
this );
490 m_message.reset(
new wxString( aText ) );
514 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 the reporter client is non-empty.
A pure virtual class used to derive REPORTER objects from.
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.
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.