Yet another ToDo-List.
Some code borrowed from different parts of the forum. Can't remember them all now.
TXT.ahk from:
http://www.autohotkey.com/forum/viewtopic.php?t=32757
Some modifications to the code there..
It was written to work on my system. To be out of the way yet easy to look at. So it sits nicely docked in my start menu.
There are probably a lot of setups where it won't work as intended and I'm not at all satisfied with the code.. It just doesn't feel right.. There's probably a lot of room for improvement.
Anyways:
slt.ahk
Code:
#SingleInstance force
#NoEnv
DetectHiddenWindows, on
inifile = %A_ScriptDir%\slt.ini
IniRead, database, %inifile%, settings, database
; from inifile
IniRead, LV_Height, %inifile%, settings, LV_Height
IniRead, DockedH, %inifile%, settings, DockedH
IniRead, UseHdr, %inifile%, settings, UseHdr
If UseHdr = 1
CUseHdr = +
If UseHdr = 0
UseHdr = -
IniRead, HeaderText, %inifile%, settings, HeaderText
IniRead, Appearance, %inifile%, settings, Appearance
IniRead, hotkey, %inifile%, settings, hotkey
Hotkey, %hotkey%, QuickAdd
ProgName = [slt]
; Menu
Menu, Status_Menu, Add, New, MenuHandler
Menu, Status_Menu, Add, Active, MenuHandler
Menu, Status_Menu, Add, Urgent, MenuHandler
Menu, Status_Menu, Add, Waiting, MenuHandler
Menu, Status_Menu, Add, Done, MenuHandler
Menu, TD_Menu, Add, Status, :Status_Menu
Menu, Action_Menu, Add, Add Entry, MenuHandler
Menu, Action_Menu, Add, View Details, MenuHandler
Menu, Action_Menu, Add, Delete, MenuHandler
Menu, TD_Menu, Add, Action, :Action_Menu
Menu, Sort_Menu, Add, Timestamp, MenuHandler
Menu, Sort_Menu, Add, Status, MenuHandler
Menu, TD_Menu, Add, Sort by, :Sort_Menu
Menu, TD_Menu, Add,
Menu, Appearance_Menu, Add, Docked to taskbar, MenuHandler
Menu, Appearance_Menu, Add, Docked to desktop, MenuHandler
Menu, Appearance_Menu, Add, Normal, MenuHandler
Menu, Appearance_Menu, Add, Always on top, MenuHandler
Menu, TD_Menu, Add, Apperance, :Appearance_Menu
Menu, Maintenance_Menu, Add, Archive, MenuHandler
Menu, Maintenance_Menu, Add, View Archived, MenuHandler
Menu, Maintenance_Menu, Add, Delete All, MenuHandler
Menu, TD_Menu, Add, Maintenance, :Maintenance_Menu
Menu, TD_Menu, Add,
Menu, TD_Menu, Add, Settings, MenuHandler
Menu, TD_Menu, Add,
Menu, TD_Menu, Add, Exit, MenuHandler
; ****
If Appearance = 1
Menu, Appearance_Menu, Check, Docked to taskbar
If Appearance = 2
Menu, Appearance_Menu, Check, Docked to desktop
If Appearance = 3
Menu, Appearance_Menu, Check, Normal
If Appearance = 4
Menu, Appearance_MEnu, Check, Always on top
If (Appearance = 1) {
set_Caption = -
; Get the dimensions from the StartMenu and SysTray
WinGetPos,,,StartMenu_Width,, ahk_class Shell_TrayWnd
ControlGetPos,,SysTray_Y,,,ToolbarWindow321, ahk_class Shell_TrayWnd
LV_Width := StartMenu_Width-16
Gui, +MinSize%LV_Width%x ; Set so we can't make width smaller than the StartMenu
Win_Y := SysTray_Y-(DockedH+14)
Win_X = 0
LV_Height = %DockedH%
}
Else If (Appearance=4) {
set_Caption = +
IniRead, LV_Width, %A_ScriptDir%\slt.ini, settings, LV_Width
IniRead, Win_X, %A_ScriptDir%\slt.ini, settings, Win_X
IniRead, Win_Y, %A_ScriptDir%\slt.ini, settings, Win_Y
WinSettings = +AlwaysOnTop
}
Else {
set_Caption = +
IniRead, LV_Width, %A_ScriptDir%\slt.ini, settings, LV_Width
IniRead, Win_X, %A_ScriptDir%\slt.ini, settings, Win_X
IniRead, Win_Y, %A_ScriptDir%\slt.ini, settings, Win_Y
}
; Caption, depending on startmenu or desktop
Gui, %set_Caption%Caption +Resize +LastFound %WinSettings%
Gui, Margin, 0, 0
gui_hwnd:=WinExist() ; ahk_id
Gui, Add, ListView, w%LV_Width% h%LV_Height% Grid -ReadOnly %UseHdr%Hdr gLV_Event AltSubmit vTD_List, %HeaderText%|Body|Status|TimeStamp
LV_ModifyCol(1, "NoSort")
LV_ModifyCol(2, 0)
LV_ModifyCol(3, 0)
LV_ModifyCol(3, "Integer")
LV_ModifyCol(4, 0)
LV_ModifyCol(4, "Integer")
ImageListID := IL_Create(5) ; Create an ImageList to hold 3 small icons.
IL_Add(ImageListID, "icons\1.png")
IL_Add(ImageListID, "icons\2.png")
IL_Add(ImageListID, "icons\3.png")
IL_Add(ImageListID, "icons\4.png")
IL_Add(ImageListID, "icons\5.png")
LV_SetImageList(ImageListID)
; dock in startmenu or desktop
If (Appearance = 1) {
hw_startmenu := DllCall( "FindWindowEx", "uint", 0, "uint", 0, "str", "Shell_TrayWnd", "uint", 0 )
DllCall( "SetParent", "uint", gui_hwnd, "uint", hw_startmenu )
}
Else If (Appearance=2) {
hw_desktop := DllCall( "FindWindowEx", "uint", 0, "uint", 0, "str", "Progman", "uint", 0 )
DllCall( "SetParent", "uint", gui_hwnd, "uint", hw_desktop )
}
Gui, Show, x%Win_X% y%Win_Y% w%LV_Width%, %ProgName% - [simple lite todo]
LoadDB(database)
Return
LoadDB(database, SortBy="Timestamp")
{
Gui 1:Default
LV_Delete()
Loop, Read, %database%
{
StringSplit, DBRow, A_LoopReadLine, |
LV_Add("Icon" . DBRow3,DBRow1,DBRow2,DBRow3, DBRow4)
}
If SortBy = Status
LV_ModifyCol(3, "Sort")
}
GetDbRow(database, SearchText) {
Loop, Read, %database%
{
IfInString, A_LoopReadLine, %SearchText%
FocusedDbRow = %A_Index%
}
return FocusedDbRow
}
SaveWinPos(Appearance, hwnd, inifile) {
WinGetPos, Self_X, Self_Y, Self_W, Self_H, ahk_id %hwnd%
If (Appearance = 1) {
IniWrite, %Self_H%, %inifile%, settings, DockedH
}
Else {
IniWrite, %Self_X%, %inifile%, settings, Win_X
IniWrite, %Self_Y%, %inifile%, settings, Win_Y
IniWrite, %Self_W%, %inifile%, settings, LV_Width
IniWrite, %Self_H%, %inifile%, settings, LV_Height
}
}
;Resize Col to remove scrollbars
RemoveVSCROLL(gui_hwnd, Appearance, NewWidth, LV_Width) {
ControlGet, Control_Style, Style,, SysListView321, ahk_id %gui_hwnd%
Gui ListView, TD_List
If (Control_Style & 0x200000) ; 0x200000 is WS_VSCROLL
If (Appearance != 1)
LV_ModifyCol(1, NewWidth-20)
Else
LV_ModifyCol(1, LV_Width-20)
Else
If (Appearance != 1)
LV_ModifyCol(1, NewWidth-4)
Else
LV_ModifyCol(1, LV_Width-4)
}
GuiContextMenu: ; Launched in response to a right-click or press of the Apps key.
if A_GuiControl <> TD_List
return
FocusedRowNumber = %A_EventInfo%
LV_GetText(LV_TimeStamp, FocusedRowNumber,4)
LV_GetText(LV_Status, FocusedRowNumber,3)
SelectedDbRow := GetDbRow(database, LV_TimeStamp)
If LV_Status = 1
{
Menu, Status_Menu, Check, New
Menu, Status_Menu, UnCheck, Active
Menu, Status_Menu, UnCheck, Urgent
Menu, Status_Menu, UnCheck, Waiting
Menu, Status_Menu, UnCheck, Done
}
If LV_Status = 2
{
Menu, Status_Menu, Check, Active
Menu, Status_Menu, UnCheck, New
Menu, Status_Menu, UnCheck, Urgent
Menu, Status_Menu, UnCheck, Waiting
Menu, Status_Menu, UnCheck, Done
}
If LV_Status = 3
{
Menu, Status_Menu, Check, Urgent
Menu, Status_Menu, UnCheck, New
Menu, Status_Menu, UnCheck, Active
Menu, Status_Menu, UnCheck, Waiting
Menu, Status_Menu, UnCheck, Done
}
If LV_Status = 4
{
Menu, Status_Menu, Check, Waiting
Menu, Status_Menu, UnCheck, New
Menu, Status_Menu, UnCheck, Active
Menu, Status_Menu, UnCheck, Urgent
Menu, Status_Menu, UnCheck, Done
}
If LV_Status = 5
{
Menu, Status_Menu, Check, Done
Menu, Status_Menu, UnCheck, New
Menu, Status_Menu, UnCheck, Active
Menu, Status_Menu, UnCheck, Urgent
Menu, Status_Menu, UnCheck, Waiting
}
Menu, TD_Menu, Show, %A_GuiX%, %A_GuiY%
return
MenuHandler:
If (A_ThisMenuItem = "Settings") {
Gui 3:Default
If UseHdr = +
CB_UseHdr = 1
If UseHdr = -
CB_UseHdr = 0
Gui 3:Add, CheckBox, vSetUseHdr Checked%CB_UseHdr%, Show header?
Gui 3:Add, Text,, Hotkey for quick add:
Gui 3:Add, Edit, w300 vSetHotkey, %hotkey%
Gui 3:Add, Button, x270, Save
Gui 3:Show,, %ProgName% - Settings
}
If A_ThisMenuItem = New
TXT_SetCSV("!" . database, SelectedDbRow, 3, 1, "|")
If A_ThisMenuItem = Active
TXT_SetCSV("!" . database, SelectedDbRow, 3, 2, "|")
If A_ThisMenuItem = Urgent
TXT_SetCSV("!" . database, SelectedDbRow, 3, 3, "|")
If A_ThisMenuItem = Waiting
TXT_SetCSV("!" . database, SelectedDbRow, 3, 4, "|")
If A_ThisMenuItem = Done
TXT_SetCSV("!" . database, SelectedDbRow, 3, 5, "|")
If A_ThisMenuItem = Add Entry
Goto, QuickAdd
If A_ThisMenuItem = View Details
{
Menu_Details = 1
Goto LV_event
}
If A_ThisMenuItem = Exit
Goto GuiClose
If A_ThisMenuItem = Delete
TXT_RemoveLines("!" . Database, SelectedDbRow, SelectedDbRow)
If A_ThisMenuItem = Archive
{
Loop, Read, %database%, archive.slt
{
StringSplit, SplitLine, A_LoopReadLine, |
Status = %SplitLine3%
If Status = 5
FileAppend, %A_LoopReadLine%`n
Else
Saved .= A_LoopReadLine "`n"
}
FileDelete, %database%
FileAppend, %Saved%, %database%
}
If A_ThisMenuItem = Delete All
FileDelete, %database%
If A_ThisMenuItem = View Archived
{
Gui 5:Default
Gui 5: Margin, 0, 0
Gui 5:Add, ListView, x0 y0 w%LV_Width% h%LV_Height% Grid %UseHdr%Hdr gArchived_Event AltSubmit vArchive_List, %HeaderText%|Body
LV_ModifyCol(1, LV_Width-4)
LV_ModifyCol(2, 0)
LV_ModifyCol(3, 0)
LV_ModifyCol(3, "Integer")
LV_ModifyCol(4, 0)
LV_ModifyCol(4, "Integer")
LV_Delete()
Loop, Read, %A_ScriptDir%\archive.slt
{
StringSplit, DBRow, A_LoopReadLine, |
LV_Add("Icon" . DBRow3,DBRow1,DBRow2)
}
Gui 5:Show, AutoSize, %ProgName% - Archive
}
If A_ThisMenuItem = Timestamp
SortBy = Timestamp
If A_ThisMenuItem = Status
SortBy = Status
If A_ThisMenuItem = Docked to taskbar
{
IniWrite, 1, %inifile%, settings, Appearance
SaveWinPos(Appearance, gui_hwnd, inifile)
Reload
}
If A_ThisMenuItem = Docked to desktop
{
IniWrite, 2, %inifile%, settings, Appearance
SaveWinPos(Appearance, gui_hwnd, inifile)
Reload
}
If A_ThisMenuItem = Normal
{
IniWrite, 3, %inifile%, settings, Appearance
SaveWinPos(Appearance, gui_hwnd, inifile)
Reload
}
If A_ThisMenuItem = Always on top
{
IniWrite, 4, %inifile%, settings, Appearance
SaveWinPos(Appearance, gui_hwnd, inifile)
Reload
}
LoadDB(database, SortBy)
Return
QuickAdd:
Gui 2:Default
Gui 2:+ToolWindow
Gui 2:Add, Edit, w300 vQA_Header,
Gui 2:Add, Edit, Hidden w300 h200 vQA_Body,
Gui 2:Add, Button, Hidden Default x270 vQA_Save, Save
Gui 2:Show, AutoSize, %ProgName% - Quick Add
Input, var,V,{TAB}
IfWinActive %ProgName% - Quick Add
{
GuiControl, 2:Show, QA_Body
GuiControl, 2:Show, QA_Save
Gui 2:Show, AutoSize, %ProgName% - Quick Add
Send, {TAB}
}
return
Archived_event:
if (A_GuiEvent = "DoubleClick") {
FocusedRowNumber := LV_GetNext(0, "F") ; Find the focused row.
if not FocusedRowNumber ; No row is focused.
return
{
Gui 6:Destroy
LV_GetText(LV_Header, FocusedRowNumber,1)
LV_GetText(LV_Body, FocusedRowNumber,2)
StringReplace, LV_Body, LV_Body, :NL:, `n, A
Gui 6:Add, Edit, w310 -Wrap R1 vHeader, %LV_Header%
Gui 6:Add, Edit, xs R10 w310 vBody, %LV_Body%
Gui 6:+ToolWindow
Gui 6:Show, AutoSize, %ProgName% - Archive Details
}
}
Return
LV_event:
if ((A_GuiEvent = "DoubleClick") OR (Menu_Details=1)) {
FocusedRowNumber := LV_GetNext(0, "F") ; Find the focused row.
if not FocusedRowNumber ; No row is focused.
return
{
Gui 4:Destroy
LV_GetText(LV_Header, FocusedRowNumber,1)
LV_GetText(LV_Body, FocusedRowNumber,2)
LV_GetText(LV_Status, FocusedRowNumber,3)
LV_GetText(LV_TimeStamp, FocusedRowNumber,4)
StringReplace, LV_Body, LV_Body, :NL:, `n, A
Gui 4:Add, Edit, w230 -Wrap R1 vHeader, %LV_Header%
Gui 4:Add, DropDownList, ys w70 Choose%LV_Status% vStatus, New|Active|Urgent|Waiting|Done
Gui 4:Add, Edit, xs R10 w310 vBody, %LV_Body%
Gui 4:Add, Button, xs x285, Save
Gui 4:+ToolWindow
Gui 4:Show, AutoSize, %ProgName% - Edit Details
Menu_Details=0
}
}
if (A_GuiEvent == "e") {
FocusedRowNumber := LV_GetNext(0, "F") ; Find the focused row.
if not FocusedRowNumber ; No row is focused.
return
{
LV_GetText(LV_Text, FocusedRowNumber,1)
LV_GetText(LV_TimeStamp, FocusedRowNumber,4)
SelectedDbRow := GetDbRow(database, LV_TimeStamp)
TXT_SetCSV("!" . database, SelectedDbRow, 1, LV_Text, "|")
}
}
if (A_GuiEvent = "ColClick") {
Gui 7:Default
Gui 7:+ToolWindow
Gui 7:Margin, 0, 0
Gui 7:Add, Edit, w150 vNewHeader,
Gui 7:Add, Button, Hidden Default, Save
Gui 7:Show, AutoSize, %ProgName% - New Header
}
Return
; Quick Add
2ButtonSave:
Gui 2:Submit
Input
StringReplace, QA_Body, QA_Body, `n, :NL:, A
IfExist %database%
{
FileReadLine, FirstLine, %database%, 1
If FirstLine
FileAppend, `n%QA_Header%|%QA_Body%|1|%A_Now%, %database%
Else
FileAppend, %QA_Header%|%QA_Body%|1|%A_Now%, %database%
}
Else
FileAppend, %QA_Header%|%QA_Body%|1|%A_Now%, %database%
LoadDB(database)
;Resize Col to remove scrollbars
RemoveVSCROLL(gui_hwnd, Appearance, NewWidth, LV_Width)
GoTo 2GuiClose
Return
; Settings
3ButtonSave:
Gui 3:Submit
IniWrite, %SetUseHdr%, %inifile%, settings, UseHdr
IniWrite, %SetHotkey%, %inifile%, settings, hotkey
Reload
GoTo 3GuiClose
Return
; Edit
4ButtonSave:
Gui 4:Submit
If Status = New
Status = 1
If Status = Active
Status = 2
If Status = Urgent
Status = 3
If Status = Waiting
Status = 4
If Status = Done
Status = 5
SelectedDbRow := GetDbRow(database, LV_TimeStamp)
StringReplace, Body, Body, `n, :NL:, A
TXT_ReplaceLine("!" . database, SelectedDbRow, Header "|" Body "|" Status "|" LV_TimeStamp)
LoadDB(database)
;Resize Col to remove scrollbars
RemoveVSCROLL(gui_hwnd, Appearance, NewWidth, LV_Width)
Goto 4GuiClose
Return
7ButtonSave:
Gui 7:Submit
IniWrite, %NewHeader%, %inifile%, settings, HeaderText
;Reload
Gui 1:Default
LV_ModifyCol(1,"", NewHeader)
Goto 7GuiClose
Return
GuiSize:
if ErrorLevel = 1 ; The window has been minimized. No action needed.
return
; Otherwise, the window has been resized or maximized. Resize the Edit control to match.
NewWidth := A_GuiWidth
NewHeight := A_GuiHeight
GuiControl, Move, TD_List, W%NewWidth% H%NewHeight%
;Resize Col to remove scrollbars
RemoveVSCROLL(gui_hwnd, Appearance, NewWidth, LV_Width)
Return
GuiEscape:
GuiClose:
WinGetPos, Self_X, Self_Y, Self_W, Self_H, ahk_id %gui_hwnd%
If (Appearance = 1) {
IniWrite, %Self_H%, %inifile%, settings, DockedH
}
Else {
IniWrite, %Self_X%, %inifile%, settings, Win_X
IniWrite, %Self_Y%, %inifile%, settings, Win_Y
IniWrite, %Self_W%, %inifile%, settings, LV_Width
IniWrite, %Self_H%, %inifile%, settings, LV_Height
}
ExitApp
Return
; Quick Add
2GuiEscape:
2GuiClose:
Input
Gui 2:Destroy
Gui 1:Default
Return
3GuiEscape:
3GuiClose:
Gui 3:Destroy
Gui 1:Default
Return
4GuiEscape:
4GuiClose:
Gui 4:Destroy
Gui 1:Default
Return
5GuiEscape:
5GuiClose:
Gui 5:Destroy
Gui 1:Default
Return
6GuiEscape:
6GuiClose:
Gui 6:Destroy
Gui 1:Default
Return
7GuiEscape:
7GuiClose:
Gui 7:Destroy
Gui 1:Default
Return
#include TXT.ahk
TXT.ahk
Code:
TXT_RemoveLines(TextFile, StartLine, EndLine){
Original := A_BatchLines
SetBatchLines, -1
TextFile := (SubStr(TextFile,1,1)="!") ? (SubStr(TextFile,2),OW=1) : TextFile
FileRead, Str, %TextFile%
Loop, Parse, Str, `n, `r
{
If A_Index between %StartLine% and %Endline%
Continue
Else
OutPut .= A_LoopField "`n"
}
StringTrimRight, OutPut, OutPut, 1 ; trim trailing `n
If OW {
FileDelete, %TextFile%
FileAppend, %OutPut%, %TextFile%
}
Else {
SplitPath, TextFile,, Dir, Ext, Name
FileDelete, % Dir "\" Name "_copy." Ext
FileAppend, %OutPut%, % Dir "\" Name "_copy." Ext
}
SetBatchLines, %Original%
}
TXT_ReplaceLine(TextFile, Line, ReplaceText=""){
Original := A_BatchLines
SetBatchLines, -1
TextFile := (SubStr(TextFile,1,1)="!") ? (SubStr(TextFile,2),OW=1) : TextFile
FileRead, Str, %TextFile%
Loop, Parse, Str, `n, `r
OutPut .= (A_Index=Line) ? ReplaceText "`n" : A_LoopField "`n"
StringTrimRight, OutPut, OutPut, 1 ; trim trailing `n
If OW {
FileDelete, %TextFile%
FileAppend, %OutPut%, %TextFile%
}
Else {
SplitPath, TextFile,, Dir, Ext, Name
FileDelete, % Dir "\" Name "_copy." Ext
FileAppend, %OutPut%, % Dir "\" Name "_copy." Ext
}
SetBatchLines, %Original%
}
TXT_SetCSV(TextFile, Row, Column, Text="", Delimiter="|"){ ;A_Tab, A_Space
Original := A_BatchLines
SetBatchLines, -1
TextFile := (SubStr(TextFile,1,1)="!") ? (SubStr(TextFile,2),OW=1) : TextFile
FileRead, Str, %TextFile%
Loop, Parse, Str, `n, `r
{
If (A_Index!=Row)
OutPut .= A_LoopField "`n"
Else
{
StringSplit, Line, A_LoopField, %Delimiter%
Loop, %Line0%
{
if (A_Index!=Column) {
NewLine := Line%A_Index%
Output .= (Line0!=A_Index) ? NewLine Delimiter : NewLine
}
Else
OutPut .= (Line0!=Column) ? Text Delimiter : Text
}
OutPut .= "`n"
}
}
StringTrimRight, OutPut, OutPut, 1 ; trim trailing `n
If OW {
FileDelete, %TextFile%
If ErrorLevel
Return ErrorLevel
FileAppend, %OutPut%, %TextFile%
If ErrorLevel
Return ErrorLevel
}
Else {
SplitPath, TextFile,, Dir, Ext, Name
FileDelete, % Dir "\" Name "_copy." Ext
If ErrorLevel
Return ErrorLevel
FileAppend, %OutPut%, % Dir "\" Name "_copy." Ext
If ErrorLevel
Return ErrorLevel
}
SetBatchLines, %Original%
}
slt.ini
Code:
[settings]
LV_Height=593
DockedH=210
LV_Width=302
Win_X=100
Win_Y=100
database=sltodo.slt
HeaderText=Click me to change
UseHdr=1
hotkey=#t
Appearance=3
Cheers
Edit: Forgot to mention the icons used.
http://famfamfam.com/lab/icons/silk/
Great resource for nice looking icons.
bullet_blue.png = new
bullet_go.png = active
exclamation.png = urgent
user.png = waiting
tick.png = done