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


Фотография

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 29

#1 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 10 Сентябрь 2014 - 19:22


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


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

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


Вся документация переехала на нашу Wiki
http://computercraft.../GUI_библиотека

#2 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 10 Сентябрь 2014 - 19:36

Резерв
  • Netins и Totoro это нравится

#3 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 10 Сентябрь 2014 - 19:40

Резерв

#4 Оффлайн   Exstes

Exstes
  • Пользователи
  • Сообщений: 5
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 10 Сентябрь 2014 - 21:52

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

#5 Оффлайн   Krutoy

Krutoy
  • Гуру
  • Сообщений: 499
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

              

Отправлено 11 Сентябрь 2014 - 04:25

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

#6 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 11 Сентябрь 2014 - 05:11

В чем преимущества перед 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 может работать с бесконечным количеством мониторов, любой объект может быть на любом мониторе, можно менять положение прямо во время работы программы, динамически

#7 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 11 Сентябрь 2014 - 09:54

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

#8 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 11 Сентябрь 2014 - 17:35

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

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

#9 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 16 Сентябрь 2014 - 16:56

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

#10 Оффлайн   GodusX

GodusX
  • Пользователи
  • Сообщений: 7
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.
  • ГородЖитомир

Отправлено 16 Сентябрь 2014 - 16:59

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

#11 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 18 Сентябрь 2014 - 16:37

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

Цифровое значение шкалы прогресса почему то выводится на красном фоне. Вот так
Прикрепленный файл  p1.jpg   11,09К   124 Количество загрузок:
Хотя должно быть так
Прикрепленный файл  p2.jpg   10,99К   125 Количество загрузок:
Или так
Прикрепленный файл  p3.jpg   9,47К   125 Количество загрузок:

#12 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 18 Сентябрь 2014 - 17:02

Можно попробовать
            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) 


#13 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 25 Сентябрь 2014 - 01:13

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

            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,


#14 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 25 Сентябрь 2014 - 23:43

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

#15 Оффлайн   Brey

Brey
  • Пользователи
  • Сообщений: 40
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 25 Октябрь 2014 - 10:48

Доброго времени. Кейпад глючит: при лкм по любой отличной от 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

#16 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 25 Октябрь 2014 - 12:43

Доброго времени. Кейпад глючит: при лкм по любой отличной от 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


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



#17 Оффлайн   Brey

Brey
  • Пользователи
  • Сообщений: 40
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 25 Октябрь 2014 - 15:32

Как-то не прокатывает... Если использовать удочерение (например GUI.MainPanel:addCHILD(p1)) (без {}) вылетает ошибка GUI:105 (или 501...).
Кроме того, попробовал создать 4 кнопки вообще без функционала т.е. голые квадраты
b=GUI.NewButton()
и потом вручную прописал им х, у, высоту, ширину и текст. И та же хрень: верхняя жмется нормально, а остальные кое-как. Т.е. жму на 4 (нижняя) и получаю эффект нажатия 1, 2, 3 и только потом 4. Не понимаю пока...


#18 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 25 Октябрь 2014 - 16:31

Как-то не прокатывает... Если использовать удочерение (например GUI.MainPanel:addCHILD(p1)) (без {}) вылетает ошибка GUI:105 (или 501...).
Кроме того, попробовал создать 4 кнопки вообще без функционала т.е. голые квадраты
b=GUI.NewButton()
и потом вручную прописал им х, у, высоту, ширину и текст. И та же хрень: верхняя жмется нормально, а остальные кое-как. Т.е. жму на 4 (нижняя) и получаю эффект нажатия 1, 2, 3 и только потом 4. Не понимаю пока...


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

#19 Оффлайн   Brey

Brey
  • Пользователи
  • Сообщений: 40
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 25 Октябрь 2014 - 17:51

:fp:Ура! Спасибо! =D

#20 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 30 Октябрь 2014 - 23:23

Обновлена библиотека, добавлены функции GUI.NO_EXIT() GUI.EXIT() А так же деструктор объектов
  • Fingercomp это нравится

#21 Оффлайн   GiviLP

GiviLP
  • Пользователи
  • Сообщений: 32
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 01 Февраль 2015 - 13:29

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

 

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 смотреть...


#22 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 01 Февраль 2015 - 14:01

 

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

 

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") - сменит текст и перерисует объект самостоятельно



#23 Оффлайн   GiviLP

GiviLP
  • Пользователи
  • Сообщений: 32
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 01 Февраль 2015 - 19:11

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. больше подходит по смыслу.


#24 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 006
  • Уровень сигнала: 156,97%
  • В игре: 1279 час. 4 мин.

Награды

                                               

Отправлено 01 Февраль 2015 - 20:04

 

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

 

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



#25 Оффлайн   GiviLP

GiviLP
  • Пользователи
  • Сообщений: 32
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 01 Февраль 2015 - 20:42

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

 

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

 

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

 

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



#26 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 006
  • Уровень сигнала: 156,97%
  • В игре: 1279 час. 4 мин.

Награды

                                               

Отправлено 01 Февраль 2015 - 20:46

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

 

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

 

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

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



#27 Оффлайн   GiviLP

GiviLP
  • Пользователи
  • Сообщений: 32
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 01 Февраль 2015 - 20:58

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

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

 

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



#28 Оффлайн   kremnev8

kremnev8
  • Пользователи
  • Сообщений: 139
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

     

Отправлено 03 Февраль 2015 - 14:49

рид , а как запустить цикл и чтоб textArea работала ?



#29 Оффлайн   1Ridav

1Ridav

    Орден К.А.

  • Автор темы
  • Администраторы
  • Сообщений: 279
  • Уровень сигнала: 4,04%
  • В игре: 32 час. 57 мин.

Награды

            2      

Отправлено 03 Февраль 2015 - 21:19

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



#30 Оффлайн   kremnev8

kremnev8
  • Пользователи
  • Сообщений: 139
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

     

Отправлено 04 Февраль 2015 - 09:03

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


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




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных