7 //----------------------------------------------------------------------
9 /// Constructs a list displaying \p rctdl
10 CTodoList::CTodoList (void)
17 /// Sets the list to display.
18 void CTodoList::SetList (pctodolist_t pl
)
22 SetListSize (pl
->size());
25 /// Sets internal variables when the document is updated.
26 void CTodoList::OnUpdate (void)
29 SetList (&Document()->List());
30 SetSelection (Document()->Selection());
33 /// Draws list item \p ii at \p pos onto \p gc.
34 void CTodoList::OnDrawItem (CGC
& gc
, rcpos_t pos
, uint32_t ii
)
36 CListbox::OnDrawItem (gc
, pos
, ii
);
39 const CTodoEntry
& e ((*m_pTodos
)[ii
]);
41 gc
.Char (pos
, "+ "[!e
.HasSublist()]);
42 snprintf (progBuf
, 5, "%3u%%", e
.Progress());
43 gc
.Text (pos
[0] + 1, pos
[1], e
.Progress() ? progBuf
: " ");
44 static const EColor c_PriorityColors
[2][CTodoEntry::priority_Last
] = {
45 { white
, lightred
, yellow
, green
, cyan
, lightblue
},
46 { white
, lightred
, yellow
, lightgreen
, lightcyan
, lightblue
}
48 gc
.FgColor (c_PriorityColors
[ii
== Selection()][e
.Priority()]);
49 gc
.Text (pos
[0] + 6, pos
[1], e
.Text());
52 /// Causes the current entry to be edited.
53 inline void CTodoList::EditEntry (void)
55 SetFlag (f_OffersFocus
);
58 /// Processes keystroke \p key.
59 void CTodoList::OnKey (wchar_t key
)
61 CListbox::OnKey (key
);
62 pdoc_t pDoc
= Document();
63 bool bReadOnly
= Flag (f_ReadOnly
);
65 if (pDoc
->Selection() != Selection())
66 pDoc
->SetSelection (Selection());
68 // Item navigation keys are always available.
69 if (key
== kv_Left
|| key
== 'h')
70 pDoc
->LeaveCurrentEntry();
72 pDoc
->ToggleCompleteVisible();
73 else if (key
== 'q') {
74 if (pDoc
->Flag (CDocument::f_Changed
)) {
75 int rv
= MessageBox ("There are unsaved changes. Save now?", MB_YesNoCancel
);
76 if (rv
== mbrv_Cancel
)
78 else if (rv
!= mbrv_No
)
84 // Modification operations that are valid without a selection
86 if (key
== 'v' && m_CopiedId
)
87 pDoc
->PasteLinkToEntry (m_CopiedId
);
88 else if (key
== kv_Insert
|| key
== 'n') {
94 // Everything below this requires a selection (that is, a non-empty list)
95 if (pDoc
->Selection() >= pDoc
->ListSize())
98 // Navigation is available even if read-only
99 if (key
== kv_Right
|| key
== 'l' || key
== kv_Enter
)
100 pDoc
->EnterCurrentEntry();
102 // Modification operations on the current entry.
104 if (key
== kv_Delete
|| key
== 'D')
105 pDoc
->RemoveCurrentEntry();
106 else if (key
== kv_Space
) // Toggle complete flag
107 pDoc
->MarkEntryComplete();
111 m_CopiedId
= pDoc
->CurrentEntry().Id();
112 else if (key
>= '1' && key
<= '5')
113 OnCommand (key
- '1' + cmd_Item_Priority_Highest
);
117 void CTodoList::OnCommand (cmd_t c
)
119 CListbox::OnCommand (c
);
120 pdoc_t pDoc
= Document();
122 case cmd_List_Leave
: pDoc
->LeaveCurrentEntry(); break;
123 case cmd_List_OldItems
: pDoc
->ToggleCompleteVisible(); break;
124 case cmd_List_Paste
: pDoc
->PasteLinkToEntry (m_CopiedId
); break;
125 case cmd_Item_New
: pDoc
->AppendEntry(); EditEntry(); break;
126 case cmd_List_Enter
: pDoc
->EnterCurrentEntry(); break;
127 case cmd_Item_Delete
: pDoc
->RemoveCurrentEntry(); break;
128 case cmd_Item_Complete
: pDoc
->MarkEntryComplete(); break;
129 case cmd_Item_Edit
: EditEntry(); break;
130 case cmd_List_Copy
: m_CopiedId
= pDoc
->CurrentEntry().Id(); break;
131 case cmd_Item_Priority_Highest
:
132 case cmd_Item_Priority_High
:
133 case cmd_Item_Priority_Medium
:
134 case cmd_Item_Priority_Low
:
135 case cmd_Item_Priority_Lowest
:
136 pDoc
->SetCurrentEntryPriority (CTodoEntry::EPriority (c
- cmd_Item_Priority_Highest
+ 1));
141 void CTodoList::OnUpdateCommandUI (rcmd_t rc
) const
143 CListbox::OnUpdateCommandUI (rc
);
144 pcdoc_t pDoc
= Document();
145 assert (pDoc
&& "The frame should stop UpdateCommandUI if there is no document");
146 const bool bHaveSelection (pDoc
->Selection() < pDoc
->ListSize());
147 const bool bReadOnly (Flag (f_ReadOnly
));
150 case cmd_List_Leave
: bActive
= pDoc
->NestingDepth(); break;
151 case cmd_List_OldItems
:
152 rc
.SetFlag (SCmd::cf_Checked
, pDoc
->Flag (CTodoDocument::f_CompleteVisible
));
154 case cmd_List_Paste
: bActive
= !bReadOnly
; break;
155 case cmd_Item_New
: break;
156 case cmd_List_Enter
: bActive
= bHaveSelection
; break;
157 case cmd_Item_Delete
: bActive
= bHaveSelection
&& !bReadOnly
; break;
158 case cmd_Item_Complete
: bActive
= bHaveSelection
&& !bReadOnly
; break;
159 case cmd_Item_Edit
: bActive
= bHaveSelection
&& !bReadOnly
; break;
160 case cmd_List_Copy
: bActive
= bHaveSelection
; break;
161 case cmd_Item_Priority
: bActive
= bHaveSelection
; break;
162 case cmd_Item_Priority_Highest
:
163 case cmd_Item_Priority_High
:
164 case cmd_Item_Priority_Medium
:
165 case cmd_Item_Priority_Low
:
166 case cmd_Item_Priority_Lowest
:
167 bActive
= bHaveSelection
&& !bReadOnly
;
168 rc
.SetFlag (SCmd::cf_Checked
, rc
.cmd
== pDoc
->CurrentEntry().Priority() + cmd_Item_Priority_Highest
- 1);
171 bActive
= !(rc
.flags
& SCmd::cf_Grayed
);
174 rc
.SetFlag (SCmd::cf_Grayed
, !bActive
);