Allow customizing wxBusyInfo appearance.

Allow customizing wxBusyInfo window by passing wxBusyInfoFlags containing
information about the icon, title, colours and frame transparency to use.

Update the sample to show such "rich" busy info.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78063 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-10-24 21:54:38 +00:00
parent 693f41781b
commit 434c95e1a1
7 changed files with 310 additions and 44 deletions

View File

@@ -16,57 +16,106 @@
// for all others, include the necessary headers
#ifndef WX_PRECOMP
#include "wx/frame.h"
#include "wx/m_InfoFrame.h"
#include "wx/stattext.h"
#include "wx/panel.h"
#include "wx/sizer.h"
#include "wx/statbmp.h"
#include "wx/utils.h"
#endif
#include "wx/busyinfo.h"
#include "wx/generic/stattextg.h"
class WXDLLEXPORT wxInfoFrame : public wxFrame
{
public:
wxInfoFrame(wxWindow *parent, const wxString& message);
// wxStaticText currently supports markup only in wxGTK and wxOSX/Cocoa, so use
// the generic version for markup support in the other ports.
#if wxUSE_MARKUP && !(defined(__WXGTK__) || defined(__WXOSX_COCOA__))
#include "wx/generic/stattextg.h"
private:
wxDECLARE_NO_COPY_CLASS(wxInfoFrame);
};
wxInfoFrame::wxInfoFrame(wxWindow *parent, const wxString& message)
: wxFrame(parent, wxID_ANY, wxString(),
wxDefaultPosition, wxDefaultSize,
wxSIMPLE_BORDER | wxFRAME_TOOL_WINDOW | wxSTAY_ON_TOP)
{
wxPanel *panel = new wxPanel( this );
#ifdef __WXGTK__
wxGenericStaticText *text = new wxGenericStaticText(panel, wxID_ANY, message);
#define wxStaticTextWithMarkupSupport wxGenericStaticText
#else
wxStaticText *text = new wxStaticText(panel, wxID_ANY, message);
#define wxStaticTextWithMarkupSupport wxStaticText
#endif
panel->SetCursor(*wxHOURGLASS_CURSOR);
text->SetCursor(*wxHOURGLASS_CURSOR);
// make the frame of at least the standard size (400*80) but big enough
// for the text we show
wxSize size = text->GetBestSize();
size.IncBy(ConvertDialogToPixels(wxPoint(10, 10)));
size.IncTo(wxSize(400, 80));
SetClientSize(size);
// need to size the panel correctly first so that text->Centre() works
panel->SetSize(GetClientSize());
text->Centre(wxBOTH);
Centre(wxBOTH);
}
wxBusyInfo::wxBusyInfo(const wxString& message, wxWindow *parent)
void wxBusyInfo::Init(const wxBusyInfoFlags& flags)
{
m_InfoFrame = new wxInfoFrame(parent, message);
m_InfoFrame = new wxFrame(flags.m_parent, wxID_ANY, wxString(),
wxDefaultPosition, wxDefaultSize,
wxSIMPLE_BORDER |
wxFRAME_TOOL_WINDOW |
wxSTAY_ON_TOP);
wxPanel* const panel = new wxPanel(m_InfoFrame);
wxBoxSizer* const sizer = new wxBoxSizer(wxVERTICAL);
const wxSizerFlags sizerFlags = wxSizerFlags().DoubleBorder().Centre();
if ( flags.m_icon.IsOk() )
{
sizer->Add(new wxStaticBitmap(panel, wxID_ANY, flags.m_icon), sizerFlags);
}
wxControl* title;
if ( !flags.m_title.empty() )
{
title = new wxStaticTextWithMarkupSupport(panel, wxID_ANY, wxString());
title->SetFont(title->GetFont().Scaled(2));
title->SetLabelMarkup(flags.m_title);
sizer->Add(title, sizerFlags);
}
else
{
title = NULL;
}
// Vertically center the text in the window.
sizer->AddStretchSpacer();
wxControl* text;
#if wxUSE_MARKUP
if ( !flags.m_text.empty() )
{
text = new wxStaticTextWithMarkupSupport(panel, wxID_ANY, wxString());
text->SetLabelMarkup(flags.m_text);
}
else
#endif // wxUSE_MARKUP
{
text = new wxStaticText(panel, wxID_ANY, wxString());
text->SetLabelText(flags.m_label);
}
sizer->Add(text, sizerFlags);
sizer->AddStretchSpacer();
panel->SetSizer(sizer);
if ( flags.m_foreground.IsOk() )
{
if ( title )
title->SetForegroundColour(flags.m_foreground);
text->SetForegroundColour(flags.m_foreground);
}
if ( flags.m_background.IsOk() )
panel->SetBackgroundColour(flags.m_background);
if ( flags.m_alpha != wxALPHA_OPAQUE )
m_InfoFrame->SetTransparent(flags.m_alpha);
m_InfoFrame->SetCursor(*wxHOURGLASS_CURSOR);
// We need to accommodate our contents, but also impose some minimal size
// to make the busy info frame more noticeable.
wxSize size = panel->GetBestSize();
size.IncTo(wxSize(400, 80));
m_InfoFrame->SetClientSize(size);
m_InfoFrame->Layout();
m_InfoFrame->Centre(wxBOTH);
m_InfoFrame->Show(true);
m_InfoFrame->Refresh();
m_InfoFrame->Update();