| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- /******************************************************************************/
- #include "stdafx.h"
- namespace EE{
- /******************************************************************************/
- void Slider::zero()
- {
- _vertical =false;
- _focusable =false;
- _value =0;
- _lit =0;
- _func_immediate=false;
- _func_user =null;
- _func =null;
- }
- Slider::Slider() {zero();}
- Slider& Slider::del()
- {
- skin.clear();
- super::del(); zero(); return T;
- }
- Slider& Slider::create()
- {
- del();
- _type =GO_SLIDER;
- _visible =true;
- _rect.max.x= 0.30f;
- _rect.min.y=-0.05f;
- return T;
- }
- Slider& Slider::create(C Slider &src)
- {
- if(this!=&src)
- {
- if(!src.is())del();else
- {
- copyParams(src);
- _type =GO_SLIDER;
- skin =src. skin;
- _vertical =src._vertical;
- _focusable =src._focusable;
- _value =src._value;
- _lit =src._lit;
- _func_immediate=src._func_immediate;
- _func_user =src._func_user;
- _func =src._func;
- }
- }
- return T;
- }
- /******************************************************************************/
- Slider& Slider::func(void (*func)(Ptr), Ptr user, Bool immediate)
- {
- T._func =func;
- T._func_user =user;
- T._func_immediate=immediate;
- return T;
- }
- void Slider::call()
- {
- if(_func)if(_func_immediate)_func(_func_user);else Gui.addFuncCall(_func, _func_user);
- }
- /******************************************************************************/
- Slider& Slider::focusable(Bool on) {if(_focusable!=on){_focusable=on; if(!on)kbClear();} return T;}
- /******************************************************************************/
- Slider& Slider::set(Flt value, SET_MODE mode)
- {
- SAT(value);
- if(T._value!=value)
- {
- T._value=value;
- if(mode!=QUIET)call();
- }
- return T;
- }
- /******************************************************************************/
- Slider& Slider::rect(C Rect &rect)
- {
- //if(T.rect()!=rect) below looks fast so don't need this
- {
- super::rect(rect);
- T._vertical=T.rect().vertical();
- }
- return T;
- }
- /******************************************************************************/
- GuiObj* Slider::test(C GuiPC &gpc, C Vec2 &pos, GuiObj* &mouse_wheel)
- {
- if(visible() && gpc.visible)
- {
- Rect r=rect();
- if(GuiSkin *skin=getSkin())
- if(PanelImage *slider=skin->slider.slider())
- {
- if(_vertical)
- {
- Flt h=rect().w()*slider->image.aspect()*0.5f,
- y=rect().h()*_value+rect().min.y;
- r.includeY(y-h, y+h);
- }else
- {
- Flt w=rect().h()*slider->image.aspect()*0.5f,
- x=rect().w()*_value+rect().min.x;
- r.includeX(x-w, x+w);
- }
- }
- if(Cuts(pos, (r+gpc.offset)&gpc.clip))
- {
- if(!mouse_wheel || mouse_wheel->type()!=GO_SLIDEBAR)mouse_wheel=this; // don't grab wheel focus if it already belongs to a SlideBar (for example Slider located in a Region with SlideBars)
- return this;
- }
- }
- return null;
- }
- void Slider::update(C GuiPC &gpc)
- {
- Bool enabled=(T.enabled() && gpc.enabled);
- if( enabled)
- {
- if(Gui.wheel()==this && (Ms.wheel() || Ms.wheelX()))set(_value+(Ms.wheel()+Ms.wheelX())*0.1f);
- if(Gui.kb ()==this)
- {
- if(_vertical)
- {
- if(Kb.b(KB_DOWN))set(_value-Time.d()*0.2f);
- if(Kb.b(KB_UP ))set(_value+Time.d()*0.2f);
- }else
- {
- if(Kb.b(KB_LEFT ))set(_value-Time.d()*0.2f);
- if(Kb.b(KB_RIGHT))set(_value+Time.d()*0.2f);
- }
- }
- C Vec2 *pos=null; if(Gui.ms()==this && Ms.b(0))pos=&Ms.pos(); if(!pos)REPA(Touches)if(Touches[i].guiObj()==this && Touches[i].on())pos=&Touches[i].pos();
- if( pos)set(_vertical ? (pos->y-(rect().min.y+gpc.offset.y))/rect().h() : (pos->x-(rect().min.x+gpc.offset.x))/rect().w());
- //AdjustValBool(_lit, Gui.ms()==this && enabled, Gui._time_d_fade_in, Gui._time_d_fade_out);
- if(Gui.ms()==this)_lit=1;else MAX(_lit-=Gui._time_d_fade_out, 0);
- }
- }
- void Slider::draw(C GuiPC &gpc)
- {
- if(visible() && gpc.visible)
- if(GuiSkin *skin=getSkin())
- {
- Rect rect=T.rect()+gpc.offset, ext_rect;
- if(skin->slider.background) skin->slider.background->extendedRect(rect, ext_rect);else ext_rect =rect;
- if(skin->slider.progress ){Rect r; if(skin->slider.progress ->extendedRect(rect, r )) ext_rect|=r;}
- // for simplicity 'skin->slider.slider' is not included in 'ext_rect'
- if(Cuts(ext_rect, gpc.clip))
- {
- D.clip(gpc.clip);
- D.alignScreenToPixel(rect);
- Rect background_rect=rect;
- if(_vertical)
- {
- Flt shrink=skin->slider.background_shrink*rect.w();
- background_rect.min.x+=shrink;
- background_rect.max.x-=shrink;
- }else
- {
- Flt shrink=skin->slider.background_shrink*rect.h();
- background_rect.min.y+=shrink;
- background_rect.max.y-=shrink;
- }
- // background
- if(skin->slider.background)
- {
- if(_vertical)skin->slider.background->drawVertical(skin->slider.background_color, TRANSPARENT, background_rect);
- else skin->slider.background->draw (skin->slider.background_color, TRANSPARENT, background_rect);
- }else
- if(skin->slider.background_color.a)background_rect.draw(skin->slider.background_color);
- // progress
- if(skin->slider.progress)
- {
- if(skin->slider.draw_progress_partial)
- {
- if(_vertical)skin->slider.progress->drawVerticalFrac(skin->slider.progress_color, TRANSPARENT, background_rect, T(), false);
- else skin->slider.progress->drawFrac (skin->slider.progress_color, TRANSPARENT, background_rect, T(), false);
- }else
- {
- Rect prog_rect=background_rect; if(_vertical)prog_rect.max.y=background_rect.lerpY(T());else prog_rect.max.x=background_rect.lerpX(T());
- if(_vertical)skin->slider.progress->drawVertical(skin->slider.progress_color, TRANSPARENT, prog_rect);
- else skin->slider.progress->draw (skin->slider.progress_color, TRANSPARENT, prog_rect);
- }
- }else
- if(skin->slider.progress_color.a)
- {
- Rect prog_rect=background_rect; if(_vertical)prog_rect.max.y=background_rect.lerpY(T());else prog_rect.max.x=background_rect.lerpX(T());
- prog_rect.draw(skin->slider.progress_color);
- }
- // slider
- if(skin->slider.slider)
- {
- Color highlight=ColorMulZeroAlpha(skin->mouse_highlight_color, _lit);
- if(_vertical)
- {
- Rect_C r(rect.centerX(), rect.lerpY(T()), rect.w(), rect.w()*skin->slider.slider->image.aspect()); D.alignScreenToPixel(r);
- skin->slider.slider->drawVertical(skin->slider.slider_color, highlight, r);
- }else
- {
- Rect_C r(rect.lerpX(T()), rect.centerY(), rect.h()*skin->slider.slider->image.aspect(), rect.h()); D.alignScreenToPixel(r);
- skin->slider.slider->draw(skin->slider.slider_color, highlight, r);
- }
- }
- if(Gui.kb()==this)Gui.kbLit(this, rect, skin);
- }
- }
- }
- /******************************************************************************/
- Bool Slider::save(File &f, CChar *path)C
- {
- if(super::save(f, path))
- {
- f.cmpUIntV(2); // version
- f<<_focusable<<_value<<_lit;
- f._putAsset(skin.name(path));
- return f.ok();
- }
- return false;
- }
- Bool Slider::load(File &f, CChar *path)
- {
- del(); if(super::load(f, path))switch(f.decUIntV()) // version
- {
- case 2:
- {
- _type=GO_SLIDER;
- f>>_focusable>>_value>>_lit; _vertical=rect().vertical();
- skin.require(f._getAsset(), path);
- if(f.ok())return true;
- }break;
- case 1:
- {
- _type=GO_SLIDER;
- f>>_focusable>>_value>>_lit; _vertical=rect().vertical();
- f._getStr(); f._getStr();
- if(f.ok())return true;
- }break;
- case 0:
- {
- _type=GO_SLIDER;
- f>>_focusable; f.skip(4); f>>_value>>_lit; _vertical=rect().vertical();
- f._getStr8();
- if(f.ok())return true;
- }break;
- }
- del(); return false;
- }
- /******************************************************************************/
- }
- /******************************************************************************/
|