ECS 1 903 Опубликовано: 21 сентября, 2015 (изменено) Хочу поделится с вами своей библиотекой, которую использую практически в каждой программе с графическим интерфейсом. С ее помощью можно генерировать любые "окна" на свой вкус, работать с ними, а затем получать результат работы в обычном массиве. 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, "Йо"}}) На экране отобразится следующее: Командой выше мы рисуем окно по автоматически рассчитанным координатам (по центру экрана), так как первые два аргумента равняются "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)) На экране отобразится следующее: Но как только мы нажимаем, к примеру, на кнопку "Заменить", экран очистится, и перед нами предстанет следующее: Как и в предыдущем примере, мы нарисовали окно по центру экрана с основным цветом 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(" ") На экране отобразится следующее: Далее давайте введем в текстовое поле какую-то белиберду: Затем выберем формат файла "JPG": Затем укажем программе, что у нас все в порядке с сексуальной ориентацией: Cдвинем ползунок влево, указав, что никакие младенцы не были убиты: Переключим оба слайдера в значение "ON": И наконец, кликнем на кнопку "Да". Экран очистится, а в левом верхнем углу выведется содержимое массива, возвращенного окном после работы. Подытожив, можно сказать, что на экране отобразилось содержимое всех интерактивных объектов окна, то бишь: privetEpta - значение объекта Input JPG - значение объекта Selector Я не пидор - значение объекта Select 0 - значение объекта Slider true - значение первого объекта Switch true - значение второго объекта Switch Да - значение объекта Button, т.е. название кнопки, на которую мы нажали Надеюсь, общий принцип работы данной библиотеки ясен, поэтому расписывать все досканально в мельчайших деталях не вижу смысла. Главное, чтобы данные "окошки" послужили вам верой и правдой. Изменено 21 сентября, 2015 пользователем EliteClubSessions 15 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 21 сентября, 2015 Перечисли преимущества по сравнению с forms, по исходному коду я пока не вижу, разве, что недостаток: куча лишних функций в начале, вроде работы с жесткими дисками. Ты бы вырезал только окна из всей либы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 21 сентября, 2015 (изменено) Перечисли преимущества по сравнению с forms, по исходному коду я пока не вижу Преимущества? Минимализм, простой однострочный синтаксис, автоматическое позиционирование, наличие слайдеров/селекторов/свитчей/текстовых полей. И вообще что за глупости, это две совершенно разные библиотеки с различными целями и функционалом, крайне странно их сравнивать. Forms - серьезная либа, предназначенная для создания основы Window-based программ, данная же либа создавалась с целью встраивания в готовый софт, дабы упростить его. А насчет "лишнего кода" - убрал, ибо действительно глаза мозолило. Изменено 21 сентября, 2015 пользователем EliteClubSessions 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 21 сентября, 2015 Forms - серьезная либа, предназначенная для создания основы Window-based программ, данная же либа создавалась с целью встраивания в готовый софт, дабы упростить его. А я forms использую для всего, и для замены, и для новых проектов) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 21 сентября, 2015 А я forms использую для всего, и для замены, и для новых проектов) Так используй, запрещает кто-то что ли? Можно и в универ, находящийся в 50 метрах от дома, ехать через северо-запад, это уже вопрос личностных привычек и предпочтений. Зачем оффтопить-то? хд 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 21 сентября, 2015 Если либа — модульная, то можно как-то написать свой модуль, наверное? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 21 сентября, 2015 Не, он , наверное, имел ввиду, что она у него модульная... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 21 сентября, 2015 Не, он , наверное, имел ввиду, что она у него модульная...Если она модульная — то мы можем легко загружать и использовать кастомные модули. Где этот функционал, в чем заключается модульность? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 21 сентября, 2015 Если она модульная — то мы можем легко загружать и использовать кастомные модули. Где этот функционал, в чем заключается модульность? Если либа модульная - это означает, что она имеет несколько готовых модулей (компонентов, элементов, пресетов, объектов) и возможность их подключения по желанию. Создание и подключение кастомных модулей никак не подразумевается термином "модуль". Давайте не будем заниматься казуистикой и построчно выискивать причины для критики каждой софтины 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 22 сентября, 2015 Ему просто хотелось удобных расширений) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 22 сентября, 2015 (изменено) Кстати, пойду сделаю такую хрень для forms) Изменено 5 октября, 2015 пользователем SergOmarov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 11 декабря, 2015 Можно ли размещать объекты не только вертикально по отношению друг к другу, но и горизонтально в виде строки? Разные типы объектов 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 15 декабря, 2015 Можно ли размещать объекты не только вертикально Не-а 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
danshat 55 Опубликовано: 1 апреля, 2016 Великолепная библиотека. Просто класс. Наверное лучшая, по простоте и вообще кастомизабельности таких не найти для меня. Пускай тру-мега-прогеры юзают forms или сами пишут, но я буду юзать сею либу. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
vlad1vv1 0 Опубликовано: 22 апреля, 2018 (изменено) Можно ли сделать вертикальное меню из этих кнопок? Покажите пример пожалуйста. Ну и при нажатии, что-бы что то происходило, например открывало текстовый файл.P.S. Непонятно, как задать действие на кнопку или в Selector. Изменено 22 апреля, 2018 пользователем vlad1vv1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 22 апреля, 2018 @@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() 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
vlad1vv1 0 Опубликовано: 22 апреля, 2018 (изменено) Оп! Возьми GUI, меньше геморроя будет. Там тебе и примеры, и картиночки, и вообще до мелочей все расписано: https://github.com/IgorTimofeev/OpenComputers/blob/master/Documentation/GUI.md А для создания вертикального меню из кнопок воспользуйся одним из примеров в доке: ... Оп! Спасибо! Но я хотел c попроще фронт эндом. А вообще я задумал типа help через очки. Пишешь прогу, а в HUD описание какое-нибудь. Поэтому это слишком круто для очков. Я думал по кнопочкам или клавишами текст перелистывать. Изменено 16 сентября, 2018 пользователем eu_tomat большая цитата Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
MisterFunny01 4 Опубликовано: 13 января, 2019 21.09.2015 в 05:21, ECS сказал: Хочу поделится с вами своей библиотекой, которую использую практически в каждой программе с графическим интерфейсом. С ее помощью можно генерировать любые "окна" на свой вкус, работать с ними, а затем получать результат работы в обычном массиве. 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, "Йо"}}) На экране отобразится следующее: Командой выше мы рисуем окно по автоматически рассчитанным координатам (по центру экрана), так как первые два аргумента равняются "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)) На экране отобразится следующее: Но как только мы нажимаем, к примеру, на кнопку "Заменить", экран очистится, и перед нами предстанет следующее: Как и в предыдущем примере, мы нарисовали окно по центру экрана с основным цветом 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(" ") На экране отобразится следующее: Далее давайте введем в текстовое поле какую-то белиберду: Затем выберем формат файла "JPG": Затем укажем программе, что у нас все в порядке с сексуальной ориентацией: Cдвинем ползунок влево, указав, что никакие младенцы не были убиты: Переключим оба слайдера в значение "ON": И наконец, кликнем на кнопку "Да". Экран очистится, а в левом верхнем углу выведется содержимое массива, возвращенного окном после работы. Подытожив, можно сказать, что на экране отобразилось содержимое всех интерактивных объектов окна, то бишь: privetEpta - значение объекта Input JPG - значение объекта Selector Я не пидор - значение объекта Select 0 - значение объекта Slider true - значение первого объекта Switch true - значение второго объекта Switch Да - значение объекта Button, т.е. название кнопки, на которую мы нажали Надеюсь, общий принцип работы данной библиотеки ясен, поэтому расписывать все досканально в мельчайших деталях не вижу смысла. Главное, чтобы данные "окошки" послужили вам верой и правдой. Мдаа уж... Очень классные у тебя параметры) (нет(это слишком(уж очень))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
fancube 0 Опубликовано: 31 марта, 2019 ECS как всегда в своём репертуаре. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах