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:
@@ -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();
|
||||
|
Reference in New Issue
Block a user