Quantcast

* *2.6.15*

Alar of Daggerspine [08-25-15 - 22:00]
* *2.6.15*

Feature: Item rewards in Mission Control can be filtered on level
Feature: All header menu are now context sensitive
Feature: Header added to Shipyard
Feature: One click ship upgrade

Signed-off-by: Alar of Daggerspine <alar@aspide.it>
Filename
CHANGELOG.txt
FollowerPage.lua
GarrisonCommander.lua
GarrisonCommander.toc
Init.lua
MissionCache.lua
MissionControl.lua
ShipYard.lua
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index cede13b..e32a2cc 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,5 +1,12 @@
 *GarrisonCommander helps you when choosing the right follower for the right mission*

+* *2.6.15*
+Feature: Item rewards in Mission Control can be filtered on level
+Feature: All header menu are now context sensitive
+Feature: Header added to Shipyard
+Feature: One click ship upgrade
+
+
 * *2.6.14*
 Fix: Rare error when zoning in and out of Garrison
 Fix: In follower page, swap button conflicted with confirm upgrade button
diff --git a/FollowerPage.lua b/FollowerPage.lua
index 201d917..9d8f9d6 100644
--- a/FollowerPage.lua
+++ b/FollowerPage.lua
@@ -90,47 +90,34 @@ local colors={
 	[630]="Rare",
 	[645]="Epic"
 }
+function addon:ApplyUPG(value)
+	self:ShowUpgradeButtons()
+end
+function addon:ApplySWAPBUTTONS(value)
+	self:ShowUpgradeButtons()
+end
 function addon:ShowUpgradeButtons(force)
 	if InCombatLockdown() then
 		self:ScheduleLeaveCombatAction("ShowUpgradeButtons",force)
 		return
 	end
 	local gf=GMF.FollowerTab
-	if (not force and not gf:IsVisible()) then return end
-	if (not gf.showUpgrades) then
-		gf.showUpgrades=self:GetFactory():Checkbox(gf.Model,self:GetToggle("UPG"),self:GetVarInfo("UPG"))
-		gf.showUpgrades:SetPoint("TOPLEFT")
-		gf.showUpgrades:Show()
-		gf.showUpgrades:SetScript("OnClick",function(this)
-			addon:SetBoolean("UPG",this:GetChecked())
-			addon:ShowUpgradeButtons()
-		end)
-	end
-	if (not gf.noConfirm) then
-		gf.noConfirm=self:GetFactory():Checkbox(gf.Model,self:GetToggle("NOCONFIRM"),self:GetVarInfo("NOCONFIRM"))
-		gf.noConfirm:SetPoint("TOPLEFT",0,-20)
-		gf.noConfirm:Show()
-		gf.noConfirm:SetScript("OnClick",function(this)
-			addon:SetBoolean("NOCONFIRM",this:GetChecked())
-		end)
-	end
-	if (not gf.swapButtons) then
-		gf.swapButtons=self:GetFactory():Checkbox(gf.Model,self:GetToggle("SWAPBUTTONS"),self:GetVarInfo("SWAPBUTTONS"))
-		gf.swapButtons:SetPoint("TOPLEFT",0,-40)
-		gf.swapButtons:Show()
-		gf.swapButtons:SetScript("OnClick",function(this)
-			addon:SetBoolean("SWAPBUTTONS",this:GetChecked())
-			addon:ShowUpgradeButtons()
-		end)
+	if not self:GetBoolean("UPG") then
+		local b=gf.upgradeButtons
+		for i=1,#b	 do
+			b[i]:Hide()
+		end
+		return
 	end
+	if (not force and not gf:IsVisible()) then return end
 	if not gf.upgradeButtons then gf.upgradeButtons ={} end
 	--if not gf.upgradeFrame then gf.upgradeFrame=CreateFrame("Frame",nil,gf.model) end
 	local b=gf.upgradeButtons
 	local upgrades=self:GetUpgrades()
 	local axpos=self:GetBoolean("SWAPBUTTONS") and 7 or 243
 	local wxpos=self:GetBoolean("SWAPBUTTONS") and 243 or 7
-	local wypos=-155
-	local aypos=-155
+	local wypos=-85
+	local aypos=-85
 	local used=1
 	if not gf.followerID then
 		return self:DelayedRefresh(0.1)
diff --git a/GarrisonCommander.lua b/GarrisonCommander.lua
index ae34bed..bda4074 100644
--- a/GarrisonCommander.lua
+++ b/GarrisonCommander.lua
@@ -402,7 +402,7 @@ print("Initialize")
 		dbGAC.namespaces.missionscache=nil  -- Removed in 2.6.9
 		dbGAC.namespaces=nil
 	end
-	self:AddLabel("Appearance")
+	self:AddLabel(L["Garrison Appearance"])
 	self:AddToggle("MOVEPANEL",true,L["Unlock Panel"],L["Makes main mission panel movable"])
 	self:AddToggle("BIGSCREEN",true,L["Use big screen"],L["Disabling this will give you the interface from 1.1.8, given or taken. Need to reload interface"])
 	self:AddToggle("PIN",true,L["Show Garrison Commander menu"],L["Disable if you dont want the full Garrison Commander Header."])
@@ -423,7 +423,7 @@ print("Initialize")
 	L["Sort missions by:"],L["Original sort restores original sorting method, whatever it was (If you have another addon sorting mission, it should kick in again)"])
 	self:AddToggle("USEFUL",true,L["Enhance tooltip"],L["Adds a list of other useful followers to tooltip"])
 	self:AddToggle("MAXRES",true,L["Maximize result"],L["Allows a lower success percentage for resource missions. Use /gac gui to change percentage. Default is 80%"])
-	self:AddSlider("MAXRESCHANCE",80,50,100,L["Minum needed chance"],L["Applied when maximise result is enabled. Default is 80%"])
+	self:AddSlider("MAXRESCHANCE",80,50,100,L["Minum needed chance"],L["Applied when maximise result is enabled. Default is 80%"],1)
 	ns.bigscreen=self:GetBoolean("BIGSCREEN")
 	self:AddLabel("Followers Panel")
 	self:AddSlider("MAXMISSIONS",5,1,8,L["Mission shown"],L["Mission shown for follower"],1)
@@ -433,6 +433,9 @@ print("Initialize")
 	self:AddToggle("UPG",true,L["Show upgrades"],L["Only meaningful upgrades are shown"])
 	self:AddToggle("NOCONFIRM",true,L["Don't ask confirmation"],L["If checked, clicking an upgrade icon will consume the item and upgrade the follower\n|cFFFF0000NO QUESTION ASKED|r"])
 	self:AddToggle("SWAPBUTTONS",false,L["Swap upgrades position"],L["IF checked, shows armors on the left and weapons on the right "])
+	if not ns.bigscreen then
+		self:AddToggle("FOLLOWERMISSIONLIST",true,L["Show missionlist"],L["Affects only little screen mode, hiding the per follower mission list if not checked"])
+	end
 	self:AddLabel("Buildings Panel")
 	self:AddToggle("HF",false,L["Hide followers"],L["Do not show follower icon on plots"])
 --@debug@
@@ -539,6 +542,15 @@ function addon:ApplyMINPERC(value)
 	MINPERC=value
 	BUSY_MESSAGE=format(BUSY_MESSAGE_FORMAT,MAXMISSIONS,MINPERC)
 end
+function addon:ApplyFOLLOWERMISSIONLIST(value)
+	if (GMF.FollowerTab:IsVisible()) then
+		self:RenderFollowerPageMissionList(nil,GMF.FollowerTab.followerID)
+	end
+end
+function addon:ApplyIXP(vale)
+end
+function addon:ApplyILV(vale)
+end

 function addon:IsIgnored(followerID,missionID)
 	if (chardb.ignored[missionID][followerID]) then return true end
@@ -1076,9 +1088,9 @@ function addon:AddOptionToOptionsLayer(o,flag,maxsize)
 --@debug@
 	print("Adding option",flag)
 --@end-debug@
-	maxsize=tonumber(maxsize) or 140
+	maxsize=tonumber(maxsize) or 160
 	if (not flag) then return 0 end
-	local info=self:GetVarInfo(flag)
+	local info=addon:GetVarInfo(flag)
 	if (info) then
 		local data={option=info}
 		local widget
@@ -1087,14 +1099,14 @@ function addon:AddOptionToOptionsLayer(o,flag,maxsize)
 --@end-debug@
 		if (info.type=="toggle") then
 			widget=AceGUI:Create("CheckBox")
-			local value=self:GetBoolean(flag)
+			local value=addon:GetBoolean(flag)
 			widget:SetValue(value)
 			local color=value and "Green" or "Silver"
 			widget:SetLabel(C(info.name,color))
-			widget:SetWidth(max(widget.text:GetStringWidth(),maxsize))
+			widget:SetWidth(min(widget.text:GetStringWidth()+40,maxsize))
 		elseif(info.type=="select") then
 			widget=AceGUI:Create("Dropdown")
-			widget:SetValue(self:GetVar(flag))
+			widget:SetValue(addon:GetVar(flag))
 			widget:SetLabel(info.name)
 			widget:SetText(info.values[self:GetVar(flag)])
 			widget:SetList(info.values)
@@ -1107,7 +1119,7 @@ function addon:AddOptionToOptionsLayer(o,flag,maxsize)
 				self[info.func](self,data,value)
 			end)
 		elseif (info.type=="range") then
-			local value=self:GetNumber(flag)
+			local value=addon:GetNumber(flag)
 			widget=AceGUI:Create("Slider")
 			widget:SetLabel(info.name)
 			widget:SetValue(value)
@@ -1140,11 +1152,16 @@ function addon:AddOptionToOptionsLayer(o,flag,maxsize)
 	end
 	return maxsize
 end
-
-function addon:CreateHeader()
+function addon:GetMain()
+	return GMF
+end
+function addon:CreateHeader(module)
+	if not module then module=self end
 	-- Main Garrison Commander Header
-	GCF=CreateFrame("Frame","GCF",UIParent,"GarrisonCommanderTitle")
+	local GCF=CreateFrame("Frame","GCF",UIParent,"GarrisonCommanderTitle")
 	local signature=me .. " " .. self.version
+	local PIN=module and "SHIPPIN" or "PIN"
+	local MOVEPANEL =module and "SHIPMOVEPANEL" or "MOVEPANEL"
 	GCF.Signature:SetText(signature)
 --@alpha@
 	GCF.Warning:SetText("Alpha Version")
@@ -1154,16 +1171,17 @@ function addon:CreateHeader()
 	for _,f in pairs({GCF:GetRegions()}) do
 		if (f:GetObjectType()=="Texture" and f:GetAtlas()=="Garr_WoodFrameCorner") then f:Hide() end
 	end
-	GCF:SetFrameStrata(GMF:GetFrameStrata())
-	GCF:SetFrameLevel(GMF:GetFrameLevel()-2)
-	if (not ns.bigscreen) then GCF:SetHeight(GCF:GetHeight()+35) end
+	local main=module:GetMain()
+	GCF:SetFrameStrata(main:GetFrameStrata())
+	GCF:SetFrameLevel(main:GetFrameLevel()-2)
+	if (not ns.bigscreen and not module) then GCF:SetHeight(190) end
 	baseHeight=GCF:GetHeight()
 	minHeight=47
 	GCF.CloseButton:SetScript("OnClick",nil)
 	GCF.Pin:SetAllPoints(GCF.CloseButton)
 	GCF:SetWidth(BIGSIZEW)
 	GCF:SetPoint("TOP",UIParent,0,-60)
-	if (self:GetBoolean("PIN")) then
+	if (self:GetBoolean(PIN)) then
 		GCF.Pin:SetChecked(true)
 	else
 		GCF.Pin:SetChecked(false)
@@ -1175,8 +1193,12 @@ function addon:CreateHeader()
 		local baseStrata=GCF:GetFrameStrata()
 		local baseLevel=GCF:GetFrameStrata()
 		local speed=3
+		local GCF=GCF
+		local module=module
+		local MOVEPANEL=MOVEPANEL
+		local PIN=PIN
 		local function shrink(this)
-			addon:RemoveMenu()
+			module:RemoveMenu()
 			this:SetScript("OnUpdate",function(me,ts)
 				local h=me:GetHeight()
 				if (h<=45) then
@@ -1194,7 +1216,7 @@ function addon:CreateHeader()
 				if (h>=baseHeight) then
 					me:SetScript("OnUpdate",nil)
 					me:SetHeight(baseHeight)
-					if (not me.Menu) then addon:AddMenu() end
+					if (not me.Menu) then module:AddMenu() end
 					GCF.tooltip=nil
 					me.Menu:DoLayout()
 				else
@@ -1207,32 +1229,17 @@ function addon:CreateHeader()
 		GCF.Pin:SetScript("OnClick",function(this)
 			local value=this:GetChecked()
 			this:SetChecked(value)
-			addon:SetBoolean("PIN",value)
+			addon:SetBoolean(PIN,value)
 			if (value) then grow(GCF) else shrink(GCF) end
 		end)
 	end
 	GCF:EnableMouse(true)
 	GCF:SetMovable(true)
 	GCF:RegisterForDrag("LeftButton")
-	GCF:SetScript("OnDragStart",function(frame)if (self:GetBoolean("MOVEPANEL")) then frame:StartMoving() end end)
+	GCF:SetScript("OnDragStart",function(frame)if self:GetBoolean(MOVEPANEL) then frame:StartMoving() end end)
 	GCF:SetScript("OnDragStop",function(frame) frame:StopMovingOrSizing() end)
-	if (ns.bigscreen) then
-		-- Mission list on follower panels
-		local ml=CreateFrame("Frame","GCFMissions",GMFFollowers,"GarrisonCommanderFollowerMissionList")
-		ml:SetPoint("TOPLEFT",GMFFollowers,"TOPRIGHT")
-		ml:SetPoint("BOTTOMLEFT",GMFFollowers,"BOTTOMRIGHT")
-		--ml:SetWidth(450)
-		ml:Show()
-		GCFMissions=ml
-		local fs=GMFFollowers:CreateFontString(nil, "BACKGROUND", "GameFontNormalHugeBlack")
-		fs:SetPoint("TOPLEFT",GMFFollowers,"TOPRIGHT")
-		fs:SetText(AVAILABLE)
-		fs:SetWidth(250)
-		fs:Show()
-		GCFBusyStatus=fs
-	end
-	self:Trigger("MOVEPANEL")
-	self.CreateHeader=function() end
+	self:Trigger(MOVEPANEL)
+	return GCF
 end

 function addon:ScriptTrace(hook,frame,...)
@@ -1294,6 +1301,8 @@ function addon:RenderFollowerPageFollowerButton(frame,follower,showCounters)
 		else
 			frame.GCXp:Hide()
 		end
+	else
+		frame.GCXp:Hide()
 	end
 	if self:GetToggle("ILV") then
 		if (follower.level >= GARRISON_FOLLOWER_MAX_LEVEL) then
@@ -1311,18 +1320,22 @@ function addon:RenderFollowerPageFollowerButton(frame,follower,showCounters)
 			frame.GCArm:Hide()
 			frame.GCXp:SetPoint("LEFT",frame.Name,"LEFT",0,20)
 		end
+	else
+		frame.GCWep:Hide()
+		frame.GCArm:Hide()
+		frame.GCXp:SetPoint("LEFT",frame.Name,"LEFT",0,20)
 	end
 end
 function addon:HookedGarrisonFollowerListButton_OnClick(frame,button)
 --@debug@
 print("Click")
 --@end-debug@
-	if (frame.info.isCollected) then
 		if (button=="LeftButton") then
-			if (ns.bigscreen and frame and frame.info and frame.info.followerID)  then
+			if (frame and frame.info and frame.info.followerID)  then
 				self:HookedGarrisonFollowerPage_ShowFollower(frame.info,frame.info.followerID)
 			end
 		end
+	if (frame.info.isCollected) then
 		self:ScheduleTimer("HookedGarrisonFollowerButton_UpdateCounters",0.2,GMF,frame,frame.info,false)
 		self:ShowUpgradeButtons()
 	end
@@ -1366,6 +1379,7 @@ do
 	local Busystatusmessage
 	local lastFollowerID=""
 	local ml=nil
+	local mh=nil
 	local tContains=tContains
 	local function MissionOnClick(this,...)

@@ -1379,10 +1393,35 @@ print(this.frame,this.frame:GetName())
 		addon:ScriptGarrisonMissionButton_OnClick(this.frame,"Leftup")
 		lastTab=2
 	end
-	function addon:RenderFollowerPageMissionList(frame,followerID,force)
-		print(ns.bigscreen,GMFFollowers:IsVisible())
-		if not ns.bigscreen then return end
+	function addon:RenderFollowerPageMissionList(dummy,followerID,force)
+		--print(ns.bigscreen,GMFFollowers:IsVisible())
+		--if not ns.bigscreen then return end
+		if not ns.bigscreen and not self:GetBoolean("FOLLOWERMISSIONLIST") then
+			if mh then mh:Hide() end
+			if ml then ml:Hide() end
+			return
+		end
 		if not GMFFollowers:IsVisible() then return end
+		-- Mission list on follower panels
+		if not mh then
+			mh=CreateFrame("Frame","GCFMissions",GMFFollowers,"GarrisonCommanderFollowerMissionList")
+			GCFMissions=mh
+			local fs=GMFFollowers:CreateFontString(nil, "BACKGROUND", "GameFontNormalHugeBlack")
+			if (ns.bigscreen) then
+				mh:SetPoint("TOPLEFT",GMFFollowers,"TOPRIGHT")
+				fs:SetPoint("TOPLEFT",GMFFollowers,"TOPRIGHT")
+			else
+				mh:SetPoint("BOTTOMRIGHT",GMF,"TOPLEFT")
+				fs:SetPoint("TOPRIGHT",GMFFollowers,"TOPLEFT")
+				mh.Header:ClearAllPoints()
+				mh.Header:SetPoint("BOTTOMRIGHT")
+			end
+			mh:SetHeight(60)
+			fs:SetText(AVAILABLE)
+			fs:SetWidth(250)
+			fs:Show()
+			GCFBusyStatus=fs
+		end
 		if (not ml) then
 			ml=AceGUI:Create("GMCLayer")
 			ml:SetTitle("Ninso")
@@ -1393,19 +1432,28 @@ print(this.frame,this.frame:GetName())
 			ml:ClearAllPoints()
 			ml:SetWidth(200)
 			ml:SetHeight(600)
-			ml:SetPoint("TOP",GCFMissions.Header,"BOTTOM")
-			ml:SetPoint("LEFT",GMFFollowers,"RIGHT")
-			ml:SetPoint("RIGHT",GMF.FollowerTab,"LEFT")
-			ml:SetPoint("BOTTOM",GMF,0,25)
+			ml:SetPoint("TOP",mh,"BOTTOM")
+			if ns.bigscreen then
+				ml:SetPoint("LEFT",GMFFollowers,"RIGHT")
+				ml:SetPoint("RIGHT",GMF.FollowerTab,"LEFT")
+			else
+				ml:SetPoint("RIGHT",GMF,"LEFT")
+				ml:SetWidth(300)
+			end
+			ml:SetPoint("BOTTOM",GMF,0,ns.bigscreen and 25 or 0)
 		end
-		self:RenderFollowerButton(GCFMissions.Header,followerID)
 		ml:ClearChildren()
-		if (type(frame.followerID)=="number") then
+		if type(followerID)=="number" then
 			ml:SetTitle(NOT_COLLECTED)
 			ml:SetTitleColor(C.Silver())
+			mh.Header:Hide()
 			return
 		end
+		mh.Header:Show()
 		local status=self:GetFollowerStatus(followerID,true)
+		self:RenderFollowerButton(mh.Header,followerID)
+		mh:Show()
+		ml:Show()
 		ml:SetTitle(status)
 		if (status==GARRISON_FOLLOWER_WORKING) then
 			ml:SetTitleColor(C.Cyan())
@@ -1422,17 +1470,23 @@ print(this.frame,this.frame:GetName())
 			if (tContains(party.members,followerID)) then tinsert(partyIndex,missionID) end
 		end
 		table.sort(partyIndex,function(a,b) return parties[a].perc > parties[b].perc end)
+		local prog=1
 		for i=1,#partyIndex do
 			local missionID=partyIndex[i]
 			local party=parties[missionID]
 			local mission=self:GetMissionData(missionID)
 			if mission and party and #party.members >= G.GetMissionMaxFollowers(missionID) then
+--@debug@
+				print(i,prog,mission,party,self:GetNumber("MAXMISSIONS"),self:GetNumber("MINPERC"))
+				if prog > self:GetNumber("MAXMISSIONS") or party.perc< self:GetNumber("MINPERC") then print("------------------") break end
+--@end-debug@
 				local mb=AceGUI:Create("GMCMissionButton")
 				mb:SetScale(0.6)
 				ml:PushChild(mb,missionID)
 				mb:SetFullWidth(true)
 				mb:SetMission(mission,party,false,"followers")
 				mb:SetCallback("OnClick",MissionOnClick)
+				prog=prog+1
 			end
 		end
 		del(partyIndex)
@@ -1448,7 +1502,7 @@ print("Setup")
 	self:CheckMP()
 	if MP then self:AddToggle("CKMP",true,L["Use GC Interface"],L["GCMPSWITCH"]) end
 	self:CheckGMM()
-	self:CreateHeader()
+	GCF=self:CreateHeader()
 	local tabMC=CreateFrame("CheckButton",nil,GMF,"SpellBookSkillLineTabTemplate")
 	GMF.tabMC=tabMC
 	tabMC.tooltip="Open Garrison Commander Mission Control"
@@ -1493,6 +1547,7 @@ print("Setup")
 --/Interface/FriendsFrame/UI-Toast-FriendOnlineIcon
 end
 function addon:RefreshMenu()
+	if not GCF then return end  -- This could be called befaur header is built
 	if not self.currentmenu or not self.currentmenu:IsVisible() then
 		self:RemoveMenu()
 		self:AddMenu()
@@ -1508,13 +1563,15 @@ print("Adding Menu")
 	local menu,size
 	if GMF.MissionTab:IsVisible() then
 		self.currentmenu=GMF.MissionTab
-		menu,size=self:CreateOptionsLayer(MP and 'CKMP' or nil,'BIGSCREEN','IGM','IGP','NOFILL','MSORT','MAXRES','USEFUL')
+		menu,size=self:CreateOptionsLayer(MP and 'CKMP' or nil,'BIGSCREEN','IGM','IGP','MSORT','MAXRES','MAXRESCHANCE','NOFILL','USEFUL','MOVEPANEL')
 	elseif GMF.FollowerTab:IsVisible() then
+		local missionlist=ns.bigscreen or self:GetBoolean("FOLLOWERMISSIONLIST")
 		self.currentmenu=GMF.FollowerTab
-		menu,size=self:CreateOptionsLayer('BIGSCREEN',ns.bigscreen and 'MAXMISSIONS' or nil,ns.bigscreen and 'MINPERC' or nil,'ILV','IXP','UPG','NOCONFIRM','SWAPBUTTONS')
+		menu,size=self:CreateOptionsLayer('BIGSCREEN',ns.bigscreen and nil or 'FOLLOWERMISSIONLIST',missionlist and 'MAXMISSIONS' or nil,missionlist and 'MINPERC' or nil,'ILV','IXP','UPG','NOCONFIRM','SWAPBUTTONS','MOVEPANEL')
+		self:RenderFollowerPageMissionList(nil,GMF.FollowerTab.followerID)
 	elseif GMF.MissionControlTab:IsVisible() then
 		self.currentmenu=GMF.MissionControlTab
-		menu,size=self:CreateOptionsLayer('BIGSCREEN')
+		menu,size=self:CreateOptionsLayer('BIGSCREEN','GCSKIPRARE','GCSKIPEPIC','GCMINLEVEL')
 	end
 --@debug@
 	self:AddOptionToOptionsLayer(menu,'DBG')
@@ -2829,9 +2886,7 @@ function addon:HookedClickOnTabs(tab)
 	print(tab)
 --@end-debug@
 	lastTab=tab
-	if GCF then
-		self:RefreshMenu()
-	end
+	self:RefreshMenu()
 end
 function addon:GarrisonMissionFrame_SelectTab(frame,tab)
 --@debug@
diff --git a/GarrisonCommander.toc b/GarrisonCommander.toc
index ccaa1f7..f627079 100644
--- a/GarrisonCommander.toc
+++ b/GarrisonCommander.toc
@@ -13,7 +13,7 @@
 ## Notes-zhCN: 發送所有的追隨者與點擊多任務
 ## Author: Alar of Daggerspine
 ## Version: @project-version@ 6.2.0
-## X-Version: 2.6.14
+## X-Version: 2.6.15
 ## X-Revision: @project-abbreviated-hash@
 ## eMail: alar@aspide.it
 ## URL: http://wow.aspide.it
diff --git a/Init.lua b/Init.lua
index 172e6f1..d0b9841 100644
--- a/Init.lua
+++ b/Init.lua
@@ -110,10 +110,13 @@ local backdrop = {
 		edgeSize=16,
 		insets={bottom=3,left=3,right=3,top=3}
 }
-function ns.AddBackdrop(frame)
+function ns.AddBackdrop(frame,r,g,b)
+	r=r or 1
+	g=g or 0
+	b=b or 0
 	frame:SetBackdrop(backdrop)
 	frame:SetBackdropColor(1,1,1,0)
-	frame:SetBackdropBorderColor(1,0,0,1)
+	frame:SetBackdropBorderColor(r,g,b,1)
 end
 -- my implementation of tonumber which accounts for nan and inf
 ---@function [parent=#ns] tonumber
@@ -227,9 +230,15 @@ local items={
 }
 local itemcaches={
 [118529]=655,--Cache of Highmaul Treasures,
+[118530]=670,--Cache of Highmaul Treasures,
+[118531]=685,--Cache of Highmaul Treasures,
 [122484]=670, --Blackrock Foundry Spoils,
+[122485]=685, --Blackrock Foundry Spoils,
+[122486]=700, --Blackrock Foundry Spoils,
+[127853]=690,--Iron Fleet Treasure Chest
+[127854]=705,--Iron Fleet Treasure Chest
+[127855]=720,--Iron Fleet Treasure Chest
 [128391]=685,--Iron Fleet Treasure Chest
-[122486]=700, --Blackrock Foundry Spoils
 [120301]=600, -- Folower Generic armor upgrade
 [120302]=600, -- Folower Generic weapon upgrade

diff --git a/MissionCache.lua b/MissionCache.lua
index 3f8be51..0bb4e3f 100644
--- a/MissionCache.lua
+++ b/MissionCache.lua
@@ -105,6 +105,8 @@ function module:AddExtraData(mission)
 						mission.followerUpgrade=itemRarity
 					elseif itemLevel > 500 and itemMinLevel >=90 then
 						mission.itemLevel=itemLevel
+					elseif itemLevel >=655 then
+						mission.itemLevel=itemLevel
 					else
 						mission.others=mission.others+v.quantity
 					end
@@ -305,13 +307,15 @@ function addon:AddExtraData(mission)
 				if itemTexture:lower()==rushOrders then
 					mission.rush=mission.rush+v.quantity
 				elseif itemName and (not v.quantity or v.quantity==1) and not v.followerXP then
-					itemLevel=addon:GetTrueLevel(v.itemID,itemLevel)
 					if (addon:IsFollowerUpgrade(v.itemID)) then
 						mission.followerUpgrade=itemRarity
-					elseif itemLevel > 500 and itemMinLevel >=90 then
-						mission.itemLevel=itemLevel
 					else
-						mission.others=mission.others+v.quantity
+						itemLevel=addon:GetTrueLevel(v.itemID,itemLevel)
+						if itemLevel > 500  then
+							mission.itemLevel=itemLevel
+						else
+							mission.others=mission.others+v.quantity
+						end
 					end
 				else
 					mission.others=mission.others+v.quantity
diff --git a/MissionControl.lua b/MissionControl.lua
index 45dd6b4..5db5dd4 100644
--- a/MissionControl.lua
+++ b/MissionControl.lua
@@ -42,6 +42,7 @@ function module:GMCCreateMissionList(workList)
 	--First get rid of unwanted rewards and missions that are too long
 	local settings=self.privatedb.profile.missionControl
 	local ar=settings.allowedRewards
+	local minlevel=addon:GetNumber('GCMINLEVEL')
 	wipe(workList)
 	for _,missionID in self:GetMissionIterator() do
 		local discarded=false
@@ -59,7 +60,7 @@ print(missionID,"discarded due to len",durationSeconds /3600)
 --@end-debug@
 				break
 			end -- Mission too long, out of here
-			if (self:GetMissionData(missionID,'isRare') and settings.skipRare) then
+			if self:GetMissionData(missionID,'isRare') and addon:GetBoolean('GCSKIPRARE') then

 --@debug@
 print(missionID,"discarded due to rarity")
@@ -74,6 +75,15 @@ print(missionID,"discarded due to class == ", class)
 				discarded=true
 				break
 			end
+			if class=="itemLevel" then
+				if self:GetMissionData(missionID,'itemLevel') < minlevel then
+--@debug@
+print(missionID,"discarded due to ilevel == ", self:GetMissionData(missionID,'itemLevel'))
+--@end-debug@
+					discarded=true
+					break
+				end
+			end
 			if (not discarded) then
 				tinsert(workList,missionID)
 			end
@@ -90,6 +100,12 @@ print(missionID,"discarded due to class == ", class)
 		end
 	end
 	table.sort(workList,msort)
+--@debug@
+	for i=1,#workList do
+		local id=workList[i]
+		print(self:GetMissionData(id,'name'),self:GetMissionData(id,'class'),self:GetMissionData(id,self:GetMissionData(id,'class')))
+	end
+--@end-debug@
 end
 --- This routine can be called both as coroutin and as a standard one
 -- In standard version, delay between group building and submitting is done via a self schedule
@@ -175,7 +191,7 @@ do
 					minimumChance=tonumber(settings.rewardChance[class]) or 100
 				end
 				local party={members={},perc=0}
-				self:MCMatchMaker(missionID,party,settings.skipEpic,minimumChance)
+				self:MCMatchMaker(missionID,party,addon:GetBoolean('GCSKIPEPIC'),minimumChance)
 --@debug@
 				print(missionID,"  Requested",class,";",minimumChance,"Mission",party.perc,party.full,settings)
 --@end-debug@
@@ -469,33 +485,48 @@ function module:OnInitialized()
 	GMC.logoutButton:SetWidth(ns.bigscreen and 148 or 90)
 	GMC.logoutButton:SetScript("OnClick",function() GMF:Hide() Logout() end )
 	GMC.logoutButton:SetPoint('TOP',0,25)
-	GMC.skipRare=factory:Checkbox(GMC,settings.skipRare,L["Ignore rare missions"])
-	GMC.skipRare:SetPoint("TOPLEFT",chance,"BOTTOMLEFT",40,-50)
-	GMC.skipRare:SetScript("OnClick",function(this)
-		settings.skipRare=this:GetChecked()
-		module:GMC_OnClick_Start(GMC.startButton,"LeftUp")
-	end)
+	addon:AddLabel(L["Mission Control"])
+	addon:AddToggle("GCSKIPRARE",settings.skipRare,L["Ignore rare missions"],L["When checked, Mission Control ignores mission marked as rare"])
+	addon:AddToggle("GCSKIPEPIC",settings.skipRare,L["Ignore epic followers"],L["When checked, Mission Control ignores mission marked as rare"])
+	addon:AddSlider("GCMINLEVEL",600,540,715,L["Minimum Item Level"],L["For missions rewarding PC equipment, request this mimimum item level in rewards (not applied in real time)"],5)
 	local warning=GMC:CreateFontString(nil,"ARTWORK","CombatTextFont")
 	warning:SetText(L["Epic followers are NOT sent alone on xp only missions"])
 	warning:SetPoint("TOPLEFT",GMC,"TOPLEFT",0,-25)
 	warning:SetPoint("TOPRIGHT",GMC,"TOPRIGHT",0,-25)
 	warning:SetJustifyH("CENTER")
 	warning:SetTextColor(C.Orange())
-	if (settings.skipEpic) then warning:Show() else warning:Hide() end
-	GMC.skipEpic=factory:Checkbox(GMC,settings.skipEpic,L["Ignore epic for xp missions."])
-	GMC.skipEpic:SetPoint("TOPLEFT",GMC.skipRare,"BOTTOMLEFT",0,-10)
-	GMC.skipEpic:SetScript("OnClick",function(this)
-		settings.skipEpic=this:GetChecked()
-		if (settings.skipEpic) then warning:Show() else warning:Hide() end
-		module:GMC_OnClick_Start(GMC.startButton,"LeftUp")
-	end)
+	GMC.warning=warning
+	if addon:GetBoolean('GCSKIPRARE') then warning:Show() else warning:Hide() end
 	GMC.Credits=GMC:CreateFontString(nil,"ARTWORK","QuestFont_Shadow_Small")
 	GMC.Credits:SetWidth(0)
 	GMC.Credits:SetFormattedText(C(L["Original concept and interface by %s"],'Yellow'),C("Motig","Red") )
 	GMC.Credits:SetJustifyH("LEFT")
-	GMC.Credits:SetPoint("BOTTOMLEFT",25,25)
+	GMC.Credits:SetPoint("BOTTOMLEFT",50,5)
 	return GMC
 end
+local refreshTimer
+function module:Refresh()
+	if GMF.MissionControlTab.startButton:IsEnabled() then
+		self:GMC_OnClick_Start(GMF.MissionControlTab.startButton,"LeftUp")
+	else
+		if refreshTimer then
+			self:CancelTimer(refreshTimer)
+			refreshTimer=nil
+		end
+		refreshTimer=self:ScheduleTimer("Refresh",1)
+	end
+end
+function addon:ApplyGCSKIPRARE(value)
+	module:Refresh()
+end
+function addon:ApplyGCMINLEVEL(value)
+	module:Refresh()
+end
+function addon:ApplyGCSKIPEPIC(value)
+	local warning=GMF.MissionControlTab.warning
+	if addon:GetBoolean('GCSKIPRARE') then warning:Show() else warning:Hide() end
+	module:Refresh()
+end
 function module:GMCBuildChance()
 	local GMC=GMF.MissionControlTab
 	--Chance
diff --git a/ShipYard.lua b/ShipYard.lua
index 108ca39..d817abc 100644
--- a/ShipYard.lua
+++ b/ShipYard.lua
@@ -18,6 +18,19 @@ local LE_FOLLOWER_TYPE_SHIPYARD_6_2=LE_FOLLOWER_TYPE_SHIPYARD_6_2
 local module=addon:NewSubClass('ShipYard') --#Module
 local GameTooltip=GameTooltip
 local GarrisonShipyardMapMissionTooltip=GarrisonShipyardMapMissionTooltip
+local GCS
+local shipEnhancement={
+	127882,
+	127883,
+	127884,
+	127663,
+	125787,
+	127662,
+	127880,
+	127881,
+	127894,
+	127886
+}

 function module:Test()

@@ -51,9 +64,16 @@ print(ref)
 	self:SafeHookScript(GSF.MissionTab.MissionList.CompleteDialog,"OnShow",true)
 	self:SafeHookScript(GSF.MissionTab,"OnShow",true)
 	self:SafeHookScript(GSF.FollowerTab,"OnShow",true)
+	self:SafeRegisterEvent("GARRISON_SHIPYARD_NPC_CLOSED")
 	--GarrisonShipyardFrameFollowersListScrollFrameButton1
 	--GarrisonShipyardMapMission1
---@end-debug@
+	addon:AddLabel(L["Shipyard Appearance"])
+	addon:AddToggle("SHIPMOVEPANEL",true,L["Unlock Panel"],L["Makes shipyard panel movable"])
+	--addon:AddToggle("BIGSCREEN",true,L["Use big screen"],L["Disabling this will give you the interface from 1.1.8, given or taken. Need to reload interface"])
+	addon:AddToggle("SHIPPIN",true,L["Show Garrison Commander menu"],L["Disable if you dont want the full Garrison Commander Header."])
+end
+function module:GetMain()
+	return GSF
 end
 ---
 --Invoked on every mission display, only for available missions
@@ -143,13 +163,23 @@ print("Doing one time initialization for",this:GetName(),...)
 --@end-debug@
 	addon:CheckMP()
 	self:SafeSecureHookScript("GarrisonShipyardFrame","OnShow")
-	GSF:EnableMouse(true)
-	GSF:SetMovable(true)
-	GSF:RegisterForDrag("LeftButton")
-	GSF:SetScript("OnDragStart",function(frame)if (self:GetBoolean("MOVEPANEL")) then frame:StartMoving() end end)
-	GSF:SetScript("OnDragStop",function(frame) frame:StopMovingOrSizing() end)
+	self:SafeSecureHookScript(GSF.FollowerTab,"OnShow","FollowerOnShow")
+	--GSF:EnableMouse(true)
+	--GSF:SetMovable(true)
+	--GSF:RegisterForDrag("LeftButton")
+	--GSF:SetScript("OnDragStart",function(frame)if (self:GetBoolean("MOVEPANEL")) then frame:StartMoving() end end)
+	--GSF:SetScript("OnDragStop",function(frame) frame:StopMovingOrSizing() end)
+	GCS=addon:CreateHeader(self)
+	self:ScriptGarrisonShipyardFrame_OnShow()
+	self:SafeHookScript(GSF,"OnShow")
 end
 function module:ScriptGarrisonShipyardFrame_OnShow()
+	GCS:Show()
+	GCS:SetWidth(GSF:GetWidth())
+	GSF:ClearAllPoints()
+	GSF:SetPoint("TOPLEFT",GCS,"BOTTOMLEFT",0,23)
+	GSF:SetPoint("TOPRIGHT",GCS,"BOTTOMRIGHT",0,23)
+	self:RefreshMenu()

 --@debug@
 print("Doing all time initialization")
@@ -178,11 +208,117 @@ function module:HookedGarrisonShipyardMapMission_OnEnter(frame)
 		g:SetWidth(GarrisonShipyardMapMissionTooltip:GetWidth())
 	end
 end
+function addon:EventGARRISON_SHIPYARD_NPC_CLOSED(event,...)
+--@debug@
+print("NPC CLOSED")
+--@end-debug@
+	if (GCS) then
+		self:RemoveMenu()
+		GCS:Hide()
+	end
+end
+function module:RefreshMenu()
+	if not GCS then return end  -- This could be called befaur header is built
+	if not self.currentmenu or not self.currentmenu:IsVisible() then
+		self:RemoveMenu()
+		self:AddMenu()
+	end
+end
+function module:AddMenu()
+--@debug@
+print("Adding Menu",GCS.Menu,GSF.MissionTab:IsVisible(),GSF.FollowerTab:IsVisible())
+--@end-debug@
+	if GCS.Menu then
+		return
+	end
+	local menu,size
+
+	if GSF.MissionTab:IsVisible() then
+		self.currentmenu=GSF.MissionTab
+		menu,size=self:CreateOptionsLayer('SHIPMOVEPANEL')
+	elseif GSF.FollowerTab:IsVisible() then
+		self.currentmenu=GSF.FollowerTab
+		menu,size=self:CreateOptionsLayer('SHIPMOVEPANEL')
+	--elseif GSF.MissionControlTab:IsVisible() then
+	--	self.currentmenu=GSF.MissionControlTab
+	--	menu,size=self:CreateOptionsLayer('BIGSCREEN','GCSKIPRARE','GCSKIPEPIC')
+	end
+--@debug@
+	self:AddOptionToOptionsLayer(menu,'DBG')
+	self:AddOptionToOptionsLayer(menu,'TRC')
+--@end-debug@
+	local frame=menu.frame
+	frame:Show()
+	frame:SetParent(GCS)
+	frame:SetFrameStrata(GCS:GetFrameStrata())
+	frame:SetFrameLevel(GCS:GetFrameLevel()+2)
+	menu:ClearAllPoints()
+	menu:SetPoint("TOPLEFT",GCS,"TOPLEFT",25,-18)
+	menu:SetWidth(GCS:GetWidth()-50)
+	menu:SetHeight(GCS:GetHeight()-50)
+	menu:DoLayout()
+	GCS.Menu=menu
+end
+function module:RemoveMenu()
+--@debug@
+print("Removing menu")
+--@end-debug@
+	if (GCS.Menu) then
+		local rc,message=pcall(GCS.Menu.Release,GCS.Menu)
+		--@debug@
+		print("Removed menu",rc,message)
+		--@end-debug@
+		GCS.Menu=nil
+	end
+end
+
 function module:OpenLastTab()
 --@debug@
 print("Should restore tab")
 --@end-debug@
 end
+function module:FollowerOnShow()
+	self:ShowEnhancements()
+end
+function module:ShowEnhancements()
+	local f=GarrisonShipyardFrame.FollowerTab
+	local u
+	if not f.upgrades then
+		f.upgrades=CreateFrame("Frame","UPG",f)
+		f.upgrades.items={}
+		u=f.upgrades
+		u:ClearAllPoints()
+		u:SetPoint("TOPLEFT",10,-100)
+		u:SetPoint("BOTTOMLEFT",0,0)
+		u:SetWidth(50)
+	end
+	u=f.upgrades
+	for i,itemID in pairs(shipEnhancement) do
+		local e
+		if  not  u.items[i] then
+			u.items[i]=CreateFrame("Button","But"..i,u,"GarrisonCommanderUpgradeButton,SecureActionButtonTemplate")
+			e=u.items[i]
+			e.itemID=itemID
+			e.Icon:SetSize(40,40)
+			e:SetPoint("TOPLEFT",0,-45*(i-1))
+			GarrisonMissionFrame_SetItemRewardDetails(e)
+			e:EnableMouse(true)
+			e:RegisterForClicks("LeftButtonDown")
+			e:SetAttribute("type","item")
+			e:SetAttribute("item",select(2,GetItemInfo(itemID)))
+			--@debug@
+			print('Filling ',itemID,GetItemInfo(itemID))
+			--@end-debug@
+		end
+		e=u.items[i]
+		local qt=GetItemCount(itemID)
+		e.Quantity:SetText(qt)
+		e.Quantity:Show()
+		e.Icon:SetDesaturated(qt==0)
+		e:Show()
+	end
+	u:Show()
+end
 --[[ Follower
 displayHeight = 0.25
 followerTypeID = 2