lmi
[Top][All Lists]
Advanced

[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();
     }
 };
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]