Implemented the menu bar with all the commands
[ttodo.git] / elist.cc
blob25de42bb81175d45c601b90464f40887bf6a055e
1 // elist.cc
2 //
4 #include "elist.h"
5 #include <stdio.h>
7 //----------------------------------------------------------------------
9 /// Constructs a list displaying \p rctdl
10 CTodoList::CTodoList (void)
11 : CListbox (),
12 m_pTodos (NULL),
13 m_CopiedId (0)
17 /// Sets the list to display.
18 void CTodoList::SetList (pctodolist_t pl)
20 m_pTodos = pl;
21 if (m_pTodos)
22 SetListSize (pl->size());
25 /// Sets internal variables when the document is updated.
26 void CTodoList::OnUpdate (void)
28 CListbox::OnUpdate();
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);
37 if (!m_pTodos)
38 return;
39 const CTodoEntry& e ((*m_pTodos)[ii]);
40 char progBuf [5];
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();
71 else if (key == 'o')
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)
77 return;
78 else if (rv != mbrv_No)
79 pDoc->Save();
81 Close();
84 // Modification operations that are valid without a selection
85 if (!bReadOnly) {
86 if (key == 'v' && m_CopiedId)
87 pDoc->PasteLinkToEntry (m_CopiedId);
88 else if (key == kv_Insert || key == 'n') {
89 pDoc->AppendEntry();
90 EditEntry();
94 // Everything below this requires a selection (that is, a non-empty list)
95 if (pDoc->Selection() >= pDoc->ListSize())
96 return;
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.
103 if (!bReadOnly) {
104 if (key == kv_Delete || key == 'D')
105 pDoc->RemoveCurrentEntry();
106 else if (key == kv_Space) // Toggle complete flag
107 pDoc->MarkEntryComplete();
108 else if (key == 'e')
109 EditEntry();
110 else if (key == 'c')
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();
121 switch (c) {
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));
137 break;
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));
148 bool bActive = true;
149 switch (rc.cmd) {
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));
153 break;
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);
169 break;
170 default:
171 bActive = !(rc.flags & SCmd::cf_Grayed);
172 break;
174 rc.SetFlag (SCmd::cf_Grayed, !bActive);