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

[OC] Модульная оконная библиотека

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

Перечисли преимущества по сравнению с forms, по исходному коду я пока не вижу, разве, что недостаток: куча лишних функций в начале, вроде работы с жесткими дисками.


Ты бы вырезал только окна из всей либы.

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


Ссылка на сообщение
Поделиться на других сайтах
Перечисли преимущества по сравнению с forms, по исходному коду я пока не вижу

 

Преимущества? Минимализм, простой однострочный синтаксис, автоматическое позиционирование, наличие слайдеров/селекторов/свитчей/текстовых полей. И вообще что за глупости, это две совершенно разные библиотеки с различными целями и функционалом, крайне странно их сравнивать.

 

Forms - серьезная либа, предназначенная для создания основы Window-based программ, данная же либа создавалась с целью встраивания в готовый софт, дабы упростить его.

 

А насчет "лишнего кода" - убрал, ибо действительно глаза мозолило.

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

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


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

 

 

Forms - серьезная либа, предназначенная для создания основы Window-based программ, данная же либа создавалась с целью встраивания в готовый софт, дабы упростить его.
 А я forms использую для всего, и для замены, и для новых проектов)

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


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

 

 

А я forms использую для всего, и для замены, и для новых проектов)

 

Так используй, запрещает кто-то что ли? Можно и в универ, находящийся в 50 метрах от дома, ехать через северо-запад, это уже вопрос личностных привычек и предпочтений. Зачем оффтопить-то? хд

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


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

Если либа — модульная, то можно как-то написать свой модуль, наверное?

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


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

Не, он , наверное, имел ввиду, что она у него модульная...

Если она модульная — то мы можем легко загружать и использовать кастомные модули. Где этот функционал, в чем заключается модульность?

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


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

 

 

Если она модульная — то мы можем легко загружать и использовать кастомные модули. Где этот функционал, в чем заключается модульность?

 

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

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


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

Кстати, пойду сделаю такую хрень для forms)

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

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


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

Можно ли размещать объекты не только вертикально по отношению друг к другу, но и горизонтально в виде строки? Разные типы объектов

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


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

 

 

Можно ли размещать объекты не только вертикально

Не-а

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


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

Великолепная библиотека. Просто класс. Наверное лучшая, по простоте и вообще кастомизабельности таких не найти для меня. Пускай тру-мега-прогеры юзают forms или сами пишут, но я буду юзать сею либу.

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


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

Можно ли сделать вертикальное меню из этих кнопок? Покажите пример пожалуйста. Ну и при нажатии, что-бы что то  происходило, например открывало текстовый файл.
P.S. Непонятно, как задать действие на кнопку или в Selector.

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

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


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

@@vlad1vv1 Этой либе сто лет в обед, и использовать ее нет особого смысла ввиду наличия более продвинутых аналогов. Возьми GUI, меньше геморроя будет. Там тебе и примеры, и картиночки, и вообще до мелочей все расписано:

https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/GUI.md

 

А для создания вертикального меню из кнопок воспользуйся одним из примеров в доке:

local GUI = require("GUI")

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

local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))

-- Создаем вертикально ориентированный список
local verticalList = mainContainer:addChild(GUI.list(3, 2, 25, 30, 3, 0, 0xE1E1E1, 0x4B4B4B, 0xD2D2D2, 0x4B4B4B, 0x3366CC, 0xFFFFFF, false))
verticalList:addItem("Hello world")
verticalList:addItem("This is test").onTouch = function()
   -- Сделать что-то при нажатии
end
verticalList:addItem("Beautiful")
verticalList:addItem("Like a shit")

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

mainContainer:drawOnScreen(true)
mainContainer:startEventHandling()

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


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

Оп! 

 

Возьми GUI, меньше геморроя будет. Там тебе и примеры, и картиночки, и вообще до мелочей все расписано:

https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/GUI.md

 

А для создания вертикального меню из кнопок воспользуйся одним из примеров в доке:

...

Оп! Спасибо! Но я хотел  c попроще фронт эндом. А вообще я задумал типа help через очки. Пишешь прогу, а в HUD описание какое-нибудь. Поэтому это слишком круто для очков. Я думал по кнопочкам или клавишами текст перелистывать. Изменено пользователем eu_tomat
большая цитата

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


Ссылка на сообщение
Поделиться на других сайтах
21.09.2015 в 05:21, ECS сказал:

e73f9f3330e76533027342d6e3f157f4.png
 
Хочу поделится с вами своей библиотекой, которую использую практически в каждой программе с графическим интерфейсом. С ее помощью можно генерировать любые "окна" на свой вкус, работать с ними, а затем получать результат работы в обычном массиве.
 
Cкачать библиотеку:


pastebin get wtWVFpKZ lib/windows.lua

Подробное описание основной функции и ее аргументов:

 

  Скрыть содержимое

 

 

Из всей массы функций в данном файле нас будет интересовать лишь одна:

  • windows.universalWindow(x, y, width, background, closeWindowAfter, ...)
Она отрисовывает окно с перечисленными вместо двоеточия объектами. Любой объект выделяется с помощью клика мыши, после чего функция приступает к работе с этим объектом.
 
Аргументы функции:
  • x и y: это числа, обозначающие стартовые координаты левого верхнего угла данного окна. Вместо цифр вы также можете написать "auto" - и программа автоматически разместит окно по центру экрана по выбранной координате. Или по обеим координатам, если вам угодно.

 

  • width: это ширина окна, которую вы можете задать по собственному желанию. Если некторые объекты требуют расширения окна, то окно будет автоматически расширено до нужной ширины. Да, вот такая вот тавтология ;)
 
  • background: базовый цвет окна (цвет фона, кому как понятнее).
 
  • closeWindowAfter: eсли true, то окно по завершению функции будет выгружено, а на его месте отрисуются пиксели, которые имелись на экране до выполнения функции. Удобно, если не хочешь париться с перерисовкой интерфейса.

 

  • ... : многоточием тут является перечень объектов, указанных через запятую. Каждый объект является массивом и имеет собственный формат. Ниже перечислены все возможные типы объектов.

             {"Button", {Цвет кнопки1, Цвет текста на кнопке1, Сам текст1}, {Цвет кнопки2, Цвет текста на кнопке2, Сам текст2}, ...}

 
                 Это объект для рисования кнопок. Каждая кнопка - это массив, состоящий из трех элементов:
                 цвета кнопки, цвета текста на кнопке и самого текста. Кнопок может быть неограниченное количество,
                 однако чем их больше, тем большее требуется разрешение экрана по ширине.
 
                 Интерактивный объект.
 
             {"Input", Цвет рамки и текста, Цвет при выделении, Стартовый текст [, Маскировать символом]}
 
                 Объект для рисования полей ввода текстовой информации. Удобно для открытия или сохранения файлов,
                 Опциональный аргумент "Маскировать символом" полезен, если вы делаете поле для ввода пароля.
                 Никто не увидит ваш текст. В качестве данного аргумента передается символ, например "*".
 
                 Интерактивный объект.
 
             {"Selector", Цвет рамки, Цвет при выделении, Выбор 1, Выбор 2, Выбор 3 ...}
 
                 Внешне схож с объектом "Input", однако в этом случае вы будете выбирать один из предложенных
                 вариантов из выпадающего списка. По умолчанию выбран первый вариант.
 
                 Интерактивный объект.
 
             {"Select", Цвет рамки, Цвет галочки, Выбор 1, Выбор 2, Выбор 3 ...}
 
                 Объект выбора. Отличается от "Selector" тем, что здесь вы выбираете один из вариантов, отмечая
                 его галочкой. По умолчанию выбран первый вариант.
 
                 Интерактивный объект. 
 
            {"Slider", Цвет линии слайдера, Цвет пимпочки слайдера, Значения слайдера ОТ, Значения слайдера ДО, Текущее значение [, Текст-подсказка ДО] [, Текст-подсказка ПОСЛЕ]}
 
                 Ползунок, позволяющий задавать определенное количество чего-либо в указанном интервале. Имеются два
                 опциональных аргумента, позволяющих четко понимать, с чем именно мы имеем дело.
 
                 К примеру, если аргумент "Текст-подсказка ДО" будет равен "Съедено ", а аргумент "Текст-подсказка ПОСЛЕ"
                 будет равен " яблок", а значение слайдера будет равно 50, то на экране будет написано "Съедено 50 яблок".
 
                 Интерактивный объект.
 
             {"Switch", Активный цвет, Пассивный цвет, Цвет текста, Текст, Состояние}
 
                 Переключатель, принимающий два состояния: true или false. Текст - это всего лишь информация, некое
                 название данного переключателя.
 
                 Интерактивный объект.                 
 
             {"CenterText", Цвет текста, Сам текст}
 
                 Отображение текста указанного цвета по центру окна. Чисто для информативных целей.
 
             {"WrappedText", Цвет текста, Текст}
 
                 Отображение большого количества текста с автоматическим переносом. Прото режет слова на кусочки,
                 перенос символический. Чисто для информативных целей.
 
             {"TextField", Высота, Цвет фона, Цвет текста, Цвет скроллбара, Цвет пимпочки скроллбара, Сам текст}
 
                 Текстовое поле с возможностью прокрутки. Отличается от "WrappedText"
                 фиксированной высотой. Чисто для информативных целей.
   
             {"Separator", Цвет разделителя}
 
                 Линия-разделитель, помогающая лучше отделять объекты друг от друга. Декоративный объект.
 
             {"EmptyLine"}
 
                 Пустое пространство, помогающая лучше отделять объекты друг от друга. Декоративный объект.
 
             Каждый из объектов рисуется по порядку сверху вниз. Каждый объект автоматически
             увеличивает высоту окна до необходимого значения. Если объектов будет указано слишком много -
             т.е. если окно вылезет за пределы экрана, то программа завершится с ошибкой.
 
Что возвращает функция:
 
Возвратом является массив, пронумерованный от 1 до <количества объектов>. То есть 1 индекс данного массива соответствует 1 указанному интерактивному объекту. Каждый индекс массива несет в себе какие-то данные, которые вы внесли в объект во время работы функции. Например, если в 1-ый объект типа "Input" вы ввели фразу "Hello world", то первый индекс в возвращенном массиве будет равен "Hello world".
Конкретнее это будет вот так: massiv[1] = "Hello world".

 

 

 

 

Примеры работы с библиотекой:

 

  Скрыть содержимое

 

 

Пример 1

 

Сгенерируем наше первое окошко, создав программу со следующим кодом:



--Подключаем скачанную библиотеку
local windows = require("windows")

--Рисуем окошко на экране
windows.universalWindow("auto", "auto", 30, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x262626, "Hello world!"}, {"EmptyLine"}, {"Button", {0x880000, 0xffffff, "Йо"}})

На экране отобразится следующее:
 

56a42f6c4bfc19b04e218360ec64d446.png

 

Командой выше мы рисуем окно по автоматически рассчитанным координатам (по центру экрана), так  как первые два аргумента равняются "auto", "auto". Затем мы указали ширину окна - 30 пикселей. Затем указали, что основной фон окна будет иметь  цвет 0xeeeeee, то есть почти белый. Затем начинается самое интересное - мы задаем объекты нашего окна!

 

  • {"EmptyLine"} служит всего лишь для красоты, так мы разделяем объекты окна друг от друга.
  • {"CenterText", 0x262626, "Hello world!"} рисует текст "Hello world" цвета 0x262626 по центру окна.
  • {"Buttons", {0x880000, 0xffffff, "Йо"}} рисует одну-единственную кнопку красного (0x880000) цвета, а на ней уже белый (0xffffff) текст "Йо".

По нажатию на кнопку окно автоматически закрывается, а на его месте рисуются те пиксели, которые были до старта окна, так как мы задали параметр closeWindowAfter = true.

 

Пример 2

 

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

 

Создадим следующую программу:



local windows = require("windows")

--Получаем массив с данными о работе нашего окна
local action = windows.universalWindow("auto", "auto", 30, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x262626, "Файл \"OS.lua\" уже имеется в этом месте."}, {"CenterText", 0x262626, "Заменить его перемещаемым объектом?"}, {"EmptyLine"}, {"Button", {0xdddddd, 0x262626, "Оставить оба"}, {0xffffff, 0x262626, "Отмена"}, {0x99b2f2, 0xffffff, "Заменить"}})

--Вызываем функцию очистки окна и установки курсора на 1, 1 (она тут имеется)
windows.prepareToExit()

--Выводим содержимое массива окна
print(table.unpack(action))

На экране отобразится следующее:

 

b0f2c2b75a25bceac8c6038e146b3e5e.png

 

Но как только мы нажимаем, к примеру, на кнопку "Заменить", экран очистится, и перед нами предстанет следующее:

 

1edb3e2badeed27a26aa596e80e5f3ae.png

 

Как и в предыдущем примере, мы нарисовали окно по центру экрана с основным цветом 0xeeeeee, разве что мы вывели две строки с текстом вместо одной и нарисовали сразу три кнопки друг за другом.

 

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

 

Пример 3

 

В последнем примере мы создадим самую сложную программу со всеми возможными элементами окна. Далее следует много текста, аккуратнее:



local windows = require("windows")

--Очищаем экран перед использованием окна и ставим курсор на 1, 1
windows.prepareToExit()

--Рисуем окно и получаем данные после взаимодействия с ним
local data = windows.universalWindow("auto", "auto", 36, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x880000, "Здорово, ебана!"}, {"EmptyLine"}, {"Input", 0x262626, 0x880000, "Сюда вводить можно"}, {"Selector", 0x262626, 0x880000, "Выбор формата", "PNG", "JPG", "GIF", "PSD"}, {"EmptyLine"}, {"WrappedText", 0x262626, "Тест автоматического переноса букв в зависимости от ширины данного окна. Пока что тупо режет на куски, не особо красиво."}, {"EmptyLine"}, {"Select", 0x262626, 0x880000, "Я пидор", "Я не пидор"}, {"Slider", 0x262626, 0x880000, 1, 100, 50, "Убито ", " младенцев"}, {"EmptyLine"}, {"Separator", 0xaaaaaa}, {"Switch", 0xF2B233, 0xffffff, 0x262626, "✈ Авиарежим", false}, {"EmptyLine"}, {"Switch", 0x3366CC, 0xffffff, 0x262626, "☾  Не беспокоить", true}, {"Separator", 0xaaaaaa},  {"EmptyLine"}, {"TextField", 5, 0xffffff, 0x262626, 0xcccccc, 0x3366CC, "Тест текстового информационного поля. По сути это тот же самый WrappedText, разве что эта хрень ограничена по высоте, и ее можно скроллить. Ну же, поскролль меня! Скролль меня полностью! Моя жадная пизда жаждет твой хуй!"}, {"EmptyLine"}, {"Button", {0x57A64E, 0xffffff, "Да"}, {0xF2B233, 0xffffff, "Нет"}, {0xCC4C4C, 0xffffff, "Отмена"}})

--Еще раз ставим курсор на 1, 1
windows.prepareToExit()

--С помощью цикла выводим данные из массива data, полученные после взаимодействия с окном 
print(" ")
print("Вывод данных из окна:")
for i = 1, #data do print("["..i.."] = " .. tostring(data[i])) end
print(" ")

На экране отобразится следующее:

 

3b9cc6848bb2ce5a6de1803263e3119c.png

 

Далее давайте введем в текстовое поле какую-то белиберду:

 

5574f30c8009d12538a7e3fa76f53a8a.png

 

Затем выберем формат файла "JPG":

 

6d4a60d3141f5e3d5c61b1764e7b362d.png

 

Затем укажем программе, что у нас все в порядке с сексуальной ориентацией:

 

cd2a6afa832507b518be59cee5b76992.png

 

Cдвинем ползунок влево, указав, что никакие младенцы не были убиты:

 

ce166eb74840aca20bd49c6fd5437a07.png

 

Переключим оба слайдера в значение "ON":

 

8e4b2c9b75a559dd362e3f174ddef263.png

 

И наконец, кликнем на кнопку "Да". Экран очистится, а в левом верхнем углу выведется содержимое массива, возвращенного окном после работы.

 

8e71c9fe25ec376b71f2fce1bd9d0d3c.png

 

Подытожив, можно сказать, что на экране отобразилось содержимое всех интерактивных объектов окна, то бишь:

 

privetEpta - значение объекта Input

JPG - значение объекта Selector

Я не пидор - значение объекта Select

0 - значение объекта Slider

true - значение первого объекта Switch

true - значение второго объекта Switch

Да - значение объекта Button, т.е. название кнопки, на которую мы нажали

 

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

 

 

 

Мдаа уж... Очень классные у тебя параметры) (нет(это слишком(уж очень)))

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


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

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

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

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

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

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

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

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

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


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