Added wxRichToolTip class.

It can be used to show more customizable tooltips than the native wxToolTip
but at the price of using generic implementation in some cases (actually
almost always now, with the exceptions of text control tooltips under MSW).

Extra features include:
 - The balloon-like tooltip form.
 - Possibility to show an icon.
 - Title display in a different form.

More customization could be added later. It should be also possible to fully
implement this class natively under MSW.

Update the dialogs sample to show the rich tooltips in action.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69463 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-10-18 21:57:02 +00:00
parent 46ea442ca2
commit e520c3f75c
44 changed files with 2704 additions and 17 deletions

View File

@@ -257,6 +257,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(DIALOGS_NOTIFY_HIDE, MyFrame::OnNotifMsgHide)
#endif // wxUSE_NOTIFICATION_MESSAGE
#if wxUSE_RICHTOOLTIP
EVT_MENU(DIALOGS_RICHTIP_DIALOG, MyFrame::OnRichTipDialog)
#endif // wxUSE_RICHTOOLTIP
EVT_MENU(wxID_EXIT, MyFrame::OnExit)
END_EVENT_TABLE()
@@ -527,6 +531,11 @@ bool MyApp::OnInit()
#endif // wxUSE_NOTIFICATION_MESSAGE
menuDlg->AppendSubMenu(menuNotif, "&User notifications");
#if wxUSE_RICHTOOLTIP
menuDlg->Append(DIALOGS_RICHTIP_DIALOG, "Rich &tooltip dialog...\tCtrl-H");
menuDlg->AppendSeparator();
#endif // wxUSE_RICHTOOLTIP
menuDlg->Append(DIALOGS_STANDARD_BUTTON_SIZER_DIALOG, wxT("&Standard Buttons Sizer Dialog"));
menuDlg->Append(DIALOGS_TEST_DEFAULT_ACTION, wxT("&Test dialog default action"));
@@ -1777,6 +1786,219 @@ void MyFrame::OnNotifMsgHide(wxCommandEvent& WXUNUSED(event))
#endif // wxUSE_NOTIFICATION_MESSAGE
#if wxUSE_RICHTOOLTIP
#include "wx/richtooltip.h"
#include "tip.xpm"
class RichTipDialog : public wxDialog
{
public:
RichTipDialog(wxWindow* parent)
: wxDialog(parent, wxID_ANY, "wxRichToolTip Test",
wxDefaultPosition, wxDefaultSize,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
// Create the controls.
m_textTitle = new wxTextCtrl(this, wxID_ANY, "Tooltip title");
m_textBody = new wxTextCtrl(this, wxID_ANY, "Main tooltip text\n"
"possibly on several\n"
"lines.",
wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE);
wxButton* btnShowText = new wxButton(this, wxID_ANY, "Show for &text");
wxButton* btnShowBtn = new wxButton(this, wxID_ANY, "Show for &button");
const wxString icons[] =
{
"&None",
"&Information",
"&Warning",
"&Error",
"&Custom"
};
wxCOMPILE_TIME_ASSERT( WXSIZEOF(icons) == Icon_Max, IconMismatch );
m_icons = new wxRadioBox(this, wxID_ANY, "&Icon choice:",
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(icons), icons,
1, wxRA_SPECIFY_ROWS);
m_icons->SetSelection(Icon_Info);
const wxString tipKinds[] =
{
"&None", "Top left", "Top", "Top right",
"Bottom left", "Bottom", "Bottom right", "&Auto"
};
m_tipKinds = new wxRadioBox(this, wxID_ANY, "Tip &kind:",
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(tipKinds), tipKinds,
4, wxRA_SPECIFY_COLS);
m_tipKinds->SetSelection(wxTipKind_Auto);
const wxString bgStyles[] =
{
"&Default", "&Solid", "&Gradient",
};
wxCOMPILE_TIME_ASSERT( WXSIZEOF(bgStyles) == Bg_Max, BgMismatch );
m_bgStyles = new wxRadioBox(this, wxID_ANY, "Background style:",
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(bgStyles), bgStyles,
1, wxRA_SPECIFY_ROWS);
const wxString timeouts[] = { "&None", "&Default", "&3 seconds" };
wxCOMPILE_TIME_ASSERT( WXSIZEOF(timeouts) == Timeout_Max, TmMismatch );
m_timeouts = new wxRadioBox(this, wxID_ANY, "Timeout:",
wxDefaultPosition, wxDefaultSize,
WXSIZEOF(timeouts), timeouts,
1, wxRA_SPECIFY_ROWS);
m_timeouts->SetSelection(Timeout_Default);
// Lay them out.
m_textBody->SetMinSize(wxSize(300, 200));
wxBoxSizer* const sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(m_textTitle, wxSizerFlags().Expand().Border());
sizer->Add(m_textBody, wxSizerFlags(1).Expand().Border());
sizer->Add(m_icons, wxSizerFlags().Expand().Border());
sizer->Add(m_tipKinds, wxSizerFlags().Centre().Border());
sizer->Add(m_bgStyles, wxSizerFlags().Centre().Border());
sizer->Add(m_timeouts, wxSizerFlags().Centre().Border());
wxBoxSizer* const sizerBtns = new wxBoxSizer(wxHORIZONTAL);
sizerBtns->Add(btnShowText, wxSizerFlags().Border(wxRIGHT));
sizerBtns->Add(btnShowBtn, wxSizerFlags().Border(wxLEFT));
sizer->Add(sizerBtns, wxSizerFlags().Centre().Border());
sizer->Add(CreateStdDialogButtonSizer(wxOK),
wxSizerFlags().Expand().Border());
SetSizerAndFit(sizer);
// And connect the event handlers.
btnShowText->Connect
(
wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(RichTipDialog::OnShowTipForText),
NULL,
this
);
btnShowBtn->Connect
(
wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(RichTipDialog::OnShowTipForBtn),
NULL,
this
);
}
private:
enum
{
Icon_None,
Icon_Info,
Icon_Warning,
Icon_Error,
Icon_Custom,
Icon_Max
};
enum
{
Bg_Default,
Bg_Solid,
Bg_Gradient,
Bg_Max
};
enum
{
Timeout_None,
Timeout_Default,
Timeout_3sec,
Timeout_Max
};
void OnShowTipForText(wxCommandEvent& WXUNUSED(event))
{
DoShowTip(m_textTitle);
}
void OnShowTipForBtn(wxCommandEvent& WXUNUSED(event))
{
DoShowTip(FindWindow(wxID_OK));
}
void DoShowTip(wxWindow* win)
{
wxRichToolTip tip(m_textTitle->GetValue(), m_textBody->GetValue());
const int iconSel = m_icons->GetSelection();
if ( iconSel == Icon_Custom )
{
tip.SetIcon(tip_xpm);
}
else // Use a standard icon.
{
static const int stdIcons[] =
{
wxICON_NONE,
wxICON_INFORMATION,
wxICON_WARNING,
wxICON_ERROR,
};
tip.SetIcon(stdIcons[iconSel]);
}
switch ( m_bgStyles->GetSelection() )
{
case Bg_Default:
break;
case Bg_Solid:
tip.SetBackgroundColour(*wxLIGHT_GREY);
break;
case Bg_Gradient:
tip.SetBackgroundColour(*wxWHITE, wxColour(0xe4, 0xe5, 0xf0));
break;
}
switch ( m_timeouts->GetSelection() )
{
case Timeout_None:
tip.SetTimeout(0);
break;
case Timeout_Default:
break;
case Timeout_3sec:
tip.SetTimeout(3000);
break;
}
tip.SetTipKind(static_cast<wxTipKind>(m_tipKinds->GetSelection()));
tip.ShowFor(win);
}
wxTextCtrl* m_textTitle;
wxTextCtrl* m_textBody;
wxRadioBox* m_icons;
wxRadioBox* m_tipKinds;
wxRadioBox* m_bgStyles;
wxRadioBox* m_timeouts;
};
void MyFrame::OnRichTipDialog(wxCommandEvent& WXUNUSED(event))
{
RichTipDialog dialog(this);
dialog.ShowModal();
}
#endif // wxUSE_RICHTOOLTIP
void MyFrame::OnStandardButtonsSizerDialog(wxCommandEvent& WXUNUSED(event))
{
StdButtonSizerDialog dialog(this);