mirror of https://github.com/odrling/Aegisub
Float spin control mostly works, but there are two bugs that I don't want to deal with, so, meh.
Originally committed to SVN as r1240.
This commit is contained in:
parent
673a818e49
commit
a12a6f229c
|
@ -39,6 +39,15 @@
|
|||
#include <wx/wxprec.h>
|
||||
#include "float_spin.h"
|
||||
#include "utils.h"
|
||||
#include "validators.h"
|
||||
|
||||
|
||||
///////
|
||||
// IDs
|
||||
enum {
|
||||
SPIN_BUTTON = 1100,
|
||||
TEXT_EDIT
|
||||
};
|
||||
|
||||
|
||||
///////////////
|
||||
|
@ -51,8 +60,8 @@ FloatSpinCtrl::FloatSpinCtrl(wxWindow* parent,wxWindowID id,const wxPoint& pos,c
|
|||
value = initial;
|
||||
|
||||
// Create sub-controls
|
||||
text = new wxTextCtrl(this,-1,_T(""));
|
||||
button = new wxSpinButton(this,-1,wxDefaultPosition,wxSize(-1,20),wxSP_VERTICAL);
|
||||
text = new FloatSpinText(this,TEXT_EDIT);
|
||||
button = new wxSpinButton(this,SPIN_BUTTON,wxDefaultPosition,wxSize(-1,20),wxSP_VERTICAL);
|
||||
SetRange(_min,_max,_step);
|
||||
|
||||
// Set sizer
|
||||
|
@ -60,7 +69,7 @@ FloatSpinCtrl::FloatSpinCtrl(wxWindow* parent,wxWindowID id,const wxPoint& pos,c
|
|||
sizer->Add(text,1,wxEXPAND,0);
|
||||
sizer->Add(button,0,wxEXPAND,0);
|
||||
SetSizer(sizer);
|
||||
sizer->SetSizeHints(this);
|
||||
//sizer->SetSizeHints(this);
|
||||
|
||||
// Update text
|
||||
UpdateText();
|
||||
|
@ -91,3 +100,84 @@ void FloatSpinCtrl::SetRange(double _min,double _max,double _step) {
|
|||
void FloatSpinCtrl::UpdateText() {
|
||||
text->SetValue(PrettyFloatD(value));
|
||||
}
|
||||
|
||||
|
||||
///////////////
|
||||
// Event table
|
||||
BEGIN_EVENT_TABLE(FloatSpinCtrl,wxPanel)
|
||||
EVT_SPIN(SPIN_BUTTON, FloatSpinCtrl::OnSpin)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
///////////
|
||||
// On spin
|
||||
void FloatSpinCtrl::OnSpin(wxSpinEvent &event) {
|
||||
value = double(event.GetPosition())*step;
|
||||
UpdateText();
|
||||
}
|
||||
|
||||
|
||||
////////////////////////// EDIT BOX ////////////////////////////
|
||||
|
||||
///////////////
|
||||
// Constructor
|
||||
FloatSpinText::FloatSpinText(FloatSpinCtrl *_parent,int id)
|
||||
: wxTextCtrl(_parent,id,_T(""),wxDefaultPosition,wxDefaultSize,0,NumValidator(NULL,true,true))
|
||||
{
|
||||
parent = _parent;
|
||||
}
|
||||
|
||||
|
||||
//////////////
|
||||
// Focus lost
|
||||
void FloatSpinText::OnKillFocus(wxFocusEvent &event) {
|
||||
SendValue();
|
||||
}
|
||||
|
||||
|
||||
///////////////
|
||||
// Key pressed
|
||||
void FloatSpinText::OnKeyPress(wxKeyEvent &event) {
|
||||
int code = event.GetKeyCode();
|
||||
if (code == WXK_UP || code == WXK_DOWN) {
|
||||
// Update first
|
||||
SendValue();
|
||||
|
||||
// Get delta
|
||||
int sign = -1;
|
||||
if (code == WXK_UP) sign = 1;
|
||||
|
||||
// Change value
|
||||
int value = parent->button->GetValue()+sign;
|
||||
parent->button->SetValue(value);
|
||||
parent->value = parent->button->GetValue()*parent->step;
|
||||
parent->UpdateText();
|
||||
|
||||
return;
|
||||
}
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
//////////////
|
||||
// Send value
|
||||
void FloatSpinText::SendValue() {
|
||||
try {
|
||||
double value = 0.0;
|
||||
GetValue().ToDouble(&value);
|
||||
int pos = int(value/parent->step);
|
||||
parent->button->SetValue(pos);
|
||||
parent->UpdateText();
|
||||
}
|
||||
catch (...) {
|
||||
parent->UpdateText();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////
|
||||
// Event table
|
||||
BEGIN_EVENT_TABLE(FloatSpinText,wxTextCtrl)
|
||||
EVT_KEY_DOWN(FloatSpinText::OnKeyPress)
|
||||
EVT_KILL_FOCUS(FloatSpinText::OnKillFocus)
|
||||
END_EVENT_TABLE()
|
||||
|
|
|
@ -39,9 +39,32 @@
|
|||
#include <wx/wxprec.h>
|
||||
|
||||
|
||||
//////////////
|
||||
// Prototypes
|
||||
class FloatSpinCtrl;
|
||||
|
||||
|
||||
///////////////////
|
||||
// Float spin text
|
||||
class FloatSpinText : public wxTextCtrl {
|
||||
friend class FloatSpinCtrl;
|
||||
private:
|
||||
FloatSpinCtrl *parent;
|
||||
|
||||
FloatSpinText(FloatSpinCtrl *parent,int id);
|
||||
|
||||
void OnKillFocus(wxFocusEvent &event);
|
||||
void OnKeyPress(wxKeyEvent &event);
|
||||
void SendValue();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
//////////////////////
|
||||
// Float spin control
|
||||
class FloatSpinCtrl : public wxPanel {
|
||||
friend class FloatSpinText;
|
||||
private:
|
||||
wxTextCtrl *text;
|
||||
wxSpinButton *button;
|
||||
|
@ -53,6 +76,8 @@ private:
|
|||
|
||||
void UpdateText();
|
||||
|
||||
void OnSpin(wxSpinEvent &event);
|
||||
|
||||
public:
|
||||
FloatSpinCtrl(wxWindow* parent,wxWindowID id=-1,const wxPoint& pos=wxDefaultPosition,const wxSize& size = wxDefaultSize, long style = wxSP_ARROW_KEYS, double min = 0.0, double max = 100.0, double initial = 0.0, double step = 1.0, const wxString& name = _T("wxSpinCtrl"));
|
||||
|
||||
|
@ -62,4 +87,6 @@ public:
|
|||
double GetValue() { return value; }
|
||||
double GetMin() { return min; }
|
||||
double GetMax() { return max; }
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
|
|
@ -139,7 +139,7 @@ SubsEditBox::SubsEditBox (wxWindow *parent,SubtitlesGrid *gridp) : wxPanel(paren
|
|||
|
||||
// Top sizer
|
||||
TopSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
//TopSizer->Add(new FloatSpinCtrl(this,-1,wxDefaultPosition,wxSize(60,20),0.0,50.0,20.0,0.5));
|
||||
//TopSizer->Add(new FloatSpinCtrl(this,-1,wxDefaultPosition,wxSize(40,20),0,-20.0,50.0,0.0,0.5));
|
||||
TopSizer->Add(CommentBox,0,wxRIGHT | wxALIGN_CENTER,5);
|
||||
TopSizer->Add(StyleBox,1,wxRIGHT,5);
|
||||
TopSizer->Add(ActorBox,1,wxRIGHT,5);
|
||||
|
|
Loading…
Reference in New Issue