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

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

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

Хорошая либа. Удобная в использовании, красивая и шустрая. У меня тут есть вопрос. Извиняюсь, если он туп...

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

А, и еще проблема есть. При нажатии на кнопку пропадают все объекты из контейнера(он дочерний у основного). Баг или фича?)

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

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


Ссылка на сообщение
Поделиться на других сайтах
Первое: можно ли поменять цвет элементов контекстного меню?

 

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

 

2eThJLx.png?1

 

Поэтому все, что тебе требуется - это создать объект меню, изменить цвета по своему усмотрению и вызвать привычный метод menu:show(). К примеру, вот так можно создать непрозрачную серенькую менюшку:

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

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

local contextMenu = GUI.contextMenu(2, 2)

contextMenu:addItem("New")
contextMenu:addItem("Open")
contextMenu:addSeparator()
contextMenu:addItem("Save", true)
contextMenu:addItem("Save as")
contextMenu:addSeparator()
contextMenu:addItem("Close")

contextMenu.colors.default.background = 0x444444
contextMenu.colors.default.text = 0xFFFFFF
contextMenu.colors.separator = 0x999999
contextMenu.colors.transparency = nil

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

buffer.clear(0x2D2D2D)
buffer.draw(true)
contextMenu:show()

В результате получится что-то подобное:

 

DEaZwuD.png

 

При нажатии на кнопку пропадают все объекты из контейнера(он дочерний у основного)

 

Конкретизируй с примером кода, пожалуйста. Разумеется, это баг, который нужно срочно фиксить (при условии, что ты сам не делаешь что-то некорректно, что более вероятно). В этом скрипте все работает адекватно:

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

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

local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))
mainContainer:addChild(GUI.button(1, 1, 12, 3, 0x008800, 0xFFFFFF, 0x440000, 0xFFFFFF, "Кнопка 1"))

local secondContainer = mainContainer:addChild(GUI.container(4, 3, 30, 10))
secondContainer:addChild(GUI.panel(1, 1, secondContainer.width, secondContainer.height, 0xDDDDDD))
secondContainer:addChild(GUI.button(3, 2, 12, 3, 0x880000, 0xFFFFFF, 0x440000, 0xFFFFFF, "Кнопка 2"))

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

mainContainer:draw()
buffer.draw(true)
mainContainer:startEventHandling()
Изменено пользователем ECS

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


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

Блин, во я тупой ) Проблема была в том, что я добавил второй контейнер сразу же после создания первого. Переместил его на другое место и все заработало. Отдельное спасибо за объяснение и примеры кода!

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


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

Либа обновлена. По большей части изменения направлены на ускорение отрисовки графоуни и обработки событий, в результате чего местный FPS в прожорливом софте значительно повысился. Убрана зависимость от библиотеки palette, ее функционал включен в GUI. Ну, хоть на один файл меньше докачивать, ага.

 

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

 

Q2sX0P5.gif

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


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

У изображений функция .onTouch работает?

Код

radioLayout:addChild(GUI.image(55, 19, image.load('/addfm.pic'))).onTouch = function()
GUI.error('test')
end

При нажатии на изображение ничего не происходит, совсем

21e874ae2f.png

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

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


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

 

 

У изображений функция .onTouch работает?

 

Нет. Любые функции по типу onTouch/onStateChanged/onKeyDown создавались у определенной группы объектов (кнопки, слайдеры) исключительно для удобства их использования. По сути они являются следствием назначения объектам соответствующего обработчика событий и вызова этих методов в обработчике. Если вкратце, то у кнопки обоаботчик выглядит следующим образом:

button.eventHandler = function(mainContainer, button, eventData)
  if eventData[1] == "touch" then
    -- Тут кнопочка визуально "нажимается"
    
    ...

    -- Если у кнопки создавался метод .onTouch, то он вызывается
    if button.onTouch then
      button.onTouch()
    end
  end
end

Аналогичную фишечку ты можешь легко провернуть с любым объектом, включая image. Пили eventHandler, короче.

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


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

Крутак, портанул бы на dll и OpenGL/Direct3D рендер, вообще бомба была-бы!

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


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

Крутак, портанул бы на dll и OpenGL/Direct3D рендер, вообще бомба была-бы!

 

Это тя куда-то не туда понесло однако.

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


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

Крутак, портанул бы на dll и OpenGL/Direct3D рендер, вообще бомба была-бы!

 

Простовата либа для десктопа, да и более "потных" существующих аналогов пруд пруди: тут тебе и QT, и JFX/Swing, и WPF/.NET, и ваще, и ваще

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


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

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

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

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


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

Идея

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

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

 

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

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

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

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


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

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

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

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

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

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

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

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

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


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