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

GUI библиотека (ComputerCraft)

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

https-~~-//github.com/1Ridav/ComputerCraft-GUI

 

Библиотека сделана для "золотых" компьютеров и мониторов

 

Все мы знаем, что при написании программ - зачастую требуется делать кнопочки, менюшки и тд для более-менее удобного использования программы. Проблема в том, что не у каждого хватит опыта и усидчивости для решения такого рода задачи. Поэтому обмозговав все за и против - я решил сделать такую библиотеку сам, тк раньше похожая библа с похожим функционалом была в свободном доступе на англоязычных пабликах, то теперь её просто нет - автор удалил исходные коды и забросил проект( Что на мой взгляд очень прискорбно). Существующие на данный момент графические библиотеки просто не отвечают требованиям гибкости и функциональности

В чем смысл написания этой библиотеки? Задача в том, чтобы упростить работу самому разработчику и значительно уменьшить время, которое требуется для завершения программы. Это что то в роде движка - разработчику программы требуется лишь создать объект по параметрам и дать ему свойства - все остальное сделается само. Ему не требуется знать все досконально и контролировать каждую мелочь.

Думаю с этим более-менее понятно. При написании библиотеки я старался взять самые лучшие стороны из разных языков программирования и разных библиотек, к примеру значительный объем функционала взят из WinAPI, Java и по мелочам из других источников.

Функционал, который должен быть по моему видению:

 

 

Вся документация переехала на нашу Wiki

http://computercraft.ru/wiki/index.php/ComputerCraft/GUI_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0

  • Like 5

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


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

Резерв

  • Like 2

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


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

Резерв

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


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

Жаль synaps уже спит, у него эрекция начнётся когда он это увидит...... :D

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


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

В чем преимущества перед Graffiti?

http-~~-//www.youtube.com/watch?v=FebXgbxbhN8

Разные концепции реализации.

Технология построения интерфейса отличается, хотя и имеет одни и те же цели.

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

Про различия скоростей работы ничего сказать не могу, тк не замерял

 

Для сравнения создай на Graffiti две кнопки и прогрессбар. Одна кнопка пусть заполняет прогрессбар, а другая - очищает его.

 

На моей GUI библиотеке это будет выглядеть так:

os.loadAPI("GUI")
local pb = GUI.NewProgressBar(nil, 10, 10, 14, 1) -- Создаем шкалу прогресса

local f1 = function(s) -- Задаем функционал первой кнопки
  pb:stepIt() -- Заполняем шкалу на шаг
end

local f2 = function(s) -- задаем функционал второй кнопки
  pb:clear() -- Очищаем шкалу
end

local buttonFill = GUI.NewButton(nil, 1, 1, 5, 1, "fill ", f1)
local buttonClear = GUI.NewButton(nil, 1, 3, 5, 1, "clear", f2)
GUI.MainPanel:addCHILD({buttonFill, buttonClear, pb}) -- Добавляем на экран
GUI.MainPanel:draw() -- Рисуем все объекты на экране

 

К тому же мой вариант GUI может работать с бесконечным количеством мониторов, любой объект может быть на любом мониторе, можно менять положение прямо во время работы программы, динамически

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


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

Надо бы деструктор придумать. Кнопки продолжают работать даже после выхода из программы.

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


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

Надо бы деструктор придумать. Кнопки продолжают работать даже после выхода из программы.

Ну в принципе так и было задумано.

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


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

Дополнил документацию

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


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

РИД Я ТЯ ЩАС ЗАЦЕЛУЮ ИДЕАЛЬНАЯ АПИ И ТОЧКА (ладно чёто я погорячился)))

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


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

ProgressBar - Шкала прогресса.

Цифровое значение шкалы прогресса почему то выводится на красном фоне. Вот так

post-6-14160784063358_thumb.jpg

Хотя должно быть так

post-6-14160784063661_thumb.jpg

Или так

post-6-14160784064116_thumb.jpg

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


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

Можно попробовать

            s.target.setBackgroundColor( s.color_used )
            for i=1,#temp do
              X = term.getCursorPos()
              if X > px + s.x + pos - 1 then
                s.target.setBackgroundColor( s.color_bg )
               s.target.write(temp:sub(i))
                break
              end
             s.target.write(temp:sub(i,i))   
            end
вместо

s.target.write(temp) 

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


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

Можно попробовать

            s.target.setBackgroundColor( s.color_used )
            for i=1,#temp do
              X = term.getCursorPos()
              if X > px + s.x + pos - 1 then
                s.target.setBackgroundColor( s.color_bg )
               s.target.write(temp:sub(i))
                break
              end
             s.target.write(temp:sub(i,i)) 
            end
вместо

s.target.write(temp)
Мой вариант решения:

            if cx > s.dynX + pos then
               s.target.setBackgroundColor(s.color_bg)
               s.target.write(temp)  
           else
               s.target.write(string.sub(temp, 1, math.floor(s.dynX + pos - cx + 1) ) )
               s.target.setBackgroundColor(s.color_bg)
               s.target.write(string.sub(temp, math.floor(s.dynX + pos - cx + 2), #temp))
           end

 

 

Для справки:

Изменено апи

        _dynRefresh = function(s)
           px, py = 1, 1
           if s._PARENT then
               px, py = s._PARENT.dynX, s._PARENT.dynY
           end
           s.dynX = s.x + px - 1
           s.dynY = s.y + py - 1
       end,

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


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

Добавил ссылку на Github, Все обновления будут происходить там

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


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

Доброго времени. Кейпад глючит: при лкм по любой отличной от 1 кнопке начинается странная беготня вызывающая странные ассоциации с поиском пути. Т.е. тыкаю на 16 и получаю на выходе последовательно нажатые 2, 6, 7,8,16 (к примеру. при следующем нажатии путь может пройти по другому). Вопрос: так и должно быть? =D

Изображение


    os.loadAPI("GUI")
    b={}
    f={}
    local p1 = GUI.NewPanel(21,4)
    for i=1,16 do
      b[i]=GUI.NewButton(nil,1,1,3,3,tostring(i),f[i])
      f[i]=function(s)
      s=rednet.send(хххх,i)
      end
      p1:addCHILD({b[i]})
      i=i+1
    end
    for i=5,8 do
      b[i].x=6
      i=i+1
    end
    for i=9,12 do
      b[i].x=11
      i=i+1
    end
    for i=13,16 do
      b[i].x=16
      i=i+1
    end
    for i=2,14,4 do
      b[i].y=5
    end
    for i=3,15,4 do
      b[i].y=9
    end
    for i=4,16,4 do
      b[i].y=13
    end
    GUI.MainPanel:addCHILD({p1})
    GUI.MainPanel:draw()

pastebin.com/ZyC0KXtx

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


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

Доброго времени. Кейпад глючит: при лкм по любой отличной от 1 кнопке начинается странная беготня вызывающая странные ассоциации с поиском пути. Т.е. тыкаю на 16 и получаю на выходе последовательно нажатые 2, 6, 7,8,16 (к примеру. при следующем нажатии путь может пройти по другому). Вопрос: так и должно быть? =D

16d75-clip-9kb.png?nocache=1


    os.loadAPI("GUI")
    b={}
    f={}
    local p1 = GUI.NewPanel(21,4)
    for i=1,16 do
      b[i]=GUI.NewButton(nil,1,1,3,3,tostring(i),f[i])
      f[i]=function(s)
      s=rednet.send(хххх,i)
      end
      p1:addCHILD({b[i]})
      i=i+1
    end
    for i=5,8 do
      b[i].x=6
      i=i+1
    end
    for i=9,12 do
      b[i].x=11
      i=i+1
    end
    for i=13,16 do
      b[i].x=16
      i=i+1
    end
    for i=2,14,4 do
      b[i].y=5
    end
    for i=3,15,4 do
      b[i].y=9
    end
    for i=4,16,4 do
      b[i].y=13
    end
    GUI.MainPanel:addCHILD({p1})
    GUI.MainPanel:draw()

pastebin.com/ZyC0KXtx

 

 

p1:addCHILD({b})

GUI.MainPanel:addCHILD({p1})

используй без кавычек {}

. То есть GUI.MainPanel:addCHILD(p1)

p1:addCHILD(b)

 

Так же функционал надежнее задать через постустановку.

b.func = function(s)

бла бла бла

end

 

Баг в задании функционала

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


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

Как-то не прокатывает... Если использовать удочерение (например GUI.MainPanel:addCHILD(p1)) (без {}) вылетает ошибка GUI:105 (или 501...).

Кроме того, попробовал создать 4 кнопки вообще без функционала т.е. голые квадраты

b=GUI.NewButton()

и потом вручную прописал им х, у, высоту, ширину и текст. И та же хрень: верхняя жмется нормально, а остальные кое-как. Т.е. жму на 4 (нижняя) и получаю эффект нажатия 1, 2, 3 и только потом 4. Не понимаю пока...

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


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

Как-то не прокатывает... Если использовать удочерение (например GUI.MainPanel:addCHILD(p1)) (без {}) вылетает ошибка GUI:105 (или 501...).

Кроме того, попробовал создать 4 кнопки вообще без функционала т.е. голые квадраты

b=GUI.NewButton()

и потом вручную прописал им х, у, высоту, ширину и текст. И та же хрень: верхняя жмется нормально, а остальные кое-как. Т.е. жму на 4 (нижняя) и получаю эффект нажатия 1, 2, 3 и только потом 4. Не понимаю пока...

 

Указанный пастбин устарел уже больше месяца назад. Используй эту версию: ZTM3Njm6

  • Like 1

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


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

Обновлена библиотека, добавлены функции

GUI.NO_EXIT()

GUI.EXIT()

 

А так же деструктор объектов

  • Like 1

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


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

А у меня она что то не завелась на моей сборке... спецом поставил только СС и ничего больше. пытался запустить на золотом безпроводном терминале. пример из доки.

 

os.loadAPI("GUI")
 
local f = function(s)
  s.text = "CLICKED"
end
 
local button = GUI.NewButton(nil, 5, 5, 10, 3, "clickme", f, colors.cyan, colors.red, colors.green)
GUI.MainPanel:addCHILD(button) 
GUI.MainPanel:draw() 
 
GUI.NO_EXIT()
 
 
При клике на кнопку, попытка вызвать nil где-то в дебрях либы.
 
cleanup(MainPanel)
 
а функция то объявлена ниже по коду и естественно мы о ней еще не знаем в GUI.NO_EXIT()
ок поправил... больше не падает но и событие не сработало, текст не изменился.
 
Мне вот интересно либу то хоть раз запускал кто нибудь? я думал только у нас в конторе програмеры считают себя настолько крутыми что кодят в слепую и на тест за частую отдаются проги с синтаксическими ошибками =)
 
эх, пойду дайрвольфовское button api смотреть...

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


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

 

А у меня она что то не завелась на моей сборке... спецом поставил только СС и ничего больше. пытался запустить на золотом безпроводном терминале. пример из доки.

 

os.loadAPI("GUI")
 
local f = function(s)
  s.text = "CLICKED"
end
 
local button = GUI.NewButton(nil, 5, 5, 10, 3, "clickme", f, colors.cyan, colors.red, colors.green)
GUI.MainPanel:addCHILD(button) 
GUI.MainPanel:draw() 
 
GUI.NO_EXIT()
 
 
При клике на кнопку, попытка вызвать nil где-то в дебрях либы.
 
cleanup(MainPanel)
 
а функция то объявлена ниже по коду и естественно мы о ней еще не знаем в GUI.NO_EXIT()
ок поправил... больше не падает но и событие не сработало, текст не изменился.
 
Мне вот интересно либу то хоть раз запускал кто нибудь? я думал только у нас в конторе програмеры считают себя настолько крутыми что кодят в слепую и на тест за частую отдаются проги с синтаксическими ошибками =)
 
эх, пойду дайрвольфовское button api смотреть...

 

NO_EXIT пока не работает. Текст меняется при перерисовке объекта

s:setText("text") - сменит текст и перерисует объект самостоятельно

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


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

NO_EXIT пока не работает. Текст меняется при перерисовке объекта

s:setText("text") - сменит текст и перерисует объект самостоятельно

 

теперь работает =)

 

os.loadAPI("GUI")
 
local f = function(s)
  s.text = "CLICKED"
end
 
local exit = function(s)
  s.text = "Done"
  GUI.EXIT()
end
 
local button = GUI.NewButton(nil, 5, 5, 10, 3, "clickme", f, colors.cyan, colors.red, colors.green)
local button2 = GUI.NewButton(nil, 5, 9, 10, 3, "Exit", exit, colors.cyan, colors.red, colors.green)
GUI.MainPanel:addCHILD(button) 
GUI.MainPanel:addCHILD(button2) 
 
GUI.NO_EXIT()
 
все работает пока не нажмем exit ну и допилил восстановление сохраненного os.pullEvent.
 
Посмотрим что там дальше всплывет.. пока займусь реднетом и coroutin. если в итоге не всплывет ни каких проблем скину исправленную версию.
 
кстати, NO_EXIT преименую в Run. больше подходит по смыслу.

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


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

 

кстати, NO_EXIT преименую в Run. больше подходит по смыслу.

 

Почему? NO_EXIT — понятно, не выходить из программы. А RUN я лично ввобще не пойму. Бежать? Куда? :)

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


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

Почему? NO_EXIT — понятно, не выходить из программы. А RUN я лично ввобще не пойму. Бежать? Куда? :)

 

это значит запустить гуй =) что по факту эта функция и делает. там основной цикл крутится до того пока мы ему не пошлем сигнал на завершение. ну по крайней мере я так понял задумку автора и всеголишь реализовал...

 

Похоже либой реально ни кто не пользовался... в текстарии синтаксическая ошибка.

 

кстати допили курсоры в текстарии и инпуте и добавил ограничение на длину строки в инпуте. не вижу смысла рисовать маленький инпут и вводить в него длинное число. раз указана ширина 4 значит можно ввести строку длинной 3... хотя для пароля может и актуально... если не лень будет то дабавлю какоенить проперти включающее ограничение на длину. 

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


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

это значит запустить гуй =) что по факту эта функция и делает. там основной цикл крутится до того пока мы ему не пошлем сигнал на завершение. ну по крайней мере я так понял задумку автора и всеголишь реализовал...

 

Похоже либой реально ни кто не пользовался... в текстарии синтаксическая ошибка.

 

кстати допили курсоры в текстарии и инпуте и добавил ограничение на длину строки в инпуте. не вижу смысла рисовать маленький инпут и вводить в него длинное число. раз указана ширина 4 значит можно ввести строку длинной 3... хотя для пароля может и актуально... если не лень будет то дабавлю какоенить проперти включающее ограничение на длину. 

Я пробовал воспользоваться... Мало того, что мне лично ничегошеньки не понятно, так ещё и не работало нормально. С тех пор я её не использую.

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


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

Я пробовал воспользоваться... Мало того, что мне лично ничегошеньки не понятно, так ещё и не работало нормально. С тех пор я её не использую.

это да.. я тоже долго вкуривал какой же должен быть воркфлоу.. пока меня не просвятили что она не дописана =)

 

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

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


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

ГУИ библа работает на ивентах. Вот и все. Выполнит любой участок кода, но желательно, чтобы больших циклов в самих гуи элементах не было. Иначе произойдет фриз программы

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


Ссылка на сообщение
Поделиться на других сайтах
ГУИ библа работает на ивентах. Вот и все. Выполнит любой участок кода, но желательно, чтобы больших циклов в самих гуи элементах не было. Иначе произойдет фриз программы

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

×