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

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

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

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

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

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

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

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

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

Подробнее

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

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

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

MoveExample - Перетаскивание панели


Гость WShad

Рекомендуемые сообщения

можно добавить сохранение положения перетаскиваемых объектов =)

если изменить фукции так:

Code:
function DNDReg(wtWidget, ID)

mission.DNDRegister( DragNDrop [ "Form" .. ID ] .wtReacting , DND_WIDGET_MOVE * DND_CONTAINER_STEP + ID, true )

------------- загрузка позиции

local NewDNDWidgetInfo = {

Widget = wtWidget,

wtID = ID,

CFGPlacement = { posX = 0, posY = 0 },

IsPicked = false

}

local AddonName = common.GetAddonName()

local SectionName = AddonName .. "_Widget_" .. tostring(NewDNDWidgetInfo.wtID)

NewDNDWidgetInfo.CFGPlacement = common.GetGlobalConfigSection( SectionName ) or NewDNDWidgetInfo.Widget:GetPlacementPlain()

NewDNDWidgetInfo.Widget:SetPlacementPlain( NewDNDWidgetInfo.CFGPlacement )

-------------

end

Code:
function OnEventDNDDropAttempt( params )

mission.DNDConfirmDropAttempt()

common.SetCursor( "default" )

if dndid then

if (( dndid > minID or dndid == minID) and (dndid < maxID or dndid == maxID)) then

DragNDrop [ "Form" .. dndid ] .IsPicked = false

------------ сохранение позиции

local AddonName = common.GetAddonName()

local SectionName = AddonName .. "_Widget_" .. tostring( DragNDrop [ "Form" .. dndid ] .ID )

common.SetGlobalConfigSection( SectionName, DragNDrop [ "Form" .. dndid ] .Place )

------------

end

end

dndid = nil

end

может быть написал коряво - я просто практически не думая перенес готовое решение от DarkMasterа ))

так что ему спасибо )

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

2010-06-14:

-- Поправил свой скрипт, выложенный на этой странице вверху (2010-03-15).

Добавил math.ceil() в двух местах, чтобы координаты X и Y не получались дробными числами.

Просто заметил, что если эти X и Y сохранить в user.cfg, а потом вынуть и попытаться присвоить куда полагается, то в логе mods.txt игра матерится, не нравится ей, что float. Так что, лучше их округлять с помощью math.ceil().

2010-06-19:

-- Добавил math.ceil() ещё в двух местах (которые в прошлый раз не заметил). Потому, что округлять желательно все вычисления, в которых используется деление DragNDrop.Screen.fullVirtualSizeX / DragNDrop.Screen.realSizeX, ведь они возвращают дробные значения, которые нам ни к чему.

-- Завернул содержимое функции OnEventDNDDropAttempt() в if DragNDrop.IsPicked then ..... end, аналогично тому, как в это же самое завёрнута функция OnEventDNDDragTo(). Это нужно было потому, что ОКАЗЫВАЕТСЯ, событие EVENT_DND_DROP_ATTEMPT получают, одновременно, ВСЕ аддоны. И везде, где нет проверки на IsPicked, одновременно выполнялся этот код закрепления виджетов. Включая сохранение позиций в конфиг-файл, во всех аддонах, где это предусмотрено. И ещё, в таких случаях, в лог ошибок, что DragNDrop.Place есть nil. Это исправление закрывает все эти ошибки.

UPD 2010-07-14: Оказывается, баг с "зависанием" перетаскиваемых иконок в воздухе никак не связан с аддоном DarkDPSMeter, он замечен в других аддонах. И этот назойливый баг лечится ИМЕННО этой поправкой к OnEventDNDDropAttempt(), которую я сделал 2010-06-19. Девелоперы! Просьба всем обновить код перетаскивания в своих аддонах. У кого в функции OnEventDNDDropAttempt() нет проверки на IsPicked - обязательно добавьте её!

UPD 2010-07-15: Более того, я заметил, что во многих аддонах, в функции OnEventDNDDropAttempt() было сделано по тому же принципу, что и в DarkDPSMeter (в нём я это уже исправил), то есть проверка была НЕ по IsPicked, а по params.targetId. ТАК ДЕЛАТЬ НЕЛЬЗЯ. Вот почему: В документации к EVENT_DND_DRAG_TO написано, что " Замечание. Событие может прийти после окончания drag&drop, если оно было отправлено в очередь до уведомления системы об окончании перетаскивания. Эту ситуацию надо проверять дополнительно. " Так вот, видимо, такая же неразбериха и с EVENT_DND_DROP_ATTEMPT - Я заметил, что иногда, в функцию OnEventDNDDropAttempt() приходит params.targetId=-1 (минус один!). Это значит, что если вы сверяете это -1 с ID перетаскиваемого окна, то они не равны, и выходит, что перетаскивание НЕ завершено! Именно поэтому, ЕДИНСТВЕННЫЙ правильный способ для OnEventDNDDropAttempt() - это проверка по IsPicked! Девелоперы, уберите нахрен проверку по params.targetId в OnEventDNDDropAttempt() в своих аддонах, и, обязательно, замените её на IsPicked.

2010-08-28:

-- Убрал вызов DNDReg() из функции DNDInit(). Потому, что если аддон стартует с невидимой (скрытой) формой, то регистрировать её, как бы, нельзя. Ну а если она видимая, то в Init(), следом за DNDInit(...) нужно добавить вызов DNDReg(). Так универсальнее.

-- В функцию DNDUnreg() добавил вызов OnEventDNDDropAttempt(). Это нужно на тот случай, если перетаскиваемая панель, вдруг, скроется (среагировав на какое-нибудь событие), прямо во время её перетаскивания. Теперь, она вызывает OnEventDNDDropAttempt(), чтобы КОРРЕКТНО прервать перетаскивание.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Да, коряво :) Структура NewDNDWidgetInfo - это часть библиотеки AoClassLibrary.lua, написанной DarkMaster для аддона DarkDPSMeter, и она здесь совершенно не нужна.

Ссылка на комментарий
Поделиться на другие сайты

Quote:
Структура NewDNDWidgetInfo - это часть библиотеки AoClassLibrary.lua

ну в данном случае - это обычная локальная переменная.. просто не стал менять название
Ссылка на комментарий
Поделиться на другие сайты

Не нужна - в смысле, она не нужна здесь по логике. Если её выкинуть, та же функция становится в 2 раза проще:

Code:
function DNDReg(wtWidget, ID)

mission.DNDRegister( DragNDrop  [ "Form" .. ID ]  .wtReacting , DND_WIDGET_MOVE * DND_CONTAINER_STEP + ID, true )

------------- загрузка позиции

local AddonName = common.GetAddonName()

local SectionName = AddonName .. "_Widget_" .. tostring(ID)

local CFGPlacement = common.GetGlobalConfigSection( SectionName ) or wtWidget:GetPlacementPlain()

wtWidget:SetPlacementPlain( CFGPlacement )

-------------

end

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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

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