From bdbd475ae30b75aaad113f913ed9c70668b471b8 Mon Sep 17 00:00:00 2001 From: jussi Date: Fri, 2 Dec 2022 22:53:51 +0200 Subject: [PATCH] ReiLuaGui basics done. --- API.md | 2 +- changelog | 8 +- devnotes | 9 + examples/ReiLuaGui/main.lua | 118 ++--- examples/resources/images/LICENCE | 9 +- examples/resources/images/check-mark.png | Bin 0 -> 6990 bytes examples/resources/images/circle.png | Bin 0 -> 7452 bytes examples/resources/images/plain-circle.png | Bin 0 -> 6567 bytes examples/resources/lib/color.lua | 95 ++++ examples/resources/lib/gui.lua | 581 +++++++++++++++------ src/shapes.c | 6 +- 11 files changed, 607 insertions(+), 221 deletions(-) create mode 100644 examples/resources/images/check-mark.png create mode 100644 examples/resources/images/circle.png create mode 100644 examples/resources/images/plain-circle.png create mode 100644 examples/resources/lib/color.lua diff --git a/API.md b/API.md index 2a653db..b9741be 100644 --- a/API.md +++ b/API.md @@ -2505,7 +2505,7 @@ Draw a line using cubic-bezier curves in-out --- -> success = RL_DrawLineBezier( Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thickness, Color color ) +> success = RL_DrawLineBezierQuad( Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thickness, Color color ) Draw line using quadratic bezier curves with a control point diff --git a/changelog b/changelog index b0a2e61..d44b08d 100644 --- a/changelog +++ b/changelog @@ -6,12 +6,16 @@ KEY CHANGES: - ADDED: Lua interpreter mode. - ADDED: Easings extra module. - ADDED: exit function. - - FIX: uluaGetNPatchInfo fix for RL_DrawTextureNPatch. Guess this was never tested and did not work at all >:E. + - FIXED: uluaGetNPatchInfo fix for RL_DrawTextureNPatch. Guess this was never tested and did not work at all >:E. + - ADDED: ReiLuaGui. Detailed changes: ADDED: Help argument. CHANGED: Changed fuction name RL_rlSetLineWidth to RL_rlglSetLineWidth. CHANGED: Changed fuction name RL_rlGetLineWidth to RL_rlglGetLineWidth. -FIX: DrawRectangleGradient V and H expecting wrong amount of arguments. +FIXED: DrawRectangleGradient V and H expecting wrong arguments. ADDED: RL_LoadDirectoryFilesEx. ADDED: Flag option (-s) for doc_parser.lua for exporting module APIs to separate files. +FIXED: RL_DrawLineBezierQuad was called RL_DrawLineBezier in API. +ADDED: Color lib. +FIXED: RL_DrawEllipse and RL_DrawEllipseLines expecting wrong arguments. diff --git a/devnotes b/devnotes index eb6a635..7357551 100644 --- a/devnotes +++ b/devnotes @@ -1,4 +1,13 @@ Current { + * ReiLuaGui + * Mouse wheel scrolling can be detected through other elements. + * Could try putting container over all of it's content elements and having it's onOver function not breaking loop. + * Text input. + * Movable window. + * Grid container. + * Calculator. + * Grid icon window. + * File explorer. } Backlog { diff --git a/examples/ReiLuaGui/main.lua b/examples/ReiLuaGui/main.lua index ae03e89..1257ec1 100644 --- a/examples/ReiLuaGui/main.lua +++ b/examples/ReiLuaGui/main.lua @@ -3,26 +3,32 @@ package.path = package.path..";"..RL_GetBasePath().."../resources/lib/?.lua" util = require( "utillib" ) Vec2 = require( "vector2" ) Rect = require( "rectangle" ) +Color = require( "color" ) Gui = require( "gui" ) -local textColor = BLACK -local textPos = { 192, 200 } -local imageFont = -1 - local container = {} +-- local circleTexture = RL_LoadTexture( RL_GetBasePath().."../resources/images/circle.png" ) +local circleTexture = RL_LoadTexture( RL_GetBasePath().."../resources/images/plain-circle.png" ) +local checkTexture = RL_LoadTexture( RL_GetBasePath().."../resources/images/check-mark.png" ) + +RL_GenTextureMipmaps( circleTexture ) +RL_GenTextureMipmaps( checkTexture ) +RL_SetTextureFilter( circleTexture, TEXTURE_FILTER_TRILINEAR ) +RL_SetTextureFilter( checkTexture, TEXTURE_FILTER_TRILINEAR ) function initGui() -- local label = Gui.label:new( { text = "Dog", bounds = { 32, 32, 96, 96 }, drawBounds = true, Haling = Gui.ALING.CENTER, Valing = Gui.ALING.TOP } ) - local panel = Gui.panel:new( { bounds = Rect:new( 60, 32, 128, 128 ) } ) + local panel = Gui.element:new( { bounds = Rect:new( 60, 32, 128, 128 ), drawBounds = true } ) + container = Gui.container:new( { bounds = Rect:new( 256, 120, 128, 128 ), - drawBounds = true, + -- spacing = 4, -- Haling = Gui.ALING.LEFT, -- Haling = Gui.ALING.CENTER, -- Valing = Gui.ALING.CENTER, -- type = Gui.CONTAINER.HORIZONTAL, - -- scrollPos = Vec2:new( 0, 0 ), scrollable = true, + showScrollbar = true, } ) -- local container = Gui.container:new( { bounds = Rect:new( 256, 120, 128, 128 ), drawBounds = true, type = Gui.CONTAINER.HORIZONTAL } ) @@ -30,63 +36,67 @@ function initGui() -- local itemBounds = { 0, 0, container.bounds.width - container.spacing * 2, 36 } local itemBounds = Rect:new( 0, 0, 64, 36 ) - container:add( Gui.label:new( { - text = "Dog", - bounds = itemBounds:clone(), - onClicked = function() panel:setPosition( Vec2:new( 500, 80 ) ) end, - onMouseOver = function( self ) self.color = RED end, - notMouseOver = function( self ) self.color = BLACK end, - drawBounds = true, - } ) ) - - container:add( Gui.label:new( { - text = "Cat", - -- bounds = itemBounds:clone(), - bounds = Rect:new( 0, 0, 78, 24 ), + local dog = Gui.element:new( { + bounds = Rect:new( 0, 0, 128, 36 ), onClicked = function() panel:setPosition( Vec2:new( 290, 120 ) ) end, - onMouseOver = function( self ) self.color = RED end, - notMouseOver = function( self ) self.color = BLACK end, + onMouseOver = function( self ) self.items[1].color = RED end, + notMouseOver = function( self ) self.items[1].color = BLACK end, drawBounds = true, - } ) ) + } ) + + dog:add( Gui.text:new( { text = "Dog", HAling = Gui.ALING.LEFT } ) ) + dog:add( Gui.texture:new( { bounds = Rect:new( 0, 0, 24, 24 ), texture = circleTexture, HAling = Gui.ALING.RIGHT, color = Color:new( 150, 150, 255 ) } ) ) + dog:add( Gui.texture:new( { bounds = Rect:new( 0, 0, 24, 24 ), texture = checkTexture, HAling = Gui.ALING.RIGHT, visible = true } ) ) + -- dog:add( Gui.text:new( { text = "Cat", HAling = Gui.ALING.RIGHT } ) ) + -- dog:add( Gui.shape:new( { bounds = Rect:new( 0, 0, 128, 36 ), shape = Gui.SHAPE.RECTANGLE_ROUNDED, color = Color:new( GREEN ) } ) ) + + container:add( dog ) + + -- container:add( Gui.element:new( { + -- text = "Cat", + -- bounds = Rect:new( 0, 0, 78, 24 ), + -- onClicked = function() panel:setPosition( Vec2:new( 290, 120 ) ) end, + -- onMouseOver = function( self ) self.color = RED end, + -- notMouseOver = function( self ) self.color = BLACK end, + -- drawBounds = true, + -- } ) ) for i = 1, 5 do - container:add( Gui.label:new( { - text = "Giraffe", - bounds = Rect:new( 0, 0, 100, 30 ), + local element = Gui.element:new( { + bounds = Rect:new( 0, 0, 120, 30 ), onClicked = function() panel:setPosition( Vec2:new( 340, 380 ) ) end, - onMouseOver = function( self ) self.color = RED end, - notMouseOver = function( self ) self.color = BLACK end, + onMouseOver = function( self ) self.color = Color:new( DARKBLUE ) end, + notMouseOver = function( self ) self.color = Color:new( LIGHTGRAY ) end, drawBounds = true, - } ) ) + } ) + + element:add( Gui.text:new( { text = "Giraffe" } ) ) + container:add( element ) end local container2 = Gui.container:new( { - bounds = Rect:new( 400, 120, 154, 30 ), - drawBounds = true, - -- Haling = Gui.ALING.LEFT, - -- Haling = Gui.ALING.CENTER, - -- Valing = Gui.ALING.CENTER, + bounds = Rect:new( 0, 0, 154, 64 ), type = Gui.CONTAINER.HORIZONTAL, } ) - container2:add( Gui.label:new( { - text = "Dog", + local element = Gui.element:new( { bounds = itemBounds:clone(), - -- onClicked = function() panel:setPosition( Vec2:new( 500, 80 ) ) end, - onMouseOver = function( self ) self.color = RED end, - notMouseOver = function( self ) self.color = BLACK end, + onMouseOver = function( self ) self.color = Color:new( DARKBLUE ) end, + notMouseOver = function( self ) self.color = Color:new( LIGHTGRAY ) end, drawBounds = true, - } ) ) - - container2:add( Gui.label:new( { - text = "Cat", - -- bounds = itemBounds:clone(), + } ) + element:add( Gui.text:new( { text = "Dog" } ) ) + container2:add( element ) + + element = Gui.element:new( { bounds = Rect:new( 0, 0, 78, 24 ), - -- onClicked = function() panel:setPosition( Vec2:new( 290, 120 ) ) end, - onMouseOver = function( self ) self.color = RED end, - notMouseOver = function( self ) self.color = BLACK end, + -- bounds = Rect:new( 0, 0, 78, 64 ), + onMouseOver = function( self ) self.color = Color:new( DARKBLUE ) end, + notMouseOver = function( self ) self.color = Color:new( LIGHTGRAY ) end, drawBounds = true, - } ) ) + } ) + element:add( Gui.text:new( { text = "Cat" } ) ) + container2:add( element ) container:add( container2 ) @@ -110,17 +120,7 @@ function init() end function process( delta ) - if RL_IsKeyDown( KEY_RIGHT ) then - container:scroll( Vec2:new( container._scrollRect.x + 50 * delta, 0 ) ) - elseif RL_IsKeyDown( KEY_LEFT ) then - container:scroll( Vec2:new( container._scrollRect.x - 50 * delta, 0 ) ) - elseif RL_IsKeyDown( KEY_UP ) then - container:scroll( Vec2:new( 0, container._scrollRect.y - 50 * delta ) ) - elseif RL_IsKeyDown( KEY_DOWN ) then - container:scroll( Vec2:new( 0, container._scrollRect.y + 50 * delta ) ) - end - - Gui.process( RL_GetMousePosition() ) + Gui.process( Vec2:new( RL_GetMousePosition() ) ) end function draw() diff --git a/examples/resources/images/LICENCE b/examples/resources/images/LICENCE index ce0f32f..a1d1f46 100644 --- a/examples/resources/images/LICENCE +++ b/examples/resources/images/LICENCE @@ -1,6 +1,9 @@ -Resource Author Licence Source -tiles.png Chris Hamons (maintainer) CC0 https://opengameart.org/content/dungeon-crawl-32x32-tiles -arcade_platformerV2.png GrafxKid CC0 https://opengameart.org/content/arcade-platformer-assets +Resource Author Licence Source Edits +tiles.png Chris Hamons (maintainer) CC0 https://opengameart.org/content/dungeon-crawl-32x32-tiles +arcade_platformerV2.png GrafxKid CC0 https://opengameart.org/content/arcade-platformer-assets apple.png Jussi Viitala CC0 grass.png Jussi Viitala CC0 snake.png Jussi Viitala CC0 +check-mark.png Delapouite Creative Commons 3.0 https://game-icons.net Resized +circle.png Delapouite Creative Commons 3.0 https://game-icons.net Resized +plain-circle.png Delapouite Creative Commons 3.0 https://game-icons.net Resized diff --git a/examples/resources/images/check-mark.png b/examples/resources/images/check-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..345b7d4548539effe9e5618ab5b6f3a9dcfef345 GIT binary patch literal 6990 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 literal 0 HcmV?d00001 diff --git a/examples/resources/images/circle.png b/examples/resources/images/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce7c0d41e62641a59e2d9a3379a0d5c06aa7063 GIT binary patch literal 7452 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 aOU+UkA|f-@E@&ujn4OiQWwC{C^#1|4)~PK3 literal 0 HcmV?d00001 diff --git a/examples/resources/images/plain-circle.png b/examples/resources/images/plain-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..1e44ad9ba107c08239d9f10ad6c8389188f0c895 GIT binary patch literal 6567 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 success = RL_DrawLineBezier( Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thickness, Color color ) +> success = RL_DrawLineBezierQuad( Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thickness, Color color ) Draw line using quadratic bezier curves with a control point @@ -371,7 +371,7 @@ Draw ellipse - Success return true */ int lshapesDrawEllipse( lua_State *L ) { - if ( !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { + if ( !lua_istable( L, -4 ) || !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawEllipse( Vector2 center, float radiusH, float radiusV, Color color )" ); lua_pushboolean( L, false ); return 1; @@ -399,7 +399,7 @@ Draw ellipse outline - Success return true */ int lshapesDrawEllipseLines( lua_State *L ) { - if ( !lua_istable( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { + if ( !lua_istable( L, -4 ) || !lua_isnumber( L, -3 ) || !lua_isnumber( L, -2 ) || !lua_istable( L, -1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_DrawEllipseLines( Vector2 center, float radiusH, float radiusV, Color color )" ); lua_pushboolean( L, false ); return 1;