Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

Recommended Posts

LibDnD

Просмотр файла

Официальная версия 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 } )

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


 

Edited by Fye D. Flowright
Link to comment
Share on other sites

HOW-TO: LibDnD.lua - Drag&Drop Library

It so happened that the Drag&Drop code, posted once here, has grown into a large separate library. Many people copied it, almost everyone have changed it by adding different functionality, and so different modifications of this code have populated in many addons. In most cases, people was adding a multiple widgets support in a single addon, and the position saving to User.cfg.

So I have made a separate library LibDnD, with all those features (Btw, it is attached to the upper post). Here is a list of new features, in addition to all that was in previous versions:

  • VERY easy to use! :)
  • Can work with multiple widgets in a single addon.
  • Can save widgets positions into the config file(optional).

When dragging, keeps the movable panel in the screen area edges(optional).

On initialization, and on game resolution changes, brings all moving widgets to the screen area.You can set the Padding, that the panel locked to screen area, could be partially pushed off the screen area(optional).

Even easier to use, Drag&Drop works after a single command.This command has only 2 required params - ID and Widget - others are optional.Some minor tweaks and some protection against user mistakes, invisible until you "eat a pound of salt" on the Drag&Drop in the AO.Free bonus - GetConfig() and SetConfig() functions.

The library moved to a separate file LibDnD.lua.

Since library functionality (or rather, the demands on it) has more or less well established, the existing functions syntax will not change in the future. Although it will be a little more extended. But backward compatibility will be always maintained (advanced params that will appear in future versions, will be optional, so they can be omitted).

In the next version, for example, I will remove the restrictions requiring that the moving panel was necessarily positioned as WIDGET_ALIGN_LOW.

Basic LibDnD usage example

I hope everybody knows that LibDnD.lua should be included in AddonDesc.(UIAddon).xdb, in <ScriptFileRefs> section:

Code:
<Item href="LibDnD.lua" />

DnD:Init() is initializing the widget for Drag&Drop. It is required only once, during an addon initialization, or anytime later. (Although, nothing terrible will happen if you do it 500 times in a row, even if using the same ID and different widget names each time - just the same ID will be reinitialized with the new widgets and parameters).

Code:
DnD:Init( MY_DND_ID, wtMainPanel )

-- Done, Drag&Drop is ALREADY working :))

Features

1) Using DnD:Init() you can register AS MANY widgets AS YOU WANT in a single addon, using different IDs for each.

2) Moving widget (wtMoving) MUST be positioned as WIDGET_ALIGN_LOW (by X and by Y), but in future versions of this library, this restriction will be removed.

3) If you think that function OnDragTo() should move something more than one panel, then you probably badly designed the hierarchy of widgets:) It is better to make so, that all you have to move, is wrapped in a single panel, which we will be moving. Otherwise, it is hard to standardize this process.

Syntax of DnD:Init()

DnD:Init( ID, wtReacting, wtMovable, fUseCfg, fLockedToScreenArea, Padding )

Required params:

1) ID - number between 2 and 999.

ID of the reacting widget, must be unique in ALL addons scope (!) If your ID, accidentally, matches with the ID of another addon, then both addons will be dragging together. So, try not to use someone else's IDs.

2) wtReacting - link to Widget.

Widget, to which binds the reaction, i.e. the widget at WHICH YOU WILL HOLD A MOUSE PRESSED to drag wtMovable. It can be wtMovable itself, the widget which you want to be movable, but not necessarily (!) it can by anything, for example a WINDOW TITLE, which is a "child" of wtMovable WINDOW.

Optional params (can be nil, or you can even omit them all):

3) wtMovable - link to Widget (nil = wtReacting).

Widget, WHICH WILL BE MOVING while are you dragging the wtReacting widget. If it is not wtReacting itself. For example, this can be a panel, which is "parent" to wtReacting (commonly MainPanel). Or you can pass here the same widget which you have passed in wtReacting. Or nil, which is equivalent to wtReacting.

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

To save the position into config file User.cfg, or not. If true, then it will be saved in a very compact way, in the section, named after the addon, using only 2 variables, one for X and second for Y. (Also read below about the two bonus functions GetConfig () and SetConfig () ).

5) fLockedToScreenArea - true/false (nil = true).

If true, the widget is not even partially movable off the screen edges. It will always stay entirely on the screen (although there is a Padding option, described below). But if false, then you can drag it off screen almost entirely, the same way as you can drag any window off-screen in Microsux Windows OS.

6) Padding - table consisting of 4 numbers {Top,Right,Bottom,Left} (nil = {0,0,0,0} ).

If fLockedToScreenArea=true, then Padding is enabled. If you want to alter the "invisible Drag&Drop edges" of your widget, to make it partially (at some depth) draggable off the screen edges, you can fill in the table. For example, it is done in "PhanTime" and "HonorInfo" addons, where the edges of the panel has an 8 pixels wide "shadow". In those addons, this table is filled with negative numbers, this way: {-8,-8,-8,-8}.

DnD:Init() usage examples

Window widget (wtWindow), which you can drag by holding its Title widget (wtTitle), which is a "child" of a Window:

Code:
DnD:Init( ID, wtTitle, wtWindow )

Widget is draggable by itself, AND it saves its position between game sessions (Creates a section in User.cfg, named after the addon):

Code:
DnD:Init( ID, wtPanel, wtPanel, true )

-- or

DnD:Init( ID, wtPanel, nil, true )

This widget don't save its position into config, AND you can drag it off screen almost entirely:

Code:
DnD:Init( ID, wtPanel, nil, false, true )

This one also don't save its position, but it have an 8 pixels width "shadow" painted on all four sides of its background texture, and this "shadow" can be dragged off the screen edge (this is done in addons "PhanTime" and "HonorInfo"):

Code:
DnD:Init( ID, wtMainPanel, nil, nil, nil, {-8,-8,-8,-8} )

Making 3 different widgets draggable in one addon:

Code:
DnD:Init( ID1, wtTrayButton )

DnD:Init( ID2, wtMainWindow )

DnD:Init( ID3, wtConfigWindow )

DnD:Enable() function

Syntax:

DnD:Enable( wtWidget, fEnable )

1) wtWidget - link to Widget

It can be wtReacting or wtMovable, it is not important, because both variants works.

2) fEnable - true/false.

If true, then widget will respond to Drag&Drop. But if false, then Drag&Drop will be denied for this widget (that is, the widget will be "locked", it will ignore all attempts to drag).

You are not necessarily have to use this function, because all widgets that are registered in the system by DnD:Init(), by default are ACTIVE. But if you, for some reason, want to "lock" the widget, then DnD:Enable() function exists exactly for this purpose. It changes the status of widget, permanently allowing or disallowing its Drag&Drop. You can "lock" the widget using DnD:Enable( YourWidget, false ), and it will ignore all attempts to drag. If later you need to unlock it again (to make it draggable again), then do this by using DnD:Enable( YourWidget, true ).

You may need this function, if you want to upgrade your addon with full support of AddonManager special events.

More info about it can be found here: AddonManager support in other addons

DnD:IsDragging() function

If your addon have a draggable buttons (such is, for example, in "DarkDPSMeter" and "GuildGui1b" addons), then DnD:IsDragging() is a useful function for you. So, to AVOID the button "click" while you are dragging it, insert the following line at the beginning of the button click event reaction:

Code:
if DnD:IsDragging() then return end

Bonus: GetConfig() and SetConfig() functions

Usage:

Get the complete addon config as a TABLE (if it exists in User.cfg), or nil (if not exists):

Code:
Config = GetConfig()

Get the "Name" variable from config (if this variable exists in User.cfg) or nil (if not exists).

Variable name can be a string or a number, and its value can be anything, even a table.

Code:
MyOption = GetConfig( Name )

Save the "Name" variable with "Value" value into config file.

The same rules apply to variable name and its value, as described in previous example.

Code:
SetConfig( Name, Value )

If you pass only ONE parameter, and it is a TABLE, then all its variables will be carefully MERGED into config section.

That is, merged. It do NOT foolishly overwrite one table over another.

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

You don't need to pass a config section name into those 2 functions, because they always use the section named after the addon.

SampleLibDnD.zip

There is a working example of using the library, including the library itself LibDnD.lua. You can download it thom the attachment in the upper post.

P.S. This text will be periodically updated along with the library.

Link to comment
Share on other sites

  • 2 weeks later...

RU:

Библиотека и описание обновлены до версии 2010-09-20.

-- Исправлен баг, из-за которого, параметр fLockedToScreenArea нельзя было выставить false.

-- Функции DnD:Reg() и DnD:Unreg() теперь принимают в качестве параметра wtReacting или wtMovable. Это для удобства, чтобы в эти функции можно было бы передавать тот же самый виджет, который прячем/показываем командой ИмяВиджета:Show().

EN:

Library and description was updated to version 2010-09-20.

-- Fixed bug, which prevented from setting the parameter fLockedToScreenArea to false.

-- Functions DnD:Reg() and DnD:Unreg() now accepts as a parameter wtReacting or wtMovable. This is for convenience, so that you can pass to those functions the same widget, which you show/hide by WidgetName:Show() function.

Link to comment
Share on other sites

RU:

Библиотека обновлена до версии 2010-09-28.

-- Добавлено "обхождение" бага игры, из-за которого виджеты, придвинутые к самому правому и/или нижнему краю экрана, сдвигались со своих позиций при смене резолюции игры, и переключении Alt+Tab.

-- Кроме того, этот фикс добавил приятное свойство - например, если придвинуть виджет к правому краю экрана в резолюции 16:9, и переключиться на 4:3 (при этом, виджет будет заботливо передвинут в видимую область экрана), затем если НЕ двигать этот виджет вручную в резолюции 4:3, и переключиться обратно в 16:9, то... вуаля! Виджет встанет на прежнее место, где он был изначально, до переключения с 16:9 :)

-- UPD 2010-10-05: Библиотека обновлена до версии 2010-10-05. Ничего не изменилось, только убран хак для версий АО 1.1.00/01, в связи с тем, что сегодня в EU/US стартует АО 1.1.02.

EN:

Library was updated to version 2010-09-28.

-- Added "handling" of a game bug, which caused widgets, placed on the rightmost and/or bottommost border of the screen, to shift from their positions on changing game resolution, and Alt+Tab'ing.

-- In addition, this fix added a nice feature - for example, if you move the widget to the right edge of the screen in a 16:9 resolution, and then switch to 4:3 resolution (in this case, the widget will be carefully moved into the visible screen area), then if you do NOT manually move this widget in 4:3 resolution, and switch back to 16:9, then... voila! Widget will appear in its former place, where it was originally, before switching from 16:9 :)

-- UPD 2010-10-05: Library was updated to version 2010-10-05. Nothing changed, just removed the hack for AO 1.1.00/01, because today EU/US gets AO 1.1.02.

Link to comment
Share on other sites

  • 2 months later...

RU:

Библиотека и описание обновлены до версии 2010-11-28.

-- Отремонтировано для АО 2.0.01. Естественно, сохранена и обратная совместимость с EU/US версиями.

-- Убраны функции DnD:Reg() и DnD:Unreg() - они больше не нужны. Совсем! :) Получается, что теперь, для *полноценной* работы всей этой системы, достаточно лишь одного вызова DnD:Init() - сбылась моя давняя мечта :)

-- Добавлена функция DnD:Enable(), которая может понадобиться для поддержки "AddonManager" (здесь подробнее).

Подробнее об этом релизе написано здесь: Патч 2.0.01 - Ремонтируем Drag&Drop

UPD 2010-12-08:

-- Добавлена обработка события EVENT_DND_DRAG_CANCELLED.

-- Теперь, виджеты, передаваемые в функцию DnD:Enable(), распознаются с помощью GetInstanceId(), то есть, теперь они распознаются ВСЕГДА, даже если виджет хранился не в глобал-переменной, а был заново взят с помощью GetChildChecked().

-- Реакции на события EVENT_DND_DRAG_TO, EVENT_DND_DROP_ATTEMPT, EVENT_DND_DRAG_CANCELLED теперь регистрируются ТОЛЬКО на время перетаскивания виджета, и только если этот виджет принадлежит аддону, зарегистрирован для Drag&Drop, и не выключен вызовом DnD:Enable(). По окончании перетаскивания, регистрация этих трёх событий снова отключается. Тем самым, избавляя всю систему от лишней нагрузки.

UPD 2010-12-10:

-- Добавил функцию DnD:IsDragging(), для предотвращения НАЖАТИЯ на кнопку при её перетаскивании (только для перетаскиваемых кнопок). По просьбе Ciuine.

EN:

Library and description was updated to version 2010-11-28.

-- Repaired for AO 2.0.01. Of course, backward compatibility with EU/US versions preserved.

-- Removed DnD:Reg() and DnD:Unreg() functions - they are no longer needed. Forever! :) Exactly, now, for a *full-featured* work of the entire system, we need only a single call of DnD:Init() function - my long-cherished dream became true :)

-- Added DnD:Enable() function, which may be required to support "AddonManager" (more info).

More info about this release is here: Patch 2.0.01 - Repairing Drag&Drop

UPD 2010-12-08:

-- Added EVENT_DND_DRAG_CANCELLED event handler.

-- Now, widgets, passed to DnD:Enable() function, are recognized by GetInstanceId(), that is, they are now recognized ALWAYS, even if the widget wasn't stored in global-variable, and was re-taken by GetChildChecked() instead.

-- EVENT_DND_DRAG_TO, EVENT_DND_DROP_ATTEMPT, EVENT_DND_DRAG_CANCELLED events handlers now registers ONLY when widget is dragging, and only if this widget belongs to the addon, is registered for Drag&Drop, and is not locked by DnD:Enable(). At the end of dragging, these three events are unregistered again. Thereby eliminating the unnecessary overload on the entire system.

UPD 2010-12-10:

-- Added DnD:IsDragging() function, to avoid button CLICK while the button is dragging (for draggable buttons only). By Ciuine request.

Link to comment
Share on other sites

  • 5 months later...

Мудачье. Че еще придумают на этот раз? Какую отмазку?

ЗЫ. Вообще-то сломался не ДнД, а аддоны, использующие эту библиотеку. И я даже догадываюсь из-за чего

ЗЫЫ. ЛайтДПС нормально таскается

Link to comment
Share on other sites

Guest Hommit

своими руками можно чтото пофиксить? или ждать апдейтов?

а то ни гилдгуи, ни дарк не таскаются, а если открыть и попробовать потащить, тупо зависают на экране и даже не закрываются.

Link to comment
Share on other sites

там своя библиотека - не LibDnD

DnD.lua - как то проще и работает...

может ее лучше за основу взять?

особенно меня смущает в LibDnD поиск того что и так есть

Code:
function DnD.Register( wtWidget, fRegister )

if not DnD.Widgets then return end

local ID = DnD.GetWidgetID( wtWidget )

а в DnD.lua делается проще:

Code:
mission.DNDRegister(DnD.wtMov [num] [2] , DnD.ID+num, true )
Link to comment
Share on other sites

RU:

Библиотека обновлена до версии 2011-05-27.

-- Отремонтировано для АО 2.0.06. Естественно, сохранена и обратная совместимость с EU/US версиями.

Кстати, отремонтировать удалось добавлением вызова mission.DNDConfirmPickAttempt() в DnD.OnPickAttempt()

EN:

Library updated to version 2011-05-27.

-- Repaired for AO 2.0.06. Of course, backward compatibility with EU/US versions preserved.

Btw, I have repaired it by adding mission.DNDConfirmPickAttempt() call to DnD.OnPickAttempt()

Link to comment
Share on other sites

Can you add some sort of version based check?

Code:
if avatar.GetUnlocks then

mission.DNDConfirmPickAttempt()

end

For some reason, DarkDPSMeter doesn't drag with this DNDConfirmPickAttempt; atleast in my version/client of Allods.

Anyone want to verify that it's not just me experiencing this?

Link to comment
Share on other sites

RU:

Библиотека обновлена до версии 2011-05-28.

-- Вчерашнее обновление библиотеки (2011-05-27) НЕ работало в EU/US версиях. Отремонтировано!

EN:

Library updated to version 2011-05-28.

-- Yesterday's library update (2011-05-27) did NOT work in EU/US versions. Repaired!

Link to comment
Share on other sites

  • 3 years later...

Теме ап.

Обновил до работающего на клиенте 5.0.02 состояния. Версия 2014-07-02:

  • for k,v in table do --> for k,v in pairs(table) do
  • if mission.GetLocalTimeHMS then --> if common.GetLocalDateTime or common.GetLocalTimeHMS or mission.GetLocalTimeHMS then

 

PS: Я в курсе, что была уже куча разных версий, исправляющих баги и добавляющих разный функционал. Попытаюсь их интегрировать, чтобы не выглядело убого. На данный момент заработали виджеты с выравниванием отличным от WIDGET_ALIGN_LOW, а также научил либу двигать контролы внутри разных окон. Позже выложу несколько разных обновлений. Идеи приветствуются.

LibDnD.zip

Link to comment
Share on other sites

 

Also, math.mod changed to math.fmod. To make it compatible with clients that don't have 5.02 yet, you can use this: 

if not math.mod then math.mod = math.fmod end

 

Yep, thanks.

I have left it intentionally because that math.mod expression is assumed to be used for AO 1.1.02-2.0.00.

So, if AO client starts reporting "Attempt to call a nil value" errors in LibDnD that will likely mean that expression to check for AO 2.0.01+ clients does not work properly.

function DnD.GetItemId( DnDId )
    if common.GetLocalDateTime or common.GetLocalTimeHMS or mission.GetLocalTimeHMS then
        -- AO 2.0.01+
        return ( DnDId - DND_WIDGET_MOVE ) / DND_CONTAINER_STEP
    else
        -- AO 1.1.02-2.0.00
        return math.mod( params.srcId, DND_CONTAINER_STEP )
    end
end

BTW, it was broken for 1,5 years: mission.GetLocalTimeHMS previously solely used in condition is removed since AO 4.0.00.

Link to comment
Share on other sites

  • 1 month later...

Обновил либу:

  • Заработали виджеты с выравниванием, отличным от WIDGET_ALIGN_LOW
  • Научил либу двигать контролы внутри разных окон
  • Изменен принцип хранения положение виджетов в user.cfg: теперь позиция сохраняется в таблице DnD:<путь.к.виджету.в.иерархии>
  • Либа поддерживает и преобразовывает старый формат хранения позиции виджета в новый

Собственно, данная версия уже давно используется в аддоне DnDforEverything.

Должна работать с любыми клиентами, но проверить это не успел.

Пародию на ООП пока не стал убирать для сохранения совместимости.

Link to comment
Share on other sites

  • 3 weeks later...

Два реквеста:

1. Регистрация без указания ID вручную, но используя RequestIntegerByInstanceId.

2. Функции для корректной раз-регистрации (нужно, например, когда двигающийся виджет должен быть удален).

Link to comment
Share on other sites

  • 1 month later...

Обновление LibDnD.lua, version 2014-10-24

Что нового в этой версии:

  • Изменились прототипы большинства функций, при обновлении библиотеки LibDnD в своих аддонах необходимо править код, обращающийся к переменной DnD.
  • Изменен прототип функции DnD:Init. Изменен способ вызова функции на DnD.Init. Параметр ID удален. Параметры wtMovable и wtReacting поменялись местами. Добавлены параметры KbFlag и Cursor.
  • Добавлена функция 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.
Edited by hal.dll
Link to comment
Share on other sites

В планах на ближайшее будущее:

1. Связь между wtMovable и wtReacting типа "многие-ко-многим", как реализовано в аддоне Cartographer (3 окна можно двигать одновременно за заголовок, каждое из 3-х окон можно двигать по отдельности).

2. Поправить кривой расчет положения виджетов после изменения разрешения.

3. Скорей всего семантика параметра fLockedToParentArea, описанная выше, будет возложена на параметр Padding. Параметр fLockedToParentArea будет означать, требуется ли от LibDnD перерасчет положения виджетов после изменения разрешения.

Link to comment
Share on other sites

А зачем изменил название функций DnD:Init | DnD:Enable | DnD:IsDragging на DnD.Init | DnD.Enable | DnD.IsDragging.

Крайне не удобно и не привычно.

Да и создаёт кучу не очень приятных правок в аддонах.

Пришлось твою LibDnD править под себя.

Link to comment
Share on other sites

Причины следующие:

1. Двоеточие - это ООП-изм. Т.е. конструкция для вызова метода "объекта". DnD в данном случае никогда не рассматривался объектом. Использование двоеточия логически ничем не было оправдано.

2. Раз это вызов метода - неявно передается дополнительный параметр self. Который в этой функции даже не используется.

3. Все функции (не методы) клиентского API предоставляют вызов через точку.

4. Нет никакого преимущества вызова через двоеточие. И удобства тоже.

5. Раз программисту всё равно придется править вызов DnD:Init в аддоне из-за удаления одного параметра, то сделать там же глобальную замену DnD: на DnD., на которую способен даже вшивый виндовый блокнот, не представляется трудозатратным. Тем более, что прототипы остальных функций остались прежними.

 

Если настолько не нравится вызов через точку, могу для тебя специально выпускать версию с двоеточием. Или как вариант версию, которая будет принимать оба варианта вызова.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use