void Flu_Spinner::draw() { int W = w()*15/100; if( W < h()/2 ) W = h()/2; int X = x()+w()-W, Y = y(); // fltk 2.0 behavior bool refresh; if( step() >= 1.0 ) { refresh = ( _input.type() != FL_INT_INPUT ); _input.type( FL_INT_INPUT ); } else { refresh = ( _input.type() != FL_FLOAT_INPUT ); _input.type( FL_FLOAT_INPUT ); } if( refresh ) value_damage(); // draw the up/down arrow buttons fl_draw_box( (Fl_Boxtype)_valbox[0], X, Y, W, h()/2, color() ); fl_draw_box( (Fl_Boxtype)_valbox[1], X, Y+h()/2, W, h()/2, color() ); fl_color( active_r() ? FL_FOREGROUND_COLOR : fl_inactive(FL_FOREGROUND_COLOR) ); fl_polygon( X+4, Y+h()/2-4, X+W/2, Y+4, X+W-4, Y+h()/2-4 ); Y += h()/2; fl_polygon( X+4, Y+4, X+W/2, Y+h()/2-4, X+W-4, Y+4 ); _input.resize( x(), y(), w()-h()/2-1, h() ); _input.redraw(); }
Fl_Value_Input_Spin::Fl_Value_Input_Spin(int in_x, int in_y, int in_w, int in_h, const char* in_l) : Fl_Valuator(in_x,in_y,in_w,in_h,in_l), input(in_x, in_y, in_w, in_h, nullptr) { soft_ = 0; if (input.parent()) { // defeat automatic-add ((Fl_Group*)input.parent())->remove(input); } input.parent((Fl_Group *)this); // kludge! input.callback(input_cb, this); input.when(FL_WHEN_CHANGED); selection_color(input.selection_color()); align(FL_ALIGN_LEFT); box(input.box()); value_damage(); buttonssize(15); ix=in_x; iy=in_y; drag=0; indrag=0; sldrag=0; mouseobj = 0; deltadir=0; delta=0; }
Fl_new_adjuster(int X, int Y, int W, int H, const char* L=0) :Fl_Adjuster(X,Y,W/2,H, L) ,b(FL_DOWN_BOX, X+W/2,Y, W/2,H,buf2) { if(b.h()<=20 && b.labelsize()>11) b.labelsize(11); align(FL_ALIGN_LEFT); step(1); value_damage(); }
Fl_Value_Slider_Input::Fl_Value_Slider_Input(int in_x, int in_y, int in_w, int in_h, const char* in_l) : Fl_Value_Slider(in_x,in_y,in_w,in_h,in_l), input(in_x, in_y, in_w, in_h, nullptr) { soft_ = 0; if (input.parent()) { // defeat automatic-add ((Fl_Group*)input.parent())->remove(input); } input.parent((Fl_Group*)this); // kludge! input.callback(input_cb, this); // input.when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY); input.when(FL_WHEN_CHANGED ); selection_color(input.selection_color()); input.align(FL_ALIGN_LEFT); align(FL_ALIGN_LEFT); textboxsize(35); value_damage(); }
Flu_Spinner :: Flu_Spinner( int X, int Y, int W, int H, const char* l ) : Fl_Valuator( X, Y, W, H, l ), _input( this, X, Y, W, H, 0 ) { // we always want the buttons to be square and half the height of the widget int wid = W*15/100; if( wid < H/2 ) wid = H/2; _wrapRange = false; _dragging = false; _editable = true; _totalTime = 0.0f; _initialDelay = 0.5f; _repeatTime[0] = 0.1f; _repeatTime[1] = 0.02f; _rapidDelay = 2.0f; _doRepeat = true; _pushed = false; _valbox[0] = _valbox[1] = FL_UP_BOX; box( FL_DOWN_BOX ); align( FL_ALIGN_LEFT ); when( FL_WHEN_CHANGED ); precision( 2 ); range( 0, 1 ); value( 0 ); { _input.callback(input_cb, this); _input.resize( X, Y, W-wid-1, H ); _input.color( FL_WHITE, FL_SELECTION_COLOR ); _input.textfont( FL_HELVETICA ); _input.textsize( FL_NORMAL_SIZE ); _input.textcolor( FL_FOREGROUND_COLOR ); _input.type( FL_FLOAT_INPUT ); value_damage(); } }
int WidgetPDial::handle(int event) { double dragsize, min = minimum(), max = maximum(), result; int dy; if (event == FL_RELEASE && Fl::event_clicks() == 1) { Fl::event_clicks(0); value(reset_value); tipwin->hide(); value_damage(); if (this->when() != 0) do_callback(); return 1; } int old_mod_state; switch(event) { case FL_PUSH: mod_state = Fl::event_state() & MOD_MASK; if (!use_rounding) { if (integer_step) set_rounding(0); else if (mod_state == MOD_MASK) set_rounding(5); else if (mod_state == FL_SHIFT) set_rounding(4); else set_rounding((Fl::event_button3() || mod_state & FL_CTRL) ? 3 : 2); } oldvalue = value(); old_y = Fl::event_y(); case FL_DRAG: getPos(); old_mod_state = mod_state; mod_state = Fl::event_state() & MOD_MASK; if (old_mod_state != mod_state) { oldvalue = value(); old_y = Fl::event_y(); if (!use_rounding) { if (integer_step) set_rounding(0); else if (mod_state == MOD_MASK) set_rounding(5); else if (mod_state == FL_SHIFT) set_rounding(4); else set_rounding((Fl::event_button3() || mod_state & FL_CTRL) ? 3 : 2); } break; } dy = old_y - Fl::event_y(); if (dy < -1 || dy > 1) Fl::event_clicks(0); if (!integer_step && mod_state == MOD_MASK) dragsize = 200000.0f; else if (!integer_step && mod_state == FL_SHIFT) dragsize = 20000.0f; else dragsize = (Fl::event_button3() || mod_state & MOD_MASK) ? 1000.0f : 200.0f; value(clamp(oldvalue + dy / dragsize * (max - min))); tipwin->showValue(transform(value())); value_damage(); if(this->when() != 0) do_callback(); return 1; case FL_MOUSEWHEEL: if (Fl::event_buttons() || Fl::belowmouse() != this) return 1; mod_state = Fl::event_state() & MOD_MASK; dy = - Fl::event_dy(); if (integer_step) { if (!use_rounding) set_rounding(0); result = (int)(value() + dy * ((Fl::event_ctrl() || Fl::event_shift()) ? 1 : 8)); } else { float dragsize; if (mod_state == MOD_MASK) { dragsize = 100000.0; if (!use_rounding) set_rounding(5); } else if (mod_state == FL_SHIFT) { dragsize = 10000.0; if (!use_rounding) set_rounding(4); } else if (mod_state == FL_CTRL) { dragsize = 1000.0; if (!use_rounding) set_rounding(3); } else { dragsize = 100.0; if (!use_rounding) set_rounding(2); } result = value() + dy / dragsize * (max - min); } value(clamp(result)); tipwin->showValue(transform(value())); value_damage(); if(this->when() != 0) do_callback(); return 1; case FL_ENTER: getPos(); tipwin->showText(); return 1; case FL_HIDE: case FL_LEAVE: tipwin->hide(); resetPos(); break; case FL_RELEASE: if (integer_step) { float rounded = floorf(value() + 0.5); value(clamp(rounded)); } tipwin->hide(); resetPos(); if(this->when() == 0) do_callback(); return 1; } return 0; //#endif }