Перейти к содержимому


Фотография

Библиотека пользовательского интерфейса "GUI"

GUI интерфейс виджеты документация

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 51

#31 Оффлайн   Nifon

Nifon
  • Пользователи
  • Сообщений: 6
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 23 Январь 2018 - 10:21

Изучаю вашу библиотечку, помогите решить проблему.  Кнопкой вызывается "попап"   с кнопкой для его закрытия. По нажатию на выход  попап не удаляется с поля полностью, а отходит как бы на задний план под все слои. как полностью удалять объекты?

notAnimatedButton20 = windowButtons:addChild(GUI.button(3, 22, 18, 1, rgb2hex(224,80,226), rgb2hex(0,0,0), 0x880000, 0xFFFFFF, "Поиск скрытых"))
notAnimatedButton20.animated = false
notAnimatedButton20.switchMode = true
notAnimatedButton20.onTouch = function()

local container = mainContainer:addChild(GUI.container(1, 1, mainContainer.width, mainContainer.height))
local backend = container:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, rgb2hex(0,0,0)))
local popupContainer = container:addChild(GUI.container(math.ceil((mainContainer.width/2)-((mainContainer.width/2)/2)), math.ceil((mainContainer.height/2)-((mainContainer.height/2)/2)), mainContainer.width/2, mainContainer.height/2))
local popup = popupContainer:addChild(GUI.panel(1, 1, popupContainer.width, popupContainer.height, rgb2hex(255,255,255)))


local buttonExit = popupContainer:addChild(GUI.button(1, 1, 18, 1, rgb2hex(224,80,226), rgb2hex(0,0,0), 0x880000, 0xFFFFFF, "выход"))
buttonExit.onTouch = function()

container:delete()
mainContainer:draw()
buffer.draw(true)
end

mainContainer:draw()
buffer.draw(true)

end


#32 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 23 Январь 2018 - 17:53

По нажатию на выход  попап не удаляется с поля полностью, а отходит как бы на задний план под все слои. как полностью удалять объекты?

 

Не понял, что значит "отходит как бы на задний план". При вызове :delete() элемент полностью удаляется из своего родительского контейнера, и больше не отображается. Если этот объект более нигде не используется, он будет подтерт сборщиком мусора. В описанном же тобой примере объект, содержащийся в переменной container, хоть и удаляется, однако продолжает существовать в своей области видимости до конца работы программы, и если хочешь его удалить - присвой переменной значение nil. Ты это имел в виду? Полное удаление из оперативной памяти?

 

И еще один оч оч важный момент: форсированная отрисовка содержимого буфера через с аргументом true нужна лишь в тех случаях, когда на экране отрисовано нечто средствами прямого обращения к GPU, т.е. не учтенное в буфере. К примеру, если ты запускаешь софтину, работающую с буфером, напрямую из терминала OpenOS (работающего на "чистой" GPU), то будет разумно разово отрисовать содержимое буфера, чтобы не упустить некоторые мелкие детали.



#33 Оффлайн   Nifon

Nifon
  • Пользователи
  • Сообщений: 6
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 24 Январь 2018 - 07:29

Понял, спасибо



#34 Оффлайн   whiskas

whiskas
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0,79%
  • В игре: 5 час. 58 мин.

Награды

        

Отправлено 28 Январь 2018 - 16:46

не могу понять как сделать 2 разних контейнера на весь екран и кнопкой в одном контейнере активировать второй


Сообщение отредактировал whiskas: 28 Январь 2018 - 17:35


#35 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 28 Январь 2018 - 17:12

не могу понять как сделать 2 разних контейнера на весь екран и кнопкой в одном контейнере активировать второй
local GUI = require("GUI")
local buffer = require("doubleBuffering")

-----------------------------------------------------

-- Создаем главный полноэкранный контейнер для обработки событий и добавляем в него фоновую панель
local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))

-- Добавляем в главный контейнер еще один контейнер, будем именовать его "первым". Добавляем в первый контейнер кнопку, позволяющую переключиться на второй контейнер
local container1 = mainContainer:addChild(GUI.container(1, 1, mainContainer.width, mainContainer.height))
local button1 = container1:addChild(GUI.button(3, 2, 30, 3, 0xFFFFFF, 0x0, 0xAAAAAA, 0x0, "Переключиться на 2"))

-- Аналогично добавляем второй контейнер, по умолчанию он будет скрыт
local container2 = mainContainer:addChild(GUI.container(1, 1, mainContainer.width, mainContainer.height))
local button2 = container2:addChild(GUI.button(3, 2, 30, 3, 0xFFFFFF, 0x0, 0xAAAAAA, 0x0, "Переключиться на 1"))
container2.hidden = true

-- Назначаем кнопкам функцию, переключающую скрытость контейнеров
button1.onTouch = function()
  container1.hidden, container2.hidden = not container1.hidden, not container2.hidden
  mainContainer:draw()
  buffer.draw()
end

button2.onTouch = button1.onTouch

-----------------------------------------------------

mainContainer:draw()
buffer.draw(true)
mainContainer:startEventHandling()


#36 Оффлайн   whiskas

whiskas
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0,79%
  • В игре: 5 час. 58 мин.

Награды

        

Отправлено 28 Январь 2018 - 17:35

local GUI = require("GUI")
local buffer = require("doubleBuffering")

-----------------------------------------------------

-- Создаем главный полноэкранный контейнер для обработки событий и добавляем в него фоновую панель
local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))

-- Добавляем в главный контейнер еще один контейнер, будем именовать его "первым". Добавляем в первый контейнер кнопку, позволяющую переключиться на второй контейнер
local container1 = mainContainer:addChild(GUI.container(1, 1, mainContainer.width, mainContainer.height))
local button1 = container1:addChild(GUI.button(3, 2, 30, 3, 0xFFFFFF, 0x0, 0xAAAAAA, 0x0, "Переключиться на 2"))

-- Аналогично добавляем второй контейнер, по умолчанию он будет скрыт
local container2 = mainContainer:addChild(GUI.container(1, 1, mainContainer.width, mainContainer.height))
local button2 = container2:addChild(GUI.button(3, 2, 30, 3, 0xFFFFFF, 0x0, 0xAAAAAA, 0x0, "Переключиться на 1"))
container2.hidden = true

-- Назначаем кнопкам функцию, переключающую скрытость контейнеров
button1.onTouch = function()
  container1.hidden, container2.hidden = not container1.hidden, not container2.hidden
  mainContainer:draw()
  buffer.draw()
end

button2.onTouch = button1.onTouch

-----------------------------------------------------

mainContainer:draw()
buffer.draw(true)
mainContainer:startEventHandling()

спс а ник того кто нажал как получить?



#37 Оффлайн   whiskas

whiskas
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0,79%
  • В игре: 5 час. 58 мин.

Награды

        

Отправлено 28 Январь 2018 - 17:43

уже нашел)



#38 Оффлайн   Koteyk0o

Koteyk0o
  • Пользователи
  • Сообщений: 47
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 09 Февраль 2018 - 15:57

Никаких улучшений графика не планируется? Чтобы поддерживал отрицательные и положительные значения одновременно, типо поделить ось Y на 2 половины, или динамическое обновление графика по времени.

И еще, как можно заставить график обновляться динамически грубо говоря.

У меня просто по сети приходят значения, которые должны быть в графике, а получается график обновляется только при обновлении страницы с графиком


Сообщение отредактировал Koteyk0o: 09 Февраль 2018 - 15:57


#39 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 09 Февраль 2018 - 17:10

Никаких улучшений графика не планируется?

 

Не-а, модуль графика писал не я, а у автора никаких иных пожеланий к нему нет. Если напишешь более функциональный вариант - кидай пулл реквест на гит, буду рад смержить. К слову, хоть оси статично расположены по левому и нижнему краям объекта, отрицательные значения он вполне поддерживает:

 

5AxtBgL.png?1

 

А что касается обновления - объект графика имеет таблицу values, в которую ты можешь в реальном времени вставлять необходимые значения X и Y, а после всех манипуляций вызывать методы mainContainer:draw(); buffer.draw() для отображения результата на экране. То бишь, получил по сети нужную инфу - закинул ее в таблицу графика - отрисовал. Разумеется, библиотека никакой отсебятины делать не станет: когда ты ей скажешь перерисовать графон, тогда он и перерисуется, в этом ее фишечка. 


Сообщение отредактировал ECS: 09 Февраль 2018 - 17:22

  • Alex и Koteyk0o это нравится

#40 Оффлайн   Koteyk0o

Koteyk0o
  • Пользователи
  • Сообщений: 47
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 23 Март 2018 - 16:59

Идея

Сделать перенос текста в виджете Label/Text по превышению кол-во символов по ширине

То-есть если ширина виджета 50 пикселей, и текст не помещается в первую строку то текст начинает переносится

 

Хотя может конечно я не знаю, может это реализовано, но в документации ничего не нашел

TextBox не совсем подходит под это, ибо  допустим если надо сделать описание какой-то кнопки под этой кнопкой, то приходится лепить несколько лейблов ибо текст просто не помещается


Сообщение отредактировал Koteyk0o: 23 Март 2018 - 17:01


#41 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 23 Март 2018 - 17:52

TextBox не совсем подходит под это

Написал, что не подходит, а причину не указал. Почему не подходит-то? Лично я для тех же целей использую именно GUI.textBox с параметром autoWrap = true и autoHeight = true


  • Koteyk0o это нравится

#42 Оффлайн   Koteyk0o

Koteyk0o
  • Пользователи
  • Сообщений: 47
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 23 Март 2018 - 18:22

Написал, что не подходит, а причину не указал. Почему не подходит-то? Лично я для тех же целей использую именно GUI.textBox с параметром autoWrap = true и autoHeight = true

Действительно, сорри, как-то не обратил внимание на эти параметры

Но вообще странно что виджеты не переносят текст при превышении ширины



#43 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 23 Март 2018 - 19:41

Но вообще странно что виджеты не переносят текст при превышении ширины

 
Любую автоматизацию виджетов, потенциально ведущую к уменьшению производительности, я реализую в качестве опциональной и отключенной по умолчанию фичи. Надо - активируй по требованию, всего 12 буковок в аргументы написать, ерунда. А если оч оч лень писать или чем-то не устраивают стандартные виджеты - создай собственный, это буквально 10-20 строк кода:

local function myTextBox(x, y, width, color, text)
  local lines = string.wrap({text}, width)
  local object = GUI.object(x, y, width, #lines)

  object.draw = function()
    for i = 1, #lines do
      buffer.text(objext.x, object.y + i - 1, color, lines[i])
    end
  end

  return object
end

  • Koteyk0o это нравится

#44 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 748
  • Уровень сигнала: 4,82%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 23 Март 2018 - 21:44

  object.draw = function()
    for i = 1, #lines do
      buffer.text(objext.x, object.y + i - 1, color, lines[i])
    end
  end

 

Имхо, но как я помню такой код порождает новую функцию каждый вызов myTextBox.



#45 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 23 Март 2018 - 23:43

Имхо, но как я помню такой код порождает новую функцию каждый вызов myTextBox.

 

Да, безусловно. Надо было как-то схитрить и уместить эту фиговину в обещанные "10-20 строк", сэкономив одну на присваивание. Однако факта говнокодистости это не отменяет, нет-нет



#46 Оффлайн   BlackBurn

BlackBurn
  • Пользователи
  • Сообщений: 1
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 23 Апрель 2018 - 12:35

Пробую с помощью библиотеки сделать программу для отображения состояния моих реакторов. Не могу понять как перерисовывать содержимое экрана. У меня при включении программы оно отображает состояние реакторов на момент запуска программы, а потом, если выключить или включить реакторы, то на экране изменений нет. Как можно перерисовывать экран при изменении переменной color?

local com = require("component")
local GUI = require("GUI")
local g = com.gpu;
local p = com.proxy;
local mainContainer = GUI.fullScreenContainer()
local clr_main = 0x000FF
local buffer = require("doubleBuffering")


while true do

local adresses ={
[1] = com.get("872"),
[2] = com.get("9bd"),
[3] = com.get("03b"),
[4] = com.get("69a"),
[5] = com.get("a27"),
[6] = com.get("8ef"),
[7] = com.get("844"),
[8] = com.get("4ad"),
[9] = com.get("dbb"),
[10] = com.get("550"),
[11] = com.get("43f"),
[12] = com.get("ba6"),
[13] = com.get("d7b"),
[14] = com.get("bcf"),
[15] = com.get("a93"),
[16] = com.get("f92"),
[17] = com.get("2db"),
[18] = com.get("6cd")
}
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D, 0.4))local layout = mainContainer:addChild(GUI.layout(1, 1, mainContainer.width, mainContainer.height, 7, 10))
--
local function GetComponentsReactors(adressesComponents)
	local proxys = {}
	for i = 1, #adressesComponents do
		proxys[i] = p(adressesComponents[i])
	end
	return proxys
end

local reactors = GetComponentsReactors(adresses)

for i = 1, #reactors do
	if reactors[i].producesEnergy() then
		color = true
	end
end
local color = color and 0x008000 or 0xFF0000
--Разметка
layout:setCellPosition(1, 1, layout:addChild(GUI.text(1, 1, clr_main, "№")))
layout:setCellPosition(2, 1, layout:addChild(GUI.text(1, 1, clr_main, "Блок №1")))
layout:setCellPosition(3, 1, layout:addChild(GUI.text(1, 1, clr_main, "Блок №2")))
layout:setCellPosition(4, 1, layout:addChild(GUI.text(1, 1, clr_main, "Блок №3")))
layout:setCellPosition(5, 1, layout:addChild(GUI.text(1, 1, clr_main, "Блок №4")))
layout:setCellPosition(6, 1, layout:addChild(GUI.text(1, 1, clr_main, "Блок №5")))
layout:setCellPosition(7, 1, layout:addChild(GUI.text(1, 1, clr_main, "Блок №6")))
--Group #1
layout:setCellPosition(2, 2, layout:addChild(GUI.text(1, 1, color, "Реактор 1")))
layout:setCellPosition(2, 3, layout:addChild(GUI.text(1, 1, color, "Реактор 2")))
layout:setCellPosition(2, 4, layout:addChild(GUI.text(1, 1, color, "Реактор 3")))
layout:setCellPosition(2, 5, layout:addChild(GUI.text(1, 1, color, "Реактор 4")))
layout:setCellPosition(2, 6, layout:addChild(GUI.text(1, 1, color, "Реактор 5")))
layout:setCellPosition(2, 7, layout:addChild(GUI.text(1, 1, color, "Реактор 6")))
layout:setCellPosition(2, 8, layout:addChild(GUI.text(1, 1, color, "Реактор 7")))
layout:setCellPosition(2, 9, layout:addChild(GUI.text(1, 1, color, "Реактор 8")))
layout:setCellPosition(2, 10, layout:addChild(GUI.text(1, 1, color, "Реактор 9")))
--Group #2
layout:setCellPosition(3, 2, layout:addChild(GUI.text(1, 1, color, "Реактор 1")))
layout:setCellPosition(3, 3, layout:addChild(GUI.text(1, 1, color, "Реактор 2")))
layout:setCellPosition(3, 4, layout:addChild(GUI.text(1, 1, color, "Реактор 3")))
layout:setCellPosition(3, 5, layout:addChild(GUI.text(1, 1, color, "Реактор 4")))
layout:setCellPosition(3, 6, layout:addChild(GUI.text(1, 1, color, "Реактор 5")))
layout:setCellPosition(3, 7, layout:addChild(GUI.text(1, 1, color, "Реактор 6")))
layout:setCellPosition(3, 8, layout:addChild(GUI.text(1, 1, color, "Реактор 7")))
layout:setCellPosition(3, 9, layout:addChild(GUI.text(1, 1, color, "Реактор 8")))
layout:setCellPosition(3, 10, layout:addChild(GUI.text(1, 1, color, "Реактор 9")))


------------------------------------------------------------------------------
mainContainer:drawOnScreen(true)
mainContainer:startEventHandling()
end 

Сообщение отредактировал BlackBurn: 23 Апрель 2018 - 12:36


#47 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 748
  • Уровень сигнала: 4,82%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 23 Апрель 2018 - 17:41

buffer.draw(true)

как я помню принудительно рисует


Сообщение отредактировал NEO: 23 Апрель 2018 - 17:42


#48 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 23 Апрель 2018 - 18:15

Пробежимся по твоему скрипту: во-первых, что за странный бесконечный цикл в начале программы?

while true do
  local adresses = {
  ...

Метод :startEventHandling() автоматически обрабатывает все события бесконечно вплоть до завершения программы. Зачем нужен while true do? Нипанятна.
 
Во-вторых, почему ты заносишь адреса компонентов реакторов вручную, да еще и по их аббревиатурам? Почему бы не использовать автоматическое получение proxy?

local reactors = {}
for address in component.list("reactor") do
  table.insert(reactors, component.proxy(address))
end

Если это сделано с какой-то определенной целью, например, ради работы с небольшой группой реакторов из большого множества, то прошу прощения.
 
В-третьих, почему бы не использовать циклы для создания виджетов? Неужели самому не лень копипастить тонну однотипного кода?

-- Разметка
layout:setCellPosition(1, 1, layout:addChild(GUI.text(1, 1, clr_main, "№")))
for i = 2, 7 do
  layout:setCellPosition(i, 1, layout:addChild(GUI.text(1, 1, clr_main, "№" .. (i - 1))))
end

-- Заполняем Layout начиная со 2 колонки и 2 столбца
local column, row, counter = 2, 2, 1
for address in component.list("reactor") do
  -- Добавляем виджет
  local widget = layout:setCellPosition(column, row, layout:addChild(GUI.text(1, 1, 0x0, "Реактор " .. counter)))
  -- Присваиваем виджету ссылку на proxy компонента реактора
  widget.reactorProxy = component.proxy(address)
  
  row, counter = row + 1, counter + 1
  if row > 10 then
    column, row, counter = column + 1, 2, 1
  end
end

В-четвертых, разумеется, изменений на экране у тебя нет. Как программа поймет, что состояние реакторов изменилось? Откуда она знает, что ты от нее хочешь? Накодь соответствующий функционал и наслаждайся. А если требуется обновлять температуру реакторов периодически, то используй нечто подобное:

-- Создаем обработчик событий главного контейнера
mainContainer.eventHandler = function(mainContainer, object, eventData)
  -- Если события нет, то следует обновить состояние реакторов и отрисовать изменения на экране
  if not eventData[1] then
    -- Перебираем все виджеты Layout начиная с 9 (все предыдущие - это чисто информация)
    for i = 9, #layout.children do
      -- Задаем им нужный цвет
      layout.children[i].color = layout.children[i].reactorProxy.producesEnergy() and 0xFF0000 or 0x00FF00
    end
    -- Отрисовываем изменения на экране
    mainContainer:drawOnScreen()
  end
end

-- События пуллятся раз в 1 секунду по аналогии с computer.pullSignal(timeout)
mainContainer:startEventHandling(1)

Насчет отрисовки содержимого контейнера на экран - тут вообще все просто. Это основа основ, присутствующая в каждом примере кода в документации к либе:

mainContainer:drawOnScreen()

И наконец, где отступы? Ну рили, 2018 год на дворе, эпоха Sublime/Atom/Notepad++, где отступыЫыЫыЫ?


Сообщение отредактировал ECS: 23 Апрель 2018 - 23:17

  • Totoro, eu_tomat и lokin135 это нравится

#49 Оффлайн   lokin135

lokin135
  • Пользователи
  • Сообщений: 52
  • Уровень сигнала: 88,38%
  • В игре: 667 час. 39 мин.
  • ГородПсков

Награды

           

Отправлено 24 Апрель 2018 - 16:34

где отступыЫыЫыЫ

Открою секрет... Товарищ BlackBurn кодит прямо на сайте пастебина :D (уже было сказано, что нужно кодить в ST3)



#50 Оффлайн   Koteyk0o

Koteyk0o
  • Пользователи
  • Сообщений: 47
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 15 Июнь 2018 - 15:45

У меня возник тут достаточно туповатый вопрос. Как обновить os.time в контейнере? как я понимаю os.time выводить надо через Label, я вывожу, label присвоен контейнеру допустим с названием Time, и я допустим обновляю этот контейнер раз в секунду через Time:drawOnScreen(), но изменений я не вижу, как я понимаю я делаю что-то не так, хотелось бы узнать как это можно реализовать. 

 

И еще у меня с либой две проблемы. На довольно старых версиях либы, когда еще GUI.list был GUI.tabBar все работало нормально, то-есть кликаешь на вкладку бара и все сразу переключается, сейчас же на вкладку надо нажимать по 2 раза, чтобы ее переключить. Баг или фича?

 

И на мониторах с маленьким разрешением по ширине (моник третьего уровня, но из-за нужд он используется с разрешением 80*50) некоторые элементы не помещаются на экран. То-есть у GUI.alert кнопка OK уезжает куда-то за пределы экрана вправо, а палитра вообще только наполовину помещается на экран, вроде это все проблемы



#51 Онлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 203
  • Уровень сигнала: 0,55%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 15 Июнь 2018 - 16:57

и я допустим обновляю этот контейнер раз в секунду через Time:drawOnScreen(), но изменений я не вижу

 
Ты не обновляешь контейнер раз в секунду, а отрисовываешь его содержимое раз в секунду - это большая разница. Пожалуйста, читай документацию более вдумчиво: в ней подробно описана концепция либы.
 
Для твоей задачи логичнее всего было бы создать пустой GUI.object вместо GUI.label и присвоить ему метод отрисовки, выводящий os.time на экран:

-- Создаем главный контейнер и добавляем в него темно-серую фоновую панель
local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))

-- Добавляем объект, выводящее в экранный буфер системное время каждую операцию отрисовки
mainContainer:addChild(GUI.object(3, 2, 1, 1)).draw = function(object)
  local text = os.date("%d %b %Y %H:%M:%S", os.time())
  object.width = #text
  buffer.drawText(object.x, object.y, 0xFFFFFF, text)
end

-- Разово отрисовываем содержимое главного контейнера и запускаем обработку событий с интервалом 0
mainContainer:drawOnScreen(true)
mainContainer:startEventHandling(0)

Однако если по каким-то причинам тебе требуется использовать именно GUI.label, то можно использовать обработчик событий, обновляющий текст лейбла при каждом событии:

-- Создаем главный контейнер и добавляем в него темно-серую фоновую панел
local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))

-- Добавляем лейбл и создаем функцию-обработчик событий, которая при каждом событии (даже отсутствующем) будет обновлять текст лейбла и отрисовывать изменения на экране
local label = mainContainer:addChild(GUI.label(3, 2, 10, 1, 0xFFFFFF, ""))
mainContainer.eventHandler = function()
  label.text = os.date("%d %b %Y %H:%M:%S", os.time())
  mainContainer:drawOnScreen()
end

-- Разово вызываем созданную функцию для обновления текста
mainContainer.eventHandler()
-- Запускаем обработку событий с интервалом 0
mainContainer:startEventHandling(0)

сейчас же на вкладку надо нажимать по 2 раза, чтобы ее переключить

 

Старая версия либы была лютым калом: она отрисовывала изменения в экранный буфер во время клика на вкладку, затем вызывала метод .onTouch, а после вновь отрисовывала изменения. Я счел этот подход неразумным, т.к. незачем нагружать компьютер без четких на то указаний. Короче, добавь строку mainContainer:drawOnScreen() в конец метода .onTouch для каждой вкладки - и все будет шоколадно

 

То-есть у GUI.alert кнопка OK уезжает куда-то за пределы экрана вправо, а палитра вообще только наполовину помещается на экран, вроде это все проблемы

 

Как говорится, ложь, говнокод и провокация. Скорее всего, ты сначала создаешь объекты под жирное разрешение экрана, затем изменяешь его на меньшее, позабыв изменить размеры объектов. Пруфскрипт:

-- Изменяем разрешение экрана на требуемое
buffer.setResolution(80, 50)

local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))

-- Добавляем селектор цвета
local colorSelector = mainContainer:addChild(GUI.colorSelector(3, 2, 30, 3, 0xFF00FF, "Цвет"))
colorSelector.onColorSelected = function()
	GUI.alert("Ты выбрал новый цвет")
end

mainContainer:drawOnScreen(true)
mainContainer:startEventHandling(0)

Результат:

 

jq3SLx3.gif


  • Koteyk0o это нравится

#52 Оффлайн   Koteyk0o

Koteyk0o
  • Пользователи
  • Сообщений: 47
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 15 Июнь 2018 - 17:24

Ты не обновляешь контейнер раз в секунду, а отрисовываешь его содержимое раз в секунду - это большая разница. Пожалуйста, читай документацию более вдумчиво: в ней подробно описана концепция либы.

Точно, спасибо, я почему-то подумал что это отрисовка с обновлением

 

Как говорится, ложь, говнокод и провокация. Скорее всего, ты сначала создаешь объекты под жирное разрешение экрана, затем изменяешь его на меньшее, позабыв изменить размеры объектов

Просто при загрузке проги я изменял разрешение обращаясь напрямую к gpu, а оказывается надо обращаться к буферу. Спасибо







Темы с аналогичным тегами GUI, интерфейс, виджеты, документация

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных