Помощь - Поиск - Пользователи - Календарь
Полная версия: Плагин графического интерфейса
UoKit.com Форумы > Кликер > UO Pilot > Плагины и доп. ПО
Страницы: 1, 2, 3, 4, 5
Cockney
Набросал ради развлечения небольшой плагин, позволяющий общаться с диалогами любой сложности(но пока урезаные).

Ссылка(ЯДиск, надеюсь можно) : тык или Нажмите для просмотра прикрепленного файла

В архиве сам плагин и файл разметки. Плагин в Плагинс, а разметку рядом с пилотом.

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

Небольшое описание :

Каждый параметр заключается в *. Например, так : *par1*.

Параметры ЧУВСТВИТЕЛЬНЫ к регистру. Пробелы на концах обрезаются (для поддержки переменных).

Доступные типы элементов:

Form - само окно
Button - кнопка
Edit - поле ввода
Text - текст
Checkbox - флажок

Сами функции :

Код

GUI.ShowForm (<Имя формы>) //Показывает форму с именем

GUI.HideForm (<Имя формы>) //Скрывает форму с именем

GUI.ActionExist () //получение флага события. Возвращает 0 или 1

GUI.GetAcion () //получение описания события. Вернет массив 1х3 с именами
формы, компонента и описанием события.

GUI.Enable (<Тип элемента> <Имя формы> <Имя элемента> <Статус>) //включает/отключает элемент на форме. Статус принимает 0 или 1.

GUI.GetText (<Тип элемента> <Имя формы> <Имя элемента>) //вернет текст элемента.

GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст>) //устанавливает текст элемента


И небольшой скрипт управления :

Код

//Скрипт обслуживания оболочки
set linedelay 5
//Очистка начального сообщения(пока так)
set $a GUI.ActionExist ()
set #f 1
set logging clear
//Начинаем
while (#f = 1) //пока не прекратим
    set $act_ex GUI.ActionExist () //проверим наличие события
    if ($act_ex = 1)  //если есть событие
        set %action GUI.GetAction () //получаем это событие
        //тут обработка событий
        if (%action[1 3] = BUTTON_CLICK) //если нажата кнопка(любая)
            set logging Произошел клик на кнопке с именем %action[1 2]
        end_if
        if (%action[1 3] = BUTTON_DBL_CLICK) //если дабл.клик кнопки(любая)
            set logging Произошел двойной клик на кнопке с именем %action[1 2]
        end_if
        if (%action[1 3] = EDIT_CHANGE) //если редактируется поле ввода
            set $txt GUI.GetText (*Edit* * %action[1 1] * * %action[1 2] *)
            set logging Новый текст поля %action[1 2] : $txt
            if ($txt = stop) //если введено стоп
                set $a GUI.SetText (*Form* *Main* *Стоп!!!!*) //установка заголовка
                set linedelay 50 //побольше задержка перед выходом
                set #f 0
            end_if
            if ($txt = msg) //если введено стоп
                msg Введено msg
            end_if
        end_if
    end_if
end_while
exit
end_script


Тестировано на XP,7,8,8.1

Вроде все работает, однако могут быть проблемы.


Если понравилось, предлагайте идеи. Может что-то годное и выйдет.
-------------------------------------------------------------
Архив версий:
cirus
Сделай время для двойного клика побольше, а то иногда сначала срабатывает одинарный.
Цитата
И небольшой скрипт управления :

Что-то мне кажется большинство не поймут что с этим делать.
Примеры лучше попроще делать.
Код
set %action GUI.GetAction () //получаем событие
if %action [1 2] = Button and %action [1 3] = BUTTON_CLICK
    log Сделан клик по первой кнопке
end_if

Цитата
GUI.HideForm (<Имя формы>) //Скрывает форму с именем

Напиши пример, а то что-то не понял как это работает.

Можно ли сделать чтобы кнопка была в статусе зажата/отжата?
Cockney
Время клика задаю не я, а система. Тут возможно с задержками в скрипте надо играть.
-----
Пример писан на коленке, дабы проверить функциональность в целом.
-----
Код
set $a GUI.HideForm (*Main*) //если брать имя окна из примера разметки
--------------------
<Form_1>
    <Name>Main</Name> //имя окна, задаваемое в хмл
</Form_1>

-----
Пока не представляю, зачем нужна зажатая программно кнопка, но, думаю это вполне можно реализовать технически..

С кликами ,возможно, что-то решу. Но это даже не знаю когда возьмусь.
cirus
Цитата
Пока не представляю, зачем нужна зажатая программно кнопка

Например в игре юзаются банки HP, MP и прочее. Иногда не надо использовать все. Сейчас чтобы отключить не нужные надо переключаться на пилот, останавливать скрипт и ставить // перед gosub, чтобы не было перехода к метке с какой-то банкой. А при зажатой/отжатой кнопке можно указывать к какой метке переходить, а какой нет. Сразу видно используется какой-то блок кода или нет.
Cockney
Ну тут тогда подходят чекбоксы. выбираешь, что нужно и скрипт проверяет/выполняет. а то чет мудрено с отключением ненужных кнопок. или я не допонял.

а может так?

Код
if %action[1 2] = XP //если нажата кнопка использования XP
    //отключаем ее
   set #q 1 //флаг использования чего-то там
end_if


а в рабочем блоке :

Код
if #q = 1
/////
else
////
end_if


или другое?

Кстати, что по шрифтам? не жирноват?
cirus
Цитата
а может так?

С флагами понятно как включить/отключить блок кода. При этом не понятно включился он или выключился, придётся выводить в лог или хинт результат.

Вариант с чекбоксами то что надо. Как их сделать?
Цитата
Кстати, что по шрифтам? не жирноват?

Нормально.

P.S. Ушёл на работу.
Cockney
Теперь понял про что ты. Пока никак. Сейчас поиграюсь с кликами. Попутно добавлю новые контролы, включая чекбокс.
Cockney
Апдейт.

-Новые элементы : чекбоксы(Checkbox), текст(Text).
-Функция GetState(). Возвращает состояние элемента(пока поддерживаются только чекбоксы). 1 - галка стоит, 0 - нет.
-Новые сообщения от контролов:
CHECKBOX_CLICK
CHECKBOX_DBL_CLICK
TEXT_CLICK
TEXT_DBL_CLICK

Пример:
Код
set $a GUI.GetState (*Имя формы, на которой лежит чекбокс* *Имя чекбокса*)

----------
Аттрибуты новых элементов смотрите в GUI.xml (узел <Text> - текст, а <CheckBox> - чекбокс).
---------
Возможно будут тормоза с работой функций, так что кто будет юзать отпишитесь есть ли они.
---------
Нажмите для просмотра прикрепленного файла или Диск
cirus
Цитата
Возможно будут тормоза с работой функций, так что кто будет юзать отпишитесь есть ли они.

Есть немного, галки с чекбоксов как-то вяло ставятся и снимаются, но в целом работают.
Двойной клик по кнопкам нормально работает.
Цитата
CHECKBOX_DBL_CLICK

Вроде как не работает, да и зачем он нужен. Поставить и тут же снять галку?
Цитата
TEXT_DBL_CLICK

Один клик работает, двойной нет.


Если возможно добавь к стилю Form статус поверх всех окон.
Цитата
set $a GUI.GetState (*Имя формы, на которой лежит чекбокс* *Имя чекбокса*)

Удобнее бы было указывать заголовки чекбоксов, а не имена, если возможно.
Цитата
GUI.GetAction () //получение описания события. Вернет массив 1х3 с именами
формы, компонента и описанием события.

Лучше возвращать 4 элемента:
Форма, компонент, имя компонента, событие.
Например, есть кнопка с именем Button3 и заголовком Script5.
Удобнее в условии писать:
Код
if %action [1 3] = Script5     
//чем
if %action [1 2] = Button3

Потому что заголовок видно на форме, а за номером кнопки придётся лезть в xml файл.
Cockney
Можно систему узнать?именно процессор и ос.
-----------
Возможно, это не тормоз, а анимация установки флажка.
cirus
Запустил утром, уже нормально галки ставятся, но опять двойные клики плохо срабатывают.
Win7 x64, i7 2600k
Cockney
А в чем проблема брать имя чекбокса из GetAction по событию клика? или там у тебя другая система обработки?

Клики еще в работе.
cirus
Цитата
А в чем проблема брать имя чекбокса из GetAction по событию клика?

Можно и так. Просто с заголовком удобнее, т. к. его видно без лишних действий.

По поводу торможения чуть позже отпишу, пока немного занят. Есть одно предположение.
Когда на компе ничего не запущено (пусть даже мелочь типа аськи или браузера) пилот в разы медленнее работает, видимо из-за технологий энергосбережения, проц частоту сбрасывает.
cirus
Цитата
Есть одно предположение.
Когда на компе ничего не запущено (пусть даже мелочь типа аськи или браузера) пилот в разы медленнее работает, видимо из-за технологий энергосбережения, проц частоту сбрасывает.

Проверил. Так и есть.

Чекбоксы работают нормально.
Cockney
Хорошо. Я уж думал мой косяк.
Cockney
По поводу чекбоксов : да, удобнее, если отображается 5 букв на чекбоксе, а если больше? + имя это уникальный(в принципе, может быть одинаковым, но тогда система даст сбой) идентификатор любого элемента. И указав его, можно безошибочно сделать все что угодно. Так и зачем возвращать написанное на контроле?



или я опять не понял суть?
Cockney
Апдейт.

-Пофикшены несрабатывающие события
-Добавлено свойство форм : AlwaysTop. 1 - окно всегда будет сверху других, 0 - обычное поведение.

Нажмите для просмотра прикрепленного файла или Диск
DarkMaster
Ну и в целом можно коснуться старой, но все еще болезненно актуальной темы контроля статуса: https://forum.uokit.com/index.php?s=&sh...st&p=157513
Переменные пока не выведешь, но вот массивы можно начинать разгр<вырезано анти-матом>.
cirus
Цитата
По поводу чекбоксов : да, удобнее, если отображается 5 букв на чекбоксе, а если больше? + имя это уникальный(в принципе, может быть одинаковым, но тогда система даст сбой) идентификатор любого элемента. И указав его, можно безошибочно сделать все что угодно. Так и зачем возвращать написанное на контроле?

То что всё и так можно сделать это да.

Нажмите для просмотра прикрепленного файла
Что вижу в форме: Главное меню, Script1, Script2, Script3, start_script, HP, MP, CP.
Что пишу в скрипте: Main, Button, Button2, Button3, label, chk, chk2, chk3.
Т. е. вижу одно, пишу другое.


Возьмём, например, кнопку с именем Button2 и заголовком Script2. If будет выглядеть так:
Код
set %action GUI.GetAction ()
if %action [1 2] = Button2 and %action [1 3] = BUTTON_CLICK

Если надо будет что-то отредактировать в скрипте, придётся либо ползти в xml, либо выводить в лог или хинт GUI.GetAction чтобы узнать как называется кнопка.

Если же возвращать 4 элемента (форма, компонент, имя компонента, событие.), то If будет таким:
Код
set %action GUI.GetAction ()
if %action [1 3] = Script2 and %action [1 4] = BUTTON_CLICK

Сразу понятно что используется кнопка Script2.

Не думаю что кто-то будет делать кнопки с одинаковым названием. Никто ведь не пишет переменные с одинаковым названием.
cirus
Двойной клик по тексту (label) копирует этот текст в буфер. Так и должно быть?
Cockney
Вроде как нет.
-------
А вроде как бы и да. На ХР такого эффекта не должно быть. Но начиная с висты при двойном клике по тексту он скопируется в буфер. Этот эффект убирается путем отключения двойных кликов.
Cockney
Есть небольшой костыль.
cirus
Цитата
Но начиная с висты при двойном клике по тексту он скопируется в буфер. Этот эффект убирается путем отключения двойных кликов.

Я и не знал что такое есть smile.gif Обычно текст просто выделяется.
Cockney
Я до сегодняшнего дня тоже не знал....инновации..
------
выделяется в поле с возможностью редактирования,а в статическом поле сразу в буфер.
Cockney
Апдейт.

-Теперь GetAction возвращает 4 элемента:

1 - Имя формы
2 - Имя контрола
3 - Текст контрола
4 - Описание события

-GetState может получить статус чекбокса, обратившись к нему по его же тексту.(по имени так же работает).
Текст указывается во втором параметре.


Нажмите для просмотра прикрепленного файла или Диск



----------------------------------
Так, я не помню, клики менял или нет? все так же некорректно отрабатывают?
cirus
Цитата
-Теперь GetAction возвращает 4 элемента:

Спасибо. Так намного удобнее.
Цитата
Так, я не помню, клики менял или нет? все так же некорректно отрабатывают?

Да, также, если двойной клик делать не очень быстро, то перед ним срабатывает одиночный.
Cockney
в целом работает нормально?тормоза,баги?
cirus
Цитата
в целом работает нормально?тормоза,баги?

Пока только тестил что и как работает. Проблем не было. Если что-то будет отпишу.
Ошибки могут быть если использовать несколько плагинов одновременно, но уже к кнайту вопросы.
Cockney
А к чему несколько то их?один плагин в теории сможет обслуживать сколь угодно окон с любой начинкой.
cirus
Я имел ввиду несколько разных плагинов. Например, "Плагин для получения информации об окне" и "Математические операции с плавающей точкой" вместе не работают.
cirus
Цитата
GUI.Enable (<Тип элемента> <Имя формы> <Имя элемента> <Статус>)

Для Edit работает, для других элементов, вроде как, нет или я как-то не так пишу.
Cockney
для кнопки:

Код
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить


Или ты хочешь отключить что-то по ТЕКСТУ а не по ИМЕНИ?
cirus
Цитата
Или ты хочешь отключить что-то по ТЕКСТУ а не по ИМЕНИ?

Проще было бы по имени, но для начала чтобы вообще работало.
Нажмите для просмотра прикрепленного файла
Cockney
Странно, я не трогал Enable, но когда тестил он работал. Проверю.

Забыл, регистр имеет значенее, в моем коде ошибка.

Текст и чекбоксы пока не добавил.
cirus
Цитата
регистр имеет значенее

Теперь работает.
cirus
Цитата
Текст и чекбоксы пока не добавил.

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

Что за пункт <MultiText>?
Cockney
если это для едита,то свойство,позволяющее вмещать несколько строк в поле ввода.
cirus
Цитата
если это для едита,то свойство,позволяющее вмещать несколько строк в поле ввода.

Символ перевода строки воспринимается какой-то? Типа \n?

Еще такой момент:
Код
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить

Выдаст ошибку, т. к неправильно указано имя.
Меняем на:
Код
set $a GUI.Enable (*Button* *Main* *Button* *0*) //выключить

И тоже выдаст ошибку, пока не перезапустишь пилот или плагин.
Цитата
Ну и в целом можно коснуться старой, но все еще болезненно актуальной темы контроля статуса: https://forum.uokit.com/index.php?s=&sh...st&p=157513
Переменные пока не выведешь, но вот массивы можно начинать разгр<вырезано анти-матом>.

В поля Edit и Text уже и так можно выводить переменные.

Можно еще добавить 5й параметр для GUI.SetText <Цвет текста>.
Код
GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст> <Цвет текста>)


Потом в описании плагина лучше исправить <> на **.
Код
GUI.SetText (*Тип элемента* *Имя формы* *Имя элемента* *Новый текст* *Цвет текста*)
DarkMaster
Цитата
Потом в описании плагина лучше исправить <> на **.

Спорное утверждение. <> - является стандартным обозначением обязательного параметра. ** - являются никому не понятным костылем из-за особенностей пилота. Возможно стоит ввести оба набора обозначений и/или добавить сноску.

Цитата
В поля Edit и Text уже и так можно выводить переменные.

Тем не менее есть еще паразитные рамки окон, само окно можно было бы сделать прозрачным. Все это очень легко вылазит, когда начинаешь использовать. Сейчас под те же надобности использую лог. Весь набор проблем при использовании окон по сути остается: пропадает куча места, мешает работе, нет цветовых обозначений. Даже еще один момент появляется - нет настройки размера кегля и уйдя на кухню я уже не увижу, что там на мониторе.
cirus
Цитата
Спорное утверждение. <> - является стандартным обозначением обязательного параметра. ** - являются никому не понятным костылем из-за особенностей пилота.

Для 99% людей, в том числе для меня, <> от ** ни чем не отличается и ничего не означает smile.gif
Цитата
Возможно стоит ввести оба набора обозначений и/или добавить сноску.

Хотя бы так.
DarkMaster
Цитата
Для 99% людей,

Разве что местных и то сомнительно smile.gif Если человек хоть немного сталкивался с любым языком программирования или скриптовым языком, то он должен это знать. Даже, если хотя бы батники писал.
Cockney
Цитата(cirus @ 29.2.2016, 10:51) *

Символ перевода строки воспринимается какой-то? Типа \n?

Еще такой момент:
Код
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить

Выдаст ошибку, т. к неправильно указано имя.
Меняем на:
Код
set $a GUI.Enable (*Button* *Main* *Button* *0*) //выключить

И тоже выдаст ошибку, пока не перезапустишь пилот или плагин.

В поля Edit и Text уже и так можно выводить переменные.

Можно еще добавить 5й параметр для GUI.SetText <Цвет текста>.
Код
GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст> <Цвет текста>)


Потом в описании плагина лучше исправить <> на **.
Код
GUI.SetText (*Тип элемента* *Имя формы* *Имя элемента* *Новый текст* *Цвет текста*)



1)Вроде как да, \n
2)Пока только так, любая ошибка - смерть плагина. По этому я был за обращение по имени из GetAction
3)Будут отдельные команды для установки цвета, шрифта, размера
4)Это конечно на вкус и цвет, но <> намного визуально приятней, чем *, поэтому, в описании функций лучше использвать <>. Легче воспринимается. + я указывал, как передаются параметры.
Cockney
Цитата(DarkMaster @ 29.2.2016, 11:02) *

нет настройки размера кегля


это что такое?т.е. шрифт?
DarkMaster
Цитата
это что такое?т.е. шрифт?

Размер шрифта. Шрифт желательно иметь возможность установить моноширный(все буквы одинаковой ширины, обычно используется в консоли, при написании кода, в теге "код" на форуме и т.д.).
Cockney
могу,ошибаться,но шрифты так и накладываются на контролы.
DarkMaster
Цитата
могу,ошибаться,но шрифты так и накладываются на контролы.

Это свойства шрифта моноширный он или нет. В винде обычно используется Arial - он не моноширный. Самый просто способ посмотреть шрифты - открыть выбор шрифта в пилоте. Все что консольные, курьер, систем и т.д. моноширные. По большому счету, если будет, как ты говорил, поддержка изменения шрифта, то это позволит использовать моноширный шрифт.
Cockney
Цитата(DarkMaster @ 29.2.2016, 19:43) *

Это свойства шрифта моноширный он или нет.



На сколько я могу судить по мдсн, то это стандартные кисти шрифтов, которые имеют системные размеры (ширина, высота и диагональ вроде(или специфическая мерка какая-то)). а можно создать кастом кисть со своими мерками. Надеюсь я не утону в справке и смогу реализовать.
DarkMaster
Цитата
Надеюсь я не утону в справке и смогу реализовать.

По идее все, что нужно - это возможность задать шрифт, остальное само встанет должным образом.
cirus
Цитата
Вроде как да, \n

Код
set $a GUI.SetText (*Edit* *Main* *edit* *aaa\nbbb*)

Выведет всё в одну строку. Как-то по-другому надо?
Cockney
Цитата(cirus @ 1.3.2016, 2:17) *

Код
set $a GUI.SetText (*Edit* *Main* *edit* *aaa\nbbb*)

Выведет всё в одну строку. Как-то по-другому надо?


а пилот служебные обрабатывает?
-------
я не знаю,как написать этот символ в пилоте,но в делфи он так пишется - #13
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.