-- static popups StaticPopupDialogs["CALENDAR_DELETE_EVENT"] = { text = "%s", button1 = OKAY, button2 = CANCEL, whileDead = 1, OnAccept = function (self) CalendarContextEventRemove(); end, OnShow = function (self) CalendarFrame_PushModal(self); end, OnHide = function (self) CalendarFrame_PopModal(); end, timeout = 0, hideOnEscape = 1, enterClicksFirstButton = 1, }; StaticPopupDialogs["CALENDAR_ERROR"] = { text = CALENDAR_ERROR, button1 = OKAY, whileDead = 1, OnShow = function (self) --CalendarFrame_PushModal(self); end, OnHide = function (self) --CalendarFrame_PopModal(); end, timeout = 0, showAlert = 1, hideOnEscape = 1, enterClicksFirstButton = 1, }; -- UIParent integration tinsert(UIMenus, "CalendarContextMenu"); UIPanelWindows["CalendarFrame"] = { area = "doublewide", pushable = 0, width = 840, whileDead = 1, yOffset = 20 }; -- CalendarMenus is an ORDERED table of frames, one of which will close when you press Escape. local CalendarMenus = { "CalendarEventPickerFrame", "CalendarTexturePickerFrame", "CalendarMassInviteFrame", "CalendarCreateEventFrame", "CalendarViewEventFrame", "CalendarViewHolidayFrame", "CalendarViewRaidFrame" }; -- this function will attempt to close the first open menu in the CalendarMenus table function CloseCalendarMenus() for _, menuName in next, CalendarMenus do local menu = _G[menuName]; if ( menu and menu:IsShown() ) then if ( menu == CalendarFrame_GetEventFrame() ) then CalendarFrame_CloseEvent(); PlaySound("igMainMenuQuit"); else menu:Hide(); end return true; end end return false; end -- tab handling CALENDAR_CREATEEVENTFRAME_TAB_LIST = { "CalendarCreateEventTitleEdit", "CalendarCreateEventDescriptionEdit", "CalendarCreateEventInviteEdit", }; -- speed optimizations local next = next; local date = date; local abs = abs; local min = min; local max = max; local floor = floor; local mod = mod; local tonumber = tonumber; local random = random; local format = format; local select = select; local tinsert = tinsert; local band = bit.band; local cos = math.cos; local strtrim = strtrim; local GetCVarBool = GetCVarBool; local PI = PI; local TWOPI = PI * 2.0; -- dev constants CALENDAR_USE_SEQUENCE_FOR_EVENT_TEXTURE = true; CALENDAR_USE_SEQUENCE_FOR_OVERLAY_TEXTURE = false; -- local constants local CALENDAR_MAX_DAYS_PER_MONTH = 42; -- 6 weeks local CALENDAR_MAX_DARKDAYS_PER_MONTH = 14; -- max days from the previous and next months when viewing the current month -- Weekday constants local CALENDAR_WEEKDAY_NORMALIZED_TEX_LEFT = 0.0; local CALENDAR_WEEKDAY_NORMALIZED_TEX_TOP = 180 / 256; local CALENDAR_WEEKDAY_NORMALIZED_TEX_WIDTH = 90 / 256 - 0.001; -- fudge factor to prevent texture seams local CALENDAR_WEEKDAY_NORMALIZED_TEX_HEIGHT = 28 / 256 - 0.001; -- fudge factor to prevent texture seams -- DayButton constants local CALENDAR_DAYBUTTON_NORMALIZED_TEX_WIDTH = 90 / 256 - 0.001; -- fudge factor to prevent texture seams local CALENDAR_DAYBUTTON_NORMALIZED_TEX_HEIGHT = 90 / 256 - 0.001; -- fudge factor to prevent texture seams local CALENDAR_DAYBUTTON_MAX_VISIBLE_EVENTS = 4; local CALENDAR_DAYBUTTON_MAX_VISIBLE_BIGEVENTS = 2; local CALENDAR_DAYBUTTON_MAX_TOOLTIP_EVENTS = 30; local CALENDAR_DAYBUTTON_SELECTION_ALPHA = 1.0; local CALENDAR_DAYBUTTON_HIGHLIGHT_ALPHA = 0.5; -- DayEventButton constants local CALENDAR_DAYEVENTBUTTON_HEIGHT = 12; local CALENDAR_DAYEVENTBUTTON_BIGHEIGHT = 24; local CALENDAR_DAYEVENTBUTTON_XOFFSET = 4; local CALENDAR_DAYEVENTBUTTON_YOFFSET = -3; -- ContextMenu flags local CALENDAR_CONTEXTMENU_FLAG_SHOWDAY = 0x01; local CALENDAR_CONTEXTMENU_FLAG_SHOWEVENT = 0x02; -- CreateEventFrame constants local CALENDAR_CREATEEVENTFRAME_DEFAULT_TITLE = CALENDAR_EVENT_NAME; local CALENDAR_CREATEEVENTFRAME_DEFAULT_DESCRIPTION = CALENDAR_EVENT_DESCRIPTION; local CALENDAR_CREATEEVENTFRAME_DEFAULT_TYPE = CALENDAR_EVENTTYPE_OTHER; local CALENDAR_CREATEEVENTFRAME_DEFAULT_REPEAT_OPTION = 1; local CALENDAR_CREATEEVENTFRAME_DEFAULT_HOUR = 12; -- default is standard (not military) time local CALENDAR_CREATEEVENTFRAME_DEFAULT_MINUTE = 0; local CALENDAR_CREATEEVENTFRAME_DEFAULT_AM = true; local CALENDAR_CREATEEVENTFRAME_DEFAULT_AUTOAPPROVE = nil; local CALENDAR_CREATEEVENTFRAME_DEFAULT_LOCK = nil; -- ViewEventFrame constants local CALENDAR_VIEWEVENTFRAME_EVENT_RSVPBUTTON_WIDTH = 128; local CALENDAR_VIEWEVENTFRAME_GUILDEVENT_RSVPBUTTON_WIDTH = 94; local CALENDAR_VIEWEVENTFRAME_EVENT_INVITELIST_HEIGHT = 230; local CALENDAR_VIEWEVENTFRAME_GUILDEVENT_INVITELIST_HEIGHT = 250; -- dark flags local DARKFLAG_PREVMONTH = 0x0001; local DARKFLAG_NEXTMONTH = 0x0002; local DARKFLAG_CORNER = 0x0004; local DARKFLAG_SIDE_LEFT = 0x0008; local DARKFLAG_SIDE_RIGHT = 0x0010; local DARKFLAG_SIDE_TOP = 0x0020; local DARKFLAG_SIDE_BOTTOM = 0x0040; -- top flags local DARKFLAG_PREVMONTH_TOP = DARKFLAG_PREVMONTH + DARKFLAG_SIDE_TOP; local DARKFLAG_PREVMONTH_TOPLEFT = DARKFLAG_PREVMONTH_TOP + DARKFLAG_SIDE_LEFT; local DARKFLAG_PREVMONTH_TOPRIGHT = DARKFLAG_PREVMONTH_TOP + DARKFLAG_SIDE_RIGHT; local DARKFLAG_PREVMONTH_TOPLEFTRIGHT = DARKFLAG_PREVMONTH_TOPLEFT + DARKFLAG_SIDE_RIGHT; local DARKFLAG_NEXTMONTH_TOP = DARKFLAG_NEXTMONTH + DARKFLAG_SIDE_TOP; local DARKFLAG_NEXTMONTH_TOPLEFT = DARKFLAG_NEXTMONTH_TOP + DARKFLAG_SIDE_LEFT; local DARKFLAG_NEXTMONTH_TOPRIGHT = DARKFLAG_NEXTMONTH_TOP + DARKFLAG_SIDE_RIGHT; -- corner flags local DARKFLAG_NEXTMONTH_CORNER = DARKFLAG_NEXTMONTH + DARKFLAG_CORNER; -- day 8 of next month local DARKFLAG_NEXTMONTH_CORNER_TOP = DARKFLAG_NEXTMONTH_CORNER + DARKFLAG_SIDE_TOP; -- day 7 of next month local DARKFLAG_NEXTMONTH_CORNER_RIGHT = DARKFLAG_NEXTMONTH_CORNER + DARKFLAG_SIDE_RIGHT; -- day 8 of next month, index 42 local DARKFLAG_NEXTMONTH_CORNER_TOPLEFT = DARKFLAG_NEXTMONTH_CORNER_TOP + DARKFLAG_SIDE_LEFT; -- day 1 of next month local DARKFLAG_NEXTMONTH_CORNER_TOPLEFTRIGHT = DARKFLAG_NEXTMONTH_CORNER_TOPLEFT + DARKFLAG_SIDE_RIGHT; -- day 1 of next month, 7th day of the week -- bottom flags local DARKFLAG_PREVMONTH_BOTTOM = DARKFLAG_PREVMONTH + DARKFLAG_SIDE_BOTTOM; local DARKFLAG_PREVMONTH_BOTTOMLEFT = DARKFLAG_PREVMONTH_BOTTOM + DARKFLAG_SIDE_LEFT; local DARKFLAG_PREVMONTH_BOTTOMRIGHT = DARKFLAG_PREVMONTH_BOTTOM + DARKFLAG_SIDE_RIGHT; local DARKFLAG_PREVMONTH_BOTTOMLEFTRIGHT = DARKFLAG_PREVMONTH_BOTTOMLEFT + DARKFLAG_SIDE_RIGHT; local DARKFLAG_NEXTMONTH_BOTTOM = DARKFLAG_NEXTMONTH + DARKFLAG_SIDE_BOTTOM; local DARKFLAG_NEXTMONTH_BOTTOMLEFT = DARKFLAG_NEXTMONTH_BOTTOM + DARKFLAG_SIDE_LEFT; local DARKFLAG_NEXTMONTH_BOTTOMRIGHT = DARKFLAG_NEXTMONTH_BOTTOM + DARKFLAG_SIDE_RIGHT; local DARKFLAG_NEXTMONTH_BOTTOMLEFTRIGHT = DARKFLAG_NEXTMONTH_BOTTOMLEFT + DARKFLAG_SIDE_RIGHT; local DARKFLAG_NEXTMONTH_LEFTRIGHT = DARKFLAG_NEXTMONTH + DARKFLAG_SIDE_LEFT + DARKFLAG_SIDE_RIGHT; -- day 1 of next month, 7th day of the week, not index 42 -- shared flags local DARKFLAG_NEXTMONTH_LEFT = DARKFLAG_NEXTMONTH + DARKFLAG_SIDE_LEFT; local DARKFLAG_NEXTMONTH_RIGHT = DARKFLAG_NEXTMONTH + DARKFLAG_SIDE_RIGHT; -- the dark day tcoord tables simplify tex coord setup for dark days local DARKDAY_TOP_TCOORDS = { [DARKFLAG_PREVMONTH_TOP] = { left = 90 / 512, right = 180 / 512, top = 0.0, bottom = 45 / 256, }, [DARKFLAG_PREVMONTH_TOPLEFT] = { left = 0.0, right = 90 / 512, top = 0.0, bottom = 45 / 256 - 0.001, -- fudge factor to prevent texture seams }, [DARKFLAG_PREVMONTH_TOPRIGHT] = { left = 90 / 512, right = 0.0, top = 0.0, bottom = 45 / 256 - 0.001, -- fudge factor to prevent texture seams }, [DARKFLAG_PREVMONTH_TOPLEFTRIGHT] = { left = 0.0, right = 90 / 512, top = 180 / 256, bottom = 225 / 256 - 0.001, -- fudge factor to prevent texture seams }, -- next 3 are same as DARKDAY_BOTTOM_TCOORDS (blank, left, right--no difference between top & bottom) [DARKFLAG_NEXTMONTH] = { -- no drop shadowing left = 90 / 512, right = 180 / 512, top = 45 / 256, bottom = 90 / 256, }, [DARKFLAG_NEXTMONTH_LEFT] = { left = 90 / 512, right = 0.0, top = 90 / 256, bottom = 135 / 256, }, [DARKFLAG_NEXTMONTH_RIGHT] = { left = 0.0, right = 90 / 512, top = 90 / 256, bottom = 135 / 256 - 0.001, -- fudge factor to prevent texture seams }, [DARKFLAG_NEXTMONTH_TOP] = { left = 90 / 512, right = 180 / 512, top = 0.0, bottom = 45 / 256, }, [DARKFLAG_NEXTMONTH_TOPLEFT] = { left = 0.0, right = 90 / 512, top = 0.0, bottom = 45 / 256 - 0.001, -- fudge factor to prevent texture seams }, [DARKFLAG_NEXTMONTH_TOPRIGHT] = { left = 90 / 512, right = 0.0, top = 0.0, bottom = 45 / 256 - 0.001, -- fudge factor to prevent texture seams }, -- day 8 of next month [DARKFLAG_NEXTMONTH_CORNER] = { left = 90 / 512, right = 180 / 512 - 0.001, -- fudge factor to prevent texture seams top = 135 / 256, bottom = 180 / 256, }, -- day 7 of next month [DARKFLAG_NEXTMONTH_CORNER_TOP] = { left = 0.0, right = 90 / 512, top = 135 / 256, bottom = 180 / 256 - 0.001, -- fudge factor to prevent texture seams }, -- day 8 of next month, index 42 [DARKFLAG_NEXTMONTH_CORNER_RIGHT] = { left = 180 / 512, right = 270 / 512 - 0.001, -- fudge factor to prevent texture seams top = 45 / 256, bottom = 90 / 256 - 0.001, -- fudge factor to prevent texture seams }, -- day 1 of next month [DARKFLAG_NEXTMONTH_CORNER_TOPLEFT] = { left = 0.0, right = 90 / 512, top = 45 / 256, bottom = 90 / 256, }, -- day 1 of next month, 7th day of the week [DARKFLAG_NEXTMONTH_CORNER_TOPLEFTRIGHT] = { left = 180 / 512, right = 90 / 512, top = 225 / 256, bottom = 180 / 256, }, }; local DARKDAY_BOTTOM_TCOORDS = { [DARKFLAG_PREVMONTH_BOTTOM] = { left = 90 / 512, right = 180 / 512, top = 45 / 256, bottom = 0.0, }, [DARKFLAG_PREVMONTH_BOTTOMLEFT] = { left = 0.0, right = 90 / 512, top = 45 / 256 - 0.001, -- fudge factor to prevent texture seams bottom = 0.0, }, [DARKFLAG_PREVMONTH_BOTTOMRIGHT] = { left = 90 / 512, right = 0.0, top = 90 / 256, bottom = 45 / 256, }, [DARKFLAG_PREVMONTH_BOTTOMLEFTRIGHT] = { left = 90 / 512, right = 180 / 512, top = 180 / 256, bottom = 225 / 256, }, -- next 3 are same as DARKDAY_TOP_TCOORDS (blank, left, right--no difference between top & bottom) [DARKFLAG_NEXTMONTH] = { -- no drop shadowing left = 90 / 512, right = 180 / 512, top = 45 / 256, bottom = 90 / 256, }, [DARKFLAG_NEXTMONTH_LEFT] = { left = 90 / 512, right = 0.0, top = 90 / 256, bottom = 135 / 256, }, [DARKFLAG_NEXTMONTH_RIGHT] = { left = 0.0, right = 90 / 512, top = 90 / 256, bottom = 135 / 256, }, [DARKFLAG_NEXTMONTH_BOTTOM] = { left = 90 / 512, right = 180 / 512, top = 45 / 256, bottom = 0.0, }, [DARKFLAG_NEXTMONTH_BOTTOMLEFT] = { left = 0.0, right = 90 / 512, top = 45 / 256 - 0.001, -- fudge factor to prevent texture seams bottom = 0.0, }, [DARKFLAG_NEXTMONTH_BOTTOMRIGHT] = { left = 90 / 512, right = 0.0, top = 45 / 256 - 0.001, -- fudge factor to prevent texture seams bottom = 0.0, }, [DARKFLAG_NEXTMONTH_BOTTOMLEFTRIGHT] = { left = 0.0, right = 90 / 512, top = 225 / 256, bottom = 180 / 256, }, -- day 1 of next month, 7th day of the week, not index 42 [DARKFLAG_NEXTMONTH_LEFTRIGHT] = { left = 180 / 512, right = 270 / 512 - 0.001, -- fudge factor to prevent texture seams top = 0.0, bottom = 45 / 256, }, }; -- more local constants local CALENDAR_MONTH_NAMES = { MONTH_JANUARY, MONTH_FEBRUARY, MONTH_MARCH, MONTH_APRIL, MONTH_MAY, MONTH_JUNE, MONTH_JULY, MONTH_AUGUST, MONTH_SEPTEMBER, MONTH_OCTOBER, MONTH_NOVEMBER, MONTH_DECEMBER, }; -- month names show up differently for full date displays in some languages local CALENDAR_FULLDATE_MONTH_NAMES = { FULLDATE_MONTH_JANUARY, FULLDATE_MONTH_FEBRUARY, FULLDATE_MONTH_MARCH, FULLDATE_MONTH_APRIL, FULLDATE_MONTH_MAY, FULLDATE_MONTH_JUNE, FULLDATE_MONTH_JULY, FULLDATE_MONTH_AUGUST, FULLDATE_MONTH_SEPTEMBER, FULLDATE_MONTH_OCTOBER, FULLDATE_MONTH_NOVEMBER, FULLDATE_MONTH_DECEMBER, }; local CALENDAR_WEEKDAY_NAMES = { WEEKDAY_SUNDAY, WEEKDAY_MONDAY, WEEKDAY_TUESDAY, WEEKDAY_WEDNESDAY, WEEKDAY_THURSDAY, WEEKDAY_FRIDAY, WEEKDAY_SATURDAY, }; local CALENDAR_EVENTCOLOR_MODERATOR = {r=0.54, g=0.75, b=1.0}; local CALENDAR_INVITESTATUS_INFO = { ["UNKNOWN"] = { name = UNKNOWN, color = NORMAL_FONT_COLOR, -- colorCode = NORMAL_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_CONFIRMED] = { name = CALENDAR_STATUS_CONFIRMED, color = GREEN_FONT_COLOR, -- colorCode = GREEN_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_ACCEPTED] = { name = CALENDAR_STATUS_ACCEPTED, color = GREEN_FONT_COLOR, -- colorCode = GREEN_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_DECLINED] = { name = CALENDAR_STATUS_DECLINED, color = RED_FONT_COLOR, -- colorCode = RED_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_OUT] = { name = CALENDAR_STATUS_OUT, color = RED_FONT_COLOR, -- colorCode = RED_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_STANDBY] = { name = CALENDAR_STATUS_STANDBY, color = ORANGE_FONT_COLOR, -- colorCode = ORANGE_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_INVITED] = { name = CALENDAR_STATUS_INVITED, color = NORMAL_FONT_COLOR, -- colorCode = NORMAL_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_SIGNEDUP] = { name = CALENDAR_STATUS_SIGNEDUP, color = GREEN_FONT_COLOR, -- colorCode = GREEN_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_NOT_SIGNEDUP] = { name = CALENDAR_STATUS_NOT_SIGNEDUP, color = NORMAL_FONT_COLOR, -- colorCode = NORMAL_FONT_COLOR_CODE, }, [CALENDAR_INVITESTATUS_TENTATIVE] = { name = CALENDAR_STATUS_TENTATIVE, color = ORANGE_FONT_COLOR, -- colorCode = ORANGE_FONT_COLOR_CODE, }, }; local CALENDAR_CALENDARTYPE_NAMEFORMAT = { ["PLAYER"] = { [""] = "%s", }, ["GUILD_ANNOUNCEMENT"] = { [""] = "%s", }, ["GUILD_EVENT"] = { [""] = "%s", }, ["SYSTEM"] = { [""] = "%s", }, ["HOLIDAY"] = { ["START"] = CALENDAR_EVENTNAME_FORMAT_START, ["END"] = CALENDAR_EVENTNAME_FORMAT_END, [""] = "%s", }, ["RAID_LOCKOUT"] = { [""] = CALENDAR_EVENTNAME_FORMAT_RAID_LOCKOUT, }, ["RAID_RESET"] = { [""] = CALENDAR_EVENTNAME_FORMAT_RAID_RESET, }, }; local CALENDAR_CALENDARTYPE_TEXTURE_PATHS = { -- ["PLAYER"] = "", -- ["GUILD_ANNOUNCEMENT"] = "", -- ["GUILD_EVENT"] = "", -- ["SYSTEM"] = "", ["HOLIDAY"] = "Interface\\Calendar\\Holidays\\", -- ["RAID_LOCKOUT"] = "", -- ["RAID_RESET"] = "", }; local CALENDAR_CALENDARTYPE_TEXTURES = { ["PLAYER"] = { -- [""] = "", }, ["GUILD_ANNOUNCEMENT"] = { -- [""] = "", }, ["GUILD_EVENT"] = { -- [""] = "", }, ["SYSTEM"] = { -- [""] = "", }, ["HOLIDAY"] = { ["START"] = "Interface\\Calendar\\Holidays\\Calendar_DefaultHoliday", -- ["ONGOING"] = "", ["END"] = "Interface\\Calendar\\Holidays\\Calendar_DefaultHoliday", ["INFO"] = "Interface\\Calendar\\Holidays\\Calendar_DefaultHoliday", -- [""] = "", }, ["RAID_LOCKOUT"] = { -- [""] = "", }, ["RAID_RESET"] = { -- [""] = "", }, }; local CALENDAR_CALENDARTYPE_TEXTURE_APPEND = { -- ["PLAYER"] = { -- }, -- ["GUILD_ANNOUNCEMENT"] = { -- }, -- ["GUILD_EVENT"] = { -- }, -- ["SYSTEM"] = { -- }, ["HOLIDAY"] = { ["START"] = "Start", ["ONGOING"] = "Ongoing", ["END"] = "End", ["INFO"] = "Info", [""] = "", }, -- ["RAID_LOCKOUT"] = { -- }, -- ["RAID_RESET"] = { -- }, }; local CALENDAR_CALENDARTYPE_TCOORDS = { ["PLAYER"] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, ["GUILD_ANNOUNCEMENT"] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, ["GUILD_EVENT"] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, ["SYSTEM"] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, ["HOLIDAY"] = { left = 0.0, right = 0.7109375, top = 0.0, bottom = 0.7109375, }, ["RAID_LOCKOUT"] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, ["RAID_RESET"] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, }; local CALENDAR_CALENDARTYPE_COLORS = { -- ["PLAYER"] = , -- ["GUILD_ANNOUNCEMENT"] = , -- ["GUILD_EVENT"] = , ["SYSTEM"] = YELLOW_FONT_COLOR, ["HOLIDAY"] = HIGHLIGHT_FONT_COLOR, ["RAID_LOCKOUT"] = HIGHLIGHT_FONT_COLOR, ["RAID_RESET"] = HIGHLIGHT_FONT_COLOR, }; local CALENDAR_EVENTTYPE_TEXTURE_PATHS = { [CALENDAR_EVENTTYPE_RAID] = "Interface\\LFGFrame\\LFGIcon-", [CALENDAR_EVENTTYPE_DUNGEON] = "Interface\\LFGFrame\\LFGIcon-", -- [CALENDAR_EVENTTYPE_PVP] = "", -- [CALENDAR_EVENTTYPE_MEETING] = "", -- [CALENDAR_EVENTTYPE_OTHER] = "", }; local CALENDAR_EVENTTYPE_TEXTURES = { [CALENDAR_EVENTTYPE_RAID] = "Interface\\LFGFrame\\LFGIcon-Raid", [CALENDAR_EVENTTYPE_DUNGEON] = "Interface\\LFGFrame\\LFGIcon-Dungeon", [CALENDAR_EVENTTYPE_PVP] = "Interface\\Calendar\\UI-Calendar-Event-PVP", [CALENDAR_EVENTTYPE_MEETING] = "Interface\\Calendar\\MeetingIcon", [CALENDAR_EVENTTYPE_OTHER] = "Interface\\Calendar\\UI-Calendar-Event-Other", }; local CALENDAR_EVENTTYPE_TCOORDS = { [CALENDAR_EVENTTYPE_RAID] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, [CALENDAR_EVENTTYPE_DUNGEON] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, [CALENDAR_EVENTTYPE_PVP] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, [CALENDAR_EVENTTYPE_MEETING] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, [CALENDAR_EVENTTYPE_OTHER] = { left = 0.0, right = 1.0, top = 0.0, bottom = 1.0, }, }; do -- set the pvp icon to the player's faction local factionGroup = UnitFactionGroup("player"); if ( factionGroup ) then -- need new texcoords too? if ( factionGroup == "Alliance" ) then CALENDAR_EVENTTYPE_TEXTURES[CALENDAR_EVENTTYPE_PVP] = "Interface\\Calendar\\UI-Calendar-Event-PVP02"; else CALENDAR_EVENTTYPE_TEXTURES[CALENDAR_EVENTTYPE_PVP] = "Interface\\Calendar\\UI-Calendar-Event-PVP01"; end end end local CALENDAR_FILTER_CVARS = { {text = CALENDAR_FILTER_BATTLEGROUND, cvar = "calendarShowBattlegrounds" }, {text = CALENDAR_FILTER_DARKMOON, cvar = "calendarShowDarkmoon" }, {text = CALENDAR_FILTER_RAID_LOCKOUTS, cvar = "calendarShowLockouts" }, {text = CALENDAR_FILTER_RAID_RESETS, cvar = "calendarShowResets" }, {text = CALENDAR_FILTER_WEEKLY_HOLIDAYS, cvar = "calendarShowWeeklyHolidays" }, }; -- local data -- CalendarDayButtons is just a table of all the Calendar day buttons...the size of this table should -- equal CALENDAR_MAX_DAYS_PER_MONTH once the CalendarFrame is done loading local CalendarDayButtons = { }; -- CalendarEventTextureCache gets updated whenever event type textures are requested (currently only -- the Dungeon and Raid event types have texture lists) local CalendarEventTextureCache = { }; -- CalendarClassData gets updated whenever the current event's invite list is updated local CalendarClassData = { }; do for i, class in ipairs(CLASS_SORT_ORDER) do CalendarClassData[class] = { name = nil, tcoords = CLASS_ICON_TCOORDS[class], counts = { [CALENDAR_INVITESTATUS_INVITED] = 0, [CALENDAR_INVITESTATUS_ACCEPTED] = 0, [CALENDAR_INVITESTATUS_DECLINED] = 0, [CALENDAR_INVITESTATUS_CONFIRMED] = 0, [CALENDAR_INVITESTATUS_OUT] = 0, [CALENDAR_INVITESTATUS_STANDBY] = 0, [CALENDAR_INVITESTATUS_SIGNEDUP] = 0, [CALENDAR_INVITESTATUS_NOT_SIGNEDUP] = 0, [CALENDAR_INVITESTATUS_TENTATIVE] = 0, }, }; end end -- CalendarModalStack is a stack of modal dialog frames. The reason why we use a stack (instead of a single -- frame), for the modal system is because modal dialogs can stack on top of each other...for example, -- try deleting an event from the event picker frame. The stack will have two elements: the bottom element -- is the event picker frame and the top element is the delete confirmation popup. local CalendarModalStack = { }; -- local helper functions local function safeselect(index, ...) local count = select("#", ...); if ( count > 0 and index <= count ) then return select(index, ...); else return nil; end end local function _CalendarFrame_SafeGetName(name) if ( not name or name == "" ) then return UNKNOWN; end return name; end local function _CalendarFrame_GetDayOfWeek(index) return mod(index - 1, 7) + 1; end -- _CalendarFrame_GetWeekdayIndex takes an index in the range [1, n] and maps it to a weekday starting -- at CALENDAR_FIRST_WEEKDAY. For example, -- CALENDAR_FIRST_WEEKDAY = 1 => [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY] -- CALENDAR_FIRST_WEEKDAY = 2 => [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY] -- CALENDAR_FIRST_WEEKDAY = 6 => [FRIDAY, SATURDAY, SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY] local function _CalendarFrame_GetWeekdayIndex(index) -- the expanded form for the left input to mod() is: -- (index - 1) + (CALENDAR_FIRST_WEEKDAY - 1) -- why the - 1 and then + 1 before return? because lua has 1-based indexes! awesome! return mod(index - 2 + CALENDAR_FIRST_WEEKDAY, 7) + 1; end local function _CalendarFrame_GetFullDate(weekday, month, day, year) local weekdayName = CALENDAR_WEEKDAY_NAMES[weekday]; local monthName = CALENDAR_FULLDATE_MONTH_NAMES[month]; return weekdayName, monthName, day, year, month; end local function _CalendarFrame_GetFullDateFromDay(dayButton) local weekday = _CalendarFrame_GetWeekdayIndex(dayButton:GetID()); local month, year = CalendarGetMonth(dayButton.monthOffset); local day = dayButton.day; return _CalendarFrame_GetFullDate(weekday, month, day, year); end local function _CalendarFrame_IsTodayOrLater(month, day, year) local presentWeekday, presentMonth, presentDay, presentYear = CalendarGetDate(); local todayOrLater = false; if ( year > presentYear ) then todayOrLater = true; elseif ( year == presentYear ) then if ( month > presentMonth ) then todayOrLater = true; elseif ( month == presentMonth ) then todayOrLater = day >= presentDay; end end return todayOrLater; end local function _CalendarFrame_IsAfterMaxCreateDate(month, day, year) local maxWeekday, maxMonth, maxDay, maxYear = CalendarGetMaxCreateDate(); local afterMaxDate = false; if ( year > maxYear ) then afterMaxDate = true; elseif ( year == maxYear ) then if ( month > maxMonth ) then afterMaxDate = true; elseif ( month == maxMonth ) then afterMaxDate = day > maxDay; end end return afterMaxDate; end local function _CalendarFrame_IsPlayerCreatedEvent(calendarType) return calendarType == "PLAYER" or calendarType == "GUILD_ANNOUNCEMENT" or calendarType == "GUILD_EVENT"; end local function _CalendarFrame_CanInviteeRSVP(inviteStatus) return inviteStatus == CALENDAR_INVITESTATUS_INVITED or inviteStatus == CALENDAR_INVITESTATUS_ACCEPTED or inviteStatus == CALENDAR_INVITESTATUS_DECLINED or inviteStatus == CALENDAR_INVITESTATUS_SIGNEDUP or inviteStatus == CALENDAR_INVITESTATUS_NOT_SIGNEDUP or inviteStatus == CALENDAR_INVITESTATUS_TENTATIVE; end local function _CalendarFrame_IsSignUpEvent(calendarType, inviteType) return calendarType == "GUILD_EVENT" and inviteType == CALENDAR_INVITETYPE_SIGNUP; end local function _CalendarFrame_CanRemoveEvent(modStatus, calendarType, inviteType, inviteStatus) return modStatus ~= "CREATOR" and (calendarType == "PLAYER" or (calendarType == "GUILD_EVENT" and inviteType == CALENDAR_INVITETYPE_NORMAL)); end local function _CalendarFrame_CacheEventTextures_Internal(...) local numTextures = select("#", ...) / 4; if ( numTextures <= 0 ) then CalendarEventTextureCache.eventType = nil; return false; end while ( #CalendarEventTextureCache > numTextures ) do tremove(CalendarEventTextureCache); end local param = 1; local cacheIndex = 1; for textureIndex = 1, numTextures do if ( not CalendarEventTextureCache[cacheIndex] ) then CalendarEventTextureCache[cacheIndex] = { }; end -- insert texture CalendarEventTextureCache[cacheIndex].textureIndex = textureIndex; CalendarEventTextureCache[cacheIndex].title = select(param, ...); param = param + 1; CalendarEventTextureCache[cacheIndex].texture = select(param, ...); param = param + 1; CalendarEventTextureCache[cacheIndex].expansionLevel = select(param, ...); param = param + 1; CalendarEventTextureCache[cacheIndex].difficultyName = select(param, ...); param = param + 1; -- insert headers between expansion levels local entry = CalendarEventTextureCache[cacheIndex]; local prevEntry = CalendarEventTextureCache[cacheIndex - 1]; if ( not prevEntry or (prevEntry and prevEntry.expansionLevel ~= entry.expansionLevel) ) then -- insert empty entry... if ( prevEntry ) then --...only if we had a previous entry CalendarEventTextureCache[cacheIndex] = { }; cacheIndex = cacheIndex + 1; end -- insert header CalendarEventTextureCache[cacheIndex] = { title = _G["EXPANSION_NAME"..entry.expansionLevel], expansionLevel = entry.expansionLevel, }; cacheIndex = cacheIndex + 1; -- make the current entry the next entry CalendarEventTextureCache[cacheIndex] = entry; end cacheIndex = cacheIndex + 1; end return true; end local function _CalendarFrame_CacheEventTextures(eventType) if ( eventType ~= CalendarEventTextureCache.eventType ) then CalendarEventTextureCache.eventType = eventType if ( eventType ) then return _CalendarFrame_CacheEventTextures_Internal(CalendarEventGetTextures(eventType)); end end return true; end local function _CalendarFrame_GetEventTexture(index, eventType) if ( not _CalendarFrame_CacheEventTextures(eventType) ) then return nil; end for cacheIndex = 1, #CalendarEventTextureCache do local entry = CalendarEventTextureCache[cacheIndex]; if ( entry.textureIndex and index == entry.textureIndex ) then return entry; end end return nil; end local function _CalendarFrame_GetTextureFile(textureName, calendarType, sequenceType, eventType) local texture, tcoords; if ( textureName and textureName ~= "" ) then if ( CALENDAR_CALENDARTYPE_TEXTURE_PATHS[calendarType] ) then texture = CALENDAR_CALENDARTYPE_TEXTURE_PATHS[calendarType]..textureName; if ( CALENDAR_CALENDARTYPE_TEXTURE_APPEND[calendarType] ) then texture = texture..CALENDAR_CALENDARTYPE_TEXTURE_APPEND[calendarType][sequenceType]; end tcoords = CALENDAR_CALENDARTYPE_TCOORDS[calendarType]; elseif ( CALENDAR_EVENTTYPE_TEXTURE_PATHS[eventType] ) then texture = CALENDAR_EVENTTYPE_TEXTURE_PATHS[eventType]..textureName; tcoords = CALENDAR_EVENTTYPE_TCOORDS[eventType]; elseif ( CALENDAR_CALENDARTYPE_TEXTURES[calendarType][sequenceType] ) then texture = CALENDAR_CALENDARTYPE_TEXTURES[calendarType][sequenceType]; tcoords = CALENDAR_CALENDARTYPE_TCOORDS[calendarType]; elseif ( CALENDAR_EVENTTYPE_TEXTURES[eventType] ) then texture = CALENDAR_EVENTTYPE_TEXTURES[eventType]; tcoords = CALENDAR_EVENTTYPE_TCOORDS[eventType]; end elseif ( CALENDAR_CALENDARTYPE_TEXTURES[calendarType][sequenceType] ) then texture = CALENDAR_CALENDARTYPE_TEXTURES[calendarType][sequenceType]; tcoords = CALENDAR_CALENDARTYPE_TCOORDS[calendarType]; elseif ( CALENDAR_EVENTTYPE_TEXTURES[eventType] ) then texture = CALENDAR_EVENTTYPE_TEXTURES[eventType]; tcoords = CALENDAR_EVENTTYPE_TCOORDS[eventType]; end return texture, tcoords; end local function _CalendarFrame_GetEventColor(calendarType, modStatus, inviteStatus) if ( calendarType == "PLAYER" or calendarType == "GUILD_ANNOUNCEMENT" or calendarType == "GUILD_EVENT" ) then if ( modStatus == "MODERATOR" or modStatus == "CREATOR" ) then return CALENDAR_EVENTCOLOR_MODERATOR; elseif ( inviteStatus and CALENDAR_INVITESTATUS_INFO[inviteStatus] ) then return CALENDAR_INVITESTATUS_INFO[inviteStatus].color; end elseif ( CALENDAR_CALENDARTYPE_COLORS[calendarType] ) then return CALENDAR_CALENDARTYPE_COLORS[calendarType]; end -- default to normal color return NORMAL_FONT_COLOR; end local function _CalendarFrame_SafeGetInviteStatusInfo(inviteStatus) return CALENDAR_INVITESTATUS_INFO[inviteStatus] or CALENDAR_INVITESTATUS_INFO["UNKNOWN"]; end local function _CalendarFrame_ResetClassData() for _, classData in next, CalendarClassData do for i in next, classData.counts do classData.counts[i] = 0; end end end local function _CalendarFrame_UpdateClassData() _CalendarFrame_ResetClassData(); for i = 1, CalendarEventGetNumInvites() do local _, _, className, classFilename, inviteStatus = CalendarEventGetInvite(i); if ( classFilename and classFilename ~= "" ) then CalendarClassData[classFilename].counts[inviteStatus] = CalendarClassData[classFilename].counts[inviteStatus] + 1; -- HACK: doing this because we don't have class names in global strings CalendarClassData[classFilename].name = className; end end end local function _CalendarFrame_InviteToRaid(maxInviteCount) local inviteCount = 0; local i = 1; while ( inviteCount < maxInviteCount and i <= CalendarEventGetNumInvites() ) do local name, level, className, classFilename, inviteStatus = CalendarEventGetInvite(i); if ( not UnitInParty(name) and not UnitInRaid(name) and (inviteStatus == CALENDAR_INVITESTATUS_ACCEPTED or inviteStatus == CALENDAR_INVITESTATUS_CONFIRMED or inviteStatus == CALENDAR_INVITESTATUS_SIGNEDUP) ) then InviteUnit(name); inviteCount = inviteCount + 1; end i = i + 1; end return inviteCount; end local function _CalendarFrame_GetInviteToRaidCount(maxInviteCount) local inviteCount = 0; local i = 1; while ( inviteCount < maxInviteCount and i <= CalendarEventGetNumInvites() ) do local name, level, className, classFilename, inviteStatus = CalendarEventGetInvite(i); if ( not UnitInParty(name) and not UnitInRaid(name) and (inviteStatus == CALENDAR_INVITESTATUS_ACCEPTED or inviteStatus == CALENDAR_INVITESTATUS_CONFIRMED or inviteStatus == CALENDAR_INVITESTATUS_SIGNEDUP) ) then inviteCount = inviteCount + 1; end i = i + 1; end return inviteCount; end -- CalendarFrame function Calendar_Toggle() if ( CalendarFrame:IsShown() ) then Calendar_Hide(); else Calendar_Show(); end end function Calendar_Hide() HideUIPanel(CalendarFrame); end function Calendar_Show() ShowUIPanel(CalendarFrame); end function CalendarFrame_ShowEventFrame(frame) if ( frame == CalendarFrame.eventFrame ) then if ( frame ) then if ( not frame:IsShown() ) then frame:Show(); CalendarEventFrameBlocker:Show(); elseif ( frame.update ) then frame.update(); CalendarEventFrameBlocker:Show(); end end else if ( CalendarFrame.eventFrame ) then CalendarFrame.eventFrame:Hide(); CalendarEventFrameBlocker:Hide(); end CalendarFrame.eventFrame = frame; if ( frame ) then frame:Show(); CalendarEventFrameBlocker:Show(); end end end function CalendarFrame_HideEventFrame(frame) if ( not frame or frame and frame == CalendarFrame.eventFrame ) then CalendarFrame_ShowEventFrame(nil); end end function CalendarFrame_GetEventFrame() return CalendarFrame.eventFrame; end function CalendarFrame_UpdateTimeFormat() -- update all frames that display a time local militaryTime = GetCVarBool("timeMgrUseMilitaryTime"); if ( CalendarFrame:IsShown() and militaryTime ~= CalendarFrame.militaryTime ) then -- update the main frame CalendarFrame_Update(); local eventFrame = CalendarFrame.eventFrame; if ( eventFrame ) then -- update the event frame if ( eventFrame == CalendarCreateEventFrame ) then -- the create event frame is handled specially because a full update could potentially clobber -- a player's changes if he is creating or editing an event CalendarCreateEvent_UpdateTimeFormat(); elseif ( eventFrame.update ) then eventFrame.update(); end end if ( CalendarEventPickerFrame:IsShown() ) then -- update the event picker frame CalendarEventPickerScrollFrame_Update(); end CalendarFrame.militaryTime = militaryTime; end end function CalendarFrame_OnLoad(self) self:RegisterEvent("CALENDAR_UPDATE_EVENT_LIST"); -- self:RegisterEvent("CALENDAR_UPDATE_PENDING_INVITES"); -- event list updates are fired for invite status changes now self:RegisterEvent("CALENDAR_OPEN_EVENT"); self:RegisterEvent("CALENDAR_UPDATE_ERROR"); -- initialize weekdays for i = 1, 7 do CalendarFrame_InitWeekday(i); end -- initialize day buttons for i = 1, CALENDAR_MAX_DAYS_PER_MONTH do CalendarDayButtons[i] = CreateFrame("Button", "CalendarDayButton"..i, self, "CalendarDayButtonTemplate"); CalendarFrame_InitDay(i); end -- initialize the selected date self.selectedMonth = nil; self.selectedDay = nil; self.selectedYear = nil; -- initialize the viewed date self.viewedMonth = nil; self.viewedYear = nil; -- initialize modal dialog handling self.modalFrame = nil; end function CalendarFrame_OnEvent(self, event, ...) if ( event == "CALENDAR_UPDATE_EVENT_LIST" ) then CalendarFrame_Update(); elseif ( event == "CALENDAR_OPEN_EVENT" ) then -- hide the invite context menu right off the bat, since it's probably going to be invalid CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); -- now open the event based on its calendar type local calendarType = ...; if ( calendarType == "HOLIDAY" ) then CalendarFrame_ShowEventFrame(CalendarViewHolidayFrame); elseif ( calendarType == "RAID_RESET" or calendarType == "RAID_LOCKOUT" ) then CalendarFrame_ShowEventFrame(CalendarViewRaidFrame); else -- for now, it could only be a player-created type if ( CalendarEventCanEdit() ) then CalendarCreateEventFrame.mode = "edit"; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); else CalendarFrame_ShowEventFrame(CalendarViewEventFrame); end end elseif ( event == "CALENDAR_UPDATE_ERROR" ) then local message = ...; StaticPopup_Show("CALENDAR_ERROR", message); end end function CalendarFrame_OnShow(self) -- an event could have stayed selected if the calendar closed without the player doing so explicitly -- (e.g. reloadui) so make sure that we're not selecting an event when the calendar comes back CalendarFrame_CloseEvent(); self.militaryTime = GetCVarBool("timeMgrUseMilitaryTime"); local weekday, month, day, year = CalendarGetDate(); CalendarSetAbsMonth(month, year); CalendarFrame_Update(); OpenCalendar(); PlaySound("igSpellBookOpen"); end function CalendarFrame_OnHide(self) -- close the event now...the reason is that the calendar may clear the current event data next time -- the frame opens up CalendarFrame_CloseEvent(); CalendarEventPickerFrame_Hide(); CalendarTexturePickerFrame_Hide(); CalendarContextMenu_Reset(); HideDropDownMenu(1); StaticPopup_Hide("CALENDAR_DELETE_EVENT"); StaticPopup_Hide("CALENDAR_ERROR"); -- pop all modal frames as a fail safe, just in case we somehow end up in a state where modal frames -- are left shown, which shouldn't happen CalendarFrame_PopModal(true); -- clean up texture references local dayButton, dayButtonName; for i = 1, CALENDAR_MAX_DAYS_PER_MONTH do dayButton = CalendarDayButtons[i]; dayButtonName = dayButton:GetName(); _G[dayButtonName.."EventTexture"]:SetTexture(); _G[dayButtonName.."OverlayFrameTexture"]:SetTexture(); end PlaySound("igSpellBookClose"); end function CalendarFrame_InitWeekday(index) local backgroundName = "CalendarWeekday"..index.."Background"; local background = _G[backgroundName]; local left = (band(index, 1) * CALENDAR_WEEKDAY_NORMALIZED_TEX_WIDTH) + CALENDAR_WEEKDAY_NORMALIZED_TEX_LEFT; -- mod(index, 2) * width local right = left + CALENDAR_WEEKDAY_NORMALIZED_TEX_WIDTH; local top = CALENDAR_WEEKDAY_NORMALIZED_TEX_TOP; local bottom = top + CALENDAR_WEEKDAY_NORMALIZED_TEX_HEIGHT; background:SetTexCoord(left, right, top, bottom); end function CalendarFrame_InitDay(buttonIndex) local button = CalendarDayButtons[buttonIndex]; local buttonName = button:GetName(); button:SetID(buttonIndex); -- set anchors button:ClearAllPoints(); if ( buttonIndex == 1 ) then button:SetPoint("TOPLEFT", CalendarWeekday1Background, "BOTTOMLEFT", 0, 0); elseif ( mod(buttonIndex, 7) == 1 ) then button:SetPoint("TOPLEFT", CalendarDayButtons[buttonIndex - 7], "BOTTOMLEFT", 0, 0); else button:SetPoint("TOPLEFT", CalendarDayButtons[buttonIndex - 1], "TOPRIGHT", 0, 0); end -- set the normal texture to be the background local tex = button:GetNormalTexture(); tex:SetDrawLayer("BACKGROUND"); local texLeft = random(0,1) * CALENDAR_DAYBUTTON_NORMALIZED_TEX_WIDTH; local texRight = texLeft + CALENDAR_DAYBUTTON_NORMALIZED_TEX_WIDTH; local texTop = random(0,1) * CALENDAR_DAYBUTTON_NORMALIZED_TEX_HEIGHT; local texBottom = texTop + CALENDAR_DAYBUTTON_NORMALIZED_TEX_HEIGHT; tex:SetTexCoord(texLeft, texRight, texTop, texBottom); -- adjust the highlight texture layer tex = button:GetHighlightTexture(); tex:SetAlpha(CALENDAR_DAYBUTTON_HIGHLIGHT_ALPHA); -- create event buttons local eventButtonPrefix = buttonName.."EventButton"; -- anchor first event button to the parent... local eventButton = CreateFrame("Button", buttonName.."EventButton1", button, "CalendarDayEventButtonTemplate"); eventButton:SetPoint("BOTTOMLEFT", button, "BOTTOMLEFT", CALENDAR_DAYEVENTBUTTON_XOFFSET, -CALENDAR_DAYEVENTBUTTON_YOFFSET); -- ...anchor the rest to the previous event button for i = 2, CALENDAR_DAYBUTTON_MAX_VISIBLE_EVENTS do eventButton = CreateFrame("Button", eventButtonPrefix..i, button, "CalendarDayEventButtonTemplate"); eventButton:SetPoint("BOTTOMLEFT", eventButtonPrefix..(i-1), "TOPLEFT", 0, CALENDAR_DAYEVENTBUTTON_YOFFSET); eventButton:Hide(); end end function CalendarFrame_Update() local presentWeekday, presentMonth, presentDay, presentYear = CalendarGetDate(); local prevMonth, prevYear, prevNumDays = CalendarGetMonth(-1); local nextMonth, nextYear, nextNumDays = CalendarGetMonth(1); local month, year, numDays, firstWeekday = CalendarGetMonth(); -- update the viewed month CalendarFrame.viewedMonth = month; CalendarFrame.viewedYear = year; -- get selected elements local selectedMonth = CalendarFrame.selectedMonth; local selectedDay = CalendarFrame.selectedDay; local selectedYear = CalendarFrame.selectedYear; local selectedEventMonthOffset, selectedEventDay, selectedEventIndex = CalendarGetEventIndex(); local contextEventMonthOffset, contextEventDay, contextEventIndex = CalendarContextGetEventIndex(); -- set title CalendarFrame_UpdateTitle(); -- update the prev/next month buttons in case we hit a min or max month CalendarFrame_UpdateMonthOffsetButtons(); -- initialize weekdays for i = 1, 7 do local weekday = _CalendarFrame_GetWeekdayIndex(i); _G["CalendarWeekday"..i.."Name"]:SetText(CALENDAR_WEEKDAY_NAMES[weekday]); end -- initialize hidden attributes CalendarTodayFrame:Hide(); CalendarWeekdaySelectedTexture:Hide(); CalendarLastDayDarkTexture:Hide(); CalendarFrame_SetSelectedEvent(); local buttonIndex = 1; local darkTexIndex = 1; local darkTopFlags = 0; local darkBottomFlags = 0; local isSelectedDay, isSelectedMonth; local isToday, isThisMonth; local isContextEventDay; local isSelectedEventMonthOffset; local isContextEventMonthOffset; local day; -- adjust the first week day --firstWeekday = _CalendarFrame_GetWeekdayIndex(firstWeekday); -- set the previous month's days before the first day of the week local viewablePrevMonthDays = mod((firstWeekday - CALENDAR_FIRST_WEEKDAY - 1) + 7, 7); day = prevNumDays - viewablePrevMonthDays; isSelectedMonth = selectedMonth == prevMonth and selectedYear == prevYear; isThisMonth = presentMonth == prevMonth and presentYear == prevYear; isSelectedEventMonthOffset = selectedEventMonthOffset == -1; isContextEventMonthOffset = contextEventMonthOffset == -1; while ( _CalendarFrame_GetWeekdayIndex(buttonIndex) ~= firstWeekday ) do darkTopFlags = DARKFLAG_PREVMONTH + DARKFLAG_SIDE_TOP; darkBottomFlags = DARKFLAG_PREVMONTH + DARKFLAG_SIDE_BOTTOM; if ( buttonIndex == 1 ) then darkTopFlags = darkTopFlags + DARKFLAG_SIDE_LEFT; darkBottomFlags = darkBottomFlags + DARKFLAG_SIDE_LEFT; end if ( buttonIndex == (firstWeekday - 1) ) then darkTopFlags = darkTopFlags + DARKFLAG_SIDE_RIGHT; darkBottomFlags = darkBottomFlags + DARKFLAG_SIDE_RIGHT; end isSelectedDay = isSelectedMonth and selectedDay == day; isToday = isThisMonth and presentDay == day; isContextEventDay = isContextEventMonthOffset and contextEventDay == day; CalendarFrame_UpdateDay(buttonIndex, day, -1, isSelectedDay, isContextEventDay, isToday, darkTopFlags, darkBottomFlags); CalendarFrame_UpdateDayEvents(buttonIndex, day, -1, isSelectedEventMonthOffset and selectedEventDay == day and selectedEventIndex, isContextEventDay and contextEventIndex); day = day + 1; darkTexIndex = darkTexIndex + 1; buttonIndex = buttonIndex + 1; end -- set the days of this month day = 1; isSelectedMonth = selectedMonth == month and selectedYear == year; isThisMonth = presentMonth == month and presentYear == year; isSelectedEventMonthOffset = selectedEventMonthOffset == 0; isContextEventMonthOffset = contextEventMonthOffset == 0; while ( day <= numDays ) do isSelectedDay = isSelectedMonth and selectedDay == day; isToday = isThisMonth and presentDay == day; isContextEventDay = isContextEventMonthOffset and contextEventDay == day; CalendarFrame_UpdateDay(buttonIndex, day, 0, isSelectedDay, isContextEventDay, isToday); CalendarFrame_UpdateDayEvents(buttonIndex, day, 0, isSelectedEventMonthOffset and selectedEventDay == day and selectedEventIndex, isContextEventDay and contextEventIndex); day = day + 1; buttonIndex = buttonIndex + 1; end -- set the special last-day-of-month texture if ( buttonIndex < 36 and mod(buttonIndex - 1, 7) ~= 0 ) then -- if we are not the last day of the week then we set a special corner texture -- to match up with the dark textures of the following month CalendarFrame_SetLastDay(CalendarDayButtons[buttonIndex - 1], numDays); end -- set the first days of the next month day = 1; isSelectedMonth = selectedMonth == nextMonth and selectedYear == nextYear; isThisMonth = presentMonth == nextMonth and presentYear == nextYear; isSelectedEventMonthOffset = selectedEventMonthOffset == 1; local dayOfWeek; local checkCorners = mod(buttonIndex, 7) ~= 1; -- last day of the viewed month is not the last day of the week while ( buttonIndex <= CALENDAR_MAX_DAYS_PER_MONTH ) do darkTopFlags = DARKFLAG_NEXTMONTH; darkBottomFlags = DARKFLAG_NEXTMONTH; -- left darkness dayOfWeek = _CalendarFrame_GetDayOfWeek(buttonIndex); if ( dayOfWeek == 1 or day == 1 ) then darkTopFlags = darkTopFlags + DARKFLAG_SIDE_LEFT; darkBottomFlags = darkBottomFlags + DARKFLAG_SIDE_LEFT; end -- right darkness if ( dayOfWeek == 7 ) then darkTopFlags = darkTopFlags + DARKFLAG_SIDE_RIGHT; darkBottomFlags = darkBottomFlags + DARKFLAG_SIDE_RIGHT; end -- top darkness if ( not CalendarDayButtons[buttonIndex - 7].dark ) then -- this day last week was not dark darkTopFlags = darkTopFlags + DARKFLAG_SIDE_TOP; end -- bottom darkness if ( not CalendarDayButtons[buttonIndex + 7] ) then -- this day next week does not exist darkBottomFlags = darkBottomFlags + DARKFLAG_SIDE_BOTTOM; end -- corner stuff if ( checkCorners and (day == 1 or day == 7 or day == 8) ) then darkTopFlags = darkTopFlags + DARKFLAG_CORNER; end isSelectedDay = isSelectedMonth and selectedDay == day; isToday = isThisMonth and presentDay == day; isContextEventDay = isContextEventMonthOffset and contextEventDay == day; CalendarFrame_UpdateDay(buttonIndex, day, 1, isSelectedDay, isContextEventDay, isToday, darkTopFlags, darkBottomFlags); CalendarFrame_UpdateDayEvents(buttonIndex, day, 1, isSelectedEventMonthOffset and selectedEventDay == day and selectedEventIndex, isContextEventDay and contextEventIndex); day = day + 1; darkTexIndex = darkTexIndex + 1; buttonIndex = buttonIndex + 1; end -- if this month didn't have a selected event... if ( not CalendarFrame.selectedEventButton ) then local eventFrame = CalendarFrame_GetEventFrame(); if ( eventFrame and (eventFrame ~= CalendarCreateEventFrame or eventFrame.mode ~= "create") ) then --...and the event frame was open and not in create mode, hide the event frame CalendarFrame_CloseEvent(); end end -- if the context menu was set to an event... if ( CalendarContextMenu.eventButton and CalendarContextMenu.func == CalendarDayContextMenu_Initialize ) then if ( contextEventDay == 0 ) then --...and the context event no longer exists -- hide the context menu CalendarContextMenu_Hide(); -- hide the event deletion popup -- this might seem kludgy, but it takes just as long, if not longer, to check visibility of the popup -- as it does to just hide it, that's why we don't check visibility first StaticPopup_Hide("CALENDAR_DELETE_EVENT"); elseif ( CalendarContextMenu:IsShown() ) then local dayButton = CalendarContextMenu.dayButton; local eventButton = CalendarContextMenu.eventButton; if ( dayButton.monthOffset ~= contextEventMonthOffset or dayButton.day ~= contextEventDay or eventButton.eventIndex ~= contextEventIndex ) then --...and the event index changed, hide the context menu -- you might be thinking "why don't we just reanchor the context menu to the proper day?" -- great question! we don't do this because we don't want the UI to jump around on the user -- like that, especially since calendar updates are not always caused by the user CalendarContextMenu_Hide(); end end end end function CalendarFrame_UpdateTitle() CalendarMonthName:SetText(CALENDAR_MONTH_NAMES[CalendarFrame.viewedMonth]); CalendarYearName:SetText(CalendarFrame.viewedYear); end function CalendarFrame_UpdateDay(index, day, monthOffset, isSelected, isContext, isToday, darkTopFlags, darkBottomFlags) local button = CalendarDayButtons[index]; local buttonName = button:GetName(); local dateLabel = _G[buttonName.."DateFrameDate"]; local darkTop = _G[buttonName.."DarkFrameTop"]; local darkBottom = _G[buttonName.."DarkFrameBottom"]; local darkFrame = darkTop:GetParent(); -- darkBottom:GetParent() also works -- set date dateLabel:SetText(day); button.day = day; button.monthOffset = monthOffset; -- set darkened textures, these are for days not in the viewed month button.dark = darkTopFlags and darkBottomFlags; if ( button.dark ) then local tcoords; tcoords = DARKDAY_TOP_TCOORDS[darkTopFlags]; darkTop:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); tcoords = DARKDAY_BOTTOM_TCOORDS[darkBottomFlags]; darkBottom:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); darkFrame:Show(); else darkFrame:Hide(); end -- highlight the button if it is the selected day if ( isSelected ) then CalendarFrame_SetSelectedDay(button); else if ( not isContext ) then button:UnlockHighlight(); end end -- highlight the button if it is today if ( isToday ) then --CalendarFrame_SetToday(button, dateLabel); CalendarFrame_SetToday(button); end end function CalendarFrame_UpdateDayEvents(index, day, monthOffset, selectedEventIndex, contextEventIndex) local dayButton = CalendarDayButtons[index]; local dayButtonName = dayButton:GetName(); local numEvents = CalendarGetNumDayEvents(monthOffset, day); -- turn pending invite on if we have one on this day local pendingInviteIndex = CalendarGetFirstPendingInvite(monthOffset, day); local pendingInviteTex = _G[dayButtonName.."PendingInviteTexture"]; if ( pendingInviteIndex > 0 ) then pendingInviteTex:Show(); else pendingInviteTex:Hide(); end -- first pass: -- record the number of viewable events -- record first holiday index local numViewableEvents = 0; local firstHolidayIndex; for i = 1, numEvents do local title, hour, minute, calendarType, sequenceType = CalendarGetDayEvent(monthOffset, day, i); if ( title ) then if ( calendarType == "HOLIDAY" and not firstHolidayIndex ) then -- record the first holiday index...the first holiday can have sequenceType "ONGOING" firstHolidayIndex = i; end if ( sequenceType ~= "ONGOING" ) then numViewableEvents = numViewableEvents + 1; end end end dayButton.numViewableEvents = numViewableEvents; -- setup for second pass: -- adjust the event buttons based on the number of viewable events in the day -- also, determine whether or not we need the more events button local moreEventsButton = _G[dayButtonName.."MoreEventsButton"]; moreEventsButton:Hide(); local buttonHeight; local text1RelPoint, text2Point, text2JustifyH; local showingBigEvents = numViewableEvents <= CALENDAR_DAYBUTTON_MAX_VISIBLE_BIGEVENTS; if ( numViewableEvents > 0 ) then if ( showingBigEvents ) then buttonHeight = CALENDAR_DAYEVENTBUTTON_BIGHEIGHT; --text1RelPoint = nil; text2Point = "BOTTOMLEFT"; text2JustifyH = "LEFT"; else if ( numViewableEvents > CALENDAR_DAYBUTTON_MAX_VISIBLE_EVENTS ) then -- we have more viewable events than we have buttons moreEventsButton:Show(); end buttonHeight = CALENDAR_DAYEVENTBUTTON_HEIGHT; text1RelPoint = "BOTTOMLEFT"; text2Point = "RIGHT"; text2JustifyH = "RIGHT"; end end -- second pass: -- record the first event button -- show viewable events local firstEventButton; local eventIndex = 1; local eventButtonIndex = 1; local eventButton, eventButtonName, eventButtonBackground, eventButtonText1, eventButtonText2, eventColor; local prevEventButton; while ( eventButtonIndex <= CALENDAR_DAYBUTTON_MAX_VISIBLE_EVENTS and eventIndex <= numEvents ) do eventButton = _G[dayButtonName.."EventButton"..eventButtonIndex]; eventButtonName = eventButton:GetName(); eventButtonText1 = _G[eventButtonName.."Text1"]; eventButtonText2 = _G[eventButtonName.."Text2"]; local title, hour, minute, calendarType, sequenceType, eventType, texture, modStatus, inviteStatus, invitedBy, difficulty, inviteType, sequenceIndex, numSequenceDays, difficultyName = CalendarGetDayEvent(monthOffset, day, eventIndex); if ( title and sequenceType ~= "ONGOING" ) then -- set the event button if the sequence type is not ongoing -- record the event Index eventButton.eventIndex = eventIndex; -- set the event button size eventButton:SetHeight(buttonHeight); -- set the event time and title if ( calendarType == "HOLIDAY" ) then -- any event that does not display the time should go here eventButtonText2:Hide(); eventButtonText1:SetFormattedText(CALENDAR_CALENDARTYPE_NAMEFORMAT[calendarType][sequenceType], title); eventButtonText1:ClearAllPoints(); eventButtonText1:SetAllPoints(eventButton); eventButtonText1:Show(); elseif ( calendarType == "RAID_LOCKOUT" or calendarType == "RAID_RESET" ) then eventButtonText2:Hide(); title = GetDungeonNameWithDifficulty(title, difficultyName); eventButtonText1:SetFormattedText(CALENDAR_CALENDARTYPE_NAMEFORMAT[calendarType][sequenceType], title); eventButtonText1:ClearAllPoints(); eventButtonText1:SetAllPoints(eventButton); eventButtonText1:Show(); else eventButtonText2:SetText(GameTime_GetFormattedTime(hour, minute, showingBigEvents)); eventButtonText2:ClearAllPoints(); eventButtonText2:SetPoint(text2Point, eventButton, text2Point); eventButtonText2:SetJustifyH(text2JustifyH); eventButtonText2:Show(); eventButtonText1:SetFormattedText(CALENDAR_CALENDARTYPE_NAMEFORMAT[calendarType][sequenceType], title); eventButtonText1:ClearAllPoints(); eventButtonText1:SetPoint("TOPLEFT", eventButton, "TOPLEFT"); if ( text1RelPoint ) then eventButtonText1:SetPoint("BOTTOMRIGHT", eventButtonText2, text1RelPoint); end eventButtonText1:Show(); end -- set the event color eventColor = _CalendarFrame_GetEventColor(calendarType, modStatus, inviteStatus); eventButtonText1:SetTextColor(eventColor.r, eventColor.g, eventColor.b); -- anchor the event button eventButton:SetPoint("BOTTOMLEFT", dayButton, "BOTTOMLEFT", CALENDAR_DAYEVENTBUTTON_XOFFSET, -CALENDAR_DAYEVENTBUTTON_YOFFSET); if ( prevEventButton ) then -- anchor the prev event button to this one...this makes the latest event stay at the bottom prevEventButton:SetPoint("BOTTOMLEFT", eventButton, "TOPLEFT", 0, -CALENDAR_DAYEVENTBUTTON_YOFFSET); end prevEventButton = eventButton; -- highlight the selected event if ( selectedEventIndex and eventIndex == selectedEventIndex ) then CalendarFrame_SetSelectedEvent(eventButton); else -- only unlock the highlight if this is not the context event if ( not contextEventIndex or eventIndex ~= contextEventIndex ) then eventButton:UnlockHighlight(); end end -- show the event button eventButton:Show(); -- record the first event button firstEventButton = firstEventButton or eventButton; eventButtonIndex = eventButtonIndex + 1; end eventIndex = eventIndex + 1; end -- hide unused event buttons while ( eventButtonIndex <= CALENDAR_DAYBUTTON_MAX_VISIBLE_EVENTS ) do eventButton = _G[dayButtonName.."EventButton"..eventButtonIndex]; eventButton.eventIndex = nil; eventButton:Hide(); eventButtonIndex = eventButtonIndex + 1; end -- update day textures CalendarFrame_UpdateDayTextures(dayButton, numEvents, firstEventButton, firstHolidayIndex); end function CalendarFrame_UpdateDayTextures(dayButton, numEvents, firstEventButton, firstHolidayIndex) local dayButtonName = dayButton:GetName(); -- local dateBackground = _G[dayButtonName.."DateFrameBackground"]; -- if ( dayButton.numViewableEvents > 0 ) then -- dateBackground:Show(); -- else -- dateBackground:Hide(); -- end local monthOffset, day = dayButton.monthOffset, dayButton.day; local texturePath, tcoords; -- set event textures local eventBackground = _G[dayButtonName.."EventBackgroundTexture"]; local eventTex = _G[dayButtonName.."EventTexture"]; if ( firstEventButton ) then dayButton.firstEventButton = firstEventButton; -- anchor the top of the event background to the first event button since it is always -- the highest button eventBackground:SetPoint("TOP", firstEventButton, "TOP", 0, 40); eventBackground:SetPoint("BOTTOM", dayButton, "BOTTOM"); eventBackground:Show(); -- set day texture local title, hour, minute, calendarType, sequenceType, eventType, texture = CalendarGetDayEvent(monthOffset, day, firstEventButton.eventIndex); eventTex:SetTexture(); if ( CALENDAR_USE_SEQUENCE_FOR_EVENT_TEXTURE ) then texturePath, tcoords = _CalendarFrame_GetTextureFile(texture, calendarType, sequenceType, eventType); else texturePath, tcoords = _CalendarFrame_GetTextureFile(texture, calendarType, "", eventType); end if ( texturePath ) then eventTex:SetTexture(texturePath); eventTex:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); eventTex:Show(); else eventTex:Hide(); end else eventBackground:Hide(); eventTex:Hide(); dayButton.firstEventButton = nil; end -- set overlay texture local overlayTex = _G[dayButtonName.."OverlayFrameTexture"]; if ( firstHolidayIndex ) then -- for now, the overlay texture is the first holiday's sequence texture local title, hour, minute, calendarType, sequenceType, eventType, texture, modStatus, inviteStatus, invitedBy, difficulty, inviteType, sequenceIndex, numSequenceDays = CalendarGetDayEvent(monthOffset, day, firstHolidayIndex); -- local sequenceIndex, numSequenceDays, sequenceType = CalendarGetDayEventSequenceInfo(monthOffset, day, firstHolidayIndex); if ( numSequenceDays > 2 ) then -- by art/design request, we're not going to show sequence textures if the sequence only lasts up to 2 days overlayTex:SetTexture(); if ( CALENDAR_USE_SEQUENCE_FOR_OVERLAY_TEXTURE ) then texturePath, tcoords = _CalendarFrame_GetTextureFile(texture, calendarType, sequenceType, eventType); else texturePath, tcoords = _CalendarFrame_GetTextureFile(texture, calendarType, "ONGOING", eventType); end if ( texturePath ) then overlayTex:SetTexture(texturePath); overlayTex:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); overlayTex:GetParent():Show(); return; end end end overlayTex:GetParent():Hide(); end function CalendarFrame_SetSelectedDay(dayButton) local prevSelectedDayButton = CalendarFrame.selectedDayButton; if ( prevSelectedDayButton ) then prevSelectedDayButton:UnlockHighlight(); prevSelectedDayButton:GetHighlightTexture():SetAlpha(CALENDAR_DAYBUTTON_HIGHLIGHT_ALPHA); end dayButton:LockHighlight(); dayButton:GetHighlightTexture():SetAlpha(CALENDAR_DAYBUTTON_SELECTION_ALPHA); CalendarFrame.selectedDayButton = dayButton; -- highlight the weekday label at this point too local weekdayBackground = _G["CalendarWeekday".._CalendarFrame_GetDayOfWeek(dayButton:GetID()).."Background"]; CalendarWeekdaySelectedTexture:ClearAllPoints(); CalendarWeekdaySelectedTexture:SetPoint("CENTER", weekdayBackground, "CENTER"); CalendarWeekdaySelectedTexture:Show(); end function CalendarFrame_SetToday(dayButton) --CalendarTodayTexture:SetParent(dayButton); --CalendarTodayTexture:ClearAllPoints(); --CalendarTodayTexture:SetPoint("CENTER", anchor, "CENTER"); --CalendarTodayTexture:Show(); CalendarTodayFrame:SetParent(dayButton); CalendarTodayFrame:ClearAllPoints(); CalendarTodayFrame:SetPoint("CENTER", dayButton, "CENTER"); CalendarTodayFrame:Show(); local darkFrame = _G[dayButton:GetName().."DarkFrame"]; CalendarTodayFrame:SetFrameLevel(darkFrame:GetFrameLevel() + 1); end function CalendarTodayFrame_OnUpdate(self, elapsed) self.timer = self.timer - elapsed; if (self.timer < 0) then self.timer = self.fadeTime; if (self.fadein) then self.fadein = false; else self.fadein = true; end else if (self.fadein) then CalendarTodayTextureGlow:SetAlpha(1-(self.timer/self.fadeTime)); else CalendarTodayTextureGlow:SetAlpha(self.timer/self.fadeTime); end end end function CalendarFrame_SetLastDay(dayButton, day) CalendarLastDayDarkTexture:SetParent(dayButton); CalendarLastDayDarkTexture:ClearAllPoints(); CalendarLastDayDarkTexture:SetPoint("BOTTOMRIGHT", dayButton, "BOTTOMRIGHT"); CalendarLastDayDarkTexture:Show(); end function CalendarFrame_SetSelectedEvent(eventButton) if ( CalendarFrame.selectedEventButton ) then CalendarFrame.selectedEventButton:UnlockHighlight(); CalendarFrame.selectedEventButton.black:Hide(); end CalendarFrame.selectedEventButton = eventButton; if ( CalendarFrame.selectedEventButton ) then CalendarFrame.selectedEventButton:LockHighlight(); CalendarFrame.selectedEventButton.black:Show(); end end function CalendarFrame_OpenEvent(dayButton, eventIndex) local day = dayButton.day; local monthOffset = dayButton.monthOffset; CalendarOpenEvent(monthOffset, day, eventIndex); end function CalendarFrame_CloseEvent() CalendarCloseEvent(); CalendarFrame_HideEventFrame(); CalendarDayEventButton_Click(); end function CalendarFrame_OffsetMonth(offset) CalendarSetMonth(offset); CalendarContextMenu_Hide(); StaticPopup_Hide("CALENDAR_DELETE_EVENT"); CalendarEventPickerFrame_Hide(); CalendarTexturePickerFrame_Hide(); CalendarFrame_Update(); end function CalendarFrame_UpdateMonthOffsetButtons() if ( CalendarFrame_GetModal() ) then CalendarPrevMonthButton:Disable(); CalendarNextMonthButton:Disable(); return; end local testWeekday, testMonth, testDay, testYear = CalendarGetMinDate(); CalendarPrevMonthButton:Enable(); if ( CalendarFrame.viewedYear <= testYear ) then if ( CalendarFrame.viewedMonth <= testMonth ) then CalendarPrevMonthButton:Disable(); end end -- the max create date is the max date we're going to allow people to view testWeekday, testMonth, testDay, testYear = CalendarGetMaxCreateDate(); CalendarNextMonthButton:Enable(); if ( CalendarFrame.viewedYear >= testYear ) then if ( CalendarFrame.viewedMonth >= testMonth ) then CalendarNextMonthButton:Disable(); end end end function CalendarPrevMonthButton_OnClick() PlaySound("igAbiliityPageTurn"); CalendarFrame_OffsetMonth(-1); end function CalendarNextMonthButton_OnClick() PlaySound("igAbiliityPageTurn"); CalendarFrame_OffsetMonth(1); end function CalendarFilterButton_OnClick(self) ToggleDropDownMenu(1, nil, CalendarFilterDropDown, self, 0, 0); PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarFilterDropDown_OnLoad(self) UIDropDownMenu_Initialize(self, CalendarFilterDropDown_Initialize); UIDropDownMenu_SetText(self, CALENDAR_FILTERS); UIDropDownMenu_SetAnchor(self, 0, 0, "TOPRIGHT", CalendarFilterButton, "BOTTOMRIGHT"); end function CalendarFilterDropDown_Initialize(self) local info = UIDropDownMenu_CreateInfo(); info.keepShownOnClick = 1; for index, value in next, CALENDAR_FILTER_CVARS do info.text = value.text; info.func = CalendarFilterDropDown_OnClick; if ( GetCVarBool(value.cvar) ) then info.checked = 1; else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function CalendarFilterDropDown_OnClick(self) SetCVar(CALENDAR_FILTER_CVARS[self:GetID()].cvar, UIDropDownMenuButton_GetChecked(self)); CalendarFrame_Update(); end function CalendarFrame_UpdateFilter() if ( CalendarFrame_GetModal() ) then HideDropDownMenu(1); CalendarFilterButton:Disable(); else CalendarFilterButton:Enable(); end end -- Modal Dialog Support function CalendarFrame_PushModal(frame) local numModalDialogs = #CalendarModalStack; local changed = numModalDialogs == 0 or CalendarModalStack[numModalDialogs] ~= frame; if ( changed and frame ) then tinsert(CalendarModalStack, frame); CalendarModalDummy:SetParent(frame); CalendarModalDummy:SetFrameLevel(frame:GetFrameLevel() - 1); CalendarModalDummy_Show(); PlaySound("igMainMenuOptionCheckBoxOn"); end end function CalendarFrame_PopModal(popAll) local numModalDialogs = #CalendarModalStack; if ( numModalDialogs > 0 ) then if ( popAll ) then wipe(CalendarModalStack); else tremove(CalendarModalStack); end numModalDialogs = #CalendarModalStack; if ( numModalDialogs == 0 ) then -- if we have no more modal dialogs, undo the modal state... CalendarModalDummy:SetParent(CalendarFrame); --CalendarModalDummy:SetFrameLevel(CalendarFrame:GetFrameLevel()); CalendarModalDummy_Hide(); else --...otherwise reparent to the new top local top = CalendarModalStack[numModalDialogs]; CalendarModalDummy:SetParent(top); CalendarModalDummy:SetFrameLevel(top:GetFrameLevel() - 1); CalendarModalDummy_Show(); end PlaySound("igMainMenuQuit"); end end function CalendarFrame_GetModal() return CalendarModalStack[#CalendarModalStack]; end function CalendarModalDummy_Show(self) CalendarFrameModalOverlay:Show(); CalendarEventFrameBlocker:Show(); CalendarFrame_UpdateMonthOffsetButtons(); CalendarFrame_UpdateFilter(); CalendarClassButtonContainer_Update(); CalendarModalDummy:Show(); end function CalendarModalDummy_Hide(self) CalendarFrameModalOverlay:Hide(); CalendarEventFrameBlocker:Hide(); CalendarFrame_UpdateMonthOffsetButtons(); CalendarFrame_UpdateFilter(); CalendarClassButtonContainer_Update(); CalendarModalDummy:Hide(); end function CalendarEventFrameBlocker_OnShow(self) local eventFrame = CalendarFrame_GetEventFrame(); if ( eventFrame and eventFrame:IsShown() ) then -- can't do SetAllPoints because the eventFrame anchors haven't been determined yet --CalendarEventFrameBlocker:SetAllPoints(eventFrame); CalendarEventFrameBlocker:SetWidth(eventFrame:GetWidth()); CalendarEventFrameBlocker:SetHeight(eventFrame:GetHeight()); local eventFrameOverlay = _G[eventFrame:GetName().."ModalOverlay"]; if ( eventFrameOverlay ) then eventFrameOverlay:Show(); end else CalendarEventFrameBlocker:Hide(); end end function CalendarEventFrameBlocker_OnHide(self) local eventFrame = CalendarFrame_GetEventFrame(); if ( eventFrame ) then local eventFrameOverlay = _G[eventFrame:GetName().."ModalOverlay"]; if ( eventFrameOverlay ) then eventFrameOverlay:Hide(); end end end function CalendarEventFrameBlocker_Update() local eventFrame = CalendarFrame_GetEventFrame(); if ( CalendarFrame_GetModal() ) then if ( eventFrame and eventFrame:IsShown() ) then -- can't do SetAllPoints because the eventFrame anchors haven't been determined yet --CalendarEventFrameBlocker:SetAllPoints(eventFrame); CalendarEventFrameBlocker:SetWidth(eventFrame:GetWidth()); CalendarEventFrameBlocker:SetHeight(eventFrame:GetHeight()); CalendarEventFrameBlocker:Show(); local eventFrameOverlay = _G[eventFrame:GetName().."ModalOverlay"]; if ( eventFrameOverlay ) then eventFrameOverlay:Show(); end end else if ( eventFrame ) then local eventFrameOverlay = _G[eventFrame:GetName().."ModalOverlay"]; if ( eventFrameOverlay ) then eventFrameOverlay:Hide(); end end CalendarEventFrameBlocker:Hide(); end end -- CalendarContextMenu function CalendarContextMenu_Show(attachFrame, func, anchorName, xOffset, yOffset, ...) local uiScale; local uiParentScale = UIParent:GetScale(); if ( GetCVarBool("useUIScale") ) then uiScale = tonumber(GetCVar("uiscale")); if ( uiParentScale < uiScale ) then uiScale = uiParentScale; end else uiScale = uiParentScale; end --CalendarContextMenu:SetScale(uiScale); local point = "TOPLEFT"; local relativePoint = "BOTTOMLEFT"; local relativeTo; if ( anchorName == "cursor" ) then relativeTo = nil; local cursorX, cursorY = GetCursorPosition(); cursorX = cursorX / uiScale; cursorY = cursorY / uiScale; if ( not xOffset ) then xOffset = 0; end if ( not yOffset ) then yOffset = 0; end xOffset = cursorX + xOffset; yOffset = cursorY + yOffset; else relativeTo = anchorName; end local subMenu = _G[CalendarContextMenu.subMenu]; if ( subMenu ) then subMenu:Hide(); end CalendarContextMenu:ClearAllPoints(); CalendarContextMenu:SetPoint(point, relativeTo, relativePoint, xOffset, yOffset); CalendarContextMenu.attachFrame = attachFrame; CalendarContextMenu.func = func; if ( func(CalendarContextMenu, ...) ) then CalendarContextMenu:Show(); else CalendarContextMenu:Hide(); end end function CalendarContextMenu_Toggle(attachFrame, func, anchorName, xOffset, yOffset, ...) if ( CalendarContextMenu:IsShown() ) then if ( not func or func == CalendarContextMenu.func ) then CalendarContextMenu_Hide(); else CalendarContextMenu_Show(attachFrame, func, anchorName, xOffset, yOffset, ...); end else CalendarContextMenu_Show(attachFrame, func, anchorName, xOffset, yOffset, ...); end end function CalendarContextMenu_Hide(func) if ( not func or func == CalendarContextMenu.func ) then CalendarContextMenu:Hide(); end end function CalendarContextMenu_Reset() CalendarContextMenu.func = nil; CalendarContextMenu.dayButton = nil; CalendarContextMenu.eventButton = nil; end function CalendarContextMenu_OnLoad(self) self:RegisterEvent("GUILD_ROSTER_UPDATE"); self:RegisterEvent("PLAYER_GUILD_UPDATE"); self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b); self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b); end function CalendarContextMenu_OnEvent(self, event, ...) if ( event == "GUILD_ROSTER_UPDATE" or event == "PLAYER_GUILD_UPDATE" ) then CalendarDayContextMenu_RefreshEvent(); end end function CalendarContextMenu_OnHide(self) -- fail safe: unlock old highlights CalendarDayContextMenu_UnlockHighlights(); CalendarInviteContextMenu_UnlockHighlights(); -- fail safe: always hide nested menus CalendarArenaTeamContextMenu:Hide(); CalendarInviteStatusContextMenu:Hide(); end -- CalendarDayContextMenu function CalendarDayContextMenu_Initialize(self, flags, dayButton, eventButton) UIMenu_Initialize(self); -- unlock old highlights CalendarDayContextMenu_UnlockHighlights(); -- record the new day and event buttons self.dayButton = dayButton; self.eventButton = eventButton; self.flags = flags; local day = dayButton.day; local monthOffset = dayButton.monthOffset; local month, year = CalendarGetMonth(monthOffset); -- record whether or not local isTodayOrLater = _CalendarFrame_IsTodayOrLater(month, day, year); local isAfterMaxDate = _CalendarFrame_IsAfterMaxCreateDate(month, day, year); local validCreationDate = isTodayOrLater and not isAfterMaxDate; local canPaste = validCreationDate and CalendarContextEventClipboard(); local showDay = validCreationDate and band(flags, CALENDAR_CONTEXTMENU_FLAG_SHOWDAY) ~= 0; local showEvent = eventButton and band(flags, CALENDAR_CONTEXTMENU_FLAG_SHOWEVENT) ~= 0; local needSpacer = false; if ( showDay ) then -- add guild selections if the player has a guild UIMenu_AddButton(self, CALENDAR_CREATE_EVENT, nil, CalendarDayContextMenu_CreateEvent); if ( CanEditGuildEvent() ) then -- UIMenu_AddButton(self, CALENDAR_CREATE_GUILDWIDE_EVENT, nil, CalendarDayContextMenu_CreateGuildWideEvent); UIMenu_AddButton(self, CALENDAR_CREATE_GUILD_EVENT, nil, CalendarDayContextMenu_CreateGuildEvent); UIMenu_AddButton(self, CALENDAR_CREATE_GUILD_ANNOUNCEMENT, nil, CalendarDayContextMenu_CreateGuildAnnouncement); end --[[ -- add arena team selection if the player has an arena team if ( IsInArenaTeam() ) then --UIMenu_AddButton(self, CALENDAR_CREATE_ARENATEAM_EVENT, nil, nil, "CalendarArenaTeamContextMenu"); end --]] needSpacer = true; end if ( showEvent ) then local eventIndex = eventButton.eventIndex; local title, hour, minute, calendarType, sequenceType, eventType, texture, modStatus, inviteStatus, invitedBy, difficulty, inviteType = CalendarGetDayEvent(monthOffset, day, eventIndex); -- add context items for the selected event if ( _CalendarFrame_IsPlayerCreatedEvent(calendarType) ) then if ( CalendarContextEventCanEdit(monthOffset, day, eventIndex) ) then -- spacer if ( needSpacer ) then UIMenu_AddButton(self, ""); end -- copy UIMenu_AddButton(self, CALENDAR_COPY_EVENT, nil, CalendarDayContextMenu_CopyEvent); -- paste if ( canPaste ) then UIMenu_AddButton(self, CALENDAR_PASTE_EVENT, nil, CalendarDayContextMenu_PasteEvent); end -- delete UIMenu_AddButton(self, CALENDAR_DELETE_EVENT, nil, CalendarDayContextMenu_DeleteEvent); needSpacer = true; elseif ( canPaste ) then if ( needSpacer ) then UIMenu_AddButton(self, ""); end -- paste UIMenu_AddButton(self, CALENDAR_PASTE_EVENT, nil, CalendarDayContextMenu_PasteEvent); needSpacer = true; end if ( calendarType ~= "GUILD_ANNOUNCEMENT" ) then if ( validCreationDate and _CalendarFrame_CanInviteeRSVP(inviteStatus) ) then -- spacer if ( _CalendarFrame_IsSignUpEvent(calendarType, inviteType) ) then if ( inviteStatus == CALENDAR_INVITESTATUS_NOT_SIGNEDUP ) then -- sign up if ( needSpacer ) then UIMenu_AddButton(self, ""); end UIMenu_AddButton(self, CALENDAR_SIGNUP, nil, CalendarDayContextMenu_SignUp); else -- cancel sign up if ( needSpacer ) then UIMenu_AddButton(self, ""); end UIMenu_AddButton(self, CALENDAR_REMOVE_SIGNUP, nil, CalendarDayContextMenu_RemoveInvite); end else if ( needSpacer ) then UIMenu_AddButton(self, ""); end -- accept invitation if ( inviteStatus ~= CALENDAR_INVITESTATUS_ACCEPTED ) then UIMenu_AddButton(self, CALENDAR_ACCEPT_INVITATION, nil, CalendarDayContextMenu_AcceptInvite); end -- tentative invitation if ( inviteStatus ~= CALENDAR_INVITESTATUS_TENTATIVE ) then UIMenu_AddButton(self, CALENDAR_TENTATIVE_INVITATION, nil, CalendarDayContextMenu_TentativeInvite); end -- decline invitation if ( inviteStatus ~= CALENDAR_INVITESTATUS_DECLINED ) then UIMenu_AddButton(self, CALENDAR_DECLINE_INVITATION, nil, CalendarDayContextMenu_DeclineInvite); end end needSpacer = false; end if ( _CalendarFrame_CanRemoveEvent(modStatus, calendarType, inviteType, inviteStatus) ) then -- spacer if ( needSpacer ) then UIMenu_AddButton(self, ""); end -- remove event UIMenu_AddButton(self, CALENDAR_REMOVE_INVITATION, nil, CalendarDayContextMenu_RemoveInvite); needSpacer = true; end end if ( CalendarContextEventCanComplain(monthOffset, day, eventIndex) ) then if ( needSpacer ) then UIMenu_AddButton(self, ""); end -- report spam UIMenu_AddButton(self, REPORT_SPAM, nil, CalendarDayContextMenu_ReportSpam); needSpacer = true; end elseif ( canPaste ) then -- add paste if we have a clipboard if ( needSpacer ) then UIMenu_AddButton(self, ""); end UIMenu_AddButton(self, CALENDAR_PASTE_EVENT, nil, CalendarDayContextMenu_PasteEvent); end elseif ( canPaste ) then -- add paste if we have a clipboard if ( needSpacer ) then UIMenu_AddButton(self, ""); end UIMenu_AddButton(self, CALENDAR_PASTE_EVENT, nil, CalendarDayContextMenu_PasteEvent); end if ( UIMenu_FinishInitializing(self) ) then -- lock new highlights if ( dayButton ) then dayButton:LockHighlight(); end if ( eventButton ) then -- if we're highlighting an event, then register it with the context selection system CalendarContextSelectEvent(monthOffset, day, eventButton.eventIndex); eventButton:LockHighlight(); end return true; else -- show an error if they summoned a context menu that they could not create an event for, and -- there are no buttons on the context menu if ( not isTodayOrLater ) then StaticPopup_Show("CALENDAR_ERROR", CALENDAR_ERROR_CREATEDATE_BEFORE_TODAY); elseif ( isAfterMaxDate ) then StaticPopup_Show("CALENDAR_ERROR", format(CALENDAR_ERROR_CREATEDATE_AFTER_MAX, _CalendarFrame_GetFullDate(CalendarGetMaxCreateDate()))); end return false; end end function CalendarDayContextMenu_RefreshEvent() -- this function assumes that the CalendarContextMenu is already attached to an event local menu = CalendarContextMenu; if ( menu:IsShown() and menu.func == CalendarDayContextMenu_Initialize ) then CalendarContextMenu_Show(menu.attachFrame, menu.func, "cursor", 3, -3, menu.flags, menu.dayButton, menu.eventButton); end end function CalendarDayContextMenu_UnlockHighlights() local dayButton = CalendarContextMenu.dayButton; local eventButton = CalendarContextMenu.eventButton; if ( dayButton and dayButton ~= CalendarFrame.selectedDayButton and dayButton ~= GameTooltip:GetOwner() ) then dayButton:UnlockHighlight(); end if ( eventButton and eventButton ~= CalendarFrame.selectedEventButton and eventButton ~= CalendarEventPickerFrame.selectedEventButton ) then eventButton:UnlockHighlight(); end end function CalendarDayContextMenu_CreateEvent() CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); CalendarCloseEvent(); CalendarFrame_HideEventFrame(); CalendarDayButton_Click(CalendarContextMenu.dayButton); CalendarNewEvent(); CalendarCreateEventFrame.mode = "create"; CalendarCreateEventFrame.dayButton = CalendarContextMenu.dayButton; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); end function CalendarDayContextMenu_CreateGuildAnnouncement() CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); CalendarCloseEvent(); CalendarFrame_HideEventFrame(); CalendarDayButton_Click(CalendarContextMenu.dayButton); CalendarNewGuildAnnouncement(); CalendarCreateEventFrame.mode = "create"; CalendarCreateEventFrame.dayButton = CalendarContextMenu.dayButton; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); end function CalendarDayContextMenu_CreateGuildEvent() CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); CalendarCloseEvent(); CalendarFrame_HideEventFrame(); CalendarDayButton_Click(CalendarContextMenu.dayButton); CalendarNewGuildEvent(); CalendarCreateEventFrame.mode = "create"; CalendarCreateEventFrame.dayButton = CalendarContextMenu.dayButton; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); end function CalendarDayContextMenu_CopyEvent() CalendarContextEventCopy(); end function CalendarDayContextMenu_PasteEvent() local dayButton = CalendarContextMenu.dayButton; CalendarContextEventPaste(dayButton.monthOffset, dayButton.day); end function CalendarDayContextMenu_DeleteEvent() local text; local calendarType = CalendarContextEventGetCalendarType(); if ( calendarType == "GUILD_ANNOUNCEMENT" ) then text = CALENDAR_DELETE_ANNOUNCEMENT_CONFIRM; elseif ( calendarType == "GUILD_EVENT" ) then text = CALENDAR_DELETE_GUILD_EVENT_CONFIRM; else text = CALENDAR_DELETE_EVENT_CONFIRM; end StaticPopup_Show("CALENDAR_DELETE_EVENT", text); end function CalendarDayContextMenu_ReportSpam() CalendarContextEventComplain(); end function CalendarDayContextMenu_AcceptInvite() CalendarContextInviteAvailable(); end function CalendarDayContextMenu_TentativeInvite() CalendarContextInviteTentative(); end function CalendarDayContextMenu_DeclineInvite() CalendarContextInviteDecline(); end function CalendarDayContextMenu_RemoveInvite() CalendarContextInviteRemove(); end function CalendarDayContextMenu_SignUp() CalendarContextEventSignUp(); end function CalendarArenaTeamContextMenu_OnLoad(self) self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b); self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b); -- get updated arena team info for the context menu self:RegisterEvent("ARENA_TEAM_ROSTER_UPDATE"); for i = 1, MAX_ARENA_TEAMS do ArenaTeamRoster(i); end self.parentMenu = "CalendarContextMenu"; self.onlyAutoHideSelf = true; end function CalendarArenaTeamContextMenu_OnShow(self) CalendarArenaTeamContextMenu_Initialize(self); end function CalendarArenaTeamContextMenu_OnEvent(self, event, ...) if ( event == "ARENA_TEAM_ROSTER_UPDATE" ) then CalendarArenaTeamContextMenu_Initialize(self); end end function CalendarArenaTeamContextMenu_Initialize(self) UIMenu_Initialize(self); local teamName, teamSize; for i = 1, MAX_ARENA_TEAMS do teamName, teamSize = GetArenaTeam(i); if ( teamName ) then UIMenu_AddButton( CalendarArenaTeamContextMenu, -- menu format(PVP_TEAMSIZE, teamSize, teamSize), -- text nil, -- shortcut CalendarArenaTeamContextMenuButton_OnClick_CreateArenaTeamEvent, -- func nil, -- nested i); -- value end end return UIMenu_FinishInitializing(self); end function CalendarArenaTeamContextMenuButton_OnClick_CreateArenaTeamEvent(self) -- hide parent menu CalendarContextMenu_Hide(CalendarDayContextMenu_Initialize); CalendarCloseEvent(); CalendarFrame_HideEventFrame(); CalendarDayButton_Click(CalendarContextMenu.dayButton) CalendarNewArenaTeamEvent(self.value); CalendarCreateEventFrame.mode = "create"; CalendarCreateEventFrame.dayButton = CalendarContextMenu.dayButton; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); end -- CalendarDayButtonTemplate function CalendarDayButton_OnLoad(self) self:RegisterForClicks("LeftButtonUp", "RightButtonUp"); end function CalendarDayButton_OnEnter(self) if ( not self.day ) then -- not yet updated return; end local monthOffset = self.monthOffset; local day = self.day; local numEvents = CalendarGetNumDayEvents(monthOffset, day); if ( numEvents <= 0 ) then return; end -- add events local eventTime, eventColor; local numShownEvents = 0; for i = 1, numEvents do local title, hour, minute, calendarType, sequenceType, eventType, texture, modStatus, inviteStatus, invitedBy, difficulty, inviteType, sequenceIndex, numSequenceDays, difficultyName = CalendarGetDayEvent(monthOffset, day, i); if ( title and sequenceType ~= "ONGOING" ) then if ( numShownEvents == 0 ) then GameTooltip:SetOwner(self, "ANCHOR_RIGHT"); GameTooltip:ClearLines(); -- add date if we hit our first viewable event local fullDate = format(FULLDATE, _CalendarFrame_GetFullDateFromDay(self)); GameTooltip:AddLine(fullDate, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); GameTooltip:AddLine(" "); else GameTooltip:AddLine(" "); end eventTime = GameTime_GetFormattedTime(hour, minute, true); eventColor = _CalendarFrame_GetEventColor(calendarType, modStatus, inviteStatus); if ( calendarType == "RAID_RESET" or calendarType == "RAID_LOCKOUT" ) then title = GetDungeonNameWithDifficulty(title, difficultyName); end GameTooltip:AddDoubleLine( format(CALENDAR_CALENDARTYPE_NAMEFORMAT[calendarType][sequenceType], title), eventTime, eventColor.r, eventColor.g, eventColor.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b, 1 ); if ( _CalendarFrame_IsPlayerCreatedEvent(calendarType) ) then local text; if ( UnitIsUnit("player", invitedBy) ) then if ( calendarType == "GUILD_ANNOUNCEMENT" ) then text = CALENDAR_ANNOUNCEMENT_CREATEDBY_YOURSELF; elseif ( calendarType == "GUILD_EVENT" ) then text = CALENDAR_GUILDEVENT_INVITEDBY_YOURSELF; else text = CALENDAR_EVENT_INVITEDBY_YOURSELF; end else if ( _CalendarFrame_IsSignUpEvent(calendarType, inviteType) ) then local inviteStatusInfo = _CalendarFrame_SafeGetInviteStatusInfo(inviteStatus); if ( inviteStatus == CALENDAR_INVITESTATUS_NOT_SIGNEDUP or inviteStatus == CALENDAR_INVITESTATUS_SIGNEDUP ) then text = inviteStatusInfo.name; else text = format(CALENDAR_SIGNEDUP_FOR_GUILDEVENT_WITH_STATUS, inviteStatusInfo.name); end else if ( calendarType == "GUILD_ANNOUNCEMENT" ) then text = format(CALENDAR_ANNOUNCEMENT_CREATEDBY_PLAYER, _CalendarFrame_SafeGetName(invitedBy)); else text = format(CALENDAR_EVENT_INVITEDBY_PLAYER, _CalendarFrame_SafeGetName(invitedBy)); end end end GameTooltip:AddLine(text, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); end numShownEvents = numShownEvents + 1; end end if ( numShownEvents > 0 ) then GameTooltip:Show(); end end function CalendarDayButton_OnLeave(self) GameTooltip:Hide(); if ( self ~= CalendarFrame.selectedDayButton and (not CalendarContextMenu:IsShown() or self ~= CalendarContextMenu.dayButton) ) then self:UnlockHighlight(); end end function CalendarDayButton_OnClick(self, button) --[[ local month, year = CalendarGetMonth(self.monthOffset); local dayChanged = month ~= CalendarFrame.selectedMonth or self.day ~= CalendarFrame.selectedDay or year ~= CalendarFrame.selectedYear; CalendarDayButton_Click(self); if ( button == "LeftButton" ) then CalendarContextMenu_Hide(); elseif ( button == "RightButton" ) then local flags = CALENDAR_CONTEXTMENU_FLAG_SHOWDAY; if ( dayChanged ) then CalendarContextMenu_Show(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, self); else CalendarContextMenu_Toggle(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, self); end end --]] if ( self.firstEventButton ) then CalendarDayEventButton_OnClick(self.firstEventButton, button); else if ( button == "LeftButton" ) then local dayChanged = self ~= CalendarFrame.selectedDayButton; CalendarDayButton_Click(self); if ( dayChanged ) then CalendarFrame_CloseEvent(); end CalendarContextMenu_Hide(); elseif ( button == "RightButton" ) then local dayChanged = self ~= CalendarContextMenu.dayButton; local flags = CALENDAR_CONTEXTMENU_FLAG_SHOWDAY; if ( dayChanged ) then CalendarContextMenu_Show(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, self); else CalendarContextMenu_Toggle(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, self); end end end PlaySound("igMainMenuOptionCheckBoxOn"); end -- CalendarDayButton_Click allows the OnClick for a day and its event buttons to do some of the same processing function CalendarDayButton_Click(button) -- close the event picker if it doesn't belong to this day if ( CalendarEventPickerFrame.dayButton and CalendarEventPickerFrame.dayButton ~= button ) then CalendarEventPickerFrame_Hide(); end local day, monthOffset = button.day, button.monthOffset; local month, year = CalendarGetMonth(monthOffset); if ( day ~= CalendarFrame.selectedDay or month ~= CalendarFrame.selectedMonth or year ~= CalendarFrame.selectedYear ) then -- a new day has been selected CalendarFrame.selectedDay = day; CalendarFrame.selectedMonth = month; CalendarFrame.selectedYear = year; CalendarFrame_SetSelectedDay(button); end end function CalendarDayButtonMoreEventsButton_OnLoad(self) self:RegisterForClicks("LeftButtonUp", "RightButtonUp"); end function CalendarDayButtonMoreEventsButton_OnEnter(self) local dayButton = self:GetParent(); CalendarDayButton_OnEnter(dayButton); dayButton:LockHighlight(); end function CalendarDayButtonMoreEventsButton_OnLeave(self) local dayButton = self:GetParent(); CalendarDayButton_OnLeave(dayButton); end function CalendarDayButtonMoreEventsButton_OnClick(self, button) --[[ local dayButton = self:GetParent(); local dayChanged = CalendarFrame.selectedDayButton ~= dayButton; CalendarDayButton_Click(dayButton); if ( button == "LeftButton" ) then CalendarEventPickerFrame_Toggle(dayButton); elseif ( button == "RightButton" ) then local flags = CALENDAR_CONTEXTMENU_FLAG_SHOWDAY; if ( dayChanged ) then CalendarContextMenu_Show(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton); else CalendarContextMenu_Toggle(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton); end end --]] local dayButton = self:GetParent(); if ( button == "LeftButton" ) then CalendarDayButton_Click(dayButton); CalendarEventPickerFrame_Toggle(dayButton); elseif ( button == "RightButton" ) then local dayChanged = CalendarFrame.selectedDayButton ~= dayButton; local flags = CALENDAR_CONTEXTMENU_FLAG_SHOWDAY; if ( firstEventButton ) then local eventChanged = CalendarContextMenu.eventButton ~= self or CalendarContextMenu.dayButton ~= dayButton; local flags = CALENDAR_CONTEXTMENU_FLAG_SHOWDAY + CALENDAR_CONTEXTMENU_FLAG_SHOWEVENT; if ( eventChanged ) then CalendarContextMenu_Show(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton, self); else CalendarContextMenu_Toggle(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton, self); end flags = flags + CALENDAR_CONTEXTMENU_FLAG_SHOWEVENT; else if ( dayChanged ) then CalendarContextMenu_Show(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton); else CalendarContextMenu_Toggle(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton); end end end PlaySound("igMainMenuOptionCheckBoxOn"); end -- CalendarDayEventButtonTemplate function CalendarDayEventButton_OnLoad(self) self:RegisterForClicks("LeftButtonUp", "RightButtonUp"); self.black = _G[self:GetName().."Black"]; self.black:SetAlpha(0.7); end function CalendarDayEventButton_OnEnter(self) local dayButton = self:GetParent(); CalendarDayButton_OnEnter(dayButton); dayButton:LockHighlight(); end function CalendarDayEventButton_OnLeave(self) local dayButton = self:GetParent(); CalendarDayButton_OnLeave(dayButton); end function CalendarDayEventButton_OnClick(self, button) local dayButton = self:GetParent(); if ( button == "LeftButton" ) then CalendarDayButton_Click(dayButton); CalendarDayEventButton_Click(self, true); CalendarContextMenu_Hide(); elseif ( button == "RightButton" ) then local eventChanged = CalendarContextMenu.eventButton ~= self or CalendarContextMenu.dayButton ~= dayButton; local flags = CALENDAR_CONTEXTMENU_FLAG_SHOWDAY + CALENDAR_CONTEXTMENU_FLAG_SHOWEVENT; if ( eventChanged ) then CalendarContextMenu_Show(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton, self); else CalendarContextMenu_Toggle(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton, self); end end PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarDayEventButton_Click(button, openEvent) if ( not button ) then StaticPopup_Hide("CALENDAR_DELETE_EVENT"); CalendarFrame_SetSelectedEvent(); return; end local dayButton = button:GetParent(); local day = dayButton.day; local monthOffset = dayButton.monthOffset; local eventIndex = button.eventIndex; local selectedEventMonthOffset, selectedEventDay, selectedEventIndex = CalendarGetEventIndex(); if ( selectedEventIndex ~= eventIndex or selectedEventDay ~= day or selectedEventMonthOffset ~= monthOffset ) then StaticPopup_Hide("CALENDAR_DELETE_EVENT"); end CalendarFrame_SetSelectedEvent(button); if ( openEvent ) then CalendarFrame_OpenEvent(dayButton, eventIndex); end end -- Calendar Misc Templates function CalendarTitleFrame_SetText(titleFrame, text) local name = titleFrame:GetName(); local textFrame = _G[name.."Text"]; local middleFrame = _G[name.."BackgroundMiddle"]; textFrame:SetWidth(0); textFrame:SetText(text); middleFrame:SetWidth(min(240, max(140, textFrame:GetWidth()))); textFrame:SetWidth(middleFrame:GetWidth()); end -- CalendarViewHolidayFrame function CalendarViewHolidayFrame_OnLoad(self) self.update = CalendarViewHolidayFrame_Update; CalendarViewHolidayInfoTexture:SetAlpha(0.4); end function CalendarViewHolidayFrame_OnShow(self) CalendarViewHolidayFrame_Update(); end function CalendarViewHolidayFrame_OnHide(self) end function CalendarViewHolidayFrame_Update() local name, description, texture = CalendarGetHolidayInfo(CalendarGetEventIndex()); CalendarTitleFrame_SetText(CalendarViewHolidayTitleFrame, name); CalendarViewHolidayDescription:SetText(description); CalendarViewHolidayInfoTexture:SetTexture(); -- mschweitzer NOTE: we're going to use the default texture here until we can get real INFO art local texture = CALENDAR_CALENDARTYPE_TEXTURES["HOLIDAY"]["INFO"]; local tcoords = CALENDAR_CALENDARTYPE_TCOORDS["HOLIDAY"]; -- local texture, tcoords = _CalendarFrame_GetTextureFile(texture, "HOLIDAY", "INFO", 0); if ( texture ) then CalendarViewHolidayInfoTexture:SetTexture(texture); CalendarViewHolidayInfoTexture:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); CalendarViewHolidayInfoTexture:Show(); else CalendarViewHolidayInfoTexture:Hide(); end end -- CalendarViewRaidFrame function CalendarViewRaidFrame_OnLoad(self) self.update = CalendarViewRaidFrame_Update; end function CalendarViewRaidFrame_OnShow(self) CalendarViewRaidFrame_Update(); end function CalendarViewRaidFrame_OnHide(self) end function CalendarViewRaidFrame_Update() local name, calendarType, raidID, hour, minute, difficulty, difficultyName = CalendarGetRaidInfo(CalendarGetEventIndex()); name = GetDungeonNameWithDifficulty(name, difficultyName); CalendarTitleFrame_SetText(CalendarViewRaidTitleFrame, name); if ( calendarType == "RAID_LOCKOUT" ) then CalendarViewRaidDescription:SetFormattedText(CALENDAR_RAID_LOCKOUT_DESCRIPTION, name, GameTime_GetFormattedTime(hour, minute, true)); else -- calendarType should be "RAID_RESET" CalendarViewRaidDescription:SetFormattedText(CALENDAR_RAID_RESET_DESCRIPTION, name, GameTime_GetFormattedTime(hour, minute, true)); end end -- Calendar Event Templates function CalendarEventCloseButton_OnClick(self) CalendarContextMenu_Hide(); CalendarFrame_CloseEvent(); PlaySound("igMainMenuQuit"); end function CalendarEventDescriptionScrollFrame_OnLoad(self) ScrollFrame_OnLoad(self); -- we need to mess with the size of the scroll bar and the position of the up and down buttons -- in order to get the thumb texture to stop closer to the up and down buttons -- first: resize the scrollbar local scrollBar = _G[self:GetName().."ScrollBar"]; scrollBar:ClearAllPoints(); scrollBar:SetPoint("TOPLEFT", self, "TOPRIGHT", 0, -10); scrollBar:SetPoint("BOTTOMLEFT", self, "BOTTOMRIGHT", 0, 10); -- second: reposition the up and down buttons _G[self:GetName().."ScrollBarScrollDownButton"]:SetPoint("TOP", scrollBar, "BOTTOM", 0, 4); _G[self:GetName().."ScrollBarScrollUpButton"]:SetPoint("BOTTOM", scrollBar, "TOP", 0, -4); -- now save off the scroll bar for convenience's sake self.scrollBar = scrollBar; -- make the scroll bar hideable and force it to start off hidden so positioning calculations can be done -- as soon as it needs to be shown self.scrollBarHideable = 1; scrollBar:Hide(); -- register the addon loaded event for post-load fixups self:RegisterEvent("ADDON_LOADED"); self:SetScript("OnEvent", CalendarEventDescriptionScrollFrame_OnEvent); end function CalendarEventDescriptionScrollFrame_OnEvent(self, event, ...) if ( event == "ADDON_LOADED" ) then local addonName = ...; if ( not addonName or (addonName and addonName ~= "Blizzard_Calendar") ) then return; end -- NOTE: this function expects the scroll frame to have a .content member, which should be the -- stuff we're scrolling on (scroll frame's scroll child's frame)! if ( self.content ) then local scrollBar = self.scrollBar; scrollBar.Show = function (self) local scrollFrame = self:GetParent(); -- adjust scroll frame width scrollFrame:SetPoint("BOTTOMRIGHT", scrollFrame:GetParent(), "BOTTOMRIGHT", -4 - self:GetWidth(), 4); scrollFrame:GetScrollChild():SetWidth(scrollFrame:GetWidth()); -- adjust content width scrollFrame.content:SetWidth(scrollFrame.defaultContentWidth); getmetatable(self).__index.Show(self); end scrollBar.Hide = function (self) local scrollFrame = self:GetParent(); -- adjust scroll frame width scrollFrame:SetPoint("BOTTOMRIGHT", scrollFrame:GetParent(), "BOTTOMRIGHT", -4, 4); scrollFrame:GetScrollChild():SetWidth(scrollFrame:GetWidth()); -- adjust content width scrollFrame.content:SetWidth(scrollFrame.defaultContentWidth + self:GetWidth()); getmetatable(self).__index.Hide(self); end self.defaultContentWidth = self.content:GetWidth(); end -- we don't need this event any more self:UnregisterEvent(event) end end function CalendarEventInviteList_OnLoad(self) self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b); self:SetBackdropColor(0.0, 0.0, 0.0, 0.9); self.sortButtons = { name = _G[self:GetName().."NameSortButton"], class = _G[self:GetName().."ClassSortButton"], status = _G[self:GetName().."StatusSortButton"], }; -- register the addon loaded event for post-load fixups self:RegisterEvent("ADDON_LOADED"); self:SetScript("OnEvent", CalendarEventInviteList_OnEvent); end function CalendarEventInviteList_OnEvent(self, event, ...) if ( event == "ADDON_LOADED" ) then local addonName = ...; if ( not addonName or (addonName and addonName ~= "Blizzard_Calendar") ) then return; end local scrollBar = self.scrollFrame.scrollBar; scrollBar.Show = function (self) local scrollFrame = self:GetParent(); local scrollFrameParent = scrollFrame:GetParent(); local scrollBarWidth = scrollFrameParent.scrollBarWidth; -- adjust scroll frame width scrollFrame:SetPoint("BOTTOMRIGHT", scrollFrameParent, "BOTTOMRIGHT", -scrollBarWidth, 3); scrollFrame.scrollChild:SetWidth(scrollFrame:GetWidth()); -- adjust button width local buttonWidth = scrollFrameParent.defaultButtonWidth - scrollBarWidth; for _, button in next, scrollFrame.buttons do button:SetWidth(buttonWidth); end getmetatable(self).__index.Show(self); end scrollBar.Hide = function (self) local scrollFrame = self:GetParent(); local scrollFrameParent = scrollFrame:GetParent(); -- adjust scroll frame width scrollFrame:SetPoint("BOTTOMRIGHT", scrollFrameParent, "BOTTOMRIGHT", 0, 3); scrollFrame.scrollChild:SetWidth(scrollFrame:GetWidth()); -- adjust button width local buttonWidth = scrollFrameParent.defaultButtonWidth; for _, button in next, scrollFrame.buttons do button:SetWidth(buttonWidth); end getmetatable(self).__index.Hide(self); end -- kinda cheesy...might wanna unify the create and view invite lists more at some point... self.scrollFrame.update = _G[self.scrollFrame:GetName().."_Update"]; HybridScrollFrame_CreateButtons(self.scrollFrame, self:GetName().."ButtonTemplate"); self.scrollBarWidth = 25; -- looks better than actual scroll bar width self.defaultButtonWidth = self.scrollFrame.buttons[1]:GetWidth() + self.scrollBarWidth; -- we don't need this event any more self:UnregisterEvent(event); end end function CalendarEventInviteList_AnchorSortButtons(inviteList) local scrollFrame = inviteList.scrollFrame; if ( not scrollFrame.buttons or not scrollFrame.buttons[1] ) then return; end local inviteButton = scrollFrame.buttons[1]; local inviteButtonName = inviteButton:GetName(); local nameSortButton = inviteList.sortButtons.name; if ( inviteList.partyMode ) then local inviteName = _G[inviteButtonName.."Name"]; nameSortButton:SetPoint("LEFT", inviteName, "LEFT"); else local invitePartyIcon = _G[inviteButtonName.."PartyIcon"]; nameSortButton:SetPoint("LEFT", invitePartyIcon, "LEFT"); end local classSortButton = inviteList.sortButtons.class; local inviteClass = _G[inviteButtonName.."Class"]; classSortButton:SetPoint("LEFT", inviteClass, "LEFT"); local statusSortButton = inviteList.sortButtons.status; local inviteSort = _G[inviteButtonName.."Status"]; statusSortButton:SetPoint("RIGHT", inviteSort, "RIGHT"); end function CalendarEventInviteList_UpdateSortButtons(inviteList) local criterion, reverse = CalendarEventGetInviteSortCriterion(); for index, button in pairs(inviteList.sortButtons) do local direction = _G[button:GetName().."Direction"]; if ( button.criterion == criterion ) then if ( reverse ) then direction:SetTexCoord(0.0, 0.9375, 0.0, 0.6875); else direction:SetTexCoord(0.0, 0.9375, 0.6875, 0.0); end direction:Show(); button:SetWidth(button:GetTextWidth() + direction:GetWidth()); else direction:Hide(); button:SetWidth(button:GetTextWidth()); end end end function CalendarEventInviteSortButton_OnLoad(self) local width = self:GetTextWidth() + _G[self:GetName().."Direction"]:GetWidth(); self:SetWidth(width); end function CalendarEventInviteSortButton_OnClick(self) CalendarEventSortInvites(self.criterion, self.criterion == CalendarEventGetInviteSortCriterion()); PlaySound("igMainMenuOptionCheckBoxOn"); CalendarContextMenu_Hide(CalendarViewEventInviteContextMenu_Initialize); CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); end function CalendarEventInviteListButton_OnEnter(self) if ( self.inviteIndex ) then local weekday, month, day, year, hour, minute = CalendarEventGetInviteResponseTime(self.inviteIndex); if ( weekday ~= 0 ) then GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT"); GameTooltip:AddLine(CALENDAR_TOOLTIP_INVITE_RESPONDED); -- date GameTooltip:AddLine( format(FULLDATE, _CalendarFrame_GetFullDate(weekday, month, day, year)), HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b ); -- time GameTooltip:AddLine( GameTime_GetFormattedTime(hour, minute, true), HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b ); GameTooltip:Show(); end end end -- CalendarViewEventFrame function CalendarViewEventFrame_OnLoad(self) self:RegisterEvent("CALENDAR_UPDATE_EVENT"); self:RegisterEvent("CALENDAR_UPDATE_INVITE_LIST"); self:RegisterEvent("CALENDAR_CLOSE_EVENT"); self:RegisterEvent("GUILD_ROSTER_UPDATE"); self:RegisterEvent("PLAYER_GUILD_UPDATE"); -- self:RegisterEvent("PARTY_MEMBERS_CHANGED"); self.update = CalendarViewEventFrame_Update; self.selectedInvite = nil; self.myInviteIndex = nil; self.defaultHeight = self:GetHeight(); end function CalendarViewEventFrame_OnEvent(self, event, ...) if ( CalendarViewEventFrame:IsShown() ) then if ( event == "CALENDAR_UPDATE_EVENT" ) then CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); if ( CalendarEventCanEdit() ) then CalendarCreateEventFrame.mode = "edit"; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); else CalendarViewEventFrame_Update(); end elseif ( event == "CALENDAR_UPDATE_INVITE_LIST" ) then CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); if ( CalendarEventCanEdit() ) then CalendarCreateEventFrame.mode = "edit"; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); else -- RSVP'ing to the event can induce an invite list update, so we -- need to do an RSVP update local title, description, creator, eventType, repeatOption, maxSize, textureIndex, weekday, month, day, year, hour, minute, lockoutWeekday, lockoutMonth, lockoutDay, lockoutYear, lockoutHour, lockoutMinute, locked, autoApprove, pendingInvite, inviteStatus, inviteType, calendarType = CalendarGetEventInfo(); CalendarViewEventRSVP_Update(month, day, year, pendingInvite, inviteStatus, inviteType, calendarType); CalendarViewEventInviteList_Update(inviteType, calendarType); end elseif ( event == "CALENDAR_CLOSE_EVENT" ) then CalendarFrame_HideEventFrame(CalendarViewEventFrame); elseif ( event == "GUILD_ROSTER_UPDATE" or event == "PLAYER_GUILD_UPDATE" ) then if ( CalendarEventCanEdit() ) then -- our permissions changed and we can now edit this event CalendarCreateEventFrame.mode = "edit"; CalendarFrame_ShowEventFrame(CalendarCreateEventFrame); end -- elseif ( event == "PARTY_MEMBERS_CHANGED" ) then -- CalendarViewEventInviteList_Update(); end end end function CalendarViewEventFrame_OnShow(self) CalendarViewEventFrame_Update(); end function CalendarViewEventFrame_OnHide(self) CalendarContextMenu_Hide(CalendarViewEventInviteContextMenu_Initialize); --CalendarDayEventButton_Click(); end function CalendarViewEventFrame_Update() local title, description, creator, eventType, repeatOption, maxSize, textureIndex, weekday, month, day, year, hour, minute, lockoutWeekday, lockoutMonth, lockoutDay, lockoutYear, lockoutHour, lockoutMinute, locked, autoApprove, pendingInvite, inviteStatus, inviteType, calendarType = CalendarGetEventInfo(); if ( not title ) then -- event was probably deleted CalendarFrame_HideEventFrame(CalendarViewEventFrame); CalendarClassButtonContainer_Hide(); return; end -- record the invite type CalendarViewEventFrame.inviteType = inviteType; -- reset the flash timer to reinforce the visual feedback that the player is switching between events CalendarViewEventFlashTimer:Stop(); -- set the icon CalendarViewEventIcon:SetTexture(); local tcoords = CALENDAR_EVENTTYPE_TCOORDS[eventType]; CalendarViewEventIcon:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); local eventTex = _CalendarFrame_GetEventTexture(textureIndex, eventType); if ( eventTex ) then -- set the event type local name = eventTex.title; name = GetDungeonNameWithDifficulty(name, eventTex.difficultyName); CalendarViewEventTypeName:SetFormattedText(CALENDAR_VIEW_EVENTTYPE, safeselect(eventType, CalendarEventGetTypes()), name); -- set the eventTex texture if ( eventTex.texture ~= "" ) then CalendarViewEventIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURE_PATHS[eventType]..eventTex.texture); else CalendarViewEventIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURES[eventType]); end else -- set the event type CalendarViewEventTypeName:SetText(safeselect(eventType, CalendarEventGetTypes())); CalendarViewEventIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURES[eventType]); end -- set the creator CalendarViewEventCreatorName:SetFormattedText(CALENDAR_EVENT_CREATORNAME, _CalendarFrame_SafeGetName(creator)); -- set the date CalendarViewEventDateLabel:SetFormattedText(FULLDATE, _CalendarFrame_GetFullDate(weekday, month, day, year)); -- set the time CalendarViewEventTimeLabel:SetText(GameTime_GetFormattedTime(hour, minute, true)); -- set the description CalendarViewEventDescription:SetText(description); CalendarViewEventDescriptionScrollFrame:SetVerticalScroll(0); -- change the look based on the locked status if ( locked ) then -- set the event title CalendarViewEventTitle:SetFormattedText(CALENDAR_VIEW_EVENTTITLE_LOCKED, title); SetDesaturation(CalendarViewEventIcon, true); CalendarViewEventTypeName:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); CalendarViewEventCreatorName:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); --CalendarViewEventDateLabel:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); --CalendarViewEventTimeLabel:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); CalendarViewEventDescription:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); else -- set the event title CalendarViewEventTitle:SetText(title); SetDesaturation(CalendarViewEventIcon, false); CalendarViewEventTypeName:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); CalendarViewEventCreatorName:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); --CalendarViewEventDateLabel:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b) --CalendarViewEventTimeLabel:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); CalendarViewEventDescription:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); end if ( calendarType == "GUILD_ANNOUNCEMENT" ) then CalendarTitleFrame_SetText(CalendarViewEventTitleFrame, CALENDAR_VIEW_ANNOUNCEMENT); -- guild wide events don't have invite lists, auto approval, or event locks CalendarViewEventInviteListSection:Hide(); CalendarViewEventFrame:SetHeight(CalendarViewEventFrame.defaultHeight - CalendarViewEventInviteListSection:GetHeight()); CalendarClassButtonContainer_Hide(); else if ( calendarType == "GUILD_EVENT" ) then CalendarTitleFrame_SetText(CalendarViewEventTitleFrame, CALENDAR_VIEW_GUILD_EVENT); else CalendarTitleFrame_SetText(CalendarViewEventTitleFrame, CALENDAR_VIEW_EVENT); end CalendarViewEventInviteListSection:Show(); CalendarViewEventFrame:SetHeight(CalendarViewEventFrame.defaultHeight); if ( locked ) then -- event locked...you cannot respond to the event CalendarViewEventAcceptButton:Disable(); CalendarViewEventTentativeButton:Disable(); CalendarViewEventDeclineButton:Disable(); CalendarViewEventAcceptButtonFlashTexture:Hide(); CalendarViewEventTentativeButtonFlashTexture:Hide(); CalendarViewEventDeclineButtonFlashTexture:Hide() CalendarViewEventFrame:SetScript("OnUpdate", nil); else CalendarViewEventRSVP_Update(month, day, year, pendingInvite, inviteStatus, inviteType, calendarType); end CalendarViewEventInviteList_Update(inviteType, calendarType); end CalendarEventFrameBlocker_Update(); end function CalendarViewEventDescriptionScrollFrame_OnLoad(self) self.content = CalendarViewEventDescription; CalendarEventDescriptionScrollFrame_OnLoad(self); end function CalendarViewEventRSVPButton_OnUpdate(self) self.flashTexture:SetAlpha(CalendarViewEventFlashTimer:GetSmoothProgress()); end function CalendarViewEventAcceptButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); if ( CalendarViewEventFrame.inviteType == CALENDAR_INVITETYPE_SIGNUP ) then GameTooltip:SetText(CALENDAR_TOOLTIP_SIGNUPBUTTON, nil, nil, nil, nil, 1); else GameTooltip:SetText(CALENDAR_TOOLTIP_AVAILABLEBUTTON, nil, nil, nil, nil, 1); end GameTooltip:Show(); --GameTooltip_AddNewbieTip(self, nil, 1.0, 1.0, 1.0, CALENDAR_TOOLTIP_AVAILABLEBUTTON, 1); end function CalendarViewEventAcceptButton_OnClick(self) if ( CalendarViewEventFrame.inviteType == CALENDAR_INVITETYPE_SIGNUP ) then CalendarEventSignUp(); else CalendarEventAvailable(); end end function CalendarViewEventTentativeButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); GameTooltip:SetText(CALENDAR_TOOLTIP_TENTATIVEBUTTON, nil, nil, nil, nil, 1); GameTooltip:Show(); --GameTooltip_AddNewbieTip(self, nil, 1.0, 1.0, 1.0, CALENDAR_TOOLTIP_TENTATIVEBUTTON, 1); end function CalendarViewEventTentativeButton_OnClick(self) CalendarEventTentative(); end function CalendarViewEventDeclineButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); GameTooltip:SetText(CALENDAR_TOOLTIP_DECLINEBUTTON, nil, nil, nil, nil, 1); GameTooltip:Show(); --GameTooltip_AddNewbieTip(self, nil, 1.0, 1.0, 1.0, CALENDAR_TOOLTIP_DECLINEBUTTON, 1); end function CalendarViewEventDeclineButton_OnClick(self) CalendarEventDecline(); end function CalendarViewEventRemoveButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); if ( CalendarViewEventFrame.inviteType == CALENDAR_INVITETYPE_SIGNUP ) then GameTooltip:SetText(CALENDAR_TOOLTIP_REMOVESIGNUPBUTTON, nil, nil, nil, nil, 1); else GameTooltip:SetText(CALENDAR_TOOLTIP_REMOVEBUTTON, nil, nil, nil, nil, 1); end GameTooltip:Show(); --GameTooltip_AddNewbieTip(self, nil, 1.0, 1.0, 1.0, CALENDAR_TOOLTIP_REMOVEBUTTON, 1); end function CalendarViewEventRemoveButton_OnClick(self) CalendarRemoveEvent(); end function CalendarViewEventRSVP_Update(month, day, year, pendingInvite, inviteStatus, inviteType, calendarType) -- record the invite type CalendarViewEventFrame.inviteType = inviteType; local isTodayOrLater = _CalendarFrame_IsTodayOrLater(month, day, year); if ( _CalendarFrame_IsSignUpEvent(calendarType, inviteType) ) then -- set buttons to sign up mode CalendarViewEventAcceptButton:SetText(CALENDAR_SIGNUP); CalendarViewEventAcceptButton:ClearAllPoints(); CalendarViewEventAcceptButton:SetPoint("TOPLEFT", CalendarViewEventTentativeButton:GetParent(), "TOPLEFT", 14, 0); CalendarViewEventAcceptButton:SetWidth(CALENDAR_VIEWEVENTFRAME_GUILDEVENT_RSVPBUTTON_WIDTH); CalendarViewEventAcceptButtonFlashTexture:Hide(); CalendarViewEventTentativeButton:ClearAllPoints(); CalendarViewEventTentativeButton:SetPoint("TOP", CalendarViewEventTentativeButton:GetParent(), "TOP", 0, 0); CalendarViewEventTentativeButton:SetWidth(CALENDAR_VIEWEVENTFRAME_GUILDEVENT_RSVPBUTTON_WIDTH); CalendarViewEventTentativeButtonFlashTexture:Hide(); CalendarViewEventRemoveButton:ClearAllPoints(); CalendarViewEventRemoveButton:SetWidth(CALENDAR_VIEWEVENTFRAME_GUILDEVENT_RSVPBUTTON_WIDTH); CalendarViewEventRemoveButton:SetPoint("TOPRIGHT", CalendarViewEventRemoveButton:GetParent(), "TOPRIGHT", -14, 0); CalendarViewEventDeclineButton:Hide(); -- update shown buttons if ( isTodayOrLater ) then if ( inviteStatus == CALENDAR_INVITESTATUS_NOT_SIGNEDUP ) then CalendarViewEventAcceptButton:Enable(); CalendarViewEventTentativeButton:Enable(); CalendarViewEventRemoveButton:Disable(); else CalendarViewEventAcceptButton:Disable(); CalendarViewEventTentativeButton:Disable(); CalendarViewEventRemoveButton:Enable(); end else CalendarViewEventAcceptButton:Disable(); CalendarViewEventTentativeButton:Disable(); CalendarViewEventRemoveButton:Disable(); end CalendarViewEventFrame:SetScript("OnUpdate", nil); else -- set buttons to normal mode CalendarViewEventAcceptButton:ClearAllPoints(); CalendarViewEventAcceptButton:SetPoint("TOPRIGHT", CalendarViewEventTentativeButton:GetParent(), "TOP", -10, 4); CalendarViewEventAcceptButton:SetWidth(CALENDAR_VIEWEVENTFRAME_EVENT_RSVPBUTTON_WIDTH); CalendarViewEventAcceptButton:SetText(ACCEPT); CalendarViewEventTentativeButton:ClearAllPoints(); CalendarViewEventTentativeButton:SetPoint("TOPLEFT", CalendarViewEventTentativeButton:GetParent(), "TOP", 10, 4); CalendarViewEventTentativeButton:SetWidth(CALENDAR_VIEWEVENTFRAME_EVENT_RSVPBUTTON_WIDTH); CalendarViewEventDeclineButton:Show(); CalendarViewEventRemoveButton:ClearAllPoints(); CalendarViewEventRemoveButton:SetPoint("TOPLEFT", CalendarViewEventRemoveButton:GetParent(), "TOP", 10, -26); CalendarViewEventRemoveButton:SetWidth(CALENDAR_VIEWEVENTFRAME_EVENT_RSVPBUTTON_WIDTH); -- update shown buttons local canRSVP = _CalendarFrame_CanInviteeRSVP(inviteStatus); if ( isTodayOrLater and canRSVP ) then if ( inviteStatus ~= CALENDAR_INVITESTATUS_ACCEPTED ) then CalendarViewEventAcceptButton:Enable(); else CalendarViewEventAcceptButton:Disable(); end if ( inviteStatus ~= CALENDAR_INVITESTATUS_TENTATIVE ) then CalendarViewEventTentativeButton:Enable(); else CalendarViewEventTentativeButton:Disable(); end if ( inviteStatus ~= CALENDAR_INVITESTATUS_DECLINED ) then CalendarViewEventDeclineButton:Enable(); else CalendarViewEventDeclineButton:Disable(); end if ( pendingInvite ) then CalendarViewEventAcceptButtonFlashTexture:Show(); CalendarViewEventTentativeButtonFlashTexture:Show(); CalendarViewEventDeclineButtonFlashTexture:Show() else CalendarViewEventAcceptButtonFlashTexture:Hide(); CalendarViewEventTentativeButtonFlashTexture:Hide(); CalendarViewEventDeclineButtonFlashTexture:Hide() end CalendarViewEventFlashTimer:Play(); else CalendarViewEventAcceptButton:Disable(); CalendarViewEventTentativeButton:Disable(); CalendarViewEventDeclineButton:Disable(); CalendarViewEventAcceptButtonFlashTexture:Hide(); CalendarViewEventTentativeButtonFlashTexture:Hide(); CalendarViewEventDeclineButtonFlashTexture:Hide() CalendarViewEventFlashTimer:Stop(); end end end function CalendarViewEventInviteList_Update(inviteType, calendarType) -- CalendarViewEventInviteList.partyMode = GetRealNumPartyMembers() > 0 or GetRealNumRaidMembers() > 0; CalendarViewEventInviteList.partyMode = false; if ( _CalendarFrame_IsSignUpEvent(calendarType, inviteType) ) then -- expand the event list so there is not so much empty space around the buttons CalendarViewEventDivider:SetPoint("TOPLEFT", CalendarViewEventDivider:GetParent(), "TOPLEFT", 10, -30); CalendarViewEventInviteList:SetPoint("TOP", CalendarViewEventInviteList:GetParent(), "TOP", 0, -60); CalendarViewEventInviteList:SetHeight(CALENDAR_VIEWEVENTFRAME_GUILDEVENT_INVITELIST_HEIGHT); else -- shrink the event list to make room for the buttons CalendarViewEventDivider:SetPoint("TOPLEFT", CalendarViewEventDivider:GetParent(), "TOPLEFT", 10, -50); CalendarViewEventInviteList:SetPoint("TOP", CalendarViewEventInviteList:GetParent(), "TOP", 0, -80); CalendarViewEventInviteList:SetHeight(CALENDAR_VIEWEVENTFRAME_EVENT_INVITELIST_HEIGHT); end CalendarViewEventInviteListScrollFrame_Update(); CalendarEventInviteList_AnchorSortButtons(CalendarViewEventInviteList); CalendarEventInviteList_UpdateSortButtons(CalendarViewEventInviteList); end function CalendarViewEventInviteListScrollFrame_Update() local buttons = CalendarViewEventInviteListScrollFrame.buttons; local numInvites = CalendarEventGetNumInvites(); local numButtons = #buttons; local buttonHeight = buttons[1]:GetHeight(); CalendarViewEventFrame.myInviteIndex = nil; local selectedInviteIndex = CalendarEventGetSelectedInvite(); if ( selectedInviteIndex <= 0 ) then selectedInviteIndex = nil; end local displayedHeight = 0; local selectedInvite = CalendarViewEventFrame.selectedInvite; local offset = HybridScrollFrame_GetOffset(CalendarViewEventInviteListScrollFrame); for i = 1, numButtons do -- get current button info local button = buttons[i]; local buttonName = button:GetName(); local inviteIndex = i + offset; local name, level, className, classFilename, inviteStatus, modStatus, inviteIsMine = CalendarEventGetInvite(inviteIndex); if ( name ) then button.inviteIndex = inviteIndex; -- setup moderator status local buttonModIcon = _G[buttonName.."ModIcon"]; if ( modStatus == "CREATOR" ) then buttonModIcon:SetTexture("Interface\\GroupFrame\\UI-Group-LeaderIcon"); buttonModIcon:Show(); elseif ( modStatus == "MODERATOR" ) then buttonModIcon:SetTexture("Interface\\GroupFrame\\UI-Group-AssistantIcon"); buttonModIcon:Show(); else buttonModIcon:SetTexture(); buttonModIcon:Hide(); end --[[ -- setup party status buttonPartyIcon = _G[buttonName.."PartyIcon"]; if ( not CalendarViewEventInviteList.partyMode or not UnitInParty(name) or not UnitInRaid(name) ) then buttonPartyIcon:Hide(); else buttonPartyIcon:Show(); -- the party icon overrides the mod icon buttonModIcon:Hide(); end --]] -- setup name -- NOTE: classFilename could be invalid when a character is being transferred local classColor = (classFilename and RAID_CLASS_COLORS[classFilename]) or NORMAL_FONT_COLOR; local buttonNameString = _G[buttonName.."Name"]; buttonNameString:SetText(_CalendarFrame_SafeGetName(name)); buttonNameString:SetTextColor(classColor.r, classColor.g, classColor.b); -- setup class local buttonClass = _G[buttonName.."Class"]; buttonClass:SetText(_CalendarFrame_SafeGetName(className)); buttonClass:SetTextColor(classColor.r, classColor.g, classColor.b); -- setup status local buttonStatus = _G[buttonName.."Status"]; local inviteStatusInfo = _CalendarFrame_SafeGetInviteStatusInfo(inviteStatus); buttonStatus:SetText(inviteStatusInfo.name); buttonStatus:SetTextColor(inviteStatusInfo.color.r, inviteStatusInfo.color.g, inviteStatusInfo.color.b); -- fixup anchors if ( CalendarViewEventInviteList.partyMode ) then buttonNameString:SetPoint("LEFT", buttonPartyIcon, "RIGHT"); --buttonClass:SetPoint("LEFT", buttonNameString, "RIGHT", -buttonPartyIcon:GetWidth(), 0); elseif ( buttonModIcon:IsShown() ) then buttonNameString:SetPoint("LEFT", buttonModIcon, "RIGHT"); --buttonClass:SetPoint("LEFT", buttonNameString, "RIGHT", -buttonModIcon:GetWidth(), 0); else buttonNameString:SetPoint("LEFT", button, "LEFT"); --buttonClass:SetPoint("LEFT", buttonNameString, "RIGHT", 0, 0); end -- set the selected button if ( selectedInviteIndex and inviteIndex == selectedInviteIndex ) then CalendarViewEventFrame_SetSelectedInvite(button); else button:UnlockHighlight(); end button:Show(); else button.inviteIndex = nil; button:Hide(); end displayedHeight = displayedHeight + buttonHeight; end CalendarClassButtonContainer_Show(CalendarViewEventFrame); local totalHeight = numInvites * buttonHeight; HybridScrollFrame_Update(CalendarViewEventInviteListScrollFrame, totalHeight, displayedHeight); end function CalendarViewEventFrame_SetSelectedInvite(inviteButton) if ( CalendarViewEventFrame.selectedInvite ) then CalendarViewEventFrame.selectedInvite:UnlockHighlight(); end CalendarViewEventFrame.selectedInvite = inviteButton; if ( CalendarViewEventFrame.selectedInvite ) then CalendarViewEventFrame.selectedInvite:LockHighlight(); end end function CalendarViewEventInviteListButton_OnClick(self, button) if ( button == "LeftButton" ) then --CalendarViewEventInviteListButton_Click(self); CalendarContextMenu_Hide(); elseif ( button == "RightButton" ) then local inviteChanged = CalendarContextMenu.inviteButton ~= self; if ( CalendarEventHasPendingInvite() and self.inviteIndex == CalendarViewEventFrame.myInviteIndex ) then if ( inviteChanged ) then CalendarContextMenu_Show(self, CalendarViewEventInviteContextMenu_Initialize, "cursor", 3, -3, self); else CalendarContextMenu_Toggle(self, CalendarViewEventInviteContextMenu_Initialize, "cursor", 3, -3, self); end end end PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarViewEventInviteListButton_Click(button) CalendarEventSelectInvite(button.inviteIndex); CalendarViewEventFrame_SetSelectedInvite(button); end function CalendarViewEventInviteContextMenu_Initialize(self, inviteButton) UIMenu_Initialize(self); -- unlock old highlights CalendarInviteContextMenu_UnlockHighlights(); -- record the invite button self.inviteButton = inviteButton; -- set invite status submenu UIMenu_AddButton(self, CALENDAR_SET_INVITE_STATUS, nil, nil, "CalendarInviteStatusContextMenu"); -- lock new highlights inviteButton:LockHighlight(); return UIMenu_FinishInitializing(self); end -- CalendarCreateEventFrame function CalendarCreateEventFrame_OnLoad(self) self:RegisterEvent("CALENDAR_UPDATE_EVENT"); self:RegisterEvent("CALENDAR_UPDATE_INVITE_LIST"); self:RegisterEvent("CALENDAR_NEW_EVENT"); self:RegisterEvent("CALENDAR_CLOSE_EVENT"); -- self:RegisterEvent("CALENDAR_ACTION_PENDING"); self:RegisterEvent("GUILD_ROSTER_UPDATE"); self:RegisterEvent("PLAYER_GUILD_UPDATE"); -- self:RegisterEvent("PARTY_MEMBERS_CHANGED"); -- used to update the frame when it is shown via CalendarFrame_ShowEventFrame self.update = CalendarCreateEventFrame_Update; -- record the default (non-guild-wide) frame size self.defaultHeight = self:GetHeight(); -- initialize UI elements UIDropDownMenu_Initialize(CalendarCreateEventTypeDropDown, CalendarCreateEventTypeDropDown_Initialize); UIDropDownMenu_SetWidth(CalendarCreateEventTypeDropDown, 100); UIDropDownMenu_Initialize(CalendarCreateEventHourDropDown, CalendarCreateEventHourDropDown_Initialize); UIDropDownMenu_SetWidth(CalendarCreateEventHourDropDown, 30, 40); UIDropDownMenu_Initialize(CalendarCreateEventMinuteDropDown, CalendarCreateEventMinuteDropDown_Initialize); UIDropDownMenu_SetWidth(CalendarCreateEventMinuteDropDown, 30, 40); UIDropDownMenu_Initialize(CalendarCreateEventAMPMDropDown, CalendarCreateEventAMPMDropDown_Initialize); UIDropDownMenu_SetWidth(CalendarCreateEventAMPMDropDown, 40, 40); UIDropDownMenu_Initialize(CalendarCreateEventRepeatOptionDropDown, CalendarCreateEventRepeatOptionDropDown_Initialize); UIDropDownMenu_SetWidth(CalendarCreateEventRepeatOptionDropDown, 80); end function CalendarCreateEventFrame_OnEvent(self, event, ...) if ( CalendarCreateEventFrame:IsShown() ) then if ( event == "CALENDAR_UPDATE_EVENT" ) then if ( CalendarEventCanEdit() ) then CalendarCreateEventFrame_Update(); else CalendarFrame_ShowEventFrame(CalendarViewEventFrame); end elseif ( event == "CALENDAR_UPDATE_INVITE_LIST" ) then CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); if ( not CalendarEventCanEdit() ) then -- if we can't edit the event any more, show the view event frame immediately CalendarFrame_ShowEventFrame(CalendarViewEventFrame); return; end --[[ local initialList = ...; if ( initialList ) then -- in this case, a new event was made and the initial invite list is now ready -- we need to update the new event with data now CalendarCreateEventFrame_Update(); else CalendarCreateEventInviteListScrollFrame_Update(); end --]] CalendarCreateEventInviteList_Update(); CalendarCreateEventRaidInviteButton_Update(); elseif ( event == "CALENDAR_NEW_EVENT" ) then local isCopy = ...; -- the CALENDAR_NEW_EVENT event gets fired when you successfully create a calendar event, -- so to provide feedback to the player, we close the current event frame when we get this -- event...the other part of the feedback is that the event shows up on their calendar -- (that part gets picked up by a CALENDAR_UPDATE_EVENT_LIST event) if ( not isCopy ) then CalendarFrame_HideEventFrame(CalendarCreateEventFrame); end elseif ( event == "CALENDAR_CLOSE_EVENT" ) then CalendarFrame_HideEventFrame(CalendarCreateEventFrame); --[[ elseif ( event == "CALENDAR_ACTION_PENDING" ) then CalendarCreateEventInviteButton_Update(); CalendarCreateEventCreateButton_Update(); --]] elseif ( event == "GUILD_ROSTER_UPDATE" or event == "PLAYER_GUILD_UPDATE" ) then if ( event == "GUILD_ROSTER_UPDATE" ) then local arg1 = ...; if ( arg1 ) then GuildRoster(); end end if ( CalendarEventCanEdit() ) then if ( CalendarCreateEventFrame.mode == "edit" ) then CalendarCreateEventFrame_Update(); end else CalendarFrame_ShowEventFrame(CalendarViewEventFrame); end -- elseif ( event == "PARTY_MEMBERS_CHANGED" ) then -- CalendarCreateEventInviteList_Update(); end end end function CalendarCreateEventFrame_OnShow(self) CalendarCreateEventFrame_Update(); end function CalendarCreateEventFrame_OnHide(self) CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); -- clear the raid invite button data so we don't get strange party-invite behavior next time we show this frame CalendarCreateEventRaidInviteButton.inviteLostMembers = false; CalendarCreateEventRaidInviteButton.inviteCount = 0; CalendarMassInviteFrame:Hide(); end function CalendarCreateEventFrame_Update() if ( CalendarCreateEventFrame.mode == "create" ) then CalendarCreateEventCreateButton_SetText(CALENDAR_CREATE); -- set the event date based on the selected date local dayButton = CalendarCreateEventFrame.dayButton; CalendarCreateEventDateLabel:SetFormattedText(FULLDATE, _CalendarFrame_GetFullDateFromDay(dayButton)); local month, year = CalendarGetMonth(dayButton.monthOffset); CalendarEventSetDate(month, dayButton.day, year); -- deselect the selected event CalendarDayEventButton_Click(); -- reset event title CalendarCreateEventTitleEdit:SetText(CALENDAR_CREATEEVENTFRAME_DEFAULT_TITLE); CalendarCreateEventTitleEdit:HighlightText(); CalendarCreateEventTitleEdit:SetFocus(); CalendarEventSetTitle(""); -- reset event description CalendarCreateEventDescriptionEdit:SetText(CALENDAR_CREATEEVENTFRAME_DEFAULT_DESCRIPTION); CalendarEventSetDescription(""); -- reset event time CalendarCreateEventFrame.selectedMinute = CALENDAR_CREATEEVENTFRAME_DEFAULT_MINUTE; CalendarCreateEventFrame.selectedAM = CALENDAR_CREATEEVENTFRAME_DEFAULT_AM; if ( CalendarFrame.militaryTime ) then CalendarCreateEventFrame.selectedHour = GameTime_ComputeMilitaryTime(CALENDAR_CREATEEVENTFRAME_DEFAULT_HOUR, CalendarCreateEventFrame.selectedAM); else CalendarCreateEventFrame.selectedHour = CALENDAR_CREATEEVENTFRAME_DEFAULT_HOUR; end CalendarCreateEvent_UpdateEventTime(); CalendarCreateEvent_SetEventTime(); -- reset event type CalendarCreateEventFrame.selectedEventType = CALENDAR_CREATEEVENTFRAME_DEFAULT_TYPE; CalendarCreateEvent_UpdateEventType(); CalendarEventSetType(CalendarCreateEventFrame.selectedEventType); -- reset event texture (must come after event type) CalendarCreateEventFrame.selectedTextureIndex = nil; CalendarCreateEventTexture_Update(); -- hide the creator CalendarCreateEventCreatorName:Hide(); -- reset repeat option CalendarCreateEventFrame.selectedRepeatOption = CALENDAR_CREATEEVENTFRAME_DEFAULT_REPEAT_OPTION; CalendarCreateEvent_UpdateRepeatOption(); CalendarEventSetRepeatOption(CalendarCreateEventFrame.selectedRepeatOption); local calendarType = CalendarEventGetCalendarType(); if ( calendarType == "GUILD_ANNOUNCEMENT" ) then CalendarTitleFrame_SetText(CalendarCreateEventTitleFrame, CALENDAR_CREATE_ANNOUNCEMENT); -- guild wide events don't have invites CalendarCreateEventInviteListSection:Hide(); CalendarCreateEventMassInviteButton:Hide(); CalendarCreateEventFrame:SetHeight(CalendarCreateEventFrame.defaultHeight - CalendarCreateEventInviteListSection:GetHeight()); CalendarClassButtonContainer_Hide(); else if ( calendarType == "GUILD_EVENT" ) then CalendarTitleFrame_SetText(CalendarCreateEventTitleFrame, CALENDAR_CREATE_GUILD_EVENT); CalendarCreateEventMassInviteButton:Hide(); else CalendarTitleFrame_SetText(CalendarCreateEventTitleFrame, CALENDAR_CREATE_EVENT); -- update mass invite button CalendarCreateEventMassInviteButton_Update(); CalendarCreateEventMassInviteButton:Show(); end -- reset auto-approve CalendarCreateEventAutoApproveCheck:SetChecked(CALENDAR_CREATEEVENTFRAME_DEFAULT_AUTOAPPROVE); CalendarCreateEvent_SetAutoApprove(); -- reset lock event CalendarCreateEventLockEventCheck:SetChecked(CALENDAR_CREATEEVENTFRAME_DEFAULT_LOCKEVENT); CalendarCreateEvent_SetLockEvent(); -- update invite list CalendarCreateEventInviteList_Update(); CalendarCreateEventInviteListSection:Show(); CalendarCreateEventFrame:SetHeight(CalendarCreateEventFrame.defaultHeight); end -- hide the raid invite button, it is only used when editing events CalendarCreateEventRaidInviteButton:Hide(); -- update the modal frame blocker CalendarEventFrameBlocker_Update(); elseif ( CalendarCreateEventFrame.mode == "edit" ) then local title, description, creator, eventType, repeatOption, maxSize, textureIndex, weekday, month, day, year, hour, minute, lockoutWeekday, lockoutMonth, lockoutDay, lockoutYear, lockoutHour, lockoutMinute, locked, autoApprove, pendingInvite, inviteStatus, inviteType, calendarType = CalendarGetEventInfo(); if ( not title ) then CalendarFrame_HideEventFrame(CalendarCreateEventFrame); CalendarClassButtonContainer_Hide(); return; end CalendarCreateEventCreateButton_SetText(CALENDAR_UPDATE); -- update event title CalendarCreateEventTitleEdit:SetText(title); CalendarCreateEventTitleEdit:SetCursorPosition(0); CalendarCreateEventTitleEdit:ClearFocus(); -- update description CalendarCreateEventDescriptionEdit:SetText(description); CalendarCreateEventDescriptionEdit:SetCursorPosition(0); CalendarCreateEventDescriptionEdit:ClearFocus(); CalendarCreateEventDescriptionScrollFrame:SetVerticalScroll(0); -- update date CalendarCreateEventDateLabel:SetFormattedText(FULLDATE, _CalendarFrame_GetFullDate(weekday, month, day, year)); -- update time if ( CalendarFrame.militaryTime ) then CalendarCreateEventFrame.selectedHour = hour; else CalendarCreateEventFrame.selectedHour = GameTime_ComputeStandardTime(hour); end CalendarCreateEventFrame.selectedMinute = minute; CalendarCreateEventFrame.selectedAM = hour < 12; if ( CalendarFrame.militaryTime ) then CalendarCreateEventFrame.selectedHour = hour; else CalendarCreateEventFrame.selectedHour = GameTime_ComputeStandardTime(hour, CalendarCreateEventFrame.selectedAM); end CalendarCreateEvent_UpdateEventTime(); -- update type CalendarCreateEventFrame.selectedEventType = eventType; CalendarCreateEvent_UpdateEventType(); -- reset event texture (must come after event type) CalendarCreateEventFrame.selectedTextureIndex = textureIndex > 0 and textureIndex; CalendarCreateEventTexture_Update(); -- update the creator (must come after event texture) CalendarCreateEventCreatorName:SetFormattedText(CALENDAR_EVENT_CREATORNAME, _CalendarFrame_SafeGetName(creator)); CalendarCreateEventCreatorName:Show(); -- update repeat option CalendarCreateEventFrame.selectedRepeatOption = repeatOption; CalendarCreateEvent_UpdateRepeatOption(); if ( calendarType == "GUILD_ANNOUNCEMENT" ) then CalendarTitleFrame_SetText(CalendarCreateEventTitleFrame, CALENDAR_EDIT_ANNOUNCEMENT); -- guild wide events don't have invites CalendarCreateEventInviteListSection:Hide(); CalendarCreateEventRaidInviteButton:Hide(); CalendarCreateEventFrame:SetHeight(CalendarCreateEventFrame.defaultHeight - CalendarCreateEventInviteListSection:GetHeight()); CalendarClassButtonContainer_Hide(); else if ( calendarType == "GUILD_EVENT" ) then CalendarTitleFrame_SetText(CalendarCreateEventTitleFrame, CALENDAR_EDIT_GUILD_EVENT); else CalendarTitleFrame_SetText(CalendarCreateEventTitleFrame, CALENDAR_EDIT_EVENT); end -- update auto approve CalendarCreateEventAutoApproveCheck:SetChecked(autoApprove); -- update locked CalendarCreateEventLockEventCheck:SetChecked(locked); -- update invite list CalendarCreateEventInviteList_Update(); -- update raid invite button CalendarCreateEventRaidInviteButton_Update(); CalendarCreateEventInviteListSection:Show(); CalendarCreateEventRaidInviteButton:Show(); CalendarCreateEventFrame:SetHeight(CalendarCreateEventFrame.defaultHeight); end -- we're not able to mass invite after an event is created... CalendarCreateEventMassInviteButton:Hide(); -- update the modal frame blocker CalendarEventFrameBlocker_Update(); end end function CalendarCreateEventTitleEdit_OnTextChanged(self) local text = self:GetText(); local trimmedText = strtrim(text); if ( trimmedText == "" or trimmedText == CALENDAR_CREATEEVENTFRAME_DEFAULT_TITLE ) then -- if the title is either the default or all whitespace, just set it to the empty string CalendarEventSetTitle(""); else CalendarEventSetTitle(text); end CalendarCreateEventCreateButton_Update(); end function CalendarCreateEventTitleEdit_OnEditFocusLost(self) local text = self:GetText(); if ( strtrim(text) == "" ) then self:SetText(CALENDAR_CREATEEVENTFRAME_DEFAULT_TITLE); end self:HighlightText(0, 0); end function CalendarCreateEventCreatorName_Update() if ( CalendarCreateEventTextureName:IsShown() ) then CalendarCreateEventCreatorName:SetPoint("TOPLEFT", CalendarCreateEventTextureName, "BOTTOMLEFT"); else CalendarCreateEventCreatorName:SetPoint("TOPLEFT", CalendarCreateEventDateLabel, "BOTTOMLEFT"); end end function CalendarCreateEventTexture_Update() local eventType = CalendarCreateEventFrame.selectedEventType; local textureIndex = CalendarCreateEventFrame.selectedTextureIndex; CalendarCreateEventIcon:SetTexture(); local tcoords = CALENDAR_EVENTTYPE_TCOORDS[eventType]; CalendarCreateEventIcon:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); local eventTex = _CalendarFrame_GetEventTexture(textureIndex, eventType); if ( eventTex ) then -- set the eventTex name since we have one local name = eventTex.title; CalendarCreateEventTextureName:SetText(GetDungeonNameWithDifficulty(name, eventTex.difficultyName)); CalendarCreateEventTextureName:Show(); -- set the eventTex texture if ( eventTex.texture ~= "" ) then CalendarCreateEventIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURE_PATHS[eventType]..eventTex.texture); else CalendarCreateEventIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURES[eventType]); end else CalendarCreateEventTextureName:Hide(); CalendarCreateEventIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURES[eventType]); end -- need to update the creator name at this point since it is affected by the texture name CalendarCreateEventCreatorName_Update(); end function CalendarCreateEventTypeDropDown_Initialize(self) CalendarCreateEventTypeDropDown_InitEventTypes(self, CalendarEventGetTypes()); end function CalendarCreateEventTypeDropDown_InitEventTypes(self, ...) local info = UIDropDownMenu_CreateInfo(); for i = 1, select("#", ...) do info.text = select(i, ...); info.func = CalendarCreateEventTypeDropDown_OnClick; if ( CalendarCreateEventFrame.selectedEventType == i ) then info.checked = 1; UIDropDownMenu_SetText(self, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function CalendarCreateEventTypeDropDown_OnClick(self) local id = self:GetID(); if ( id == CALENDAR_EVENTTYPE_DUNGEON or id == CALENDAR_EVENTTYPE_RAID ) then CalendarTexturePickerFrame_Show(id); else UIDropDownMenu_SetSelectedID(CalendarCreateEventTypeDropDown, id); CalendarCreateEventFrame.selectedEventType = id; CalendarEventSetType(id); -- NOTE: clear the texture selection for non-dungeon types since those don't have texture selections CalendarCreateEventFrame.selectedTextureIndex = nil; CalendarCreateEventTexture_Update(); CalendarCreateEventCreateButton_Update(); end end function CalendarCreateEvent_UpdateEventType() UIDropDownMenu_Initialize(CalendarCreateEventTypeDropDown, CalendarCreateEventTypeDropDown_Initialize); UIDropDownMenu_SetSelectedID(CalendarCreateEventTypeDropDown, CalendarCreateEventFrame.selectedEventType); end function CalendarCreateEventRepeatOptionDropDown_Initialize(self) CalendarCreateEventTypeDropDown_InitRepeatOptions(self, CalendarEventGetRepeatOptions()); end function CalendarCreateEventTypeDropDown_InitRepeatOptions(self, ...) local info = UIDropDownMenu_CreateInfo(); for i = 1, select("#", ...) do info.text = select(i, ...); info.func = CalendarCreateEventRepeatOptionDropDown_OnClick; if ( CalendarCreateEventFrame.selectedRepeatOption == i ) then info.checked = 1; UIDropDownMenu_SetText(self, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function CalendarCreateEventRepeatOptionDropDown_OnClick(self) local id = self:GetID(); UIDropDownMenu_SetSelectedID(CalendarCreateEventRepeatOptionDropDown, id); CalendarCreateEventFrame.selectedRepeatOption = id; CalendarEventSetRepeatOption(id); CalendarCreateEventCreateButton_Update(); end function CalendarCreateEvent_UpdateRepeatOption() UIDropDownMenu_Initialize(CalendarCreateEventRepeatOptionDropDown, CalendarCreateEventRepeatOptionDropDown_Initialize); UIDropDownMenu_SetSelectedID(CalendarCreateEventRepeatOptionDropDown, CalendarCreateEventFrame.selectedRepeatOption); end function CalendarCreateEventHourDropDown_Initialize(self) local info = UIDropDownMenu_CreateInfo(); local militaryTime = GetCVarBool("timeMgrUseMilitaryTime"); local hourMin, hourMax; if ( militaryTime ) then hourMin = 0; hourMax = 23; else hourMin = 1; hourMax = 12; end for hour = hourMin, hourMax, 1 do info.value = hour; if ( militaryTime ) then info.text = format(TIMEMANAGER_24HOUR, hour); else info.text = hour; info.justifyH = "RIGHT"; end info.func = CalendarCreateEventHourDropDown_OnClick; if ( hour == CalendarCreateEventFrame.selectedHour ) then info.checked = 1; UIDropDownMenu_SetText(self, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function CalendarCreateEventHourDropDown_OnClick(self) UIDropDownMenu_SetSelectedValue(CalendarCreateEventHourDropDown, self.value); CalendarCreateEventFrame.selectedHour = self.value; CalendarCreateEvent_SetEventTime(); CalendarCreateEventCreateButton_Update(); end function CalendarCreateEventMinuteDropDown_Initialize(self) local info = UIDropDownMenu_CreateInfo(); for minute = 0, 55, 5 do info.value = minute; info.text = format(TIMEMANAGER_MINUTE, minute); info.func = CalendarCreateEventMinuteDropDown_OnClick; if ( minute == CalendarCreateEventFrame.selectedMinute ) then info.checked = 1; UIDropDownMenu_SetText(self, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function CalendarCreateEventMinuteDropDown_OnClick(self) UIDropDownMenu_SetSelectedValue(CalendarCreateEventMinuteDropDown, self.value); CalendarCreateEventFrame.selectedMinute = self.value; CalendarCreateEvent_SetEventTime(); CalendarCreateEventCreateButton_Update(); end function CalendarCreateEventAMPMDropDown_Initialize(self) local info = UIDropDownMenu_CreateInfo(); info.text = TIMEMANAGER_AM; info.func = CalendarCreateEventAMPMDropDown_OnClick; if ( CalendarCreateEventFrame.selectedAM ) then info.checked = 1; UIDropDownMenu_SetText(self, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); info.text = TIMEMANAGER_PM; info.func = CalendarCreateEventAMPMDropDown_OnClick; if ( CalendarCreateEventFrame.selectedAM ) then info.checked = nil; else info.checked = 1; UIDropDownMenu_SetText(self, info.text); end UIDropDownMenu_AddButton(info); end function CalendarCreateEventAMPMDropDown_OnClick(self) local id = self:GetID(); UIDropDownMenu_SetSelectedID(CalendarCreateEventAMPMDropDown, id); CalendarCreateEventFrame.selectedAM = id == 1; CalendarCreateEvent_SetEventTime(); CalendarCreateEventCreateButton_Update(); end function CalendarCreateEvent_SetEventTime() local hour = CalendarCreateEventFrame.selectedHour; if ( not CalendarFrame.militaryTime ) then hour = GameTime_ComputeMilitaryTime(hour, CalendarCreateEventFrame.selectedAM); end CalendarEventSetTime(hour, CalendarCreateEventFrame.selectedMinute); end function CalendarCreateEvent_UpdateEventTime() if ( CalendarFrame.militaryTime ) then CalendarCreateEventAMPMDropDown:Hide(); else CalendarCreateEventAMPMDropDown:Show(); UIDropDownMenu_Initialize(CalendarCreateEventAMPMDropDown, CalendarCreateEventAMPMDropDown_Initialize); if ( CalendarCreateEventFrame.selectedAM ) then UIDropDownMenu_SetSelectedID(CalendarCreateEventAMPMDropDown, 1); else UIDropDownMenu_SetSelectedID(CalendarCreateEventAMPMDropDown, 2); end end UIDropDownMenu_Initialize(CalendarCreateEventHourDropDown, CalendarCreateEventHourDropDown_Initialize); UIDropDownMenu_SetSelectedValue(CalendarCreateEventHourDropDown, CalendarCreateEventFrame.selectedHour); UIDropDownMenu_Initialize(CalendarCreateEventMinuteDropDown, CalendarCreateEventMinuteDropDown_Initialize); UIDropDownMenu_SetSelectedValue(CalendarCreateEventMinuteDropDown, CalendarCreateEventFrame.selectedMinute); end function CalendarCreateEvent_UpdateTimeFormat() local hour, am = CalendarCreateEventFrame.selectedHour, CalendarCreateEventFrame.selectedAM; local militaryTime = GetCVarBool("timeMgrUseMilitaryTime"); if ( militaryTime ) then if ( not CalendarFrame.militaryTime ) then -- need to convert from 12hr to 24hr CalendarCreateEventFrame.selectedHour = GameTime_ComputeMilitaryTime(hour, am); CalendarCreateEventAMPMDropDown:Hide(); end else if ( CalendarFrame.militaryTime ) then -- need to convert from 24hr to 12hr CalendarCreateEventFrame.selectedHour, CalendarCreateEventFrame.selectedAM = GameTime_ComputeStandardTime(hour); CalendarCreateEventAMPMDropDown:Show(); end UIDropDownMenu_Initialize(CalendarCreateEventAMPMDropDown, CalendarCreateEventAMPMDropDown_Initialize); if ( CalendarCreateEventFrame.selectedAM ) then UIDropDownMenu_SetSelectedID(CalendarCreateEventAMPMDropDown, 1); else UIDropDownMenu_SetSelectedID(CalendarCreateEventAMPMDropDown, 2); end end CalendarFrame.militaryTime = militaryTime; UIDropDownMenu_Initialize(CalendarCreateEventHourDropDown, CalendarCreateEventHourDropDown_Initialize); UIDropDownMenu_SetSelectedValue(CalendarCreateEventHourDropDown, CalendarCreateEventFrame.selectedHour); UIDropDownMenu_Initialize(CalendarCreateEventMinuteDropDown, CalendarCreateEventMinuteDropDown_Initialize); UIDropDownMenu_SetSelectedValue(CalendarCreateEventMinuteDropDown, CalendarCreateEventFrame.selectedMinute); end function CalendarCreateEventDescriptionScrollFrame_OnLoad(self) self.content = CalendarCreateEventDescriptionEdit; CalendarEventDescriptionScrollFrame_OnLoad(self); end function CalendarCreateEventAutoApproveCheck_OnLoad(self) CalendarCreateEventAutoApproveCheckText:SetText(CALENDAR_AUTO_APPROVE); CalendarCreateEventAutoApproveCheckText:SetFontObject(GameFontNormalSmallLeft); self:SetHitRectInsets(0, -CalendarCreateEventAutoApproveCheckText:GetWidth(), 0, 0); end function CalendarCreateEventAutoApproveCheck_OnClick(self) CalendarCreateEvent_SetAutoApprove(); if ( self:GetChecked() ) then PlaySound("igMainMenuOptionCheckBoxOn"); else PlaySound("igMainMenuOptionCheckBoxOff"); end CalendarCreateEventCreateButton_Update(); end function CalendarCreateEvent_SetAutoApprove() if ( CalendarCreateEventAutoApproveCheck:GetChecked() ) then CalendarEventSetAutoApprove(); else CalendarEventClearAutoApprove(); end end function CalendarCreateEventLockEventCheck_OnLoad(self) CalendarCreateEventLockEventCheckText:SetText(CALENDAR_LOCK_EVENT); CalendarCreateEventLockEventCheckText:SetFontObject(GameFontNormalSmallLeft); self:SetHitRectInsets(0, -CalendarCreateEventLockEventCheckText:GetWidth(), 0, 0); end function CalendarCreateEventLockEventCheck_OnClick(self) CalendarCreateEvent_SetLockEvent(); if ( self:GetChecked() ) then PlaySound("igMainMenuOptionCheckBoxOn"); else PlaySound("igMainMenuOptionCheckBoxOff"); end CalendarCreateEventCreateButton_Update(); end function CalendarCreateEvent_SetLockEvent() if ( CalendarCreateEventLockEventCheck:GetChecked() ) then CalendarEventSetLocked(); else CalendarEventClearLocked(); end end function CalendarCreateEventInviteList_Update() -- CalendarCreateEventInviteList.partyMode = CalendarCreateEventFrame.mode == "edit" and GetRealNumPartyMembers() > 0 and GetRealNumRaidMembers() > 0; CalendarCreateEventInviteList.partyMode = false; CalendarCreateEventInviteListScrollFrame_Update(); CalendarEventInviteList_AnchorSortButtons(CalendarCreateEventInviteList); CalendarEventInviteList_UpdateSortButtons(CalendarCreateEventInviteList); end function CalendarCreateEventInviteListScrollFrame_Update() local buttons = CalendarCreateEventInviteListScrollFrame.buttons; local numInvites = CalendarEventGetNumInvites(); local numButtons = #buttons; local buttonHeight = buttons[1]:GetHeight(); local selectedInviteIndex = CalendarEventGetSelectedInvite(); if ( selectedInviteIndex <= 0 ) then selectedInviteIndex = nil; end local isEditMode = CalendarCreateEventFrame.mode == "edit"; local displayedHeight = 0; local offset = HybridScrollFrame_GetOffset(CalendarCreateEventInviteListScrollFrame); for i = 1, numButtons do -- get current button info local button = buttons[i]; local buttonName = button:GetName(); local inviteIndex = i + offset; -- NOTE: if we ever end up storing invites in a cache rather than getting it from C, then be sure to -- add a flag that stores whether or not we can invite the player to a party; that would make the -- CalendarCreateEventRaidInviteButton code more efficient as well local name, level, className, classFilename, inviteStatus, modStatus, inviteIsMine = CalendarEventGetInvite(inviteIndex); if ( name ) then -- set the button index button.inviteIndex = inviteIndex; -- setup moderator status local buttonModIcon = _G[buttonName.."ModIcon"]; if ( modStatus == "CREATOR" ) then buttonModIcon:SetTexture("Interface\\GroupFrame\\UI-Group-LeaderIcon"); buttonModIcon:Show(); elseif ( modStatus == "MODERATOR" ) then buttonModIcon:SetTexture("Interface\\GroupFrame\\UI-Group-AssistantIcon"); buttonModIcon:Show(); else buttonModIcon:SetTexture(); buttonModIcon:Hide(); end --[[ -- setup party status buttonPartyIcon = _G[buttonName.."PartyIcon"]; if ( not CalendarCreateEventInviteList.partyMode or not UnitInParty(name) or not UnitInRaid(name) ) then buttonPartyIcon:Hide(); else buttonPartyIcon:Show(); -- the party icon overrides the mod icon buttonModIcon:Hide(); end --]] -- setup name -- NOTE: classFilename could be invalid when a character is being transferred local classColor = (classFilename and RAID_CLASS_COLORS[classFilename]) or NORMAL_FONT_COLOR; local buttonNameString = _G[buttonName.."Name"]; buttonNameString:SetText(_CalendarFrame_SafeGetName(name)); buttonNameString:SetTextColor(classColor.r, classColor.g, classColor.b); -- setup class local buttonClass = _G[buttonName.."Class"]; buttonClass:SetText(_CalendarFrame_SafeGetName(className)); buttonClass:SetTextColor(classColor.r, classColor.g, classColor.b); -- setup status local buttonStatus = _G[buttonName.."Status"]; local inviteStatusInfo = _CalendarFrame_SafeGetInviteStatusInfo(inviteStatus); buttonStatus:SetText(inviteStatusInfo.name); buttonStatus:SetTextColor(inviteStatusInfo.color.r, inviteStatusInfo.color.g, inviteStatusInfo.color.b); -- fixup anchors if ( CalendarCreateEventInviteList.partyMode ) then buttonNameString:SetPoint("LEFT", buttonPartyIcon, "RIGHT"); --buttonClass:SetPoint("LEFT", buttonNameString, "RIGHT", -buttonPartyIcon:GetWidth(), 0); elseif ( buttonModIcon:IsShown() ) then buttonNameString:SetPoint("LEFT", buttonModIcon, "RIGHT"); --buttonClass:SetPoint("LEFT", buttonNameString, "RIGHT", -buttonModIcon:GetWidth(), 0); else buttonNameString:SetPoint("LEFT", button, "LEFT"); --buttonClass:SetPoint("LEFT", buttonNameString, "RIGHT", 0, 0); end -- set the selected button if ( selectedInviteIndex and inviteIndex == selectedInviteIndex ) then CalendarCreateEventFrame_SetSelectedInvite(button); else button:UnlockHighlight(); end -- set the onclick handler based on the parent mode if ( isEditMode ) then button:SetScript("OnEnter", CalendarEventInviteListButton_OnEnter); else button:SetScript("OnEnter", nil); end -- update class counts if ( classFilename ~= "" ) then CalendarClassData[classFilename].counts[inviteStatus] = CalendarClassData[classFilename].counts[inviteStatus] + 1; -- MFS HACK: doing this because we don't have class names in global strings CalendarClassData[classFilename].name = className; end button:Show(); else button.inviteIndex = nil; button:Hide(); end displayedHeight = displayedHeight + buttonHeight; end CalendarClassButtonContainer_Show(CalendarCreateEventFrame); local totalHeight = numInvites * buttonHeight; HybridScrollFrame_Update(CalendarCreateEventInviteListScrollFrame, totalHeight, displayedHeight); end function CalendarCreateEventFrame_SetSelectedInvite(inviteButton) if ( CalendarCreateEventFrame.selectedInvite ) then CalendarCreateEventFrame.selectedInvite:UnlockHighlight(); end CalendarCreateEventFrame.selectedInvite = inviteButton; if ( CalendarCreateEventFrame.selectedInvite ) then CalendarCreateEventFrame.selectedInvite:LockHighlight(); end end function CalendarCreateEventInviteListButton_OnClick(self, button) if ( button == "LeftButton" ) then --CalendarCreateEventInviteListButton_Click(self); CalendarContextMenu_Hide(); elseif ( button == "RightButton" ) then local inviteChanged = CalendarContextMenu.inviteButton ~= self; if ( inviteChanged ) then CalendarContextMenu_Show(self, CalendarCreateEventInviteContextMenu_Initialize, "cursor", 3, -3, self); else CalendarContextMenu_Toggle(self, CalendarCreateEventInviteContextMenu_Initialize, "cursor", 3, -3, self); end end PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarCreateEventInviteListButton_Click(button) CalendarEventSelectInvite(button.inviteIndex); CalendarCreateEventFrame_SetSelectedInvite(button); end function CalendarCreateEventInviteContextMenu_Initialize(self, inviteButton) UIMenu_Initialize(self); -- unlock old highlights CalendarInviteContextMenu_UnlockHighlights(); -- record the invite button self.inviteButton = inviteButton; local inviteIndex = inviteButton.inviteIndex; local name, _, _, _, _, modStatus = CalendarEventGetInvite(inviteIndex); local needSpacer = false; if ( modStatus ~= "CREATOR" ) then -- remove invite UIMenu_AddButton(self, REMOVE, nil, CalendarInviteContextMenu_RemoveInvite); -- spacer --UIMenu_AddButton(self, ""); if ( modStatus == "MODERATOR" ) then -- clear moderator status UIMenu_AddButton(self, CALENDAR_INVITELIST_CLEARMODERATOR, nil, CalendarInviteContextMenu_ClearModerator); else -- set moderator status UIMenu_AddButton(self, CALENDAR_INVITELIST_SETMODERATOR, nil, CalendarInviteContextMenu_SetModerator); end end if ( CalendarCreateEventFrame.mode == "edit" ) then if ( needSpacer ) then UIMenu_AddButton(self); end -- set invite status submenu UIMenu_AddButton(self, CALENDAR_INVITELIST_SETINVITESTATUS, nil, nil, "CalendarInviteStatusContextMenu"); needSpacer = true; end if ( not UnitIsUnit("player", name) and (not UnitInParty(name) or not UnitInRaid(name)) ) then -- spacer if ( needSpacer ) then UIMenu_AddButton(self, ""); end UIMenu_AddButton( self, -- self CALENDAR_INVITELIST_INVITETORAID, -- text nil, -- shortcut CalendarInviteContextMenu_InviteToGroup, -- func nil, -- nested self name name); -- value end if ( UIMenu_FinishInitializing(self) ) then -- lock new highlights inviteButton:LockHighlight(); return true; else return false; end end function CalendarInviteContextMenu_UnlockHighlights() local inviteButton = CalendarContextMenu.inviteButton; if ( inviteButton and inviteButton ~= CalendarViewEventFrame.selectedInvite and inviteButton ~= CalendarCreateEventFrame.selectedInvite ) then inviteButton:UnlockHighlight(); end end function CalendarInviteContextMenu_RemoveInvite() local inviteButton = CalendarContextMenu.inviteButton; CalendarEventRemoveInvite(inviteButton.inviteIndex); end function CalendarInviteContextMenu_SetModerator() local inviteButton = CalendarContextMenu.inviteButton; CalendarEventSetModerator(inviteButton.inviteIndex); end function CalendarInviteContextMenu_ClearModerator() local inviteButton = CalendarContextMenu.inviteButton; CalendarEventClearModerator(inviteButton.inviteIndex); end function CalendarInviteContextMenu_InviteToGroup(self) InviteUnit(self.value); end function CalendarInviteStatusContextMenu_OnLoad(self) self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b); self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b); self:RegisterEvent("CALENDAR_UPDATE_EVENT"); self.parentMenu = "CalendarContextMenu"; self.onlyAutoHideSelf = true; end function CalendarInviteStatusContextMenu_OnShow(self) CalendarInviteStatusContextMenu_Initialize(self, CalendarEventGetStatusOptions(CalendarContextMenu.inviteButton.inviteIndex)); end function CalendarInviteStatusContextMenu_OnEvent(self, event, ...) if ( event == "CALENDAR_UPDATE_EVENT" ) then if ( self:IsShown() ) then CalendarInviteStatusContextMenu_Initialize(self, CalendarEventGetStatusOptions(CalendarContextMenu.inviteButton.inviteIndex)); end end end function CalendarInviteStatusContextMenu_Initialize(self, ...) UIMenu_Initialize(self); local statusIndex, statusName; for i = 1, select("#", ...), 2 do statusIndex = select(i, ...); statusName = select(i + 1, ...); UIMenu_AddButton( self, -- self statusName, -- text nil, -- shortcut CalendarInviteStatusContextMenu_SetStatusOption, -- func nil, -- nested statusIndex -- value ); end return UIMenu_FinishInitializing(self); end function CalendarInviteStatusContextMenu_SetStatusOption(self) CalendarEventSetStatus(CalendarContextMenu.inviteButton.inviteIndex, self.value); -- hide parent CalendarContextMenu_Hide(CalendarCreateEventInviteContextMenu_Initialize); end function CalendarCreateEventInviteEdit_OnEnterPressed(self) if ( not AutoCompleteEditBox_OnEnterPressed(self) ) then local text = strtrim(self:GetText()); local trimmedText = strtrim(text); if ( trimmedText == "" or trimmedText == CALENDAR_PLAYER_NAME ) then self:ClearFocus(); elseif ( CalendarCanSendInvite() ) then CalendarEventInvite(text); self:SetText(""); end end end function CalendarCreateEventInviteEdit_OnEditFocusLost(self) AutoCompleteEditBox_OnEditFocusLost(self); self:HighlightText(0, 0); local trimmedText = strtrim(self:GetText()); if ( trimmedText == "" ) then self:SetText(CALENDAR_PLAYER_NAME); end end function CalendarCreateEventInviteButton_OnClick(self) local text = strtrim(CalendarCreateEventInviteEdit:GetText()); local trimmedText = strtrim(text); if ( trimmedText == "" or trimmedText == CALENDAR_PLAYER_NAME ) then CalendarCreateEventInviteEdit:ClearFocus(); else CalendarEventInvite(text); CalendarCreateEventInviteEdit:SetText(""); --CalendarCreateEventInviteEdit:ClearFocus(); end PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarCreateEventInviteButton_OnUpdate(self) CalendarCreateEventInviteButton_Update(); end function CalendarCreateEventInviteButton_Update() if ( CalendarCanSendInvite() ) then CalendarCreateEventInviteButton:Enable(); else CalendarCreateEventInviteButton:Disable(); end end function CalendarCreateEventMassInviteButton_OnClick() CalendarMassInviteFrame:Show(); end function CalendarCreateEventMassInviteButton_OnUpdate(self) CalendarCreateEventMassInviteButton_Update(); end function CalendarCreateEventMassInviteButton_Update() if ( CalendarCanSendInvite() and (CanEditGuildEvent() or IsInArenaTeam()) ) then CalendarCreateEventMassInviteButton:Enable(); else CalendarCreateEventMassInviteButton:Disable(); end end function CalendarCreateEventRaidInviteButton_OnLoad(self) self:RegisterEvent("PARTY_MEMBERS_CHANGED"); self:RegisterEvent("PARTY_CONVERTED_TO_RAID"); self:SetWidth(self:GetTextWidth() + 40); end function CalendarCreateEventRaidInviteButton_OnEvent(self, event, ...) if ( self:IsShown() and self:GetParent():IsShown() ) then if ( event == "PARTY_MEMBERS_CHANGED" ) then CalendarCreateEventRaidInviteButton_Update(); if ( GetRealNumRaidMembers() == 0 and GetRealNumPartyMembers() >= 1 and self.inviteLostMembers ) then -- in case we weren't able to convert to a raid when the player clicked the raid invite button -- (which means the player was not in a party), we want to convert to a raid now since he has a party ConvertToRaid(); end elseif ( event == "PARTY_CONVERTED_TO_RAID" ) then CalendarCreateEventRaidInviteButton_Update(); if ( self.inviteLostMembers ) then -- should already be in a raid at this point, invite members who were not invited due to the party to raid conversion local maxInviteCount = MAX_RAID_MEMBERS - GetRealNumRaidMembers(); local inviteCount = _CalendarFrame_InviteToRaid(maxInviteCount); self.inviteLostMembers = false; end end end end function CalendarCreateEventRaidInviteButton_OnClick(self) -- compute the max number of players that we should invite local maxInviteCount; local realNumRaidMembers = GetRealNumRaidMembers(); local realNumPartyMembers = GetRealNumPartyMembers(); if ( realNumRaidMembers == 0 ) then if ( realNumPartyMembers + self.inviteCount > MAX_PARTY_MEMBERS ) then -- if I can't invite the number of people that I'm supposed to... self.inviteLostMembers = true; if ( realNumPartyMembers > 0 ) then --...and I'm already in a party, then I need to form a raid first to fit everyone ConvertToRaid(); return; end --...and I'm NOT already in a party, then I need to form a party first (happens below), -- then form a raid to fit everyone (happens in response to the PARTY_CONVERTED_TO_RAID event) end maxInviteCount = MAX_PARTY_MEMBERS - realNumPartyMembers; else maxInviteCount = MAX_RAID_MEMBERS - realNumRaidMembers; end _CalendarFrame_InviteToRaid(maxInviteCount); end function CalendarCreateEventRaidInviteButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); if ( GetRealNumRaidMembers() > 0 or GetRealNumPartyMembers() + self.inviteCount > MAX_PARTY_MEMBERS ) then GameTooltip:SetText(CALENDAR_TOOLTIP_INVITEMEMBERS_BUTTON_RAID, nil, nil, nil, nil, 1); else GameTooltip:SetText(CALENDAR_TOOLTIP_INVITEMEMBERS_BUTTON_PARTY, nil, nil, nil, nil, 1); end GameTooltip:Show(); --GameTooltip_AddNewbieTip(self, nil, 1.0, 1.0, 1.0, CALENDAR_TOOLTIP_INVITETORAID_BUTTON, 1); end function CalendarCreateEventRaidInviteButton_Update() -- NOTE: it might be an efficiency concern that we go through the list twice: once to get a count -- and once to do the actual inviting (that's in the OnClick), but I thought it would be better to -- go through the list twice than to take up extra space in memory and potentially cause a lot of -- garbage collection due to constantly rebuilding a saved table local maxInviteCount = MAX_RAID_MEMBERS - GetRealNumRaidMembers(); local inviteCount = _CalendarFrame_GetInviteToRaidCount(maxInviteCount); if ( inviteCount > 0 ) then CalendarCreateEventRaidInviteButton:Enable(); else CalendarCreateEventRaidInviteButton:Disable(); end CalendarCreateEventRaidInviteButton.inviteCount = inviteCount; end function CalendarCreateEventCreateButton_OnClick(self) if ( CalendarCreateEventFrame.mode == "create" ) then CalendarAddEvent(); elseif ( CalendarCreateEventFrame.mode == "edit" ) then CalendarUpdateEvent(); end end function CalendarCreateEventCreateButton_OnUpdate(self) CalendarCreateEventCreateButton_Update(); end function CalendarCreateEventCreateButton_SetText(text) local button = CalendarCreateEventCreateButton; button:SetText(text); button:SetWidth(button:GetTextWidth() + 40); end function CalendarCreateEventCreateButton_Update() if ( CalendarCreateEventFrame.mode == "create" ) then if ( CalendarCanAddEvent() ) then CalendarCreateEventCreateButton:Enable(); else CalendarCreateEventCreateButton:Disable(); end --CalendarCreateEventCreateButton_SetText(CALENDAR_CREATE); elseif ( CalendarCreateEventFrame.mode == "edit" ) then if ( CalendarEventHaveSettingsChanged() and not CalendarIsActionPending() ) then CalendarCreateEventCreateButton:Enable(); else CalendarCreateEventCreateButton:Disable(); end --CalendarCreateEventCreateButton_SetText(CALENDAR_UPDATE); end end -- CalendarMassInviteFrame function CalendarMassInviteFrame_OnLoad(self) self:RegisterEvent("CALENDAR_ACTION_PENDING"); self:RegisterEvent("GUILD_ROSTER_UPDATE"); self:RegisterEvent("PLAYER_GUILD_UPDATE"); self:RegisterEvent("ARENA_TEAM_UPDATE"); local minLevel, maxLevel = CalendarDefaultGuildFilter(); CalendarMassInviteGuildMinLevelEdit:SetNumber(minLevel); CalendarMassInviteGuildMaxLevelEdit:SetNumber(maxLevel); UIDropDownMenu_SetWidth(CalendarMassInviteGuildRankMenu, 100); -- try to fire off a guild roster event so we can properly update our guild options if ( IsInGuild() and GetNumGuildMembers() == 0 ) then GuildRoster(); end -- do the same for arena teams for i = 1, MAX_ARENA_TEAMS do ArenaTeamRoster(i); end -- update the arena team section in order to fill initial data CalendarMassInviteArena_Update(); end function CalendarMassInviteFrame_OnShow(self) CalendarFrame_PushModal(self); CalendarMassInviteGuild_Update(); CalendarMassInviteArena_Update(); end function CalendarMassInviteFrame_OnEvent(self, event, ...) if ( event == "GUILD_ROSTER_UPDATE" ) then local arg1 = ...; if ( arg1 ) then GuildRoster(); end end if ( self:IsShown() ) then if ( not CanEditGuildEvent() and not IsInArenaTeam() ) then -- if we are no longer in a guild OR an arena team, we can't mass invite CalendarMassInviteFrame:Hide(); CalendarCreateEventMassInviteButton_Update(); else if ( event == "CALENDAR_ACTION_PENDING" ) then CalendarMassInviteGuild_Update(); CalendarMassInviteArena_Update(); elseif ( event == "GUILD_ROSTER_UPDATE" or event == "PLAYER_GUILD_UPDATE" ) then CalendarMassInviteGuild_Update(); elseif ( event == "ARENA_TEAM_UPDATE" ) then CalendarMassInviteArena_Update(); end end end end function CalendarMassInviteFrame_OnUpdate(self) CalendarMassInviteGuild_Update(); CalendarMassInviteArena_Update(); end function CalendarMassInviteGuild_Update() if ( CalendarCanSendInvite() and CanEditGuildEvent() ) then -- enable the accept button CalendarMassInviteGuildAcceptButton:Enable(); -- set the selected rank if ( not CalendarMassInviteFrame.selectedRank or CalendarMassInviteFrame.selectedRank > GuildControlGetNumRanks() ) then local _, _, rank = CalendarDefaultGuildFilter(); CalendarMassInviteFrame.selectedRank = rank; end -- enable and initialize the rank drop down UIDropDownMenu_EnableDropDown(CalendarMassInviteGuildRankMenu); UIDropDownMenu_Initialize(CalendarMassInviteGuildRankMenu, CalendarMassInviteGuildRankMenu_Initialize); -- set text color back to normal CalendarMassInviteGuildLevelText:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); CalendarMassInviteGuildMinLevelEdit:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); CalendarMassInviteGuildMaxLevelEdit:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); CalendarMassInviteGuildRankText:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); else -- disable the accept button CalendarMassInviteGuildAcceptButton:Disable(); -- disable the rank drop down UIDropDownMenu_DisableDropDown(CalendarMassInviteGuildRankMenu); -- set text color to a disabled color CalendarMassInviteGuildLevelText:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); CalendarMassInviteGuildMinLevelEdit:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); CalendarMassInviteGuildMaxLevelEdit:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); CalendarMassInviteGuildRankText:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); end end function CalendarMassInviteGuildRankMenu_Initialize() local info = UIDropDownMenu_CreateInfo(); for i = 1, GuildControlGetNumRanks() do info.text = GuildControlGetRankName(i); info.func = CalendarMassInviteGuildRankMenu_OnClick; if ( i == CalendarMassInviteFrame.selectedRank ) then info.checked = 1; UIDropDownMenu_SetText(CalendarMassInviteGuildRankMenu, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function CalendarMassInviteGuildRankMenu_OnClick(self) CalendarMassInviteFrame.selectedRank = self:GetID(); UIDropDownMenu_SetSelectedID(CalendarMassInviteGuildRankMenu, CalendarMassInviteFrame.selectedRank); end function CalendarMassInviteGuildAcceptButton_OnClick(self) local minLevel = CalendarMassInviteGuildMinLevelEdit:GetNumber(); local maxLevel = CalendarMassInviteGuildMaxLevelEdit:GetNumber(); CalendarMassInviteGuild(minLevel, maxLevel, CalendarMassInviteFrame.selectedRank); CalendarMassInviteFrame:Hide(); end local ARENA_TEAMS = {2, 3, 5}; function CalendarMassInviteArena_Update() -- initialize the teams local teamName, teamSize; local button; for i = 1, MAX_ARENA_TEAMS do button = _G["CalendarMassInviteArenaButton"..ARENA_TEAMS[i]]; button.teamName = nil; button:Disable(); end -- set the teams local canSendInvite = CalendarCanSendInvite(); for i = 1, MAX_ARENA_TEAMS do teamName, teamSize = GetArenaTeam(i); if ( canSendInvite and teamName ) then button = _G["CalendarMassInviteArenaButton"..teamSize]; button:SetFormattedText(PVP_TEAMTYPE, teamSize, teamSize); button.teamName = teamName; button:SetID(i); button:Enable(); end end -- optimization note: using two separate init and set loops yields less redundancy and less branches than two nested loops end function CalendarMassInviteArenaButton_OnLoad(self) local teamSize = ARENA_TEAMS[self:GetID()]; self:SetFormattedText(PVP_TEAMTYPE, teamSize, teamSize); end function CalendarMassInviteArenaButton_OnClick(self) CalendarMassInviteArenaTeam(self:GetID()); CalendarMassInviteFrame:Hide(); end function CalendarMassInviteArenaButton_OnEnter(self) if ( self.teamName ) then GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT"); GameTooltip:SetText(self.teamName); end end -- CalendarEventPickerFrame function CalendarEventPickerFrame_OnLoad(self) self:RegisterEvent("CALENDAR_UPDATE_EVENT_LIST"); self.dayButton = nil; self.selectedEvent = nil; end function CalendarEventPickerFrame_OnEvent(self, event, ...) if ( self:IsShown() and event == "CALENDAR_UPDATE_EVENT_LIST" and self.dayButton ) then CalendarEventPickerScrollFrame_Update(); end end function CalendarEventPickerFrame_Show(dayButton) CalendarEventPickerFrame.dayButton = dayButton; CalendarEventPickerFrame:ClearAllPoints(); if ( _CalendarFrame_GetDayOfWeek(dayButton:GetID()) > 4 ) then CalendarEventPickerFrame:SetPoint("TOPRIGHT", dayButton, "TOPLEFT"); else CalendarEventPickerFrame:SetPoint("TOPLEFT", dayButton, "TOPRIGHT"); end CalendarContextMenu_Hide(); CalendarEventPickerFrame:Show(); CalendarEventPickerScrollBar:SetValue(0); CalendarEventPickerScrollFrame_Update(); end function CalendarEventPickerFrame_Hide() CalendarContextMenu_Hide(CalendarDayContextMenu_Initialize); CalendarEventPickerFrame.dayButton = nil; CalendarEventPickerFrame:Hide(); -- clean up texture references for i = 1, #CalendarEventPickerScrollFrame.buttons do _G[CalendarEventPickerScrollFrame.buttons[i]:GetName().."Icon"]:SetTexture(); end end function CalendarEventPickerFrame_Toggle(dayButton) if ( CalendarEventPickerFrame:IsShown() ) then CalendarEventPickerFrame_Hide(); else CalendarEventPickerFrame_Show(dayButton); end end function CalendarEventPickerFrame_SetSelectedEvent(eventButton) if ( CalendarEventPickerFrame.selectedEventButton ) then CalendarEventPickerFrame.selectedEventButton:UnlockHighlight(); end CalendarEventPickerFrame.selectedEventButton = eventButton; if ( CalendarEventPickerFrame.selectedEventButton ) then CalendarEventPickerFrame.selectedEventButton:LockHighlight(); end end function CalendarEventPickerScrollFrame_OnLoad(self) HybridScrollFrame_OnLoad(self); -- register the addon loaded event for post-load fixups self:RegisterEvent("ADDON_LOADED"); self:SetScript("OnEvent", CalendarEventPickerScrollFrame_OnEvent); end function CalendarEventPickerScrollFrame_OnEvent(self, event, ...) if ( event == "ADDON_LOADED" ) then local addonName = ...; if ( not addonName or (addonName and addonName ~= "Blizzard_Calendar") ) then return; end local scrollBar = self.scrollBar; scrollBar.Show = function (self) local scrollFrame = self:GetParent(); local scrollBarWidth = self:GetWidth(); -- adjust scroll frame width local scrollFrameWidth = scrollFrame.defaultWidth - scrollBarWidth; scrollFrame:SetWidth(scrollFrameWidth); scrollFrame.scrollChild:SetWidth(scrollFrameWidth); -- adjust button width local buttonWidth = scrollFrame.defaultButtonWidth - scrollBarWidth; for _, button in next, scrollFrame.buttons do button:SetWidth(buttonWidth); end getmetatable(self).__index.Show(self); end scrollBar.Hide = function (self) local scrollFrame = self:GetParent(); -- adjust scroll frame width local scrollFrameWidth = scrollFrame.defaultWidth; scrollFrame:SetWidth(scrollFrameWidth); scrollFrame.scrollChild:SetWidth(scrollFrameWidth); -- adjust button width local buttonWidth = scrollFrame.defaultButtonWidth; for _, button in next, scrollFrame.buttons do button:SetWidth(buttonWidth); end getmetatable(self).__index.Hide(self); end self.update = CalendarEventPickerScrollFrame_Update; HybridScrollFrame_CreateButtons(self, "CalendarEventPickerButtonTemplate"); local scrollBarWidth = scrollBar:GetWidth(); self.defaultWidth = self:GetWidth() + scrollBarWidth; self.defaultButtonWidth = self.buttons[1]:GetWidth() + scrollBarWidth; -- we don't need this event any more self:UnregisterEvent(event); end end function CalendarEventPickerScrollFrame_Update() local dayButton = CalendarEventPickerFrame.dayButton; local monthOffset = dayButton.monthOffset; local day = dayButton.day; local numViewableEvents = dayButton.numViewableEvents; if ( numViewableEvents <= CALENDAR_DAYBUTTON_MAX_VISIBLE_EVENTS ) then CalendarEventPickerFrame_Hide(); return; end -- since we aren't displaying ongoing events, we need to count all ongoing events towards the offset -- if they come before the offset local offset = HybridScrollFrame_GetOffset(CalendarEventPickerScrollFrame); local eventIndex = 1 + offset; for i=1, offset do local title, hour, minute, calendarType, sequenceType = CalendarGetDayEvent(monthOffset, day, i); if ( title and sequenceType == "ONGOING" ) then eventIndex = eventIndex + 1; end end -- only check the selected event index if we're looking at the right month local selectedEventMonthOffset, selectedEventDay, selectedEventIndex = CalendarGetEventIndex(); if ( selectedEventIndex <= 0 or day ~= selectedEventDay or monthOffset ~= selectedEventMonthOffset ) then selectedEventIndex = nil; end -- now fill in the buttons starting from the already-offset event index local buttons = CalendarEventPickerScrollFrame.buttons; local numButtons = #buttons; local buttonHeight = buttons[1]:GetHeight(); local displayedHeight = 0; local numEvents = CalendarGetNumDayEvents(monthOffset, day); local button, buttonName, buttonIcon, buttonTitle, buttonTime; local texturePath, tcoords; local eventColor; local i = 1; while ( i <= numButtons and eventIndex <= numEvents ) do local title, hour, minute, calendarType, sequenceType, eventType, texture, modStatus, inviteStatus, invitedBy, difficulty, inviteType, sequenceIndex, numSequenceDays, difficultyName = CalendarGetDayEvent(monthOffset, day, eventIndex); if ( sequenceType ~= "ONGOING" ) then -- pretend like ongoing events aren't even in the event list button = buttons[i]; if ( title ) then buttonName = button:GetName(); buttonIcon = _G[buttonName.."Icon"]; buttonTitle = _G[buttonName.."Title"]; buttonTime = _G[buttonName.."Time"]; button.eventIndex = eventIndex; -- set event texture buttonIcon:SetTexture(); texturePath, tcoords = _CalendarFrame_GetTextureFile(texture, calendarType, sequenceType, eventType); if ( texturePath and texturePath ~= "" ) then buttonIcon:SetTexture(texturePath); buttonIcon:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); buttonIcon:Show(); buttonTitle:SetPoint("TOPLEFT", buttonIcon, "TOPRIGHT"); else buttonIcon:Hide(); buttonTitle:SetPoint("TOPLEFT", button, "TOPLEFT"); end -- set event title and time if ( calendarType == "HOLIDAY" ) then buttonTime:Hide(); buttonTitle:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT"); else if ( calendarType == "RAID_RESET" or calendarType == "RAID_LOCKOUT" ) then title = GetDungeonNameWithDifficulty(title, difficultyName); end buttonTime:SetText(GameTime_GetFormattedTime(hour, minute, true)); buttonTime:Show(); buttonTitle:SetPoint("BOTTOMLEFT", buttonTime, "BOTTOMLEFT"); end buttonTitle:SetFormattedText(CALENDAR_CALENDARTYPE_NAMEFORMAT[calendarType][sequenceType], title); -- set event color eventColor = _CalendarFrame_GetEventColor(calendarType, modStatus, inviteStatus); buttonTitle:SetTextColor(eventColor.r, eventColor.g, eventColor.b); -- set selected event if ( selectedEventIndex and eventIndex == selectedEventIndex ) then CalendarEventPickerFrame_SetSelectedEvent(button); else button:UnlockHighlight(); end button:Show(); else -- non-existent events, unlike ongoing events, will take up button slots to indicate -- holes in the event list (though the holes should all be at the end) button.eventIndex = nil; button:Hide(); end i = i + 1; displayedHeight = displayedHeight + buttonHeight; end eventIndex = eventIndex + 1; end -- hide any unused buttons while ( i <= numButtons ) do button = buttons[i]; button.eventIndex = nil; button:Hide(); i = i + 1; end local totalHeight = numViewableEvents * buttonHeight; HybridScrollFrame_Update(CalendarEventPickerScrollFrame, totalHeight, displayedHeight); end function CalendarEventPickerCloseButton_OnClick() CalendarEventPickerFrame_Hide(); end function CalendarEventPickerButton_OnLoad(self) self:RegisterForClicks("LeftButtonUp", "RightButtonUp"); end function CalendarEventPickerButton_OnClick(self, button) if ( button == "LeftButton" ) then CalendarEventPickerButton_Click(self); CalendarContextMenu_Hide(); elseif ( button == "RightButton" ) then local dayButton = CalendarEventPickerFrame.dayButton; local eventChanged = CalendarContextMenu.eventButton ~= self or CalendarContextMenu.dayButton ~= dayButton; local flags = CALENDAR_CONTEXTMENU_FLAG_SHOWEVENT; if ( eventChanged ) then CalendarContextMenu_Show(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton, self); else CalendarContextMenu_Toggle(self, CalendarDayContextMenu_Initialize, "cursor", 3, -3, flags, dayButton, self); end end PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarEventPickerButton_Click(button) -- select the event CalendarEventPickerFrame_SetSelectedEvent(button); local eventIndex = button.eventIndex; local dayButton = CalendarEventPickerFrame.dayButton; -- search for the corresponding event button on the calendar frame if the event changed local dayButtonName = dayButton:GetName(); local dayEventButton; for i = 1, CALENDAR_DAYBUTTON_MAX_VISIBLE_EVENTS do local curDayEventButton = _G[dayButtonName.."EventButton"..i]; if ( curDayEventButton.eventIndex and curDayEventButton.eventIndex == eventIndex ) then dayEventButton = curDayEventButton; break; end end if ( dayEventButton ) then -- if we found the day event button then click it... CalendarDayEventButton_Click(dayEventButton, true); else CalendarFrame_SetSelectedEvent(); --...otherwise this event is not visible on the calendar, only the picker, so we need to do the selection -- work that would have otherwise happened by clicking the calendar event button StaticPopup_Hide("CALENDAR_DELETE_EVENT"); CalendarFrame_OpenEvent(dayButton, eventIndex); end end function CalendarEventPickerButton_OnDoubleClick(self, button) CalendarEventPickerButton_OnClick(self, button); CalendarEventPickerCloseButton_OnClick(); end -- CalendarTexturePickerFrame function CalendarTexturePickerFrame_OnLoad(self) self.selectedTextureIndex = nil; CalendarTexturePickerScrollFrame.update = CalendarTexturePickerScrollFrame_Update; HybridScrollFrame_CreateButtons(CalendarTexturePickerScrollFrame, "CalendarTexturePickerButtonTemplate"); end function CalendarTexturePickerFrame_Show(eventType) if ( not eventType ) then return; end if ( eventType ~= CalendarTexturePickerFrame.eventType) then if ( not _CalendarFrame_CacheEventTextures(eventType) ) then return; end -- new event type...reset the selected texture CalendarTexturePickerFrame.selectedTextureIndex = nil; CalendarTexturePickerFrame.eventType = eventType; else CalendarTexturePickerFrame.selectedTextureIndex = CalendarCreateEventFrame.selectedTextureIndex; end CalendarTexturePickerFrame:Show(); CalendarTexturePickerFrame_Update(); end function CalendarTexturePickerFrame_Hide() CalendarTexturePickerFrame.eventType = nil; CalendarTexturePickerFrame.selectedTextureIndex = nil; CalendarTexturePickerFrame:Hide(); -- clean up texture references for i = 1, #CalendarTexturePickerScrollFrame.buttons do _G[CalendarTexturePickerScrollFrame.buttons[i]:GetName().."Icon"]:SetTexture(); end end function CalendarTexturePickerFrame_Toggle(eventType) if ( CalendarTexturePickerFrame:IsShown() ) then CalendarTexturePickerFrame_Hide(); else CalendarTexturePickerFrame_Show(eventType); end end function CalendarTexturePickerFrame_Update() if ( not CalendarTexturePickerFrame.eventType ) then CalendarTexturePickerFrame_Hide(); return; end CalendarTexturePickerTitleFrame_Update(); CalendarTexturePickerScrollFrame_Update(); end function CalendarTexturePickerTitleFrame_Update() if ( CalendarTexturePickerFrame.eventType == CALENDAR_EVENTTYPE_RAID ) then CalendarTitleFrame_SetText(CalendarTexturePickerTitleFrame, CALENDAR_TEXTURE_PICKER_TITLE_RAID); else CalendarTitleFrame_SetText(CalendarTexturePickerTitleFrame, CALENDAR_TEXTURE_PICKER_TITLE_DUNGEON); end end function CalendarTexturePickerScrollFrame_OnLoad(self) HybridScrollFrame_OnLoad(self); -- register the addon loaded event for post-load fixups self:RegisterEvent("ADDON_LOADED"); self:SetScript("OnEvent", CalendarTexturePickerScrollFrame_OnEvent); end function CalendarTexturePickerScrollFrame_OnEvent(self, event, ...) if ( event == "ADDON_LOADED" ) then local addonName = ...; if ( not addonName or (addonName and addonName ~= "Blizzard_Calendar") ) then return; end local scrollBar = self.scrollBar; scrollBar.Show = function (self) local scrollFrame = self:GetParent(); local scrollBarWidth = self:GetWidth(); -- adjust scroll frame width local scrollFrameWidth = scrollFrame.defaultWidth - scrollBarWidth; scrollFrame:SetWidth(scrollFrameWidth); scrollFrame.scrollChild:SetWidth(scrollFrameWidth); -- adjust button width local buttonWidth = scrollFrame.defaultButtonWidth - scrollBarWidth; for _, button in next, scrollFrame.buttons do button:SetWidth(buttonWidth); end getmetatable(self).__index.Show(self); end scrollBar.Hide = function (self) local scrollFrame = self:GetParent(); -- adjust scroll frame width local scrollFrameWidth = scrollFrame.defaultWidth; scrollFrame:SetWidth(scrollFrameWidth); scrollFrame.scrollChild:SetWidth(scrollFrameWidth); -- adjust button width local buttonWidth = scrollFrame.defaultButtonWidth; for _, button in next, scrollFrame.buttons do button:SetWidth(buttonWidth); end getmetatable(self).__index.Hide(self); end self.update = CalendarTexturePickerScrollFrame_Update; HybridScrollFrame_CreateButtons(self, "CalendarTexturePickerButtonTemplate"); local scrollBarWidth = scrollBar:GetWidth(); self.defaultWidth = self:GetWidth() + scrollBarWidth; self.defaultButtonWidth = self.buttons[1]:GetWidth() + scrollBarWidth; -- we don't need this event any more self:UnregisterEvent(event); end end function CalendarTexturePickerScrollFrame_Update() local buttons = CalendarTexturePickerScrollFrame.buttons; local numButtons = #buttons; local buttonHeight = buttons[1]:GetHeight(); local displayedHeight = 0; local button, buttonName, buttonIcon, buttonTitle; local eventTex, textureIndex; local selectedTextureIndex = CalendarTexturePickerFrame.selectedTextureIndex; local eventType = CalendarTexturePickerFrame.eventType; local numTextures = #CalendarEventTextureCache; local offset = HybridScrollFrame_GetOffset(CalendarTexturePickerScrollFrame); for i = 1, numButtons do button = buttons[i]; buttonName = button:GetName(); textureIndex = i + offset; eventTex = CalendarEventTextureCache[textureIndex]; if ( eventTex ) then buttonIcon = _G[buttonName.."Icon"]; buttonTitle = _G[buttonName.."Title"]; if ( eventTex.textureIndex ) then -- this is a texture -- record the textureIndex in the button button.textureIndex = eventTex.textureIndex; -- set the selected dungeon if ( selectedTextureIndex and button.textureIndex == selectedTextureIndex ) then button:LockHighlight(); CalendarTexturePickerFrame.selectedTexture = button; else button:UnlockHighlight(); end -- set the eventTex title local name = eventTex.title; buttonTitle:SetText(GetDungeonNameWithDifficulty(name, eventTex.difficultyName)); buttonTitle:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); buttonTitle:ClearAllPoints(); buttonTitle:SetPoint("LEFT", buttonIcon, "RIGHT"); buttonTitle:Show(); -- set the eventTex icon buttonIcon:SetTexture(); local tcoords = CALENDAR_EVENTTYPE_TCOORDS[eventType]; buttonIcon:SetTexCoord(tcoords.left, tcoords.right, tcoords.top, tcoords.bottom); if ( eventTex.texture ~= "" ) then buttonIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURE_PATHS[eventType]..eventTex.texture); else buttonIcon:SetTexture(CALENDAR_EVENTTYPE_TEXTURES[eventType]); end buttonIcon:Show(); -- make this button selectable button:Enable(); elseif ( eventTex.expansionLevel and eventTex.expansionLevel >= 0 ) then -- this is a header -- record the textureIndex in the button button.textureIndex = eventTex.textureIndex; -- set the header title buttonTitle:SetText(eventTex.title); buttonTitle:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); buttonTitle:ClearAllPoints(); buttonTitle:SetPoint("LEFT", buttonIcon, "LEFT"); buttonTitle:Show(); -- hide the icon buttonIcon:Hide(); -- make this button unselectable button:Disable(); else -- this is a blank space buttonTitle:Hide(); buttonIcon:Hide(); button:Disable(); end button:Show(); else button.textureIndex = nil; button:Hide(); end displayedHeight = displayedHeight + buttonHeight; end local totalHeight = numTextures * buttonHeight; HybridScrollFrame_Update(CalendarTexturePickerScrollFrame, totalHeight, displayedHeight); end function CalendarTexturePickerAcceptButton_OnClick(self) CalendarCreateEventFrame.selectedTextureIndex = CalendarTexturePickerFrame.selectedTextureIndex; if ( CalendarCreateEventFrame.selectedTextureIndex ) then -- now that we've selected a texture, we can set the create event data local eventType = CalendarTexturePickerFrame.eventType; CalendarEventSetType(eventType); CalendarEventSetTextureID(CalendarCreateEventFrame.selectedTextureIndex); -- update the create event frame using our selection UIDropDownMenu_SetSelectedID(CalendarCreateEventTypeDropDown, eventType); CalendarCreateEventFrame.selectedEventType = eventType; CalendarCreateEventTexture_Update(); CalendarTexturePickerFrame:Hide(); CalendarCreateEventCreateButton_Update(); end end function CalendarTexturePickerButton_OnLoad(self) self:RegisterForClicks("LeftButtonUp", "RightButtonUp"); end function CalendarTexturePickerButton_OnClick(self, button) if ( CalendarTexturePickerFrame.selectedTexture ) then CalendarTexturePickerFrame.selectedTexture:UnlockHighlight(); end CalendarTexturePickerFrame.selectedTexture = self; CalendarTexturePickerFrame.selectedTextureIndex = self.textureIndex; self:LockHighlight(); PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarTexturePickerButton_OnDoubleClick(self, button) CalendarTexturePickerButton_OnClick(self, button); CalendarTexturePickerAcceptButton_OnClick(self); end -- Calendar Class Buttons function CalendarClassButtonContainer_Show(parent) if ( CalendarClassButtonContainer:GetParent() ~= parent ) then CalendarClassButtonContainer:SetParent(parent); CalendarClassButtonContainer:ClearAllPoints(); CalendarClassButtonContainer:SetPoint("TOPLEFT", parent, "TOPRIGHT", -2, -30); end CalendarClassButtonContainer:Show(); _CalendarFrame_UpdateClassData(); CalendarClassButtonContainer_Update(); end function CalendarClassButtonContainer_Hide() CalendarClassButtonContainer:SetParent(nil); CalendarClassButtonContainer:Hide(); end function CalendarClassButtonContainer_Update() if ( not CalendarClassButtonContainer:IsShown() ) then return; end local isModal = CalendarFrame_GetModal(); local button, buttonName, buttonIcon, buttonCount; local classData, count; local totalCount = 0; for i, class in ipairs(CLASS_SORT_ORDER) do button = _G["CalendarClassButton"..i]; buttonName = button:GetName(); buttonCount = _G[buttonName.."Count"]; buttonIcon = button:GetNormalTexture(); -- set the count classData = CalendarClassData[class]; count = classData.counts[CALENDAR_INVITESTATUS_CONFIRMED] + classData.counts[CALENDAR_INVITESTATUS_ACCEPTED] + classData.counts[CALENDAR_INVITESTATUS_SIGNEDUP]; buttonCount:SetText(count); if ( count > 0 ) then buttonCount:Show(); if ( isModal ) then SetDesaturation(buttonIcon, true); button:Disable(); else SetDesaturation(buttonIcon, false); button:Enable(); end else buttonCount:Hide(); SetDesaturation(buttonIcon, true); button:Disable(); end -- adjust the total totalCount = totalCount + count; end -- set the total CalendarClassTotalsText:SetText(totalCount); CalendarClassTotalsButton_Update(); end function CalendarClassButtonContainer_OnLoad(self) local button, buttonName, buttonIcon; local classData, tcoords; for i, class in ipairs(CLASS_SORT_ORDER) do -- create button button = CreateFrame("Button", "CalendarClassButton"..i, self, "CalendarClassButtonTemplate"); if ( i == 1 ) then button:SetPoint("TOPLEFT", self, "TOPLEFT"); else button:SetPoint("TOPLEFT", "CalendarClassButton"..(i-1), "BOTTOMLEFT", 0, -12); end -- get class data classData = CalendarClassData[class]; -- set texture buttonIcon = button:GetNormalTexture(); buttonIcon:SetDrawLayer("BORDER"); tcoords = classData.tcoords; buttonIcon:SetTexCoord(tcoords[1], tcoords[2], tcoords[3], tcoords[4]); -- set class button.class = class; end CalendarClassTotalsButton:SetPoint("TOPLEFT", "CalendarClassButton"..MAX_CLASSES, "BOTTOMLEFT", 0, -12); end function CalendarClassButton_OnLoad(self) self:Disable(); end function CalendarClassButton_OnEnter(self) -- TODO: set detailed counts info local classData = CalendarClassData[self.class]; GameTooltip:SetOwner(self, "ANCHOR_LEFT"); GameTooltip:SetText(classData.name, nil, nil, nil, nil, 1); GameTooltip:Show(); end --[[ function CalendarClassTotalsButton_OnLoad(self) self:RegisterEvent("PARTY_MEMBERS_CHANGED"); end function CalendarClassTotalsButton_OnEvent(self, event, ...) if ( self:IsShown() and event == "PARTY_MEMBERS_CHANGED" ) then if ( CalendarEventGetNumInvites() > MAX_PARTY_MEMBERS + 1 and GetRealNumPartyMembers() >= 1 and GetRealNumRaidMembers() == 0 ) then -- we don't have a good way of knowing in advance whether or not we need a raid to accomodate all our invites -- so we're going to create a raid as soon as possible ConvertToRaid(); end CalendarClassTotalsButton_Update(); end end function CalendarClassTotalsButton_Update() if ( CalendarFrame_GetModal() ) then CalendarClassTotalsButton:Disable(); CalendarInviteToGroupDropDown:Hide(); CalendarClassTotalsButton:SetDisabledFontObject(GameFontDisableSmall); CalendarClassTotalsButtonOnEnterDummy:Hide(); else if ( CalendarClassButtonContainer:GetParent() == CalendarCreateEventFrame and CalendarCreateEventFrame.mode == "edit" and GetRealNumPartyMembers() == 0 and GetRealNumRaidMembers() == 0 ) then CalendarClassTotalsButton:Enable(); CalendarClassTotalsButtonOnEnterDummy:Hide(); else CalendarClassTotalsButton:Disable(); CalendarInviteToGroupDropDown:Hide(); CalendarClassTotalsButtonOnEnterDummy:Show(); end CalendarClassTotalsButton:SetDisabledFontObject(GameFontGreenSmall); end end function CalendarClassTotalsButton_OnClick(self) ToggleDropDownMenu(1, nil, CalendarInviteToGroupDropDown, self, 0, 0); PlaySound("igMainMenuOptionCheckBoxOn"); end function CalendarClassTotalsButtonOnEnterDummy_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); GameTooltip:SetText(CALENDAR_TOOLTIP_INVITE_TOTALS, nil, nil, nil, nil, 1); GameTooltip:Show(); end function CalendarClassTotalsButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); if ( CalendarEventGetNumInvites() > MAX_PARTY_MEMBERS + 1 ) then GameTooltip:SetText(CALENDAR_TOOLTIP_INVITEMEMBERS_BUTTON_RAID, nil, nil, nil, nil, 1); else GameTooltip:SetText(CALENDAR_TOOLTIP_INVITEMEMBERS_BUTTON_PARTY, nil, nil, nil, nil, 1); end GameTooltip:Show(); end function CalendarInviteToGroupDropDown_OnLoad(self) UIDropDownMenu_Initialize(CalendarInviteToGroupDropDown, CalendarInviteToGroupDropDown_Initialize, "MENU"); UIDropDownMenu_SetWidth(CalendarInviteToGroupDropDown, 100); end function CalendarInviteToGroupDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); info.text = CALENDAR_INVITE_CONFIRMED; info.func = CalendarInviteToGroupDropDown_Confirmed_OnClick; UIDropDownMenu_AddButton(info); info.text = CALENDAR_INVITE_ALL; info.func = CalendarInviteToGroupDropDown_All_OnClick; UIDropDownMenu_AddButton(info); end function CalendarInviteToGroupDropDown_Confirmed_OnClick(self) local name, level, className, classFilename, inviteStatus, modStatus; local inviteCount = min(MAX_RAID_MEMBERS - GetRealNumRaidMembers(), CalendarEventGetNumInvites()); for i = 1, inviteCount do name, level, className, classFilename, inviteStatus, modStatus = CalendarEventGetInvite(i); if ( not UnitInParty(name) and not UnitInRaid(name) and (inviteStatus == CALENDAR_INVITESTATUS_ACCEPTED or inviteStatus == CALENDAR_INVITESTATUS_CONFIRMED) ) then InviteUnit(name); end end end function CalendarInviteToGroupDropDown_All_OnClick(self) local inviteCount = min(MAX_RAID_MEMBERS - GetRealNumRaidMembers(), CalendarEventGetNumInvites()); for i = 1, inviteCount do local name = CalendarEventGetInvite(i); if ( not UnitInParty(name) and not UnitInRaid(name) ) then InviteUnit(name); end end end --]] function CalendarClassTotalsButton_Update() if ( CalendarFrame_GetModal() ) then CalendarClassTotalsButton:Disable(); CalendarClassTotalsText:SetFontObject(GameFontDisableSmall); else CalendarClassTotalsButton:Enable(); CalendarClassTotalsText:SetFontObject(GameFontGreenSmall); end end function CalendarClassTotalsButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); GameTooltip:SetText(CALENDAR_TOOLTIP_INVITE_TOTALS, nil, nil, nil, nil, 1); GameTooltip:Show(); end