[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [lmi] Census editor: floating-point values
From: |
Vaclav Slavik |
Subject: |
Re: [lmi] Census editor: floating-point values |
Date: |
Tue, 20 Dec 2011 19:05:36 +0100 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:8.0) Gecko/20111105 Thunderbird/8.0 |
On 2011-12-15 17:36, Greg Chicares wrote:
> Aside from these concerns, wouldn't textctrls seem more natural
> for floating-point values? End users rarely want to change a value
> of 1000000 to 1000001; they're likely to change 1000000 to 2500000.
> I don't think the extra features of a spinctrl will prove useful.
You have a point. My main motivation for using a spin control was that
it indicates the range at least somehow. In retrospect, it's not that
useful and wxTextCtrl editing is more comfortable.
Below is a patch to change CensusView to use textctrl for floating point
values.
Thanks,
Vaclav
diff --git a/census_view.cpp b/census_view.cpp
index
f0a54930adf904a574414d7b6837667a3f55b4f3..cd7361aeab8c7f5b74c6f2b51adc954dca3fe73e
100644
--- a/census_view.cpp
+++ b/census_view.cpp
@@ -53,6 +53,7 @@
#include <wx/menu.h>
#include <wx/msgdlg.h>
#include <wx/spinctrl.h>
+#include <wx/valnum.h>
#include <wx/xrc/xmlres.h>
#include <wx/wupdlock.h>
@@ -246,42 +247,50 @@ std::string
IntSpinRenderer::DoGetValueFromEditor(wxWindow* editor)
return value_cast<std::string>(spin->GetValue());
}
-// class DoubleSpinRenderer
+// class DoubleRangeRenderer
-class DoubleSpinRenderer
+class DoubleRangeRenderer
:public RangeTypeRenderer
{
public:
- DoubleSpinRenderer() : RangeTypeRenderer() {}
+ DoubleRangeRenderer() : RangeTypeRenderer() {}
protected:
virtual wxWindow* DoCreateEditor(wxWindow* parent, wxRect const& rect,
tn_range_variant_data const& data);
virtual std::string DoGetValueFromEditor(wxWindow* editor);
};
-wxWindow* DoubleSpinRenderer::DoCreateEditor
+wxWindow* DoubleRangeRenderer::DoCreateEditor
(wxWindow* parent
,wxRect const& rect
,tn_range_variant_data const& data)
{
- return new(wx) wxSpinCtrlDouble
+ wxFloatingPointValidator<double> val;
+ val.SetRange(data.min, data.max);
+
+ wxTextCtrl* ctrl = new(wx) wxTextCtrl
(parent
,wxID_ANY
,data.value
,rect.GetTopLeft()
,rect.GetSize()
- ,wxSP_ARROW_KEYS | wxTE_PROCESS_ENTER
- ,data.min
- ,data.max
- ,value_cast<double>(data.value));
+ ,wxTE_PROCESS_ENTER
+ ,val);
+
+ // select the text in the control an place the cursor at the end
+ // (same as wxDataViewTextRenderer)
+ ctrl->SetInsertionPointEnd();
+ ctrl->SelectAll();
+
+ return ctrl;
}
-std::string DoubleSpinRenderer::DoGetValueFromEditor(wxWindow* editor)
+std::string DoubleRangeRenderer::DoGetValueFromEditor(wxWindow* editor)
{
- wxSpinCtrlDouble* spin = dynamic_cast<wxSpinCtrlDouble*>(editor);
- LMI_ASSERT(spin);
+ wxTextCtrl* ctrl = dynamic_cast<wxTextCtrl*>(editor);
+ LMI_ASSERT(ctrl);
- return value_cast<std::string>(spin->GetValue());
+ return ctrl->GetValue().ToStdString();
}
// class DateRenderer
@@ -600,7 +609,7 @@ class renderer_double_range_convertor : public
renderer_range_convertor
public:
virtual wxDataViewRenderer* create_renderer(any_member<Input> const&) const
{
- return new(wx) DoubleSpinRenderer();
+ return new(wx) DoubleRangeRenderer();
}
};