Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать


1 изображение

Информация о файле

Официальная версия LibDnD для аддонов. Рекомендуется разработчикам аддонов использовать данную версию LibDnD в своих аддонах.

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

Если требуется какой-то особенный дополнительный функционал, или кто-то готов поделиться своим, то можно об этом попросить на странице разработки LibDnD.

HOW-TO: LibDnD.lua - Библиотека Drag&Drop

Простейший пример использования LibDnD

Файл LibDnD.lua нужно включить в AddonDesc.(UIAddon).xdb, в секции <ScriptFileRefs>:

    <ScriptFileRefs>
        <Item href="LibDnD.lua" />
...
    </ScriptFileRefs>

DnD.Init() - Инициализирует виджет для Drag&Drop. Это нужно только один раз, во время инициализации аддона, или позже, когда угодно. Повторные вызовы для того же самого виджета на данный момент нежелательны.

Пример:

DnD.Init( wtMainPanel )

Всё, Drag&Drop УЖЕ работает 🙂

Функция DnD.Init()

Синтаксис:

DnD.Init( wtMovable, wtReacting, fUseCfg, fLockedToScreenArea, Padding, KbFlag, Cursor )

Обязательные параметры:

  1. wtMovable - ссылка на Widget.
    Виджет, КОТОРЫЙ нужно перемещать.

Необязательные параметры (могут быть nil, или их можно вообще не писать):

  1. wtReacting - ссылка на Widget (nil = wtMovable).
    Виджет, на который привязывается реакция, т.е. виджет, ЗА КОТОРЫЙ будет перетаскиваться wtMovable. Это может быть сам wtMovable, то есть сама перетаскиваемая панель, но НЕ обязательно (!), это может быть что угодно, например, ЗАГОЛОВОК ОКНА, "дочерний" по отношению к ОКНУ wtMovable. Если не указан - виджет wtMovable перемещается сам за себя.
     
  2. fUseCfg - true/false (nil = false).
    Сохранять ли позицию виджета в конфиг-файл User.cfg. Если да, то сохранит в таблице с именем "DnD:<путь к виджету wtMovable в иерархии>", в секции, названной по имени аддона. Рекомендуется, чтобы все родительские виджеты wtMovable имели осмысленные, не динамические, уникальные имена.
     
  3. fLockedToParentArea - true/false (nil = true).
    Если true, то передвигаемый виджет нельзя даже частично утащить за края родительского окна (чаще всего ими являются края экрана). Таким образом он всегда будет находиться целиком на экране (если не переопределено в параметре Padding, см. ниже). А если false, то его можно утащить полностью, точно так же, как можно утаскивать окна в ОС Microsuxx Windows.
     
  4. Padding - число или таблица из 4 чисел {Верхний,Правый,Нижний,Левый} (nil = {0,0,0,0}).
    Если fLockedToParentArea=true, то действует Padding. Если хотите, чтобы за край окна всё-таки можно было частично утащить wtMovable на какую-то глубину, то можете заполнить таблицу. Например, это сделано в аддонах "PhanTime" и "HonorInfo", где по краям панели имеется "тень" толщиной 8 пикселей. Там эта таблица заполнена отрицательными числами, вот так: {-8,-8,-8,-8}. В случае передачи числа в качестве параметра, оно будет использовано в качестве глубины по всем направлениям.
     
  5. KbFlag - флаги управляющих клавиш KBF_*.
    Если надо, чтобы wtMovable двигался только при нажатии клавиш Shift, Ctrl или Alt, передаем здесь соответствующие флаги KBF_*:
    • nil - нажатие любой из перечисленных клавиш не имеет никакого эффекта.
    • KBF_NONE - Перетаскивание только при не нажатых клавишах
    • KBF_SHIFT - Перетаскивание только при нажатой "Shift"
    • KBF_ALT - Перетаскивание только при нажатой "Alt"
    • KBF_CTRL - Перетаскивание только при нажатой "Ctrl"
    • KBF_ANY - Перетаскивание только при любой нажатой клавиши из перечисленных
       
  6. Cursor - строка/false (nil = "drag").
    Стиль курсора, который будет устанавливаться при перетаскивании.
    • nil/true - используется курсор по умолчанию: "drag".
    • false - курсор не меняется при перетаскивании.

Примеры использования DnD.Init()

Виджет Окно (wtWindow), которое можно таскать за виджет Заголовок-окна (wtTitle), являющийся дочерним виджетом Окна:

DnD.Init( wtWindow, wtTitle )

Виджет таскается сам по себе, И его позиция сохраняется между игровыми сессиями (создаёт секцию по названию аддона в файле User.cfg):

DnD.Init( wtPanel, wtPanel, true )

или:

DnD.Init( wtPanel, nil, true )

Виджет не сохраняет позицию между игровыми сессиями, и его можно утащить почти полностью за край экрана:

DnD.Init( wtPanel, nil, false, true )

Позицию в конфиг не сохраняет, но за то, "тень" по краям текстуры фона окна аддона, имеющая

толщину 8 пикселей со всех сторон, будет красиво задвигаться за край экрана (так сделано в аддонах "PhanTime" и "HonorInfo"):

DnD.Init( wtMainPanel, nil, nil, nil, {-8,-8,-8,-8} )

или:

DnD.Init( wtMainPanel, nil, nil, nil, -8 )

Делаем сразу три разных виджета передвигаемыми в одном аддоне:

DnD.Init( wtTrayButton )
DnD.Init( wtMainWindow )
DnD.Init( wtConfigWindow )

Делаем передвигаемую wtMainPanel и все её дочерние виджеты в пределах родителя с учетом рамки в 4 пикселя при нажатой клавише Ctrl, с сохранением всех позиций в User.cfg:

DnD.Init( wtMainPanel, nil, true )
for _,wtChild in pairs( wtMainPanel:GetNamedChildren() ) do
   DnD.Init( wtChild, nil, true, nil, 4, KBF_CTRL )
end

Функция DnD.Enable()

Синтаксис:

DnD.Enable( wtWidget, fEnable )
  1. wtWidget - ссылка на Widget.
    Это может быть wtReacting или wtMovable, не важно, т.к. оба варианта работают.
     
  2. fEnable - true/false.
    Если true, то виджет будет реагировать на Drag&Drop, а если false, то Drag&Drop виджета будет запрещён (то есть, виджет будет "пристёгнут", и будет игнорировать все попытки перетаскивания).

Этой функцией пользоваться НЕ обязательно, т.к. все виджеты, зарегистрированные в системе функцией DnD.Init(), по умолчанию, АКТИВНЫ. Но если возникнет необходимость "пристегнуть" такой виджет, то функция DnD.Enable() существует именно для этого. Она меняет статус виждета, перманентно разрешающий или запрещающий его Drag&Drop. "Пристегнуть" виджет можно командой DnD.Enable( ВашВиждет, false ), и он будет игнорировать все попытки перетаскивания. Если позже вам потребуется снова разблокировать его (снова сделать перетаскиваемым), то сделайте это командой DnD.Enable( ВашВиждет, true ).

Функция DnD.Enable() может потребоваться вам, например, если вы захотите сделать в своём аддоне полноценную поддержку событий аддона AddonManager.

Подробнее об этом написано здесь: Поддержка событий AddonManager в других аддонах

Функция DnD.IsDragging()

Синтаксис:

DnD.IsDragging()

Если в вашем аддоне есть перетаскиваемые кнопки (такие есть, например, в аддонах "DarkDPSMeter" и "GuildGui1b"), то вам пригодится функция DnD.IsDragging(). Чтобы при перетаскивании такой кнопки, ИЗБЕЖАТЬ нажатие на неё, вставьте такую строку в начало кода реакции на нажатие кнопки:

if DnD.IsDragging() then return end

Функция DnD.Remove()

Синтаксис:

DnD.Remove( wtWidget )
  1. wtWidget - ссылка на Widget.
    Виджет, который нужно разрегистрировать в системе DnD, чтобы его можно было безопасно уничтожить с помощью DestroyWidget. Передавать надо именно тот виджет, который собираетесь уничтожать.
    На данный момент не проверяет, зарегистрированы ли в системе дочерние по отношению к wtWidget виджеты, поэтому, если вы их регистрировали, то необходимо вызывать DnD.Remove и для них.
    Пример:
for _,wtChild in pairs( wtMainPanel:GetNamedChildren() ) do
   DnD.Remove( wtChild )
end
DnD.Remove( wtMainPanel )
wtMainPanel:DestroyWidget()

Бонус: функции GetConfig() и SetConfig()

Примеры:

Получить весь конфиг аддона в виде ТАБЛИЦЫ (если он есть в User.cfg), или nil (если его там нет):

Config = GetConfig()

Получить из конфига значение переменной Name (если она есть) или nil (если её там нет).

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

MyOption = GetConfig( Name )

Сохранить в конфиг-файл переменную Name со значением Value.

Те же условия для имени и значения, что описаны в предыдущем примере.

SetConfig( Name, Value )

Если передать только ОДИН параметр, но ТАБЛИЦУ, то все её переменные будут аккуратно добавлены (merged) в конфиг аддона. Именно добавлены. То есть, тупой перезаписи одной таблицы поверх другой эта функция НЕ делает.

SetConfig( {  ["A"] =5,  [100] ={1,10,100},  ["Yes"] =true } )

Этим двум функциям НЕ нужно указывать название секции, т.к. они всегда пользуются секцией, названной именем аддона.


Что нового в версии 2023-04-26   Просмотр изменений

Размещено

Фикс под 14.1 @Slashuur


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

Важная информация

Пользуясь сайтом, вы принимаете Условия использования