From 3acff6618c481a4e1fb2b927a740b929ef4cfa8c Mon Sep 17 00:00:00 2001 From: june Date: Mon, 10 Mar 2025 17:50:38 +1300 Subject: [PATCH] Add New Task from Keybind (#3) press n to add new task, type in title, then press enter to save Co-authored-by: june Co-committed-by: june --- bubbletea.go | 79 +++++++++++++++++++++++++++++++++++----------------- model.go | 4 +-- 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/bubbletea.go b/bubbletea.go index 91d5ee5..b480353 100644 --- a/bubbletea.go +++ b/bubbletea.go @@ -66,15 +66,25 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.textinput.Reset() } + case "enter": + if m.addTask { + AddNewTask(&m) + m.addTask = false + m.textinput.Reset() + } + // The "enter" key and the spacebar (a literal space) toggle // the selected state for the item that the cursor is pointing at. - case "enter", " ": - _, ok := m.selected[m.cursor] - if ok { - delete(m.selected, m.cursor) - } else { - m.selected[m.cursor] = struct{}{} + case " ": + + if !m.addTask { + if m.todos[m.cursor].done { + m.todos[m.cursor].done = false + } else { + m.todos[m.cursor].done = true + } } + } } @@ -84,30 +94,44 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, cmd } +func AddNewTask(m *model) { + t := todo{ + name: m.textinput.Value(), + done: false, + startdate: 0, + deadline: 0, + priority: 1, + isInbox: true, + } + m.todos = append(m.todos, t) +} + func (m model) View() string { // The header s := "" - currentList := []todo{} + currentList := m.todos - // switch m.tab { - // case 0: - // s += "Inbox" - // inboxFilter := func(t todo) bool { return t.isInbox } - // currentList = filter(m.todos, inboxFilter) - // case 1: - // s += "Today" - // case 2: - // s += "Tomorrow" - // case 3: - // s += "Scheduled" - // case 4: - // s += "Anytime" - // } + s += "GOTD\n" - s += "GOTD\n\n" + switch m.tab { + case 0: + s += "Inbox" + // inboxFilter := func(t todo) bool { return t.isInbox } + // currentList = filter(m.todos, inboxFilter) + case 1: + s += "Today" + case 2: + s += "Tomorrow" + case 3: + s += "Scheduled" + case 4: + s += "Anytime" + } + + s += "\n\n" // Iterate over our choices - for i, choice := range currentList { + for i, value := range currentList { // Is the cursor pointing at this choice? cursor := " " // no cursor @@ -117,12 +141,15 @@ func (m model) View() string { // Is this choice selected? checked := " " // not selected - if _, ok := m.selected[i]; ok { - checked = "x" // selected! + // if _, ok := m.selected[i]; ok { + // checked = "x" // selected! + // } + if value.done { + checked = "x" } // Render the row - s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice) + s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, value.name) } // render tab bar diff --git a/model.go b/model.go index fde7083..74730bc 100644 --- a/model.go +++ b/model.go @@ -15,7 +15,7 @@ type todo struct { type model struct { todos []todo // ALL items on the to-do list - list []todo // items currently visible on the list right now + // list []todo // items currently visible on the list right now cursor int // which to-do list item our cursor is pointing at selected map[int]struct{} // which to-do items are selected tab int // which tab is selected @@ -36,7 +36,7 @@ func initialModel() model { // Start empty todos: []todo{}, - list: []todo{}, + // list: []todo{}, // start on today tab // 0: inbox, 1: today, 2: tomorrow, 3: scheduled, 4: anytime