; -------- UTILIZZO DELLA PROGRESSBAR COME WIDGET ESTERNO----------------------------------- ; ;ESEMPIO: ;progress=NewProgressBarWin(Event.Top,'Loading batches...',/cancel) ; ; loop ... ; ; FOR i = 1, N DO $ ; BEGIN ; ; ... ; ; stop_req = SetProgressBarWin(progress,1.*i/N) ; ; IF stop_req THEN BREAK ; END ; ; ; -------- UTILIZZO DELLA PROGRESSBAR ALL'INTERNO DI UN WIDGET ----------------------------- ; ; ; Qui si definisce l'oggetto ProgressBar ed i relativi metodi ; ; esempio di utilizzo: ; ; si crei un oggetto WIDGET_DRAW con il GUI builder o manualmente. ; si indichi con WID_progress l'id del widget DRAW ed in fase di Realize del Top Widget ; si scriva: ; ; MyProgressBar = obj_new('ProgressBar',WID_progress,30) ; WIDGET_CONTROL,WID_progress,SET_UVALUE=MyProgressBar ; ; (con 30 si intende dividere la barra in 30 blocchi) ; in qualunque momento per impostare un valore alla posizione della barra si scriva ; ; WID_MyProgressBar = widget_info(Event.top, FIND_BY_UNAME=widget_name) ; WIDGET_CONTROL,WID_MyProgressBar,GET_UVALUE=MyProgressBar ; ; MyProgressBar->setDecimalValue,0.4 ; ; con 0.4 si intende barra al 40 % function ProgressBar::getDecimalValue return,self.value end pro ProgressBar::setDecimalValue,value COMPILE_OPT IDL2 n=fix(((value<1)>0)*self.count) old_n = fix(((self.value<1)>0)*self.count) self.value=((value<1)>0) if (n ne old_n) then begin WSET,self.Win_ID image=BYTARR(self.Xsize-4,self.Ysize-4)+255 tv,image,2,2 block = BYTARR(self.Xsize/self.count-2,self.Ysize-6,3) block[*,*,2] = 128 for i=0,n-1 do tv,block,i*self.Xsize/self.count+1,3,true=3 end end function ProgressBar::init,WID_widget_draw,count COMPILE_OPT IDL2 geom = widget_info(WID_widget_draw,/geometry) self.Xsize = geom.scr_Xsize self.Ysize = geom.scr_Ysize WIDGET_CONTROL, WID_widget_draw, GET_VALUE = Win_ID self.Win_ID = Win_ID self.count = count WSET,Win_ID image=BYTARR(self.Xsize,self.Ysize)+255 image[*,self.Ysize-[1,2],*]=100 image[[0,1],*,*]=100 image[self.Xsize-1,*,*]=255 image[self.Xsize-2,*,*]=200 image[*,0,*]=255 image[*,1,*]=200 tv,image return,1 end pro ProgressBar__define struct={ProgressBar,Win_ID:0,value:0.,Xsize:0,Ysize:0,count:0} end function NewProgressBarWin,groupLeader,title,cancel = cancel,MODAL=MODAL,FLOATING=FLOATING COMPILE_OPT IDL2 xsize = 200 ysize = 15 LeaderGeometry = WIDGET_INFO (groupLeader,/GEOMETRY) wBase = widget_base( $ ;/ROW, $ FLOATING=FLOATING, $ GROUP_LEADER=groupLeader, $ MODAL = MODAL, $ TITLE=title, $ YSIZE=YSIZE+25 , $ XSIZE = xsize+120 , $ XOFFSET = LeaderGeometry.XOFFSET + LeaderGeometry.XSIZE/2-(xsize+120)/2, $ YOFFSET = LeaderGeometry.YOFFSET + LeaderGeometry.YSIZE/2-(ysize+25)/2 , $ _EXTRA=_extra) wDraw = widget_draw(wBase, XSIZE=xsize, YSIZE=ysize,sensitive=0,YOFFSET=10,XOFFSET = 10) wLabel = widget_label(wBase,xsize=30,value=' 0 %',XOFFSET=xsize+15,YOFFSET=10) if keyword_set(Cancel) then wCancel = $ widget_button(wBase, VALUE=' Cancel ', EVENT_PRO='ProgressBarCancel',XOFFSET=xsize+50,YOFFSET=5) $ else wCancel = 0L widget_control, wBase, /REALIZE MyProgressBar = obj_new('ProgressBar',wDraw,20) ; Cache my state information state = { $ wBase: wBase, $ wDraw: wDraw, $ wCancel: wCancel, $ wLabel: wLabel , $ ProgBar: MyProgressBar, $ BaseTitle : Title , $ stopReq: 0 $ } widget_control, wBase, SET_UVALUE=state return,wBase end function SetProgressBarWin,Id,value,Title=Title COMPILE_OPT IDL2 widget_control, Id, Bad_ID=bad if ~bad then $ BEGIN ev = WIDGET_EVENT(/NOWAIT) widget_control, Id, GET_UVALUE=state state.ProgBar -> setDecimalValue,value WIDGET_CONTROL,state.wLabel,SET_VALUE=STRING(value*100,format='(i3)')+' %' if keyword_set(title) THEN $ BEGIN state.BaseTitle = title widget_control, Id, SET_UVALUE=state END widget_control, Id,BASE_SET_TITLE = state.BaseTitle +' '+$ STRING(value*100,format='(i3)')+' %' fine = (value EQ 1) OR (state.stopReq) if fine then $ widget_control,Id,/DESTROY return,fine ENDIF ELSE return,2 end pro ProgressBarCancel,Event COMPILE_OPT IDL2 widget_control, event.top, GET_UVALUE=state state.stopReq = 1 widget_control, event.top, SET_UVALUE=state end