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

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

Рекомендуемые сообщения

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

Любую автоматизацию виджетов, потенциально ведущую к уменьшению производительности, я реализую в качестве опциональной и отключенной по умолчанию фичи. Надо - активируй по требованию, всего 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  object.draw = function()
    for i = 1, #lines do
      buffer.text(objext.x, object.y + i - 1, color, lines[i])
    end
  end

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пробую с помощью библиотеки сделать программу для отображения состояния моих реакторов. Не могу понять как перерисовывать содержимое экрана. У меня при включении программы оно отображает состояние реакторов на момент запуска программы, а потом, если выключить или включить реакторы, то на экране изменений нет. Как можно перерисовывать экран при изменении переменной 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

buffer.draw(true)

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

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

и я допустим обновляю этот контейнер раз в секунду через 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

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

 

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Порекомендовал один человек юзать эту либу для своих прог, я установил, а документации на русском нет(уже нет). Если знаете где её найти, то пж дайте ссылку. Или расскажите самое основное))

Заранее спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Но... там же примеров кода больше, чем страниц в "Ордене Феникса"... И английский на уровне пятого класса...  :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нашел среди старых коммитов русскую версию. Для ознакомления сойдет, но учти, что в последних версиях либы очень многое изменилось, поэтому претензий никаких не предъявлять: https://github.com/IgorTimofeev/MineOS/blob/00f19b2c460bc82a4ae5fc593c367f0fbfd5ccdd/Documentation/GUI.md

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Русские девелоперы сейчас поголовно ориентированы на запад. Се ля ви. =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Щито за программа на 2 скрине (слева направо)

Какая-то прога для мониторинга? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
40 минут назад, ZloyApelsihchik сказал:

Щито за программа на 2 скрине (слева направо)

Какая-то прога для мониторинга? 

 

Угу, для контроля ядер реакторов из драконика. Сырцов нет, ничего нет, любви нет, только пара скринов

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
04.10.2018 в 17:44, ECS сказал:

 

Угу, для контроля ядер реакторов из драконика. Сырцов нет, ничего нет, любви нет, только пара скринов

Ах, как жаль. Было бы интересно посмотреть на что-нибудь такое.
(Тем более для меня подобные программы акутальны)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...