Перейти к содержимому
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

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


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

В чем преимущества перед 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

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


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

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

GUI.NO_EXIT()

GUI.EXIT()

 

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

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


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

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

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

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

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

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

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

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

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


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