LifeRPG_v2.0/ProjectManage.ahk
2012-12-16 04:02:59 -05:00

465 lines
13 KiB
AutoHotkey

; QuickAdd:
#If !WinExist("ahk_group exclude")
^!d::
Action := "QuickDone"
ProjectManage(Action)
return
#If
#If !WinExist("ahk_group exclude")
^!a::
Action := "QuickAdd"
ProjectManage(Action)
return
#If
; Add a new project:
AddProject:
if (SideListGet())
Action := "SideAdd"
else
Action := "Add"
ProjectManage(Action)
return
; Add a new subproject:
AddSubproject:
Action := "Subproject"
ProjectManage(Action)
return
; Edit a selected project:
EditProject:
Action := "Edit"
ProjectManage(Action)
return
SkillsAutoComplete:
Critical
Gui, ProjectManager:Submit, NoHide
if (!ProjectSkillsEdit)
return
else
{
SkillACStopKeys := ["Tab", "Enter"]
for k, v in SkillACStopKeys
{
Hotkey, %v%, SkillInsertAC, On
}
SkillACToolTip =
SkillACObj := {}
Loop, Parse, ProjectSkillsEdit, CSV
{
SkillToAC = %A_LoopField%
SkillACObj.Insert(SkillToAC)
}
;Notification(SkillACObj[SkillACObj.MaxIndex()])
SkillInputLast := SkillACObj[SkillACObj.MaxIndex()]
if SkillInputLast is Space
{
SkillACShutOff()
return
}
else
{
SkillACList := db.OpenRecordSet("SELECT DISTINCT skill FROM skills WHERE skill LIKE '" . SafeQuote(SkillInputLast) . "%' ORDER BY skill")
while (!SkillACList.EOF)
{
SkillACToolTip .= SkillACList["skill"] . "`n"
SkillACList.MoveNext()
}
SkillACList.Close()
if SkillACToolTip is Space
{
SkillACShutOff()
return
}
else
ToolTip, %SkillACToolTip%, A_CaretX, A_CaretY + 20
}
}
return
SkillACShutOff()
{
global SkillACStopKeys
ToolTip
for k, v in SkillACStopKeys
Hotkey, %v%, Off
}
SkillInsertAC:
;Notification(SkillInputLast)
GuiControlGet, SkillsEditFocus, ProjectManager:FocusV
;Notification(SkillsEditFocus)
if (SkillsEditFocus = "ProjectSkillsEdit")
{
Loop, Parse, SkillACToolTip, `n
{
Send % "{Backspace " . StrLen(SkillInputLast) . "}"
SendRaw % A_LoopField
for k, v in SkillACStopKeys
Hotkey, %v%, Off
Send `,%A_Space%
if (A_Index = 1)
break
}
}
ToolTip
for k, v in SkillACStopKeys
Hotkey, %v%, Off
return
ProjectManagerSubmit:
;Notification(Action, "Action")
ListSelected := "MainList" ; Allows Side List to be updated as well
Gui, ProjectManager:Default
Gui, ProjectManager:Submit, NoHide
SkillACShutOff() ; Use +Owndialogs instead
if (ProjectNameEdit = "")
{
MsgBox, 8192, Error, Can't make a project with no name!
return
}
if (ProjectSkillEdit = "All" || ProjectSkillEdit = "None") ; Sort this out during parse of skills
{
MsgBox, 8192, Error, "All" and "None" can't be used as skill names!
return
}
if (Action = "Add" || Action = "QuickDone" || Action = "QuickAdd" || Action = "Subproject" || Action = "SideAdd")
{
Record := {}
Record.Project := ProjectNameEdit
Record.Difficulty := KeyGet(DifficultyLevels, ProjectDifficultyEdit)
Record.Importance := KeyGet(ImportanceLevels, ProjectImportanceEdit)
Record.dateEntered := A_Now
if (Action = "Subproject" || Action = "SideAdd")
{
Record.Parent := SelectedProjectID
}
else
{
LV_GetText(NewParentSelectionID, LV_GetNext(), 1)
;Notification(NewParentSelectionID, "NewParentSelectionID")
if (NewParentSelectionID <> 0)
Record.Parent := NewParentSelectionID
}
db.Insert(Record, "projects")
NewProjectID := LastProjectID()
SkillsIDSetting := NewProjectID
}
else if (Action = "Edit")
{
; Update project name:
db.Query("UPDATE projects SET project = '" SafeQuote(ProjectNameEdit) "' WHERE ID = " SelectedProjectID )
; Update Difficulty level:
db.Query("UPDATE projects SET Difficulty = '" KeyGet(DifficultyLevels, ProjectDifficultyEdit) "' WHERE ID = " SelectedProjectID )
; Wipe the existing skills tied to this project:
db.Query("DELETE FROM skills WHERE projectID = " . SelectedProjectID)
SkillsIDSetting := SelectedProjectID
; Update Importance level:
db.Query("UPDATE projects SET Importance = '" KeyGet(ImportanceLevels, ProjectImportanceEdit) "' WHERE ID = " SelectedProjectID )
; Update parent field:
LV_GetText(NewParentSelectionID, LV_GetNext(), 1)
if (NewParentSelectionID = 0)
db.Query("UPDATE projects SET parent = '' WHERE ID = " . SelectedProjectID)
else
db.Query("UPDATE projects SET parent = " . NewParentSelectionID . " WHERE ID = " . SelectedProjectID)
}
; Insert skills:
Loop, parse, ProjectSkillsEdit, CSV
{
if A_LoopField is Space
continue
SkillToInsert = %A_LoopField% ;This removes any leading space due to parse
SkillToInsert := Capitalize(SkillToInsert)
SkillsInsert := {}
SkillsInsert.skill := SkillToInsert
SkillsInsert.projectID := SkillsIDSetting
db.Insert(SkillsInsert, "skills") ; Insert new skill to skills table
}
if (Action = "Add" || Action = "Edit")
{
GuiChildClose("ProjectManager")
}
else if (Action = "QuickAdd" || Action = "QuickDone")
{
Gui, ProjectManager:Cancel
Gui, 1:Default
if (Action = "QuickDone")
{
CompleteProject(LastProjectID())
}
}
gosub FilterUpdate
RefreshSkillsList(FilterSkillSelected)
; Fall through below to close window.
ProjectManagerGuiEscape:
ProjectManagerGuiClose:
ToolTip
try
{
for k, v in SkillACStopKeys
Hotkey, %v%, Off
}
if (Action = "Add" || Action = "Edit" || Action = "Subproject" || Action = "SideAdd")
{
GuiChildClose("ProjectManager")
}
else if (Action = "QuickAdd" || Action = "QuickDone")
{
Gui, ProjectManager:Cancel
Gui, 1:Default
}
return
; Functions for Project Management: =============================================================
LastProjectID()
{
global db
table := db.Query("SELECT MAX(id) FROM projects")
columnCount := table.Columns.Count()
for each, row in table.Rows
{
Loop, % columnCount
QuickID := row[A_index]
}
return QuickID
}
ProjectManage(Action)
{
global
if (Action = "SideAdd")
Gui, ListView, SideList
else
{
Gui, ListView, %ListSelected%
}
ProjectNameEdit =
ProjectDifficultyEdit =
ProjectSkillEdit =
; Get the row number of the selected project from the main project ListView:
Selection := LV_GetNext("","F")
; If editing or adding subproject, get the ID number of that project:
if (Action = "Edit" || Action = "Subproject" || Action = "SideAdd")
{
LV_GetText(SelectedProjectID, Selection, 1) ; Get project ID number from hidden column of ListView
; If no row is selected and edit is called, do nothing and go back:
If (SelectedProjectID == "ID" || !SelectedProjectID)
{
return
}
else ; Get the data for the selected project to populate the edit fields:
{
ProjectInfo := db.OpenRecordSet("SELECT * FROM projects WHERE id = " SelectedProjectID )
while(!ProjectInfo.EOF)
{
ProjectName := ProjectInfo["project"]
ProjectDifficulty := ProjectInfo["Difficulty"]
ProjectImportance := ProjectInfo["importance"]
ParentOptCurrID := ProjectInfo["parent"]
ProjectInfo.MoveNext()
}
ProjectInfo.Close()
ProjectSkill =
CommaAdd =
SkillsStringBuild := db.OpenRecordSet("SELECT * FROM skills WHERE projectID = " . SelectedProjectID )
while (!SkillsStringBuild.EOF)
{
if (A_Index > 1)
CommaAdd := ", "
ProjectSkill .= CommaAdd . SkillsStringBuild["skill"]
SkillsStringBuild.MoveNext()
}
SkillsStringBuild.Close()
}
}
else if (Action = "Add" || Action = "QuickDone" || Action = "QuickAdd")
{
ProjectName =
ProjectDifficulty =
ProjectSkill =
ProjectImportance =
if (ListSelected = "SideList")
LV_GetText(SelectedProjectID, Selection, 1) ; Get project ID number from hidden column of "side" ListView, cause we be adding a new stand-alone project
ParentOptCurrID =
if (Action = "QuickAdd" || Action = "QuickDone")
SelectedProjectID = 0
}
if (Action = "Subproject" || Action = "SideAdd")
{
; Temporary, working on where (if) to include parent project name in subproject-add box):
SubProjParentName := ProjectName
ProjectName =
ProjectDifficulty =
ProjectSkill =
ProjectImportance =
}
; Build the GUI window to either add or edit a project:
; Initiate a modal child window owned by the main window (by default):
if (Action = "Add" || Action = "Edit" || Action = "Subproject" || Action = "SideAdd")
GuiChildInit("ProjectManager")
else if (Action = "QuickDone" || Action = "QuickAdd")
{
Gui, ProjectManager:New
Gui, ProjectManager:Default
}
; GUI elements/controls: ==========================================================================
; Set size of this window:
Width = 300
Height = 200
; Tab options:
Gui, ProjectManager:Add, Tab2, x0 y0 w300 h200 -Wrap, Project|Parent|Scheduling|Rewards|Misc.
; Project Tab: ============================================
; Name of project:
if (Action = "SideAdd" || Action = "Subproject")
Gui, ProjectManager:Add, Text, ,% StringClip(SubProjParentName, 45) . " >>"
else
Gui, ProjectManager:Add, Text, , &Project Name:
Gui, ProjectManager:Add, Edit, vProjectNameEdit W270 r1, %ProjectName%
; Difficulty:
Gui, ProjectManager:Add, Text, Section, &Difficulty:
Gui, ProjectManager:Add, DropDownList, vProjectDifficultyEdit, % ListDifficulty(ProjectDifficulty)
; Importance:
Gui, ProjectManager:Add, Text, ys, Impo&rtance:
Gui, ProjectManager:Add, DropDownList, vProjectImportanceEdit, % ListImportance(ProjectImportance)
; Skill:
Gui, ProjectManager:Add, Text, xs, S&kills (separate with a comma):
Gui, ProjectManager:Add, Edit, vProjectSkillsEdit gSkillsAutoComplete w240 r1, % ProjectSkill
; Submit button:
Gui, Tab
Gui, ProjectManager:Add, Button, Default gProjectManagerSubmit w80 xm y+10, &Submit
; Parent Tab: ============================================
Gui, Tab, 2
; Search box:
Gui, ProjectManager:Add, Text, , Search:
Gui, ProjectManager:Add, Edit, % "x+1 gParentChangeSearch vParentChangeEdit r1 w" Width - 80,
; ListView:
if (ParentOptCurrID)
ParentListH = 5
else
ParentListH = 6
Gui, ProjectManager:Add, ListView, % "y+3 xm vParentChangeList -Multi -Hdr r" ParentListH " w" Width - 20, ID|Project
; Fill in ListView:
if (!SelectedProjectID || SelectedProjectID = 0)
ParentExcludeFilter := ""
else
ParentExcludeFilter := " AND id <> " . SelectedProjectID
;Notification(SelectedProjectID, "SelectedProjectID")
ParentOptions := db.OpenRecordSet("SELECT * FROM projects WHERE difficulty <> 0 " . ParentExcludeFilter)
Gui, ProjectManager:Default
while (!ParentOptions.EOF)
{
ParentOptID := ParentOptions["id"]
ParentOptName := ParentOptions["project"]
LV_Add("",ParentOptID, ParentOptName) ; Add projects to parents list
ParentOptions.MoveNext()
}
ParentOptions.Close()
; Sort possible parent projects alphabetically:
LV_ModifyCol(2, "Sort AutoHdr")
; Insert "None" option at the top:
LV_Insert(1,"","0","None")
; Hide ID col:
LV_ModifyCol(1, 0)
; Highlight current parent:
if (ParentOptCurrID)
{
Loop % LV_GetCount()
{
POSelRow := A_Index
LV_GetText(ParentOptMatch, POSelRow, 1)
if (ParentOptMatch = ParentOptCurrID)
{
LV_Modify(POSelRow, "Focus Select")
LV_Modify(POSelRow+4, "Vis")
}
}
; Display current parent project:
Gui, ProjectManager:Add, Text, , % StringClip(DBGetVal("SELECT project FROM projects WHERE id = " . ParentOptCurrID, "project"), 50)
}
else
LV_Modify(1, "Focus Select Vis")
; Calculate position for centering this child GUI window on wherever the main project list window is:
xc := CenterX(Width)
yc := CenterY(Height)
; Show window:
; Select title for Project Manager window:
if (Action = "QuickAdd")
PMTitle := "QuickAdd New Project"
else if (Action = "QuickDone")
PMTitle := "QuickDone Project"
else if (Action = "Add")
PMTitle := "Add New Project"
else if (Action = "Edit")
PMTitle := "Edit Project"
else if (Action = "SideAdd" || Action = "Subproject")
PMTitle := "Add New Subproject"
if (Action = "QuickAdd" || Action = "QuickDone") ; If calling QuickAdd/Done windows, don't set XY coordinates so that they will center everywhere:
Gui, ProjectManager:Show, w%Width% h%Height%, %PMTitle%
else
Gui, ProjectManager:Show, w%Width% h%Height% x%xc% y%yc%, %PMTitle%
; Remove the skill auto-complete tooltip if LifeRPG window loses focus:
SetTimer, ACWinWatch, 300
return
ACWinWatch:
GuiControlGet, SkillEditWatch, ProjectManager:FocusV
if (!WinActive("ahk_class AutoHotkeyGUI") || SkillEditWatch <> "ProjectSkillsEdit")
SkillACShutOff()
return
}
ParentChangeSearch:
Critical
Gui, ProjectManager:Default
; Update project list to show possible parents
LV_Delete()
GuiControlGet, ParentSearchQuery, , ParentChangeEdit
ParentOptions := db.OpenRecordSet("SELECT * FROM projects WHERE difficulty <> 0 " . ParentExcludeFilter . " AND project LIKE '%" . SafeQuote(ParentSearchQuery) . "%'")
GuiControl, -ReDraw, ParentChangeList
while (!ParentOptions.EOF)
{
ParentOptID := ParentOptions["id"]
ParentOptName := ParentOptions["project"]
LV_Add("",ParentOptID, ParentOptName)
ParentOptions.MoveNext()
}
ParentOptions.Close()
; Sort possible parent projects alphabetically:
LV_ModifyCol(2, "Sort AutoHdr")
; Insert "None" option at the top:
LV_Insert(1,"","0","None")
; Hide ID col:
LV_ModifyCol(1, 0)
GuiControl, +ReDraw, ParentChangeList
return