Add wxSpinCtrl::SetBase() to allow entering hexadecimal numbers.
Add a generic SetBase() API even though right now only bases 10 and 16 are supported as we might support other ones (e.g. 8?) in the future. Implement it for MSW, GTK and generic versions. Add controls allowing to test this feature to the widgets sample. Add "base" property support to the XRC handler for wxSpinCtrl, document it and test it in the xrc sample. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72414 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -359,6 +359,78 @@ wxSpinCtrlGTKBase::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
|
||||
// wxSpinCtrl
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
static gboolean
|
||||
wx_gtk_spin_input(GtkSpinButton* spin, gdouble* val, wxSpinCtrl* win)
|
||||
{
|
||||
// We might use g_ascii_strtoll() here but it's 2.12+ only, so use our own
|
||||
// wxString function even if this requires an extra conversion.
|
||||
const wxString
|
||||
text(wxString::FromUTF8(gtk_entry_get_text(GTK_ENTRY(spin))));
|
||||
|
||||
long lval;
|
||||
if ( !text.ToLong(&lval, win->GetBase()) )
|
||||
return FALSE;
|
||||
|
||||
*val = lval;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gint
|
||||
wx_gtk_spin_output(GtkSpinButton* spin, wxSpinCtrl* win)
|
||||
{
|
||||
const gint val = gtk_spin_button_get_value_as_int(spin);
|
||||
|
||||
gtk_entry_set_text
|
||||
(
|
||||
GTK_ENTRY(spin),
|
||||
wxPrivate::wxSpinCtrlFormatAsHex(val, win->GetMax()).utf8_str()
|
||||
);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
bool wxSpinCtrl::SetBase(int base)
|
||||
{
|
||||
// Currently we only support base 10 and 16. We could add support for base
|
||||
// 8 quite easily but wxMSW doesn't support it natively so don't bother
|
||||
// with doing something wxGTK-specific here.
|
||||
if ( base != 10 && base != 16 )
|
||||
return false;
|
||||
|
||||
if ( base == m_base )
|
||||
return true;
|
||||
|
||||
m_base = base;
|
||||
|
||||
// We need to be able to enter letters for any base greater than 10.
|
||||
gtk_spin_button_set_numeric( GTK_SPIN_BUTTON(m_widget), m_base <= 10 );
|
||||
|
||||
if ( m_base != 10 )
|
||||
{
|
||||
g_signal_connect( GTK_SPIN_BUTTON(m_widget), "input",
|
||||
G_CALLBACK(wx_gtk_spin_input), this);
|
||||
g_signal_connect( GTK_SPIN_BUTTON(m_widget), "output",
|
||||
G_CALLBACK(wx_gtk_spin_output), this);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_signal_handlers_disconnect_by_func(GTK_SPIN_BUTTON(m_widget),
|
||||
(gpointer)wx_gtk_spin_input,
|
||||
this);
|
||||
g_signal_handlers_disconnect_by_func(GTK_SPIN_BUTTON(m_widget),
|
||||
(gpointer)wx_gtk_spin_output,
|
||||
this);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxSpinCtrlDouble
|
||||
//-----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user