Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --############################
- --## Widget-ScrollBox ##
- --## main_c.lua ##
- --## @author: Str0^ ##
- --## @date: 01.03.2015 ##
- --############################
- local w, h = guiGetScreenSize()
- ScrollBox = { }
- ScrollBox.CHILDS = { }
- ScrollBox.KEYS = { { "pgup","mouse_wheel_up"} , {"pgdn","mouse_wheel_down" } }
- ScrollBox.__index = ScrollBox
- function ScrollBox.new( I_SX, I_SY , I_WIDTH , I_HEIGHT , TBL_CONTENT, BG_COLOR, S_FONT, I_FONT, B_SCROLLBAR, I_SCROLLAMOUNT )
- local B_CHECK = Check_Multiple( "number" , I_SX, I_SY , I_WIDTH , I_HEIGHT ) and type( TBL_CONTENT ) == "table"
- S_FONT = S_FONT or "default"
- I_FONT = I_FONT or 1
- BG_COLOR = BG_COLOR or 0
- if B_CHECK then
- outputDebugString("Check Passed!")
- local SELF = setmetatable( { } , ScrollBox )
- SELF.id = #ScrollBox.CHILDS
- SELF.BOUNDS ={ I_SX , I_SY , I_WIDTH , I_HEIGHT }
- SELF.FONT = S_FONT
- SELF.FONTSIZE = I_FONT
- SELF.FONT_HEIGHT = dxGetFontHeight( I_FONT , S_FONT )
- SELF.TABLE = TBL_CONTENT
- SELF:createRenderTarget( )
- SELF.BG_COLOR = BG_COLOR
- SELF.B_SCROLLBAR = B_SCROLLBAR
- SELF.SCROLL_AMOUNT = I_SCROLLAMOUNT
- SELF.SCROLLBAR_VALUE = I_SY
- SELF.RENDER_FUNC_POINTER = function () SELF:render_main ( ) end
- SELF.KEY_FUNC_POINTER = function( ) SELF:onKey( ) end
- SELF.SCROLL_FUNC_POINTER = function(button,bPress ) SELF:onScroll (button,bPress) end
- addEventHandler("onClientRender",root,SELF.RENDER_FUNC_POINTER )
- addEventHandler("onClientRender",root, SELF.KEY_FUNC_POINTER)
- addEventHandler("onClientKey",root,SELF.SCROLL_FUNC_POINTER)
- table.insert( ScrollBox.CHILDS , SELF )
- return SELF
- end
- end
- function ScrollBox.remove( ELEMENT_ID )
- for key, obj in ipairs( ScrollBox.CHILDS ) do
- if obj.id == ELEMENT_ID then
- removeEventHandler("onClientRender",root,obj.RENDER_FUNC_POINTER )
- removeEventHandler("onClientRender",root, obj.KEY_FUNC_POINTER)
- removeEventHandler("onClientKey",root,obj.SCROLL_FUNC_POINTER)
- ELEMENT = nil
- end
- end
- end
- function ScrollBox:onScroll(bButton, bPress)
- local I_X,I_Y,I_WIDTH,I_HEIGHT = self:getBounds( )
- if bButton == "mouse_wheel_up" then
- if self.SCROLLBAR_VALUE <= I_Y then
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE + self.SCROLL_AMOUNT
- end
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE - self.SCROLL_AMOUNT
- elseif bButton == "mouse_wheel_down" then
- if self.SCROLLBAR_VALUE+self.scrollbar_height>= (I_Y+I_HEIGHT)-(self.scrollbar_height) then
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE - self.SCROLL_AMOUNT
- end
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE + self.SCROLL_AMOUNT
- end
- end
- --// RENDER-ON_KEY //
- function ScrollBox:onKey( B_BUTTON , B_PRESS )
- local I_X,I_Y,I_WIDTH,I_HEIGHT = self:getBounds( )
- for key, BTN in ipairs( ScrollBox.KEYS[1] ) do
- if getKeyState( BTN ) then
- if self.SCROLLBAR_VALUE <= I_Y then
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE + self.SCROLL_AMOUNT
- end
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE - self.SCROLL_AMOUNT
- return
- end
- end
- for key, BTN in ipairs( ScrollBox.KEYS[2] ) do
- if getKeyState( BTN ) then
- if self.SCROLLBAR_VALUE+self.scrollbar_height>= (I_Y+I_HEIGHT)-(self.scrollbar_height) then
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE - self.SCROLL_AMOUNT
- end
- self.SCROLLBAR_VALUE = self.SCROLLBAR_VALUE + self.SCROLL_AMOUNT
- return
- end
- end
- end
- --// #Render Routines# //
- function ScrollBox:createRenderTarget( )
- local I_X,I_Y,I_WIDTH,I_HEIGHT = self:getBounds( )
- self.REAL_HEIGHT = self.FONT_HEIGHT * #self.TABLE
- self.RENDER_TARGET = dxCreateRenderTarget( I_WIDTH , self.REAL_HEIGHT ,true )
- if not self.RENDER_TARGET then
- self:createRenderTarget( )
- end
- end
- function ScrollBox:render_main( )
- local I_X,I_Y,I_WIDTH,I_HEIGHT = self:getBounds( )
- dxSetTextureEdge(self.RENDER_TARGET, "border", self.BG_COLOR )
- dxDrawBoxShape( I_X,I_Y,I_WIDTH,I_HEIGHT,tocolor(50,50,50,255))
- dxSetRenderTarget( self.RENDER_TARGET )
- self:render_subroutine( )
- dxSetRenderTarget( )
- dxDrawImageSection( I_X , I_Y, I_WIDTH , I_HEIGHT ,0,( self.SCROLLBAR_VALUE-I_Y)* ( self.REAL_HEIGHT / I_HEIGHT ) ,I_WIDTH,I_HEIGHT, self.RENDER_TARGET)
- self:render_scrollbar( )
- end
- function ScrollBox:render_subroutine( )
- local I_X,I_Y,I_WIDTH,I_HEIGHT = self:getBounds( )
- for KEY, D_OBJ in ipairs( self.TABLE ) do
- local DX_TEXT, F_COLOR, BG_COLOR = unpack( D_OBJ)
- local HEIGHT_INDEX = ( KEY - 1) * self.FONT_HEIGHT
- dxDrawRectangle( 0, HEIGHT_INDEX, I_WIDTH , I_HEIGHT , BG_COLOR )
- dxDrawText( DX_TEXT, 0, HEIGHT_INDEX, I_WIDTH, HEIGHT_INDEX + self.FONT_HEIGHT , tocolor( F_COLOR ) , self.FONTSIZE , self.FONT, "center", "center" )
- end
- end
- function ScrollBox:render_scrollbar( )
- local I_X,I_Y,I_WIDTH,I_HEIGHT = self:getBounds( )
- self.scrollbar_width = w*0.01
- self.scrollbar_height = ( ( ( self.FONT_HEIGHT ) / self.SCROLL_AMOUNT ) ) * ( I_HEIGHT / self.REAL_HEIGHT )
- if self.B_SCROLLBAR then
- dxDrawBoxShape( I_X+( I_WIDTH - self.scrollbar_width ) , I_Y, self.scrollbar_width,I_HEIGHT ,tocolor(50,50,50,255))
- dxDrawRectangle(I_X+( I_WIDTH - self.scrollbar_width ) , I_Y, self.scrollbar_width,I_HEIGHT , tocolor(200,200,200,200) )
- dxDrawRectangle( I_X+ ( I_WIDTH - self.scrollbar_width ) , self.SCROLLBAR_VALUE,self.scrollbar_width, self.scrollbar_height , tocolor( 50,50,50,255))
- end
- end
- --// #Render Routines# //
- --// GET-BOUNDS( ) //
- function ScrollBox:getBounds( )
- return unpack( self.BOUNDS )
- end
- --// CHECK_FUNCTIONS //
- function Check_Multiple( S_TYPE , ... )
- for I_ARG = 1, #arg do
- if type( arg[I_ARG] ) ~= S_TYPE then return false
- end
- end
- return true
- end
- createScrollBox = ScrollBox.new
- destroyScrollBox = ScrollBox.remove
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement