Перейти к публикации
Форум - ComputerCraft
ECS

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

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

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

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

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


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

 

 

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

 

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

 

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

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


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

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

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

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


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

 

 

не могу понять как сделать 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()

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


Ссылка на сообщение
Поделиться на других сайтах
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()

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

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


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

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
Никаких улучшений графика не планируется?

 

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

 

5AxtBgL.png?1

 

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

Изменено пользователем ECS
  • Like 2

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


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

Идея

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

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

 

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

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

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

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


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

 

 

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

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

  • Like 1

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


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

Написал, что не подходит, а причину не указал. Почему не подходит-то? Лично я для тех же целей использую именно 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
  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
  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
  • Like 3

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


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

 

 

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

Открою секрет... Товарищ 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

  • Like 1

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


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

 

 

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

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

 

 

 

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

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

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


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

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

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

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


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

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

  • Like 2

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


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

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

  • Like 1

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


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

ECS, благодарю!

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


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

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

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


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

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

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

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


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

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

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

 

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

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


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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×