Components
Components
bookstore consists of the following files and modules
Photoshop files
library.psd

dialog.psd

table.psd

Solar2D components
App/bookTOC
├── App │ ├── bookFree │ ├── bookOne │ ├── bookTOC | ├── components | | ├── library | | ├── layers | | | ├── bg.lua | | | ├── bookFreeIcon.lua | | | ├── bookOneIcon.lua | | | ├── downloadBtn.lua | | | ├── purchaseBtn.lua | | | ├── restoreBtn.lua | | | ├── savedBtn.lua | | | └── savingTxt.lua | | ├── page | | | └── bookstore.lua ⭐️ | | └── index.lua ⭐️ | └── dialog | └── layers | ├── bg.lua | ├── bookIcon.lua | ├── downloadBtn.lua | ├── hideOverlayBtn.lua | ├── infoTxt.lua | ├── purchaseBtn.lua | ├── savedBtn.lua | ├── savingTxt.lua | └── inddx.lua │ ├── components ├── bookstore ├── controller ├── model ├── smc ├── view ├── index.lua └── model.lua ⭐️
bookstore component is defined in components.pages table. This calls bookstore.lua
App/bookTOC/scenes/library/index.lua
local sceneName = ... -- local scene = require('controller.scene').new(sceneName, { name = "library", components = { layers = { { bg ={ } }, { bookIcon ={ } }, ... ... }, audios = { }, groups = { }, timers = { }, variables = { }, pages = { "bookstore" } }, commands = { }, onInit = function(scene) print("onInit") end }) -- return scene
App/bookTOC/components/libary/pages/bookstore.lua
local _M = {} local bookstore = require("components.bookstore.index").new() -- function _M:init(UI) end -- function _M:create(UI) local sceneGroup = UI.scene.view local layers = UI.layers -- --for k, v in pairs(UI.props) do print(k, v) end bookstore:init(sceneGroup, UI.props) end -- function _M:didShow(UI) local layers = UI.layers bookstore:setSceneGroup(UI.scene.view) end -- -- function _M:toDispose(UI) bookstore:destory() end -- return _M
bookstore.lua calls components.bookstore.model
model
- move to App/
Please fill the bookstore model with values of each book
compoents/bookstore/index.lua
local M = {} -- local pageCommand = require("components.bookstore.controller.pageCommand") local model = require("components.bookstore.model.base") -- model.debug = true model.URL = "http://localhost:8080/bookshop/" -- model.URL = nil means simple IAP store without network download -- downloadBtn, savingTxt won'T be used. You don't need to create them. ---------- model.TOC = "bookTOC" model.LIBRARY_PAGES = {en = "scenes.library"} model.DIALOG_PAGES = {en = "scenes.dialog"} -- model.name = "catalog01" -- model.books = { bookFree = { name = "bookFree", versions = {}, titles = {en="bookOne"}, descriptions = {en="desc"}, isFree = true, isOnlineImg = true, isDownloadable = true, image = "App/bookFree/assets/images/page1/bg.png", productNames = {apple = "bookFree", google = "bookFree", amazon = "bookFree"}, }, bookOne = { name = "bookOne", versions = {}, titles = {en="bookOne"}, descriptions = {en="desc"}, isFree = false, isOnlineImg = true, -- true isDownloadable = true, -- true image = "App/bookOne/assets/images/page1/bg.png", productNames = {apple = "bookOne", google = "bookOne", amazon = "bookOne"}, } } -- model.purchaseAlertMessages = {en="Your purchase was successful"} model.restoreAlertMessages = {en="Your items are being restored"} model.downloadErrorMessages = {en="Check network alive to download the content"} model.descriptions = {en=""} model.titles = {en=""} -- model.gotoSceneEffect = "slideRight" model.showOverlayEffect = "slideBottom" -- M.new = function() return pageCommand.newBookstore(model) end -- M.model = model -- return M
debug
if true, IAPBadger is in debug mode.
URL
if book assets are downlodable, please set the server url
LIBRARY_PAGES
bookstore shows one of library page with lang value
DIALOG_PAGES
bookstore shows one of dialog with lang value
name
the name for IAP catalog. You may create another model.lua with a differnet name
books
name
versions
you can put language codes for multilingual books.
you may invent a new lang code for versions. For example, instead of language code, use blue, red, gree of colors as version
titles
descriptions
isFree
true or falase
isOnlineImg
if true, thumbnail image is loaded with the following given path in App folder
if false, from URL .."/"..image
image
thumbnail image path
productNames
if debug is false, productNames should be replaced with values of Apple store, Google play, Amazon store
view
You would like to customize the looks
marker

updateText

components/bookstore/view/marker.lua
local M = {} -- function M.new (dst, group) print(dst, group) if dst.updateMark == nil then local obj = display.newCircle(0,0,4) obj.x = dst.x + dst.width/2 obj.y = dst.y - dst.height/2 obj:setFillColor(1,0,0) group:insert(obj) dst.updateMark = obj else dst.updateMark.alpha = 1 end end --- return M
components/bookstore/view/spinner.lua
local M = {}
--
function M.new (host)
local obj = {}
local spinner
obj.host = host
--
function obj:show(host)
if not spinner then
spinner = display.newGroup()
local hostName = host or obj.host or ""
--Place a progress spinner on screen and tell the user the app is contating the store
local spinnerBackground = display.newRect(0,0,360,600)
spinnerBackground:setFillColor(1,1,1,0.75)
--Spinner consumes all taps so the user cannot tap the purchase button twice
spinnerBackground:addEventListener("tap", function() return true end)
local spinnerText = display.newText("Contacting " .. hostName .. "...", 0, -20, native.systemFont, 18)
spinnerText:setFillColor(0,0,0)
--Add a little spinning rectangle
local spinnerRect = display.newRect(0, 0,35,35)
spinnerRect:setFillColor(0, 0)
spinnerRect:setStrokeColor(1,1,1)
spinnerRect.strokeWidth = 2
transition.to(spinnerRect, { time=4000, rotation=360, iterations=999999, transition=easing.inOutQuad})
--Create a group and add all these objects to it
spinner:insert(spinnerBackground)
spinner:insert(spinnerText)
spinner:insert(spinnerRect)
spinner.x, spinner.y = _W/2, _H/2
spinner.spinnerText = spinnerText
end
end
updateText
- startTime: the start time of a book download
- size: the size in progress
- bookSize:the total size of assets of a book
function obj:updateText() local percent = self.size/self.bookSize local sec = os.difftime( os.time(), self.startTime) local remain = math.floor(sec * (1.0/percent)) local time = os.date("*t", remain) self.spinnerText.text = math.floor(percent*100).." % (" ..self.size .."/" ..self.bookSize .." Mb) \n left " ..time.min..":"..time.sec end
controller
These functions are available for page&book navigation. You can set it for an event action.
- components/bookstore/controller/pageCommand.lua
- gotoTOC()
- showView(page, options)
- gotoSceneBook(book, page, version)
- gotoSceneNextBook(version)
- gotoScenePreviousBook(version)
- gotoScene(event, version)
- event = {target = {selectedPurchase= “bookOne”}}