Реклама

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, или их можно вообще не писать):

 

2) wtReacting - ссылка на Widget (nil = wtMovable).

Виджет, на который привязывается реакция, т.е. виджет, ЗА КОТОРЫЙ будет перетаскиваться wtMovable. Это может быть сам wtMovable, то есть сама перетаскиваемая панель, но НЕ обязательно (!), это может быть что угодно, например, ЗАГОЛОВОК ОКНА, "дочерний" по отношению к ОКНУ wtMovable. Если не указан - виджет wtMovable перемещается сам за себя.

3) fUseCfg - true/false (nil = false).

Сохранять ли позицию виджета в конфиг-файл User.cfg. Если да, то сохранит в таблице с именем "DnD:<путь к виджету wtMovable в иерархии>", в секции, названной по имени аддона. Рекомендуется, чтобы все родительские виджеты wtMovable имели осмысленные, не динамические, уникальные имена.

4) fLockedToParentArea - true/false (nil = true).

Если true, то передвигаемый виджет нельзя даже частично утащить за края родительского окна (чаще всего ими являются края экрана). Таким образом он всегда будет находиться целиком на экране (если не переопределено в параметре Padding, см. ниже). А если false, то его можно утащить полностью, точно так же, как можно утаскивать окна в ОС Microsuxx Windows.

5) Padding - число или таблица из 4 чисел {Верхний,Правый,Нижний,Левый} (nil = {0,0,0,0}).

Если fLockedToParentArea=true, то действует Padding. Если хотите, чтобы за край окна всё-таки можно было частично утащить wtMovable на какую-то глубину, то можете заполнить таблицу. Например, это сделано в аддонах "PhanTime" и "HonorInfo", где по краям панели имеется "тень" толщиной 8 пикселей. Там эта таблица заполнена отрицательными числами, вот так: {-8,-8,-8,-8}. В случае передачи числа в качестве параметра, оно будет использовано в качестве глубины по всем направлениям.

 

6) KbFlag - флаги управляющих клавиш KBF_*.

Если надо, чтобы wtMovable двигался только при нажатии клавиш Shift, Ctrl или Alt, передаем здесь соответствующие флаги KBF_*:

nil - нажатие любой из перечисленных клавиш не имеет никакого эффекта.

KBF_NONE - Перетаскивание только при не нажатых клавишах

KBF_SHIFT - Перетаскивание только при нажатой "Shift"

KBF_ALT - Перетаскивание только при нажатой "Alt"

KBF_CTRL - Перетаскивание только при нажатой "Ctrl"

KBF_ANY - Перетаскивание только при любой нажатой клавиши из перечисленных

7) 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 } )

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


Изменения в версии 2014-10-29   Просмотреть список изменений

Выпущена

  • 2014-10-29:
  • DnD.Init также поддерживает старый список параметров: DnD:Init(ID, wtReacting, wtMovable). Таким образом для перехода на новую версию LibDnD достаточно просто заменить файл LibDnD.lua на новый.
  • 2014-10-28:
  • Функции DnD.Init, DnD.Enable, DnD.IsDragging, DnD.Remove поддерживают вызов через двоеточие. Для этого не надо менять эти вызовы в LibDnD.lua.
  • 2014-10-24:
  • Изменились прототипы большинства функций, при обновлении библиотеки LibDnD в своих аддонах необходимо править код, обращающийся к переменной DnD.
  • Изменен прототип функции DnD:Init. Изменен способ вызова функции на DnD.Init. Параметр ID удален. Параметры wtMovable и wtReacting поменялись местами. Добавлены параметры KbFlag и Cursor. Параметр Padding теперь может быть числом.
  • Добавлена функция DnD.Remove для удаления виджета из системы DnD. Функцию необходимо вызывать перед DestroyWidget.
  • Изменен способ вызова функции DnD:Enable на DnD.Enable
  • Изменен способ вызова функции DnD:IsDragging на DnD.IsDragging.
  • Уникальные идентификаторы для передачи в mission.DNDRegister теперь выделяются самой LibDnD с помощью RequestIntegerByInstanceId в диапазоне 300200+ (с целью обезопасить от возможных конфликтов).
  • LibDnD больше не поддерживает старый формат хранения позиции виджета в настройках ("w<ID>x" и "w<ID>y").
  • LibDnD протестирована на клиентах: 6.0.00, 5.0.01, 4.0.02, 3.0.00, 1.1.02.




Отзывы пользователей

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


Ollaf

  • 5
  

Поделиться отзывом


Ссылка на отзыв
GRuSHa

  • 5
  

Поделиться отзывом


Ссылка на отзыв