Код:
-- DreamShell NG lua script
-- GUI test v1.0 (input and button)
local font
local btn_img = {
normal = nil,
highlight = nil,
pressed = nil,
disabled = nil
}
-- Сделаем функцию для удобного рисования кнопок.
function NormalButton(name, x, y, font, img, text, func)
-- Создаем кнопку.
local button = SDL.GUI_ButtonCreate(name, x, y, 110, 60);
-- Создаем текст.
local label = SDL.GUI_LabelCreate("label", 0, 0, 110, 60, font, text);
-- Наносим текст на кнопку.
SDL.GUI_ButtonSetCaption(button, label);
SDL.GUI_ObjectDecRef(SDL.GUI_AnyToObject(label));
-- Присваиваем действие к кнопке(функцию которую она выполнит).
-- Эта функция есть только в поледнем обновлении.
local cb = SDL.GUI_LuaCallbackCreate(func);
SDL.GUI_ButtonSetClick(button, cb);
-- Устанавливаем картинки к кнопке для разных ее режимов.
SDL.GUI_ButtonSetNormalImage(button, img.normal);
SDL.GUI_ButtonSetHighlightImage(button, img.highlight);
SDL.GUI_ButtonSetPressedImage(button, img.pressed);
SDL.GUI_ButtonSetDisabledImage(button, img.disabled);
return button
end
local input
function GetInputText()
return SDL.GUI_TextEntryGetText(input);
end
function callbackf(param)
if param == "Exit" then
SDL.GUI_SetRunning(0);
SDL.GUI_Quit();
end
end
function CreateContents(x, y, w, h)
-- Создаем панель(невидимую) на которой будем рисовать.
local box = SDL.GUI_PanelCreate("box", x, y, w, h);
-- Рисуем форму для ввода текста.
input = SDL.GUI_TextEntryCreate("button", 20, 305, 200, 30, font, 32);
-- Устанавливаем в форме текст.
SDL.GUI_TextEntrySetText(input, "Exit");
-- Добавляем нашу форму в панель.
SDL.GUI_ContainerAdd(box, input);
-- Рисуем кнопку с помощью нашей функции.
local button = NormalButton("TestButton", 260, 350, font, btn_img, "OK", "callbackf(GetInputText())");
SDL.GUI_ContainerAdd(box, button);
return box;
end
function Init_gui(w, h)
-- Берем экран GUI.
local screen = SDL.GUI_GetScreen();
-- Загружаем шрифт.
print("Loading font...")
font = SDL.GUI_FontLoadTrueType("/cd/fonts/comic.ttf", 18);
-- Загружаем фоновую картинку.
print("Loading background...")
local background = SDL.GUI_SurfaceLoad("/cd/image/back/water.jpg");
-- Загружаем картинки для нашей кнопки.
print("Loading button images...")
btn_img.normal = SDL.GUI_SurfaceLoad("/cd/image/gui/buttons/normal/normal.png");
btn_img.highlight = SDL.GUI_SurfaceLoad("/cd/image/gui/buttons/normal/highlight.png");
btn_img.pressed = SDL.GUI_SurfaceLoad("/cd/image/gui/buttons/normal/pressed.png");
btn_img.disabled = SDL.GUI_SurfaceLoad("/cd/image/gui/buttons/normal/disabled.png");
-- Проверяем, загрузили ли мы нужные ресурсы.
if font == nil then return 0 end
if background == nil then return 0 end
-- И так далее :)
print("Creating content...")
-- Устанавливаем фон.
SDL.GUI_ScreenSetBackground(screen, background);
-- Создаем наше творение.
local mainpage = CreateContents(0,0,w,h);
SDL.GUI_ScreenSetContents(screen, mainpage);
SDL.GUI_ObjectDecRef(SDL.GUI_AnyToObject(mainpage));
font = 0;
return 1;
end
function LoadUpdate(fn)
local f = KOS.fs_open(fn, KOS.O_RDONLY);
if f < 0 then return 0 end
KOS.fs_close(f);
DS.ds_exec_one(string.format("vmcp -tf %s /ram/ds_update.klz", fn));
DS.ds_exec_one("gz -d /ram/ds_update.klz /ram/ds_update.klf");
DS.ds_exec_one("module -open DSUpdate /ram/ds_update.klf");
DS.ds_exec_one("rm /ram/ds_update.klz");
DS.ds_exec_one("rm /ram/ds_update.klf");
return 1;
end
-- Если играет музыка, остановим ее, иначе лаганет :)
DS.ds_exec_one("ogg stop");
-- Загружаем модуль последних обновлений
-- (если вы зами его не загружали до этого)
if LoadUpdate("/vmu/a1/DSUPDATE.KLZ") == 0 then
print("Can't open latest DreamShell update module.")
print("This script cannot run without update.")
return
end
-- Запускаем
if Init_gui(640, 480) then
-- Закрываем графику DreamShell
DS.ds_draw_shutdown();
-- Устанавливаем режим GUI
DS.conio_set_mode(3, 3);
-- Loop
print("Run GUI API...")
SDL.GUI_Run();
-- Возвращаем режим
DS.conio_set_mode(1, 1);
print("GUI API is shutting down.")
-- Возвращаем графику DreamShell
DS.ds_draw_init();
print("Welcome to back in DreamShell console :)")
end