Небольшой пример для рисования графических оболочек с помощью DreamShell GUI API.
Код:
-- DreamShell NG lua script
-- GUI test (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, data)
-- Создаем кнопку.
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(label);
-- Присваиваем действие к кнопке(функцию которую она выполнит).
-- local cb = SDL.GUI_CallbackCreate(func, nil, data);
-- SDL.GUI_ButtonSetClick(button, cb);
-- SDL.GUI_ObjectDecRef(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
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);
-- Рисуем форму для ввода текста.
local input = SDL.GUI_TextEntryCreate("button", 20, 305, 200, 30, font, 32);
-- Устанавливаем в форме текст.
SDL.GUI_TextEntrySetText(input, "Exit");
-- Добавляем нашу форму в панель.
SDL.GUI_ContainerAdd(box, input);
-- SDL.GUI_ObjectDecRef(input);
-- Рисуем кнопку с помощью нашей функции.
local button = NormalButton("TestButton", 260, 350, font, btn_img, "OK", callbackf, SDL.GUI_TextEntryGetText(input));
SDL.GUI_ContainerAdd(box, button);
-- SDL.GUI_ObjectDecRef(button);
return box;
end
function Init_gui(w, h)
-- Берем экран GUI.
local screen = SDL.GUI_GetScreen();
-- Загружаем шрифт.
font = SDL.GUI_FontLoadTrueType("/cd/fonts/comic.ttf", 18);
-- Загружаем фоновую картинку.
local background = SDL.GUI_SurfaceLoad("/cd/image/back/water.jpg");
-- Загружаем картинки для нашей кнопки.
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
-- И так далее :)
-- Устанавливаем фон.
SDL.GUI_ScreenSetBackground(screen, background);
-- SDL.GUI_ObjectDecRef(background);
-- Создаем наше творение.
local mainpage = CreateContents(0,0,w,h);
SDL.GUI_ScreenSetContents(screen, mainpage);
-- SDL.GUI_ObjectDecRef(mainpage);
-- SDL.GUI_ObjectDecRef(font);
font = 0;
return 1;
end
-- Закрываем графику DreamShell
DS.ds_draw_shutdown();
-- Устанавливаем режим GUI
DS.conio_set_mode(3, 3);
-- Если играет музыка, остановим ее, иначе лаганет :)
DS.ds_exec_one("ogg stop");
-- Запускаем
if Init_gui(640, 480) then
-- Loop
SDL.GUI_Run();
end
-- Возвращаем режим
DS.conio_set_mode(1, 1);
-- Возвращаем графику DreamShell
DS.ds_draw_init();
Функции которые находянся в коментарии, являются бажными:(
Там есть проблема с типами аргументов, как всегда млин я с этим сталкиваюсь когда внедряю функции Си в lua.
В принципе главной проблемой является то, что к кнопке не назначить callback функцию, а на DecRef пофиг. А кнопка без действий, это не кнопка:)
Похоже придется выпускать обновление:)А то это уже не первый косяк который я заметил:rolleyes:
Все остальные функции GUI должны работать, теоретически:)все проверить нехватает времени.