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

"Лёгкая" библиотека GUI

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

Если нужна удобная модульность — можете подождать и узерть мой аналог формс, с удобной модульностью. Собственно, я либу уже написал, дело в том что надо напитсать модули (чекбоксы всякие, поля для ввода, списки, итд)

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


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

В библиотеку forms (и конечно же в редактор FormsMaker) добавлены два невизуальных компонента - событие и таймер. В редакторе они видны, что позволяет редактировать их свойства.

 

Событие. Создается командой:

Event1=Form1:addEvent(eventName, onEvent)

 

При возникновении в системе события с именем eventName будет вызвана функция-обработчик onEvent. Как видите, компонент событие аналогичен слушателю, создаваемому функцией event.listen, с той разницей, что компонент работает только в пределах создавшей его программы, а слушатель продолжит работу и после её завершения.

 

Параметры вызова метода addEvent:

 

eventName - (строка) имя обрабатываемого события. Если задать пустую строку, компонент будет обрабатывать все возникающие события.

onEvent - (функция) обработчик события, принимает параметры, передаваемые событием. 

 

 

Таймер. Создается командой:

Timer1=Form1:addTimer(interval, onTime)

 

Вызывает функцию onTime с заданным интервалом.

 

Параметры вызова метода addTimer:

 

interval - (число) период работы таймера в секундах.

onTime - (функция) обработчик события. 

 

 

Методы компонентов "событие" и "таймер":

 

stop() - приостанавливает работу компонента.

run() - возобновляет работу

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


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

Зеро, я улучшил компонент Menu(теперь посторонний клик вне области раскрытого меню закрывает его), но это потребовала нескольких серьезных изменений, и в целях оптимизации я перенес его из модуля в саму библиотеку. Можешь использовать мой вариант для последующих обнов?

http://pastebin.com/VNxmmkDU

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


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

Хорошо. Доберусь до компьютера, посмотрю. Опиши пожалуйста, что делает этот компонент, какие у него свойства и методы.

Есть еще какой-то LavelingFrame. Это что?

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


Ссылка на сообщение
Поделиться на других сайтах
Есть еще какой-то LavelingFrame. Это что?

 

Не работающий(пока) я его там оставил случайно, его скорее надо выделить в модуль и поставлять с пакетом моей программы(для нее его и делал).

 

 

Хорошо. Доберусь до компьютера, посмотрю. Опиши пожалуйста, что делает этот компонент, какие у него свойства и методы.

Menu - раскрывающееся меню, как в Windows

При создании передается таблица, содержащая итемы по структуре: {{[1]=<name>,[2]=function()end},...}

При клике по пункту <name> вызывается соответствующая функция, при клике вне меню - меню закрывается. Нельзя открыть больше 1 меню.

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

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


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

Форма не выводит знаки поверх себя, кроме своих частей

http://pastebin.com/FDtAVd6j

Создавать формы и компоненты следует до запуска функции run, а не по нажатию кнопки. Попробуй так:

 

 

local wce = require("WCE")
local term = require("term")
local forms = require("forms")
local event = require("event")
local buf = require("doubleBuffering")
local component = require("component")
gpu = component.gpu
 
w, h = gpu.getResolution()
------functions-------
local function exit()
  term.clear()
  forms.stop() --останавливаем выполнение среды
end

local function startgame()
  term.clear() -- этот clear можно не делать. Экран всё равно перетрется формой
  GameForm:setActive() --Делаем активной форму игры
  -- печатаем что надо
  for i=1,w do
    wce.PrintHere(i, h, "█")
  end
 -- buf.line(1, h-10, w, h-10, 0xa9a9a9, 0xa9a9ff, "█")
  buf.draw()
end

-- Создаем форму меню
  MenuForm=forms.addForm()
  MenuForm.border=1
  ButtonExit=MenuForm:addButton(w/2, h-10, "Exit", exit)
  ButtonStart=MenuForm:addButton(w/2, h-12, "Start", startgame) --по нажатию этой кнопки активной станет GameForm
-- Создаем форму игры
  GameForm=forms.addForm()
  --по нажатию этой кнопки активной станет MenuForm
  ButtonExitG=GameForm:addButton(w-10, h-1, "Exit", function() MenuForm:setActive() end)
  GameForm.border=1
--Запускаем среду на выполнение
  forms.run(MenuForm)
 

 

 

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

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


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

Господа люди умные, подскажите смертному простому косяк его
в зачатке программы при нажатии на кнопки изменяется переменная en
эту переменную выводит Label1
дабы выводил он верно, к каждой кнопке дополнительно вывесил Label1:redraw()
но... все еще выводит 0
где же тут косяк ? не заметил очевидную опечатку или не так понял синтаксис методов ?

Осторожно! Крайняя упоротость!

 

 

require("component").gpu.setResolution(60,50)
forms=require("forms")
forms.ignoreAll()

Form1=forms.addForm()
Form1.color=12566463
Form1.border=1

en = 0

function Button1onClick(self, user)
 en = en - 1000000
 Label1:redraw()
end

Button1=Form1:addButton(13,12,"-1M",Button1onClick)
Button1.color=7217965

function Button2onClick(self, user)
 en = en - 100000
 Label1:redraw()
end

Button2=Form1:addButton(13,14,"-100К",Button2onClick)
Button2.color=7217965

function Button3onClick(self, user)
 en = en - 10000
 Label1:redraw()
end

Button3=Form1:addButton(13,16,"-10К",Button3onClick)
Button3.color=7217965

Label1=Form1:addLabel(24,14,en)
Label1.centered=true
Label1.color=984582
Label1.autoSize=false
Label1.fontColor=12779488
Label1.W=10

function Button4onClick(self, user)
 en = en + 1000000
 Label1:redraw()
end

Button4=Form1:addButton(35,12,"+1М",Button4onClick)
Button4.color=8101979

function Button5onClick(self, user)
 en = en + 100000
 Label1:redraw()
end

Button5=Form1:addButton(35,14,"+100к",Button5onClick)
Button5.color=8101979

function Button6onClick(self, user)
 en = en + 10000
 Label1:redraw()
end

Button6=Form1:addButton(35,16,"+10К",Button6onClick)
Button6.color=8101979

Label2=Form1:addLabel(10,9,"Выберите количество покупаемой энергии")
Label2.color=10395294
Label2.fontColor=0
Label2.W=38
Label2.border=4

Button7=Form1:addButton(24,19,"Оплатить")
Button7.fontColor=0
Button7.color=14329120

Label3=Form1:addLabel(10,24,"Проведите смарт-картой по считывателю")
Label3.color=10395294
Label3.fontColor=0
Label3.W=37

Label4=Form1:addLabel(26,26,"<<<<<<")
Label4.color=10395294
Label4.fontColor=0
Label4.W=6

Label5=Form1:addLabel(14,33,"Количество энергии в хранилище:")
Label5.color=10395294
Label5.fontColor=0
Label5.W=31

Label6=Form1:addLabel(24,36,"Label6")
Label6.centered=true
Label6.color=8060927
Label6.autoSize=false
Label6.fontColor=0
Label6.W=10
Label6.alignRight=true

forms.run(Form1)

 

 

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

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


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

Думаю, в каждую процедуру ButtonХonClick неплохо бы добавить фразу:

Label1.caption=en

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


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

...

У меня очень глупый вопрос :D

"TComponent.__index = TComponent" позволяет обращаться в формате "Бла-бла-бла:функция()"? Ну через двоеточие, короче? :D

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


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

TComponent.__index = TComponent — это чудеса метамагии.

Есть класс TComponent. При создании нового объекта ему присваивается класс как метатаблица. Однако методы и пр. не копируются. В объекте их нет, по сути. Метапараметр __index задаёт, где искать недостающие методы.

Сначала, например, он будет искать значение в таблице объекта, а потом — в таблице __index (то есть, в классе).

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


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

 

 

Левый щелчок мыши на окне переведет компонент в режим ввода текста. Завершение ввода осуществляется нажатием клавиши Enter. После чего вызывается функция-обработчик, если она определена. Функция принимает один параметр - указатель на компонент, который ее вызвал.

@Zer0Galaxy, то ли лыжи не едут, то ли я еб***тый :blink:

Объясни на примере как сделать чтобы то что ввел в инпут можно потом вывести на экран (или вообще в другую переменную).

Не пойму просто как вытянуть переменную окна ввода в функцию печати на экран.

Пример:

function text(a)
return print(a)
end

Edit1=Form1:addEdit(10,10,function() text(??Какую переменную пишем??) end)

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


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

function text(a)
return print(a)
end
 
Edit1=Form1:addEdit(10,10,function() text(Edit1.text) end)

 

 

text - строка текста, введенного в окно ввода.

 

 

(или вообще в другую переменную).
local a=Edit1.text 

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


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

 

 

text - строка текста, введенного в окно ввода

Во спасибо.

Видимо уже разучился читать до конца документацию :D

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


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

 

 

Команда создает на форма Form1 надпись и возвращает указатель на вновь созданный объект.

@Zer0Galaxy, опять нубаский вопрос ;)

Вот есть объект надпись, как сделать чтобы он прорисовывал все что есть в цикле?

 

Покажу на примере, есть инпут туда пишем число, enter - и в лейбле показывается 1, 2, 3 и т.д. Но не все сразу числа, а именно по одной (как в секундомере).

Вообще это возможно с твоей либой прокрутить?

Мне вообще нужно много чего что в цикле (for или while true) выводить (обновлять) данные (чтобы сами перерисовывались и что бы сам вызывал отображение надписей в циклах через кнопку).

Но они всего лишь один раз вызываются и все. Перерисовываться почему-то не хотят ( :redraw() ) :(

forms=require("forms")
Form1=forms.addForm() 

function label(a)
for i = 1, a do 
	Label1=Form1:addLabel(2,2,i)
	Label1:redraw()
end
return b
end

Edit1=Form1:addEdit(10,10,function() label(Edit1.text) end)

forms.run(Form1)

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


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

Вызывать в цикле функцию addLabel нет необходимости. Каждый вызов такой функции создает новый компонент-метку, тебе же нужно просто изменить надпись на уже существующей метке. Сделать это можно изменив поле caption и перерисовав метку:

Label1.caption="New caption"
Label1:redraw()

Теперь о том по какому событию происходит смена надписи. Если ты просто вставишь эту смену в цикл

for i=1,10 do
  Label1.caption=i
  Label1:redraw()
end

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

Можешь для этого использовать компонент-таймер

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


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

 

 

а тебе, как я понял, нужно сделать счетчик, который бы считал с определенным периодом.

Ну почти, если быть точнее просто автообновляемые переменные чтобы не перезагружать по 100500 раз прожку чтобы посмотреть измененные данные (к примеру та же информация о computer.energy()).

 

 

 

то увидишь лишь последнее значение метки,

Жаль конечно, придется тогда "читерить" в этом случаи :D

 

Все равно спасибо за консультацию, разраб :smile9:

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


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

Вот пример работы того, о чем я говорил

forms=require("forms") --подключаем либу
Form1=forms.addForm()  --создаем форму

Label1=Form1:addLabel(2,2,"0") -- создаем метку

local Lmax=0 -- тут будем хранить крайнее значение метки

function onTime()
  if Label1.caption>=Lmax then Timer1:stop() return end -- если достигли конца, тормозим таймер
  Label1.caption=Label1.caption+1                       -- иначе, увеличиваем метку
  Label1:redraw()
end

Timer1=Form1:addTimer(1,onTime) -- создаем таймер с периодом 1 секунда
Timer1:stop()                   -- пока притормозим его

Edit1=Form1:addEdit(10,10, function() -- создаем поле ввода, по которому
   Label1.caption=0                   -- сбрасываем метку в ноль
   Lmax=tonumber(Edit1.text)          -- задаем крайнее значение
   Timer1:run()                       -- и запускаем таймер
end)

forms.run(Form1) -- старт всей конструкции

А вот пример с computer.energy

forms=require("forms") --подключаем либу
Form1=forms.addForm()  --создаем форму

Label1=Form1:addLabel(2,2) -- создаем метку

Timer1=Form1:addTimer(1,function() -- создаем таймер с периодом 1 секунда
  Label1.caption=computer.energy() -- в котором обновляем значение метки
  Label:redraw()                   -- и перерисовываем ее
end)

forms.run(Form1) -- старт всей конструкции

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


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

Вот пример работы того, о чем я говорил

Спасибо, попробую эту конструкцию впихнуть себе. Глядишь и получиться "считерить" :smile9:

 

Было бы конечно интересно если бы lua (?), opencomputers (?) могли поддерживать многозадачность (или многопоточность, кому как интереснее :D , про эту либу я знаю. вот бы ее в эту гуи либку воткуть бы), чтобы тут например сами по себе обновлялись данные на экране в цикле, и ты же мог юзать прожку и не ждать пока закончится цикл (с while вообще фиг что с делаешь)...

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


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

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

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

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

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

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

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

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

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


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