Compare commits

...

63 commits

Author SHA1 Message Date
Kevin Harrison
5336818494 Fix #62 2025-02-10 19:32:28 -05:00
Kevin Harrison
8d092eefa4 Update Nuklear version to latest 2023-08-27 11:37:31 -04:00
Kevin Harrison
1b8058071e Add key repeat to example 2023-08-27 11:35:54 -04:00
Kevin Harrison
829dc151c0 Replace global lua_State with local arguments 2023-08-27 11:27:51 -04:00
Kevin Harrison
e9be4aa952
Merge pull request #53 from MikuAuahDark/msvc
MSVC tweaks
2020-05-08 14:42:25 -04:00
Kevin Harrison
018aaf60a0 Prevent crash due to not returning value from layout_template_end 2020-05-08 14:41:31 -04:00
Miku AuahDark
0347818eca
Add MSVC build instructions. 2020-05-08 16:57:15 +08:00
Miku AuahDark
640a50532b
MSVC tweaks 2020-05-07 20:44:21 +08:00
Kevin Harrison
9ba37e4e4a
Merge pull request #51 from yannicka/patch-1
Update Nuklear repo URL in README
2020-04-25 17:40:54 -04:00
Yannick A
7491ab58b2
Update Nuklear repo URL in README 2020-04-25 23:35:58 +02:00
Kevin Harrison
d1cfcf2a47
Merge pull request #49 from megagrump/master
Fix typo in nk_love_style_push_progress
2020-04-14 17:44:24 -04:00
Grump
d41e9d1875 fix typo: cusor -> cursor 2020-04-14 09:27:36 +02:00
Kevin Harrison
efc53612bf
Merge pull request #44 from jyscao/readme_update
Add Guix build instruction in README
2019-12-20 09:39:16 -05:00
Jethro Cao
09cdd09716 Add Guix build instruction in README 2019-12-20 17:22:20 +07:00
Kevin Harrison
fef4e00a60
Merge pull request #43 from jyscao/cmake-update
Add install target
2019-12-04 13:04:43 -05:00
Jethro Cao
f33c94db66 Add install target
* this allows `$ make install` to also execute successfully
* without changing the output location of nuklear.so
2019-12-05 00:40:24 +07:00
Kevin Harrison
213be47f91
Merge pull request #42 from jyscao/nuklear-repo-update
Update Nuklear repo URL
2019-12-02 11:03:05 -05:00
Jethro Cao
f7ab5085f1 Update Nuklear repo URL 2019-12-02 14:37:05 +07:00
Kevin Harrison
0cca218ac7 Add support for *GetScroll and *SetScroll for windows, groups, and popups 2019-10-17 19:40:43 -04:00
Kevin Harrison
ccfb6ec005
Merge pull request #41 from ax-jason/patch-1
Scissor example
2019-10-17 19:24:51 -04:00
jason
b3af181896 Keep parent scissor setting 2019-10-17 19:20:44 -04:00
jason
05dfdb5c34
Scissor example
Scissor button example
2019-10-17 13:55:42 +08:00
Kevin Harrison
bf89bf9f08 Update build script to support more distros 2019-04-06 15:42:03 -04:00
Kevin Harrison
be9b57393a Expand Linux build instructions to cover more distros 2019-04-06 15:35:57 -04:00
Kevin Harrison
d463002a97 Fix build scripts and instructions for Linux builds 2019-04-05 17:24:48 -04:00
Kevin Harrison
0d14e1c2cf Update draw example: use colors in [0,1] instead of [0,255] 2019-02-08 12:54:19 -05:00
Kevin Harrison
2fd70e6062 Merge branch 'mouse-presses' of github.com:keharriso/love-nuklear 2019-01-03 13:11:12 -05:00
Kevin Harrison
de05b2595c Allow ui:style* outside of frameBegin/frameEnd 2019-01-03 12:40:11 -05:00
Kevin Harrison
8d081e50e6 Add presses parameter to ui:mousepressed and ui:mousereleased 2018-12-26 13:19:11 -05:00
Kevin Harrison
3254a42992
Extremely minor README update 2018-12-20 15:16:44 -05:00
Kevin Harrison
901c47fe2c Simplify build instructions for Linux 2018-12-19 12:15:07 -05:00
Kevin Harrison
f652c1936f Fix build instructions for Linux 2018-12-19 12:02:05 -05:00
Kevin Harrison
206f937e6e Add ui:style 2018-12-18 14:36:13 -05:00
Kevin Harrison
5255830af4
Merge pull request #32 from megagrump/nk_tree_state
Support for nk_tree_state_push/pop
2018-12-18 13:42:55 -05:00
Kevin Harrison
75da1af2b6
Fix nk_love_tree_state_push by making the image argument optional 2018-12-18 13:41:41 -05:00
Kevin Harrison
08abd141ce
Merge pull request #33 from megagrump/canvas-image
Canvas support for nk_love_image
2018-12-18 12:38:02 -05:00
Grump
a7991c524e added Canvas support 2018-12-18 15:51:08 +01:00
Grump
42ca8ed3c0 added support for nk_tree_state 2018-12-18 15:18:44 +01:00
Kevin Harrison
976ff9f63b Add closure alternatives to begin/end pairs 2018-12-16 17:15:17 -05:00
Kevin Harrison
bb3ffeb957 Add template layout and allow manual edit focus/unfocus 2018-12-15 13:36:43 -05:00
Kevin Harrison
752eacec7c Fix tooltip transparency 2018-12-14 17:32:56 -05:00
Kevin Harrison
8f7926039b Add Quad support for images 2018-12-14 14:46:02 -05:00
Kevin Harrison
06114619e6 Remove unnecessary code from luaopen_nuklear 2018-12-13 20:38:38 -05:00
Kevin Harrison
a3d532378b Allow proper 1-pixel width lines (#22) 2018-12-13 20:14:57 -05:00
Kevin Harrison
dfeed19486 Update README.md to use nuklear.newUI 2018-12-13 18:36:55 -05:00
Kevin Harrison
d73fde8fb1 Add section header comments 2018-12-13 17:49:02 -05:00
Kevin Harrison
d7ed3d0fb7 Update nuklear to 181cfd8 2018-12-13 17:15:03 -05:00
Kevin Harrison
569591e6eb Add button to transform example 2018-12-13 16:03:52 -05:00
Kevin Harrison
2880f0532a Merge master 2018-12-13 14:37:12 -05:00
Kevin Harrison
d4f4980ae8 Incorporate changes from master 2018-12-13 14:29:32 -05:00
Kevin Harrison
4d001728a0
Add proper build instructions to README.md 2018-06-29 15:32:06 -04:00
Kevin Harrison
c09651b655
Merge pull request #23 from mgerhardy/fixes
Fixed warnings and removed unused methods and global vars
2018-04-30 18:59:08 -04:00
Kevin Harrison
4b844d6341
Merge branch 'master' into fixes 2018-04-30 18:58:28 -04:00
Kevin Harrison
36b788c05a
Merge pull request #26 from jamestn529/master
Change color scale to 0 - 1.0
2018-04-30 18:41:58 -04:00
James Nelson
d8234fcc1c Change color scale from 0 - 255 to 0 - 1.0 2018-04-18 14:23:09 -06:00
Martin Gerhardy
b51de073da Fixed warnings and removed unused methods and global vars 2018-01-05 17:05:36 +01:00
Kevin Harrison
26f05c82e4 Allow per-context transformations (#9) 2016-12-29 23:20:11 -05:00
Kevin Harrison
8b5482e74f Fix frameBegin to use correct context 2016-12-20 15:48:07 -05:00
Kevin Harrison
47128fed66 Allow multiple contexts to persist at once 2016-12-19 22:27:42 -05:00
Kevin Harrison
c2fefb0601 Improve error handling 2016-12-19 13:19:42 -05:00
Kevin Harrison
8aa93de803 Replace layout_ratios and points with single floats array 2016-12-18 20:08:51 -05:00
Kevin Harrison
1d86aa51f4 Replace spaces with tabs 2016-12-17 10:37:35 -05:00
Kevin Harrison
47a7a6044d Add drawing and input functions (#8)
* nk.widgetHasMousePressed
* nk.widgetHasMouseReleased
* nk.widgetIsMousePressed
* nk.widgetIsMouseReleased
* nk.line
* nk.curve
* nk.polygon
* nk.circle
* nk.ellipse
* nk.arc
* nk.rectMultiColor
* nk.scissor
* nk.image
* nk.text
* nk.inputHasMousePressed
* nk.inputHasMouseReleased
* nk.inputIsMousePressed
* nk.inputIsMouseReleased
* nk.inputWasHovered
* nk.inputIsHovered
2016-12-16 21:59:32 -05:00
22 changed files with 3378 additions and 1996 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
build/

2
.gitmodules vendored
View file

@ -1,3 +1,3 @@
[submodule "src/nuklear"] [submodule "src/nuklear"]
path = src/nuklear path = src/nuklear
url = https://github.com/vurtun/nuklear.git url = https://github.com/Immediate-Mode-UI/Nuklear.git

View file

@ -24,4 +24,14 @@ TARGET_LINK_LIBRARIES(
${LUA_LIBRARIES} ${LUA_LIBRARIES}
) )
IF(MSVC)
TARGET_COMPILE_DEFINITIONS(${LIB_NAME} PRIVATE LUA_BUILD_AS_DLL)
endif(MSVC)
SET_TARGET_PROPERTIES("${LIB_NAME}" PROPERTIES PREFIX "") SET_TARGET_PROPERTIES("${LIB_NAME}" PROPERTIES PREFIX "")
IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
SET(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}" CACHE PATH "..." FORCE)
ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
INSTALL(TARGETS "${LIB_NAME}" DESTINATION .)

122
README.md
View file

@ -1,6 +1,6 @@
# LÖVE-Nuklear # LÖVE-Nuklear
[Nuklear](https://github.com/vurtun/nuklear) module for the [LÖVE](https://love2d.org/) game engine. [Nuklear](https://github.com/Immediate-Mode-UI/Nuklear) module for the [LÖVE](https://love2d.org/) game engine.
Provides a lightweight immediate mode GUI for LÖVE games. Provides a lightweight immediate mode GUI for LÖVE games.
@ -8,81 +8,145 @@ Provides a lightweight immediate mode GUI for LÖVE games.
```lua ```lua
-- Simple UI example. -- Simple UI example.
local nk = require 'nuklear' local nuklear = require 'nuklear'
local ui
function love.load() function love.load()
nk.init() ui = nuklear.newUI()
end end
local combo = {value = 1, items = {'A', 'B', 'C'}} local combo = {value = 1, items = {'A', 'B', 'C'}}
function love.update(dt) function love.update(dt)
nk.frameBegin() ui:frameBegin()
if nk.windowBegin('Simple Example', 100, 100, 200, 160, if ui:windowBegin('Simple Example', 100, 100, 200, 160,
'border', 'title', 'movable') then 'border', 'title', 'movable') then
nk.layoutRow('dynamic', 30, 1) ui:layoutRow('dynamic', 30, 1)
nk.label('Hello, world!') ui:label('Hello, world!')
nk.layoutRow('dynamic', 30, 2) ui:layoutRow('dynamic', 30, 2)
nk.label('Combo box:') ui:label('Combo box:')
if nk.combobox(combo, combo.items) then if ui:combobox(combo, combo.items) then
print('Combo!', combo.items[combo.value]) print('Combo!', combo.items[combo.value])
end end
nk.layoutRow('dynamic', 30, 3) ui:layoutRow('dynamic', 30, 3)
nk.label('Buttons:') ui:label('Buttons:')
if nk.button('Sample') then if ui:button('Sample') then
print('Sample!') print('Sample!')
end end
if nk.button('Button') then if ui:button('Button') then
print('Button!') print('Button!')
end end
end end
nk.windowEnd() ui:windowEnd()
nk.frameEnd() ui:frameEnd()
end end
function love.draw() function love.draw()
nk.draw() ui:draw()
end end
function love.keypressed(key, scancode, isrepeat) function love.keypressed(key, scancode, isrepeat)
nk.keypressed(key, scancode, isrepeat) ui:keypressed(key, scancode, isrepeat)
end end
function love.keyreleased(key, scancode) function love.keyreleased(key, scancode)
nk.keyreleased(key, scancode) ui:keyreleased(key, scancode)
end end
function love.mousepressed(x, y, button, istouch) function love.mousepressed(x, y, button, istouch, presses)
nk.mousepressed(x, y, button, istouch) ui:mousepressed(x, y, button, istouch, presses)
end end
function love.mousereleased(x, y, button, istouch) function love.mousereleased(x, y, button, istouch, presses)
nk.mousereleased(x, y, button, istouch) ui:mousereleased(x, y, button, istouch, presses)
end end
function love.mousemoved(x, y, dx, dy, istouch) function love.mousemoved(x, y, dx, dy, istouch)
nk.mousemoved(x, y, dx, dy, istouch) ui:mousemoved(x, y, dx, dy, istouch)
end end
function love.textinput(text) function love.textinput(text)
nk.textinput(text) ui:textinput(text)
end end
function love.wheelmoved(x, y) function love.wheelmoved(x, y)
nk.wheelmoved(x, y) ui:wheelmoved(x, y)
end end
``` ```
## Building ## Building
Windows and Linux binaries are available for each [release](https://github.com/keharriso/love-nuklear/releases). Windows binaries are available for each [release](https://github.com/keharriso/love-nuklear/releases).
To build the library yourself, grab the code with: To build the library yourself, grab the code with:
```sh ```sh
$ git clone --recursive git@github.com:keharriso/love-nuklear.git $ git clone --recursive https://github.com/keharriso/love-nuklear.git
``` ```
Compile with CMake (I recommend using the MinGW generator on Windows). You'll need to tell CMake where to find the LuaJIT headers and binaries. The end result is a native Lua module. Next, you need to compile the code to a native Lua module.
### Compiling with CMake on Linux
1. First, ensure you have a C compiler and the `cmake` and `luajit` or `lua51-luajit` (for openSUSE) packages installed, as well as `libluajit-5.1-dev` (for Ubuntu/Debian), `luajit-devel` (for Fedora), or `lua51-luajit-devel` (for openSUSE) if your distro has one of these packages.
2. Create a new folder next to `love-nuklear` called `love-nuklear-build`.
3. Open a terminal inside `love-nuklear-build`.
4. Compile the library with
```sh
$ cmake -DCMAKE_BUILD_TYPE=Release ../love-nuklear
$ make
```
5. Locate `nuklear.so` in the build folder.
#### Via GNU Guix
LÖVE-Nuklear is also available as a [Guix](http://guix.gnu.org/) package, and can thus be directly downloaded and built via:
```
$ guix package --install love-nuklear
```
### Compiling with CMake and MinGW on Windows
1. Install [CMake](https://cmake.org/download/) and [MinGW](http://mingw.org/) or [MinGW-w64](https://mingw-w64.org/doku.php).
2. Download the source code for [LuaJIT](http://luajit.org/download.html).
3. Open a command window inside the LuaJIT folder (the one that contains "README").
4. Compile LuaJIT with
```sh
$ mingw32-make
```
5. Remember the path to `lua51.dll` inside the LuaJIT `src` folder.
6. Run the CMake GUI.
7. Click "Browse Source" at the top right, then select the `love-nuklear` folder.
8. Enter a path for the build folder. It should be separate from the source folder.
9. Press "Configure" at the bottom.
10. Select "MinGW Makefiles" from the generator drop list, then click "Finish".
11. You should receive an error. This is normal.
12. Open the LUA tree by clicking the triangle on the left.
13. Replace "LUA_INCLUDE_DIR-NOTFOUND" with the path to the LuaJIT `src` folder.
14. Replace "LUA_LIBRARY-NOTFOUND" with the path to `lua51.dll` inside the LuaJIT `src` folder.
15. Click "Generate" at the bottom.
16. Open a command window inside the build folder.
17. Compile with
```sh
$ mingw32-make
```
18. Locate `nuklear.dll` inside the build folder.
### Compiling with CMake and MSVC on Windows
1. Install [CMake](https://cmake.org/download/) and [Visual Studio](https://visualstudio.microsoft.com/).
Community or Express edition is sufficient.
2. Download the source code for [LuaJIT](http://luajit.org/download.html).
3. Open a Visual Studio Command Prompt (x86 or x64 depending on what architecture you need)
and set the current directory to the LuaJIT folder (the one that contains "README"). Also
remember this path.
4. At the VS Command Prompt, set your current directory to `src` then
execute `msvcbuild.bat`. This will create lua51.dll, lua51.lib, and luajit.exe
5. Now open new command prompt window inside the `love-nuklear` folder.
6. Type `set "LUA_DIR=<path to directory at step 3>"`
7. Then type `cmake -Bbuild -H. -A Win32 -DLUA_INCLUDE_DIR=%LUA_DIR%\src -DLUA_LIBRARY=%LUA_DIR%\src\lua51.lib -DCMAKE_INSTALL_PREFIX=%CD%\install`.
If you previously compile LuaJIT using x64 VS command prompt, replace `Win32` with `x64` at above command.
8. Then type `cmake --build build --config Release --target install` and you'll found `nuklear.dll` inside "install" folder.
## Documentation ## Documentation

View file

@ -11,7 +11,7 @@
find_path(LUA_INCLUDE_DIR luajit.h find_path(LUA_INCLUDE_DIR luajit.h
HINTS HINTS
ENV LUA_DIR ENV LUA_DIR
PATH_SUFFIXES include/luajit-2.0 include PATH_SUFFIXES include/luajit-2.0 include/luajit-2.1 include/luajit-5_1-2.1 include
PATHS PATHS
~/Library/Frameworks ~/Library/Frameworks
/Library/Frameworks /Library/Frameworks

View file

@ -1,7 +1,5 @@
-- Simple calculator example, adapted from the original nuklear demo. -- Simple calculator example, adapted from the original nuklear demo.
local nk = require 'nuklear'
local ops = {'+', '-', '*', '/'} local ops = {'+', '-', '*', '/'}
local a, b, op = '0' local a, b, op = '0'
@ -60,36 +58,36 @@ local function display()
return b or a return b or a
end end
return function () return function (ui)
if nk.windowBegin('Calculator', 50, 50, 180, 250, 'border', 'movable', 'title') then if ui:windowBegin('Calculator', 50, 50, 180, 250, 'border', 'movable', 'title') then
nk.layoutRow('dynamic', 35, 1) ui:layoutRow('dynamic', 35, 1)
nk.label(display(), 'right') ui:label(display(), 'right')
nk.layoutRow('dynamic', 35, 4) ui:layoutRow('dynamic', 35, 4)
for i=1,16 do for i=1,16 do
if i >= 13 and i < 16 then if i >= 13 and i < 16 then
if i == 13 then if i == 13 then
if nk.button('C') then if ui:button('C') then
clear() clear()
end end
if nk.button('0') then if ui:button('0') then
digit('0') digit('0')
end end
if nk.button('=') then if ui:button('=') then
equals() equals()
end end
end end
elseif i % 4 ~= 0 then elseif i % 4 ~= 0 then
local d = tostring(math.floor(i / 4) * 3 + (i % 4)) local d = tostring(math.floor(i / 4) * 3 + (i % 4))
if nk.button(d) then if ui:button(d) then
digit(d) digit(d)
end end
else else
local o = ops[math.floor(i / 4)] local o = ops[math.floor(i / 4)]
if nk.button(o) then if ui:button(o) then
operator(o) operator(o)
end end
end end
end end
end end
nk.windowEnd() ui:windowEnd()
end end

51
example/closure.lua Normal file
View file

@ -0,0 +1,51 @@
-- Show off the optional closure-oriented versions of basic functions
local function menu(ui)
ui:layoutRow('dynamic', 30, 2)
ui:menu('Menu A', nil, 100, 200, function ()
ui:layoutRow('dynamic', 30, 1)
if ui:menuItem('Item 1') then
print 'Closure: Item 1'
end
if ui:menuItem('Item 2') then
print 'Closure: Item 2'
end
end)
ui:menu('Menu B', nil, 100, 200, function ()
ui:layoutRow('dynamic', 30, 1)
if ui:menuItem('Item 3') then
print 'Closure: Item 3'
end
if ui:menuItem('Item 4') then
print 'Closure: Item 4'
end
end)
end
local comboText = 'Combo 1'
function combo(ui)
ui:layoutRow('dynamic', 30, 1)
if ui:comboboxItem('Combo 1') then
print 'Closure: Combo 1'
comboText = 'Combo 1'
end
if ui:comboboxItem('Combo 2') then
print 'Closure: Combo 2'
comboText = 'Combo 2'
end
if ui:comboboxItem('Combo 3') then
print 'Closure: Combo 3'
comboText = 'Combo 3'
end
end
local function window(ui)
ui:menubar(menu)
ui:layoutRow('dynamic', 30, 1)
ui:combobox(comboText, combo)
end
return function (ui)
ui:window('Closure', 200, 200, 150, 120, {'title', 'movable', 'border'}, window)
end

21
example/draw.lua Normal file
View file

@ -0,0 +1,21 @@
-- Demonstrate a number of custom drawing functions.
local img = love.graphics.newImage 'skin/button.png'
return function (ui)
if ui:windowBegin('Draw Example', 300, 300, 200, 200, 'title', 'movable', 'border') then
local x, y, w, h = ui:windowGetBounds()
love.graphics.setColor(1, 0, 0)
ui:line(x + 10, y + 40, x + 50, y + 40, x + 50, y + 80)
ui:curve(x + 50, y + 80, x + 80, y + 40, x + 100, y + 80, x + 80, y + 80)
ui:polygon('line', x + 100, y + 150, x + 60, y + 140, x + 70, y + 70)
ui:circle('line', x + 130, y + 140, 50)
ui:ellipse('fill', x + 30, y + 150, 20, 40)
ui:arc('fill', x + 150, y + 80, 40, 3 * math.pi / 2, 2 * math.pi);
ui:rectMultiColor(x + 95, y + 50, 50, 50, '#ff0000', '#00ff00', '#0000ff', '#000000')
love.graphics.setColor(1, 1, 1)
ui:image(img, x + 120, y + 120, 70, 50)
ui:text('DRAW TEXT', x + 15, y + 75, 100, 100)
end
ui:windowEnd()
end

View file

@ -1,53 +1,72 @@
-- Several simple examples. -- Several simple examples.
local nk = require 'nuklear' local nuklear = require 'nuklear'
local calculator = require 'calculator' local calculator = require 'calculator'
local closure = require 'closure'
local draw = require 'draw'
local overview = require 'overview' local overview = require 'overview'
local style = require 'style' local style = require 'style'
local skin = require 'skin' local skin = require 'skin'
local template = require 'template'
local transform = require 'transform'
local ui1, ui2
function love.load() function love.load()
nk.init() love.keyboard.setKeyRepeat(true)
ui1, ui2 = nuklear.newUI(), nuklear.newUI()
end end
function love.update(dt) function love.update(dt)
nk.frameBegin() ui1:frameBegin()
calculator() calculator(ui1)
style() style(ui1)
overview() closure(ui1)
skin() overview(ui1)
nk.frameEnd() draw(ui1)
template(ui1)
skin(ui1)
ui1:frameEnd()
ui2:frameBegin()
transform(ui2)
ui2:frameEnd()
end end
function love.draw() function love.draw()
nk.draw() ui1:draw()
ui2:draw()
love.graphics.print('Current FPS: '..tostring(love.timer.getFPS( )), 10, 10)
end
local function input(name, ...)
return ui2[name](ui2, ...) or ui1[name](ui1, ...)
end end
function love.keypressed(key, scancode, isrepeat) function love.keypressed(key, scancode, isrepeat)
nk.keypressed(key, scancode, isrepeat) input('keypressed', key, scancode, isrepeat)
end end
function love.keyreleased(key, scancode) function love.keyreleased(key, scancode)
nk.keyreleased(key, scancode) input('keyreleased', key, scancode)
end end
function love.mousepressed(x, y, button, istouch) function love.mousepressed(x, y, button, istouch, presses)
nk.mousepressed(x, y, button, istouch) input('mousepressed', x, y, button, istouch, presses)
end end
function love.mousereleased(x, y, button, istouch) function love.mousereleased(x, y, button, istouch, presses)
nk.mousereleased(x, y, button, istouch) input('mousereleased', x, y, button, istouch, presses)
end end
function love.mousemoved(x, y, dx, dy, istouch) function love.mousemoved(x, y, dx, dy, istouch)
nk.mousemoved(x, y, dx, dy, istouch) input('mousemoved', x, y, dx, dy, istouch)
end end
function love.textinput(text) function love.textinput(text)
nk.textinput(text) input('textinput', text)
end end
function love.wheelmoved(x, y) function love.wheelmoved(x, y)
nk.wheelmoved(x, y) input('wheelmoved', x, y)
end end

View file

@ -1,7 +1,5 @@
-- An overview of most of the supported widgets. -- An overview of most of the supported widgets.
local nk = require 'nuklear'
local checkA = {value = false} local checkA = {value = false}
local checkB = {value = true} local checkB = {value = true}
local radio = {value = 'A'} local radio = {value = 'A'}
@ -13,94 +11,108 @@ local colorPicker = {value = '#ff0000'}
local property = {value = 6} local property = {value = 6}
local edit = {value = 'Edit text'} local edit = {value = 'Edit text'}
local comboA = {value = 1, items = {'A', 'B', 'C'}} local comboA = {value = 1, items = {'A', 'B', 'C'}}
local scissorActive = false
return function () return function (ui)
if nk.windowBegin('Overview', 100, 100, 600, 450, 'border', 'movable', 'title') then if ui:windowBegin('Overview', 100, 100, 600, 450, 'border', 'movable', 'title') then
nk.menubarBegin() ui:menubarBegin()
nk.layoutRow('dynamic', 30, 1) ui:layoutRow('dynamic', 30, 1)
if nk.menuBegin('Menu', nil, 120, 90) then if ui:menuBegin('Menu', nil, 120, 90) then
nk.layoutRow('dynamic', 40, 1) ui:layoutRow('dynamic', 40, 1)
nk.menuItem('Item A') ui:menuItem('Item A')
nk.menuItem('Item B') ui:menuItem('Item B')
nk.menuItem('Item C') ui:menuItem('Item C')
nk.menuEnd() ui:menuEnd()
end end
nk.menubarEnd() ui:menubarEnd()
nk.layoutRow('dynamic', 400, 3) ui:layoutRow('dynamic', 375, 3)
nk.groupBegin('Group 1', 'border') if ui:groupBegin('Group 1', 'border') then
nk.layoutRow('dynamic', 30, 1) ui:layoutRow('dynamic', 30, 1)
nk.label('Left label') ui:label('Left label')
nk.label('Centered label', 'centered') ui:label('Centered label', 'centered')
nk.label('Right label', 'right') ui:label('Right label', 'right')
nk.label('Colored label', 'left', '#ff0000') ui:label('Colored label', 'left', '#ff0000')
if nk.treePush('tab', 'Tree Tab') then if ui:treePush('tab', 'Tree Tab') then
if nk.treePush('node', 'Tree Node 1') then if ui:treePush('node', 'Tree Node 1') then
nk.label('Label 1') ui:label('Label 1')
nk.treePop() ui:treePop()
end end
if nk.treePush('node', 'Tree Node 2') then if ui:treePush('node', 'Tree Node 2') then
nk.label('Label 2') ui:label('Label 2')
nk.treePop() ui:treePop()
end end
nk.treePop() ui:treePop()
end end
nk.spacing(1) ui:spacing(1)
if nk.button('Button') then if ui:button('Button') then
print('button pressed!') print('button pressed!')
end end
nk.spacing(1) ui:spacing(1)
nk.checkbox('Checkbox A', checkA) ui:checkbox('Checkbox A', checkA)
nk.checkbox('Checkbox B', checkB) ui:checkbox('Checkbox B', checkB)
nk.groupEnd() if ui:button('Scissor') then
nk.groupBegin('Group 2', 'border') scissorActive = not scissorActive
nk.layoutRow('dynamic', 30, 1) end
nk.label('Radio buttons:') ui:groupEnd()
nk.layoutRow('dynamic', 30, 3) end
nk.radio('A', radio) if ui:groupBegin('Group 2', 'border') then
nk.radio('B', radio) ui:layoutRow('dynamic', 30, 1)
nk.radio('C', radio) ui:label('Radio buttons:')
nk.layoutRow('dynamic', 30, 1) ui:layoutRow('dynamic', 30, 3)
nk.selectable('Selectable A', selectA) ui:radio('A', radio)
nk.selectable('Selectable B', selectB) ui:radio('B', radio)
nk.layoutRow('dynamic', 30, {.35, .65}) ui:radio('C', radio)
nk.label('Slider:') ui:layoutRow('dynamic', 30, 1)
nk.slider(0, slider, 1, 0.05) ui:selectable('Selectable A', selectA)
nk.label('Progress:') ui:selectable('Selectable B', selectB)
nk.progress(progress, 10, true) ui:layoutRow('dynamic', 30, {.35, .65})
nk.layoutRow('dynamic', 30, 2) ui:label('Slider:')
nk.spacing(2) ui:slider(0, slider, 1, 0.05)
nk.label('Color picker:') ui:label('Progress:')
nk.button(nil, colorPicker.value) ui:progress(progress, 10, true)
nk.layoutRow('dynamic', 90, 1) ui:layoutRow('dynamic', 30, 2)
nk.colorPicker(colorPicker) ui:spacing(2)
nk.groupEnd() ui:label('Color picker:')
nk.groupBegin('Group 3', 'border') ui:button(nil, colorPicker.value)
nk.layoutRow('dynamic', 30, 1) ui:layoutRow('dynamic', 90, 1)
nk.property('Property', 0, property, 10, 0.25, 0.05) ui:colorPicker(colorPicker)
nk.spacing(1) ui:groupEnd()
nk.label('Edit:') end
nk.layoutRow('dynamic', 90, 1) if ui:groupBegin('Group 3', 'border') then
nk.edit('box', edit) ui:layoutRow('dynamic', 30, 1)
nk.layoutRow('dynamic', 5, 1) ui:property('Property', 0, property, 10, 0.25, 0.05)
nk.spacing(1) ui:spacing(1)
nk.layoutRow('dynamic', 30, 1) ui:label('Edit:')
nk.label('Combobox:') ui:layoutRow('dynamic', 90, 1)
nk.combobox(comboA, comboA.items) ui:edit('box', edit)
nk.layoutRow('dynamic', 5, 1) ui:layoutRow('dynamic', 5, 1)
nk.spacing(1) ui:spacing(1)
nk.layoutRow('dynamic', 30, 1) ui:layoutRow('dynamic', 30, 1)
if nk.widgetIsHovered() then ui:label('Combobox:')
nk.tooltip('Test tooltip') ui:combobox(comboA, comboA.items)
ui:layoutRow('dynamic', 5, 1)
ui:spacing(1)
ui:layoutRow('dynamic', 30, 1)
if ui:widgetIsHovered() then
ui:tooltip('Test tooltip')
end end
local x, y, w, h = nk.widgetBounds() local x, y, w, h = ui:widgetBounds()
if nk.contextualBegin(100, 100, x, y, w, h) then if ui:contextualBegin(100, 100, x, y, w, h) then
nk.layoutRow('dynamic', 30, 1) ui:layoutRow('dynamic', 30, 1)
nk.contextualItem('Item A') ui:contextualItem('Item A')
nk.contextualItem('Item B') ui:contextualItem('Item B')
nk.contextualEnd() ui:contextualEnd()
end end
nk.label('Contextual (Right click me)') ui:label('Contextual (Right click me)')
nk.groupEnd() ui:groupEnd()
end
end
ui:windowEnd()
if(scissorActive) then
love.graphics.setScissor()
love.graphics.clear()
love.graphics.setScissor(130, 130, 500, 400)
else
love.graphics.setScissor()
end end
nk.windowEnd()
end end

View file

@ -1,28 +1,34 @@
local nk = require 'nuklear' -- Basic skinning example.
local windowHeader = love.graphics.newImage 'skin/window_header.png' local windowHeader = love.graphics.newImage 'skin/window_header.png'
local checkboxSkin = love.graphics.newImage 'skin/checkbox_false.png' local windowBody = love.graphics.newImage 'skin/window.png'
local checkboxCheck = love.graphics.newImage 'skin/checkbox_true.png' local checkboxTexture = love.graphics.newImage 'skin/checkbox.png'
local checkboxOff = {checkboxTexture, love.graphics.newQuad(0, 0, 51, 55, 58, 115)}
local checkboxOn = {checkboxTexture, love.graphics.newQuad(0, 55, 58, 60, 58, 115)}
local buttonTexture = love.graphics.newImage 'skin/button.png'
local buttonNormal = {buttonTexture, love.graphics.newQuad(0, 0, 69, 52, 69, 156)}
local buttonActive = {buttonTexture, love.graphics.newQuad(0, 52, 69, 52, 69, 156)}
local buttonHover = {buttonTexture, love.graphics.newQuad(0, 104, 69, 52, 69, 156)}
local style = { local style = {
['text'] = { ['text'] = {
['color'] = '#000000' ['color'] = '#000000'
}, },
['button'] = { ['button'] = {
['normal'] = love.graphics.newImage 'skin/button.png', ['normal'] = buttonNormal,
['hover'] = love.graphics.newImage 'skin/button_hover.png', ['hover'] = buttonHover,
['active'] = love.graphics.newImage 'skin/button_active.png', ['active'] = buttonActive,
['text background'] = '#00000000', ['text background'] = '#00000000',
['text normal'] = '#000000', ['text normal'] = '#000000',
['text hover'] = '#000000', ['text hover'] = '#000000',
['text active'] = '#ffffff' ['text active'] = '#ffffff'
}, },
['checkbox'] = { ['checkbox'] = {
['normal'] = checkboxSkin, ['normal'] = checkboxOff,
['hover'] = checkboxSkin, ['hover'] = checkboxOff,
['active'] = checkboxSkin, ['active'] = checkboxOff,
['cursor normal'] = checkboxCheck, ['cursor normal'] = checkboxOn,
['cursor hover'] = checkboxCheck, ['cursor hover'] = checkboxOn,
['text normal'] = '#000000', ['text normal'] = '#000000',
['text hover'] = '#000000', ['text hover'] = '#000000',
['text active'] = '#000000', ['text active'] = '#000000',
@ -38,25 +44,25 @@ local style = {
['label active'] = '#000000', ['label active'] = '#000000',
['label padding'] = {x = 10, y = 8} ['label padding'] = {x = 10, y = 8}
}, },
['fixed background'] = love.graphics.newImage 'skin/window.png', ['fixed background'] = windowBody,
['background'] = '#d3ceaa' ['background'] = '#d3ceaa'
} }
} }
local check = {value = false} local check = {value = false}
return function () return function (ui)
nk.stylePush(style) ui:stylePush(style)
if nk.windowBegin('Skin Example', 200, 200, 350, 200, 'title', 'movable') then if ui:windowBegin('Skin Example', 200, 200, 350, 200, 'title', 'movable') then
nk.layoutSpaceBegin('dynamic', 150, 3) ui:layoutSpaceBegin('dynamic', 150, 3)
nk.layoutSpacePush(0.14, 0.15, 0.72, 0.3) ui:layoutSpacePush(0.14, 0.15, 0.72, 0.3)
nk.label('Skin example! Styles can change skins, colors, padding, font, and more.', 'wrap') ui:label('Skin example! Styles can change skins, colors, padding, font, and more.', 'wrap')
nk.layoutSpacePush(0.2, 0.55, 0.2, 0.2) ui:layoutSpacePush(0.2, 0.55, 0.2, 0.2)
nk.button('Button') ui:button('Button')
nk.layoutSpacePush(0.55, 0.55, 0.3, 0.2) ui:layoutSpacePush(0.55, 0.55, 0.3, 0.2)
nk.checkbox('Checkbox', check) ui:checkbox('Checkbox', check)
nk.layoutSpaceEnd() ui:layoutSpaceEnd()
end end
nk.windowEnd() ui:windowEnd()
nk.stylePop() ui:stylePop()
end end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

BIN
example/skin/checkbox.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -1,6 +1,6 @@
-- Show off some of the styling options. -- Show off some of the styling options.
local nk = require 'nuklear' local nuklear = require "nuklear"
local colors = { local colors = {
['text'] = '#afafaf', ['text'] = '#afafaf',
@ -41,28 +41,29 @@ end
table.sort(colorNames) table.sort(colorNames)
return function () return function (ui)
nk.styleLoadColors(colors) ui:styleLoadColors(colors)
nk.windowBegin('Style', 400, 50, 350, 450, 'border', 'movable', 'title', 'scrollbar') if ui:windowBegin('Style', 400, 50, 350, 450, 'border', 'movable', 'title', 'scrollbar') then
nk.layoutRow('dynamic', 25, 2) ui:layoutRow('dynamic', 25, 2)
for _,name in ipairs(colorNames) do for _,name in ipairs(colorNames) do
nk.label(name..':') ui:label(name..':')
local color = colors[name] local color = colors[name]
if nk.comboboxBegin(nil, color, 200, 200) then if ui:comboboxBegin(nil, color, 200, 200) then
nk.layoutRow('dynamic', 90, 1) ui:layoutRow('dynamic', 90, 1)
color = nk.colorPicker(color) color = ui:colorPicker(color)
colors[name] = color colors[name] = color
local r, g, b = nk.colorParseRGBA(color) local r, g, b = nuklear.colorParseRGBA(color)
nk.layoutRow('dynamic', 25, {.25, .75}) ui:layoutRow('dynamic', 25, {.25, .75})
nk.label('R: '..r) ui:label('R: '..r)
r = nk.slider(0, r, 255, 1) r = ui:slider(0, r, 255, 1)
nk.label('G: '..g) ui:label('G: '..g)
g = nk.slider(0, g, 255, 1) g = ui:slider(0, g, 255, 1)
nk.label('B: '..b) ui:label('B: '..b)
b = nk.slider(0, b, 255, 1) b = ui:slider(0, b, 255, 1)
colors[name] = nk.colorRGBA(r, g, b) colors[name] = nuklear.colorRGBA(r, g, b)
nk.comboboxEnd() ui:comboboxEnd()
end end
end end
nk.windowEnd() end
ui:windowEnd()
end end

19
example/template.lua Normal file
View file

@ -0,0 +1,19 @@
-- Show off the template row layout
return function(ui)
if ui:windowBegin('Template Layout', 200, 100, 300, 200,
'title', 'border', 'movable', 'scalable') then
x, y, width, height = ui:windowGetContentRegion()
ui:layoutRow('dynamic', 40, 1)
ui:label('Scale me!');
ui:layoutTemplateBegin(height - 40)
ui:layoutTemplatePush('static', 75)
ui:layoutTemplatePush('dynamic')
ui:layoutTemplatePush('variable', 75)
ui:layoutTemplateEnd()
ui:button(nil, '#ff0000')
ui:button(nil, '#00ff00')
ui:button(nil, '#0000ff')
end
ui:windowEnd()
end

16
example/transform.lua Normal file
View file

@ -0,0 +1,16 @@
-- Apply transformations to a basic UI.
return function(ui)
local t = love.timer.getTime()
ui:translate(350 + 100 * math.cos(t / 4), 350 + 100 * math.sin(t / 4))
ui:rotate(t / 8)
ui:scale(1 + math.sin(t / 4) / 2, 1 + math.cos(t / 4) / 2)
ui:shear(math.cos(t / 8) / 4, math.sin(t / 8) / 4)
if ui:windowBegin('Transform', 0, 0, 200, 200, 'border', 'movable', 'title') then
ui:layoutRow('dynamic', 100, 1)
ui:label('You can apply transformations to the UI using ui:rotate, ui:scale, ui:shear, and ui:translate.', 'wrap')
ui:layoutRow('dynamic', 30, 1)
ui:button('Try and catch me!')
end
ui:windowEnd()
end

@ -1 +1 @@
Subproject commit ca1c9b3275cf8e31b01fcd61c4d5116f88d4e24d Subproject commit 614abce05b9455849bbf1519b7f86e53c78b04ab

File diff suppressed because it is too large Load diff