From 6367e662033bcde7f166599b1f894053f4806eff Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 22 Mar 2020 12:17:06 +0300 Subject: [PATCH] Update README --- README.md | 71 ++++++++++++++++------- docs_md/02-creating_custom_components.md | 10 ++-- media/input_binding.png | Bin 0 -> 22818 bytes 3 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 media/input_binding.png diff --git a/README.md b/README.md index 23f3ed8..9c8e7a4 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ + + [![](media/druid_logo.png)](https://insality.github.io/druid/) -[![GitHub release (latest by date)](https://img.shields.io/github/v/release/insality/druid)](https://github.com/Insality/druid/releases) - -**Druid** - powerful defold component UI library. Use basic druid components or make your own game-specific components to make amazing GUI in your games. +**Druid** - powerful defold component UI library. Use basic Druid components or make your own game-specific components to make amazing GUI in your games. ## Setup ### Dependency -You can use the druid extension in your own project by adding this project as a [Defold library dependency](https://www.defold.com/manuals/libraries/). Open your game.project file and in the dependencies field under project add: +You can use the **Druid** extension in your own project by adding this project as a [Defold library dependency](https://www.defold.com/manuals/libraries/). Open your game.project file and in the dependencies field under project add: > [https://github.com/Insality/druid/archive/master.zip](https://github.com/Insality/druid/archive/master.zip) @@ -18,24 +18,45 @@ Or point to the ZIP file of a [specific release](https://github.com/Insality/dr ### Code -Adjust druid settings, if needed: +Adjust **Druid** settings, if needed: ```lua local druid = require("druid.druid") -- Used for button component and custom components +-- Callback should play sound by name druid.set_sound_function(callback) -- Used for lang_text component +-- Callback should return localized string by locale id druid.set_text_function(callback) -- Used for change default druid style druid.set_default_style(your_style) ``` +### Input bindings + +For **Druid** to work requires next input bindings: + +- Mouse trigger - `mouse-button-1` -> `touch` _For basic input components_ +- Key trigger - `Backspace` -> `backspace` _For back_handler component_ +- Key trigger - `Back` -> `text` _For back_handler component, Android back button_ + +![](media/input_binding.png) + +### Input capturing + +By default, **Druid** will auto-capture input focus, if any input component will be created. So you don't need to call `msg.post(".", "acquire_input_focus)"` + +If you not need this behaviour, you can disable it by settings `druid.no_auto_input` field in _game.project_: +``` +[druid] +no_auto_input = 1 +``` ## Components -Druid provides next basic components: +**Druid** provides next basic components: - **Button** - Basic game button - **Text** - Wrap on text node with text size adjusting @@ -69,16 +90,24 @@ Druid provides next basic components: Full info see on _components.md_ -## Creating components +## Basic usage + +For using **Druid**, first you should create Druid instance to spawn components. Pass to new Druid instance main engine functions: *update*, *on_message* and *on_input* + +All **Druid** components as arguments can apply node name string, you can don't do `gui.get_node()` before + +All **Druid** and component methods calling with `:` like `self.druid:new_button()` -Any components creating via druid: ```lua local druid = require("druid.druid") +local function button_callback(self) + print("Button was clicked!") +end + local function init(self) self.druid = druid.new(self) - local button = self.druid:new_button(node_name, callback) - local text = self.druid:new_text(node_text_name) + self.druid:new_button("button_node_name", button_callback) end function update(self, dt) @@ -90,14 +119,14 @@ function on_message(self, message_id, message, sender) end function on_input(self, action_id, action) - self.druid:on_input(action_id, action) + return self.druid:on_input(action_id, action) end ``` ## Examples -See the [example folder](https://github.com/insality/druid/tree/develop/example/kenney) for examples of how to use Druid +See the [example folder](https://github.com/insality/druid/tree/develop/example/kenney) for examples of how to use **Druid** See the [druid-assets repository](https://github.com/insality/druid-assets) for examples of how to create custom components and styles @@ -106,13 +135,13 @@ Try the [HTML5 version](https://insality.github.io/druid/druid/) of the example ## Documentation -To learn druid better, read next documentation: -- Druid components -- Create custom components -- Druid asset store -- Druid Styles +To learn **Druid** better, read next documentation: +- [Druid components](https://insality.github.io/druid/topics/01-components.md.html) +- [Create custom components](https://insality.github.io/druid/topics/02-creating_custom_components.md.html) +- [Druid styles](https://insality.github.io/druid/topics/03-styles.md.html) +- [Druid asset store](https://insality.github.io/druid/topics/04-druid_assets.md.html) -Full druid documentation you can find here: +Full **Druid** documentation you can find here: https://insality.github.io/druid/ @@ -127,7 +156,7 @@ _Will fill later_ - Add on_layout_change support (to keep gui data between layout change) -- Add on_change_language support (call single function to update all druid instance) +- Add on_change_language support (call single function to update all Druid instance) - Better documentation and examples @@ -140,9 +169,11 @@ Original created by [AGulev](https://github.com/AGulev) Developed and supporting by [Insality](https://github.com/Insality) +Assets from [Kenney](http://www.kenney.nl/) + MIT License ## Issues and suggestions -If you have any issues, questions or suggestions please [create an issue](https://github.com/Insality/druid/issues) or contact me: [insality@gmail.com](mailto:insality@gmail.com) +If you have any issues, questions or suggestions please [create an issue](https://github.com/Insality/druid/issues) or contact me: [insality@gmail.com](mailto:insality@gmail.com) diff --git a/docs_md/02-creating_custom_components.md b/docs_md/02-creating_custom_components.md index 197a2f3..05d09fd 100644 --- a/docs_md/02-creating_custom_components.md +++ b/docs_md/02-creating_custom_components.md @@ -10,7 +10,7 @@ Basic custom component template looks like this: local const = require("druid.const") local component = require("druid.component") -local M = component.create("your_component") +local M = component.create("name_your_component") -- Component constructor function M.init(self, ...) @@ -67,7 +67,7 @@ There is next interests in druid: ## Best practice on custom components -On each component recomended describe component scheme in next way: +On each component recommended describe component scheme in next way: ```lua -- Component module @@ -76,9 +76,9 @@ local component = require("druid.component") local M = component.create("your_component") local SCHEME = { - ROOT = "/root", - ITEM = "/item", - TITLE = "/title" + ROOT = "root", + ITEM = "item", + TITLE = "title" } function M.init(self, template_name, node_table) diff --git a/media/input_binding.png b/media/input_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b68d6cdacbec2a4b74623859fd2e35a5908e90 GIT binary patch literal 22818 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