ECS Автор темы 1 905 Опубликовано: 23 марта, 2018 TextBox не совсем подходит под это Написал, что не подходит, а причину не указал. Почему не подходит-то? Лично я для тех же целей использую именно GUI.textBox с параметром autoWrap = true и autoHeight = true 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Koteyk0o 13 Опубликовано: 23 марта, 2018 Написал, что не подходит, а причину не указал. Почему не подходит-то? Лично я для тех же целей использую именно GUI.textBox с параметром autoWrap = true и autoHeight = true Действительно, сорри, как-то не обратил внимание на эти параметры Но вообще странно что виджеты не переносят текст при превышении ширины Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 905 Опубликовано: 23 марта, 2018 Но вообще странно что виджеты не переносят текст при превышении ширины Любую автоматизацию виджетов, потенциально ведущую к уменьшению производительности, я реализую в качестве опциональной и отключенной по умолчанию фичи. Надо - активируй по требованию, всего 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 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 542 Опубликовано: 23 марта, 2018 object.draw = function() for i = 1, #lines do buffer.text(objext.x, object.y + i - 1, color, lines[i]) end end Имхо, но как я помню такой код порождает новую функцию каждый вызов myTextBox. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 905 Опубликовано: 23 марта, 2018 Имхо, но как я помню такой код порождает новую функцию каждый вызов myTextBox. Да, безусловно. Надо было как-то схитрить и уместить эту фиговину в обещанные "10-20 строк", сэкономив одну на присваивание. Однако факта говнокодистости это не отменяет, нет-нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BlackBurn 0 Опубликовано: 23 апреля, 2018 (изменено) Пробую с помощью библиотеки сделать программу для отображения состояния моих реакторов. Не могу понять как перерисовывать содержимое экрана. У меня при включении программы оно отображает состояние реакторов на момент запуска программы, а потом, если выключить или включить реакторы, то на экране изменений нет. Как можно перерисовывать экран при изменении переменной 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 Изменено 23 апреля, 2018 пользователем BlackBurn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 542 Опубликовано: 23 апреля, 2018 (изменено) buffer.draw(true) как я помню принудительно рисует Изменено 23 апреля, 2018 пользователем NEO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 905 Опубликовано: 23 апреля, 2018 (изменено) Пробежимся по твоему скрипту: во-первых, что за странный бесконечный цикл в начале программы? 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++, где отступыЫыЫыЫ? Изменено 23 апреля, 2018 пользователем ECS 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lokin135 24 Опубликовано: 24 апреля, 2018 где отступыЫыЫыЫ Открою секрет... Товарищ BlackBurn кодит прямо на сайте пастебина (уже было сказано, что нужно кодить в ST3) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Koteyk0o 13 Опубликовано: 15 июня, 2018 У меня возник тут достаточно туповатый вопрос. Как обновить os.time в контейнере? как я понимаю os.time выводить надо через Label, я вывожу, label присвоен контейнеру допустим с названием Time, и я допустим обновляю этот контейнер раз в секунду через Time:drawOnScreen(), но изменений я не вижу, как я понимаю я делаю что-то не так, хотелось бы узнать как это можно реализовать. И еще у меня с либой две проблемы. На довольно старых версиях либы, когда еще GUI.list был GUI.tabBar все работало нормально, то-есть кликаешь на вкладку бара и все сразу переключается, сейчас же на вкладку надо нажимать по 2 раза, чтобы ее переключить. Баг или фича? И на мониторах с маленьким разрешением по ширине (моник третьего уровня, но из-за нужд он используется с разрешением 80*50) некоторые элементы не помещаются на экран. То-есть у GUI.alert кнопка OK уезжает куда-то за пределы экрана вправо, а палитра вообще только наполовину помещается на экран, вроде это все проблемы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 905 Опубликовано: 15 июня, 2018 и я допустим обновляю этот контейнер раз в секунду через 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) Результат: 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Koteyk0o 13 Опубликовано: 15 июня, 2018 Ты не обновляешь контейнер раз в секунду, а отрисовываешь его содержимое раз в секунду - это большая разница. Пожалуйста, читай документацию более вдумчиво: в ней подробно описана концепция либы. Точно, спасибо, я почему-то подумал что это отрисовка с обновлением Как говорится, ложь, говнокод и провокация. Скорее всего, ты сначала создаешь объекты под жирное разрешение экрана, затем изменяешь его на меньшее, позабыв изменить размеры объектов Просто при загрузке проги я изменял разрешение обращаясь напрямую к gpu, а оказывается надо обращаться к буферу. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kaka888 10 Опубликовано: 2 сентября, 2018 Порекомендовал один человек юзать эту либу для своих прог, я установил, а документации на русском нет(уже нет). Если знаете где её найти, то пж дайте ссылку. Или расскажите самое основное)) Заранее спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 905 Опубликовано: 2 сентября, 2018 Но... там же примеров кода больше, чем страниц в "Ордене Феникса"... И английский на уровне пятого класса... 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 905 Опубликовано: 2 сентября, 2018 Нашел среди старых коммитов русскую версию. Для ознакомления сойдет, но учти, что в последних версиях либы очень многое изменилось, поэтому претензий никаких не предъявлять: https://github.com/IgorTimofeev/MineOS/blob/00f19b2c460bc82a4ae5fc593c367f0fbfd5ccdd/Documentation/GUI.md 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kaka888 10 Опубликовано: 2 сентября, 2018 ECS, благодарю! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 2 сентября, 2018 Русские девелоперы сейчас поголовно ориентированы на запад. Се ля ви. =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ZloyApelsihchik 0 Опубликовано: 4 октября, 2018 Щито за программа на 2 скрине (слева направо) Какая-то прога для мониторинга? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 905 Опубликовано: 4 октября, 2018 40 минут назад, ZloyApelsihchik сказал: Щито за программа на 2 скрине (слева направо) Какая-то прога для мониторинга? Угу, для контроля ядер реакторов из драконика. Сырцов нет, ничего нет, любви нет, только пара скринов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ZloyApelsihchik 0 Опубликовано: 16 октября, 2018 04.10.2018 в 17:44, ECS сказал: Угу, для контроля ядер реакторов из драконика. Сырцов нет, ничего нет, любви нет, только пара скринов Ах, как жаль. Было бы интересно посмотреть на что-нибудь такое. (Тем более для меня подобные программы акутальны) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах