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

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

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

Этот параметр сообщает экранному буферу, что нужно отобразить  не только изменившиеся с последней отрисовки пиксели, а вообще все сразу. Обычно эта необходимость возникает при запуске скриптов, работающих с GPU напрямую в обход концепции экранного буфера. То есть в случае майноси практически никогда. Разве что для каких-нибудь старых игр или скринсейверов фича может быть востребованной...

 

В доке по workspace он указан, хотя и без пояснений. Могу добавить инфу на всякий, если нужно:

 

image.png.1dda246b8f4ed63840b2616fd6abb322.png

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


Ссылка на сообщение
Поделиться на других сайтах
В 04.03.2022 в 10:34, ECS сказал:

Этот параметр сообщает экранному буферу, что нужно отобразить  не только изменившиеся с последней отрисовки пиксели, а вообще все сразу. Обычно эта необходимость возникает при запуске скриптов, работающих с GPU напрямую в обход концепции экранного буфера. То есть в случае майноси практически никогда. Разве что для каких-нибудь старых игр или скринсейверов фича может быть востребованной...

 

В доке по workspace он указан, хотя и без пояснений. Могу добавить инфу на всякий, если нужно:

 

image.png.1dda246b8f4ed63840b2616fd6abb322.png

Теперь всё стало ясно, спасибо :gamer2:

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


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

Наткнулся на печальные баги :(

При добавлении строки меню (GUI.menu) в titledWindow окно превращается в обычный GUI.window, то есть исчезает вся шапка окна (заголовок окна, фон и три кнопки close, maximize...).

Таким же образом добавил менюшку в tabbedWindow - эффект похожий (тёмно-серая шапка с кнопками и вкладками обрезается на треть).

 

В обоих случаях меню, конечно, рисуется, но мне и шапка окна нужна. Что же делать? :o

 

Вот скрины: https://imgur.com/a/8kFBjXq

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


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

Наткнулся на печальные баги

Печальные баги - это, видимо, GUI.menu(1, 1, ...) вместо GUI.menu(1, 2, ...)? Ты же сам расположил менюху на Y = 1, где уже чиллит титловая строка. Разумеется, менюха ее перекрыла

 

На всякий случай уточню, что гуйка работает с заранее известными координатами и размерами всех объектов, ничего не рассчитывая автоматически без ведома кодера - это не WPF/UWP с адаптивной версткой, т.к. ресурсы компов люто лимитированы. Исключения, конечно, есть в виде всяких GUI.layout или GUI.table, но это капля в море. Поэтому любая смена позиции или ресайз виджетов требует ручной обработки

 

А, и еще кое-что: GUI.titledWindow tabbedWindow и иже с ними - просто шаблоны, которые создаются буквально в 10 строчек кода на основе базового объекта окна GUI.window, но с учётом твоих личных нужд. В них попросту заранее выставлены нужные координаты и подогнаны размеры, ничего более

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


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

Печальные баги - это, видимо, GUI.menu(1, 2, ...) вместо GUI.menu(1, 1, ...)? Ты же сам расположил менюху на Y = 1, где уже чиллит титловая строка. Разумеется, менюха ее перекрыла

 

На всякий случай уточню, что гуйка работает с заранее известными координатами и размерами всех объектов, ничего не рассчитывая автоматически без ведома кодера - это не WPF/UWP с адаптивной версткой, т.к. ресурсы компов люто лимитированы. Исключения, конечно, есть в виде всяких GUI.layout или GUI.table, но это капля в море. Поэтому любая смена позиции или ресайз виджетов требует ручной обработки

 

А, и еще кое-что: GUI.titledWindow tabbedWindow и иже с ними - просто шаблоны, которые создаются буквально в 10 строчек кода на основе базового объекта окна GUI.window, но с учётом твоих личных нужд. В них попросту заранее выставлены нужные координаты и подогнаны размеры, ничего более

Какое облегчение, я уж думал версия для OpenOS настолько несовершенна :DD

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


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

Мне нужно нарисовать текст(не статический) размером 1\3 высоты экрана. Как бы это лучше всего реализовать? Есть идея построчно рисовать ASCII символами, но решил спросить тут. Должны быть варианты получше.

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

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


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

Мне нужно нарисовать текст размером 1\3 высоты экрана. Как бы это лучше всего реализовать? Есть идея построчно рисовать ASCI символами, но решил спросить тут. Должны быть варианты получше.

local event = require("event")
local unicode = require("unicode")
local component = require("component")

local screen = component.screen
local gpu = component.gpu

-- Отображаемый текст
local text = "Hehe u cute"

-- Разрешение по высоте, на основе которого будет подобрана "идеальная" ширина
-- Т.к. строка всего одна, она как раз займет 1/3 высоты экрана
local height = 3

-- Получаем компоновку мульти-блочного экрана и его пиксельную пропорцию
-- Инфа по формуле, если интересно: https://computercraft.ru/topic/2413-kak-ubrat-chyornye-polosy-po-krayam-ekrana-opencomputers/
local aspectWidth, aspectHeight = screen.getAspectRatio()
local proportion = 2 * (16 * aspectWidth - 4.5) / (16 * aspectHeight - 4.5)

-- Рассчитываем разрешение по ширине на основе высоты и пропорции
local width = math.floor(height * proportion)

-- Чистим экран
gpu.setResolution(width, height)
gpu.setBackground(0x220000)
gpu.setForeground(0xFFFFFF)
gpu.fill(1, 1, width, height, " ")

-- Рисуем текст по центру
gpu.set(math.ceil(width / 2 - unicode.len(text) / 2), math.ceil(height / 2), text)

-- Ждем интерактива от юзера
while event.pull() ~= "touch" do

end

image.png.fcce1065f7d99aa902b5420aacafb550.png 

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


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

@ECS спасибо за ответ. My bad я не до конца написал что хочу. Большой текст должен находиться на одном экране с текстом поменьше. В центре что то вроде счетчика и сбоку кнопочки и обычный текст. https://prnt.sc/-4Lfi8jY5bSP

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

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


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

@ECS спасибо за ответ. My bad я не до конца написал что хочу. Большой текст должен находиться на одном экране с текстом поменьше. В центре что то вроде счетчика и сбоку кнопочки и обычный текст. https://prnt.sc/-4Lfi8jY5bSP

Зараза! Ну, тогда только ручная растеризация символов, да. Я от недалекого ума эту фичу напрямую через двумерные таблички реализовал. Может, у тебя получится более грамотное решение

 

https://github.com/IgorTimofeev/MineOS/blob/master/Libraries/BigLetters.lua

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


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

Приветствую @ECS , похоже что пастбин забанил Ваш установщик библиотек.
Мне был необходим GUI для пары экспериментов, но похоже что простого способа его установки сейчас нет?
Pastebin.com - Not Found (#404)

image.png.40172859f1641cdc939b76b0a395c624.png

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


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

Приветствую @ECS , похоже что пастбин забанил Ваш установщик библиотек.
Мне был необходим GUI для пары экспериментов, но похоже что простого способа его установки сейчас нет?
Pastebin.com - Not Found (#404)

image.png.40172859f1641cdc939b76b0a395c624.png

вродеб всём что осталось только тут: https://github.com/IgorTimofeev/GUI

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


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Bumer_32 сказал:

вродеб всём что осталось только тут: https://github.com/IgorTimofeev/GUI

Я брал с текущей разработки, не со старых ресурсов. Буквально по той же самой ссылке которой посвящена данная тема GUI/README.md at 0fadb161469d404d477dd9babfdc9a5aa42ff203 · IgorTimofeev/GUI · GitHub
image.png.b3b2de90dc4ed725e2e54c5e023c07a1.png
пастбинский инстайлер, ставящий все зависимости вместе с самой библиотекой, недоступен. а поскольку я тут делаю очередной интерфейс взаимодействующий с апплайтом и мне требуется поставить несколько разных систем, мне необходим простой способ установки gui, со всеми зависимостями сразу

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


Ссылка на сообщение
Поделиться на других сайтах
В 12.02.2024 в 04:07, Zigo сказал:

похоже что пастбин забанил Ваш установщик библиотек

Да, пару лет назад снесли аккаунт. Исходников инсталлера нет, библиотека забыта, саппорта не будет, репозиторий в архиве, писать заново лень. Так что придётся самому

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


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

А как сейчас этой либой и смежными ей можно воспользоваться без установки MineOs? Попросил чатик, он мне написал простенький скрипт чтобы скачать все файлы на комп:
Чета типо этого

Скрытый текст

local internet = require("internet")
local filesystem = require("filesystem")

-- Базовый URL репозитория
local baseURL = "https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Libraries/"
-- Список файлов для загрузки
local files = {
    "Base64.lua",
    "BigLetters.lua",
    "Bit32.lua",
    "Color.lua",
    "Component.lua",
    "Compressor.lua",
    "Event.lua",
    "Filesystem.lua",
    "GUI.lua",
    "Image.lua",
    "Internet.lua",
    "JSON.lua",
    "Keyboard.lua",
    "Network.lua",
    "Number.lua",
    "Paths.lua",
    "SHA-256.lua",
    "Screen.lua",
    "Sides.lua",
    "System.lua",
    "Text.lua",
    "Vector.lua",
    "XML.lua"
}

-- Целевая директория для сохранения библиотек
local targetDir = "/lib/"

-- Функция для загрузки файла
local function downloadFile(url, path)
    local handle, err = internet.request(url)
    if not handle then
        io.stderr:write("Ошибка подключения: " .. (err or "неизвестная ошибка") .. "\n")
        return false
    end

    local file, err = io.open(path, "wb")
    if not file then
        io.stderr:write("Ошибка создания файла: " .. (err or "неизвестная ошибка") .. "\n")
        return false
    end

    for chunk in handle do
        file:write(chunk)
    end

    file:close()
    return true
end

-- Создание целевой директории, если она не существует
if not filesystem.isDirectory(targetDir) then
    filesystem.makeDirectory(targetDir)
end

-- Загрузка файлов
for _, file in ipairs(files) do
    local url = baseURL .. file
    local path = targetDir .. file
    print("Загрузка " .. file .. " из " .. url)
    if downloadFile(url, path) then
        print("Файл успешно сохранён: " .. path)
    else
        print("Не удалось загрузить: " .. file)
    end
end

print("Загрузка завершена. Библиотеки сохранены в " .. targetDir)

 

После установки я попробовал запустить простенькую программу:
 

Скрытый текст

local component = require("component")
local event = require("event")
local gpu = component.gpu
local GUI = require("GUI")

-- Создаем графическое окно
local workspace = GUI.workspace()

-- Создаем главный контейнер
local mainContainer = workspace:addChild(GUI.container(1, 1, gpu.getResolution()))

-- Заголовок
mainContainer:addChild(GUI.label(1, 1, mainContainer.width, 3, 0xFFFFFF, "Простой Калькулятор"))
    :setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)

-- Поля для ввода чисел
local input1 = mainContainer:addChild(GUI.input(10, 5, 20, 3, 0xFFFFFF, 0x000000, 0xAAAAAA, 0xFFFFFF, 0x000000, "", "Число 1"))
local input2 = mainContainer:addChild(GUI.input(10, 9, 20, 3, 0xFFFFFF, 0x000000, 0xAAAAAA, 0xFFFFFF, 0x000000, "", "Число 2"))

-- Место для результата
local resultLabel = mainContainer:addChild(GUI.label(10, 13, 30, 3, 0xFFFFFF, "Результат: -"))

-- Кнопка для выполнения сложения
local addButton = mainContainer:addChild(GUI.button(10, 15, 20, 3, 0xAAAAAA, 0x000000, 0x888888, 0xFFFFFF, "Сложить"))

-- Обработчик события для кнопки
addButton.onTouch = function()
    local number1 = tonumber(input1.text)
    local number2 = tonumber(input2.text)

    if number1 and number2 then
        resultLabel.text = "Результат: " .. (number1 + number2)
    else
        resultLabel.text = "Ошибка ввода!"
    end
end

-- Запуск программы
workspace:draw()
workspace:start()

 

И при запуске у меня все время какие то ошибки в либах этих выскакивают:
/lib/Event.lua: attempt to index a nil value (global 'computer')
фиксишь его - потом еще в filesystem component nil, потом filesystem  мне комп ломает почему то тем что из за ошибок я файлы редактировать не могу.
Я не верю что на гите код какой то кривой лежит, но где меня чатик обманул?

upd:
я так понял не получится ничего потому что 

 :(

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

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


Ссылка на сообщение
Поделиться на других сайтах
В 08.11.2024 в 22:49, Teen_Romance сказал:

А как сейчас этой либой и смежными ей можно воспользоваться без установки MineOs? Попросил чатик, он мне написал простенький скрипт чтобы скачать все файлы на комп:
Чета типо этого

  Показать содержимое


local internet = require("internet")
local filesystem = require("filesystem")

-- Базовый URL репозитория
local baseURL = "https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Libraries/"
-- Список файлов для загрузки
local files = {
    "Base64.lua",
    "BigLetters.lua",
    "Bit32.lua",
    "Color.lua",
    "Component.lua",
    "Compressor.lua",
    "Event.lua",
    "Filesystem.lua",
    "GUI.lua",
    "Image.lua",
    "Internet.lua",
    "JSON.lua",
    "Keyboard.lua",
    "Network.lua",
    "Number.lua",
    "Paths.lua",
    "SHA-256.lua",
    "Screen.lua",
    "Sides.lua",
    "System.lua",
    "Text.lua",
    "Vector.lua",
    "XML.lua"
}

-- Целевая директория для сохранения библиотек
local targetDir = "/lib/"

-- Функция для загрузки файла
local function downloadFile(url, path)
    local handle, err = internet.request(url)
    if not handle then
        io.stderr:write("Ошибка подключения: " .. (err or "неизвестная ошибка") .. "\n")
        return false
    end

    local file, err = io.open(path, "wb")
    if not file then
        io.stderr:write("Ошибка создания файла: " .. (err or "неизвестная ошибка") .. "\n")
        return false
    end

    for chunk in handle do
        file:write(chunk)
    end

    file:close()
    return true
end

-- Создание целевой директории, если она не существует
if not filesystem.isDirectory(targetDir) then
    filesystem.makeDirectory(targetDir)
end

-- Загрузка файлов
for _, file in ipairs(files) do
    local url = baseURL .. file
    local path = targetDir .. file
    print("Загрузка " .. file .. " из " .. url)
    if downloadFile(url, path) then
        print("Файл успешно сохранён: " .. path)
    else
        print("Не удалось загрузить: " .. file)
    end
end

print("Загрузка завершена. Библиотеки сохранены в " .. targetDir)

 

После установки я попробовал запустить простенькую программу:
 

  Показать содержимое


local component = require("component")
local event = require("event")
local gpu = component.gpu
local GUI = require("GUI")

-- Создаем графическое окно
local workspace = GUI.workspace()

-- Создаем главный контейнер
local mainContainer = workspace:addChild(GUI.container(1, 1, gpu.getResolution()))

-- Заголовок
mainContainer:addChild(GUI.label(1, 1, mainContainer.width, 3, 0xFFFFFF, "Простой Калькулятор"))
    :setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)

-- Поля для ввода чисел
local input1 = mainContainer:addChild(GUI.input(10, 5, 20, 3, 0xFFFFFF, 0x000000, 0xAAAAAA, 0xFFFFFF, 0x000000, "", "Число 1"))
local input2 = mainContainer:addChild(GUI.input(10, 9, 20, 3, 0xFFFFFF, 0x000000, 0xAAAAAA, 0xFFFFFF, 0x000000, "", "Число 2"))

-- Место для результата
local resultLabel = mainContainer:addChild(GUI.label(10, 13, 30, 3, 0xFFFFFF, "Результат: -"))

-- Кнопка для выполнения сложения
local addButton = mainContainer:addChild(GUI.button(10, 15, 20, 3, 0xAAAAAA, 0x000000, 0x888888, 0xFFFFFF, "Сложить"))

-- Обработчик события для кнопки
addButton.onTouch = function()
    local number1 = tonumber(input1.text)
    local number2 = tonumber(input2.text)

    if number1 and number2 then
        resultLabel.text = "Результат: " .. (number1 + number2)
    else
        resultLabel.text = "Ошибка ввода!"
    end
end

-- Запуск программы
workspace:draw()
workspace:start()

 

И при запуске у меня все время какие то ошибки в либах этих выскакивают:
/lib/Event.lua: attempt to index a nil value (global 'computer')
фиксишь его - потом еще в filesystem component nil, потом filesystem  мне комп ломает почему то тем что из за ошибок я файлы редактировать не могу.
Я не верю что на гите код какой то кривой лежит, но где меня чатик обманул?

upd:
я так понял не получится ничего потому что 

 :(

Так в этой же теме ECS дал ссылку на корректную либу GUI.lua для OpenOS...
 

Вот доки (там же отроешь и исходники): https://github.com/IgorTimofeev/GUI/blob/0fadb161469d404d477dd9babfdc9a5aa42ff203/README.md

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

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


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

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

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

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

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

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

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

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

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


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