1package termui
2
3import (
4 "fmt"
5 "github.com/MichaelMure/git-bug/bug/operations"
6 "github.com/MichaelMure/git-bug/cache"
7 "github.com/MichaelMure/git-bug/util"
8 "github.com/jroimartin/gocui"
9)
10
11const showBugView = "showBugView"
12const showBugSidebarView = "showBugSidebarView"
13const showBugInstructionView = "showBugInstructionView"
14
15const timeLayout = "Jan _2 2006"
16
17type showBug struct {
18 cache cache.RepoCacher
19 bug cache.BugCacher
20}
21
22func newShowBug(cache cache.RepoCacher) *showBug {
23 return &showBug{
24 cache: cache,
25 }
26}
27
28func (sb *showBug) layout(g *gocui.Gui) error {
29 maxX, maxY := g.Size()
30
31 v, err := g.SetView(showBugView, 0, 0, maxX*2/3, maxY-2)
32
33 if err != nil {
34 if err != gocui.ErrUnknownView {
35 return err
36 }
37
38 v.Frame = false
39 }
40
41 v.Clear()
42 sb.renderMain(v)
43
44 v, err = g.SetView(showBugSidebarView, maxX*2/3+1, 0, maxX-1, maxY-2)
45
46 if err != nil {
47 if err != gocui.ErrUnknownView {
48 return err
49 }
50
51 v.Frame = false
52 }
53
54 v.Clear()
55 sb.renderSidebar(v)
56
57 v, err = g.SetView(showBugInstructionView, -1, maxY-2, maxX, maxY)
58
59 if err != nil {
60 if err != gocui.ErrUnknownView {
61 return err
62 }
63
64 v.Frame = false
65 v.BgColor = gocui.ColorBlue
66
67 fmt.Fprintf(v, "[q] Return [c] Add comment [t] Change title")
68 }
69
70 _, err = g.SetCurrentView(showBugView)
71 return err
72}
73
74func (sb *showBug) keybindings(g *gocui.Gui) error {
75 // Return
76 if err := g.SetKeybinding(showBugView, 'q', gocui.ModNone, sb.back); err != nil {
77 return err
78 }
79
80 // Scrolling
81 if err := g.SetKeybinding(showBugView, gocui.KeyPgup, gocui.ModNone,
82 sb.scrollUp); err != nil {
83 return err
84 }
85 if err := g.SetKeybinding(showBugView, gocui.KeyPgdn, gocui.ModNone,
86 sb.scrollDown); err != nil {
87 return err
88 }
89
90 // Comment
91 if err := g.SetKeybinding(showBugView, 'c', gocui.ModNone,
92 sb.comment); err != nil {
93 return err
94 }
95
96 // Title
97 if err := g.SetKeybinding(showBugView, 't', gocui.ModNone,
98 sb.title); err != nil {
99 return err
100 }
101
102 // Labels
103
104 return nil
105}
106
107func (sb *showBug) disable(g *gocui.Gui) error {
108 if err := g.DeleteView(showBugView); err != nil {
109 return err
110 }
111 if err := g.DeleteView(showBugSidebarView); err != nil {
112 return err
113 }
114 if err := g.DeleteView(showBugInstructionView); err != nil {
115 return err
116 }
117 return nil
118}
119
120func (sb *showBug) renderMain(v *gocui.View) {
121 maxX, _ := v.Size()
122 snap := sb.bug.Snapshot()
123
124 header1 := fmt.Sprintf("[%s] %s", snap.HumanId(), snap.Title)
125 fmt.Fprintf(v, util.LeftPaddedString(header1, maxX, 2)+"\n\n")
126
127 header2 := fmt.Sprintf("[%s] %s opened this bug on %s",
128 snap.Status, snap.Author.Name, snap.CreatedAt.Format(timeLayout))
129 fmt.Fprintf(v, util.LeftPaddedString(header2, maxX, 2)+"\n\n")
130
131 for _, op := range snap.Operations {
132 switch op.(type) {
133
134 case operations.CreateOperation:
135 create := op.(operations.CreateOperation)
136 fmt.Fprintf(v, util.LeftPaddedString(create.Message, maxX, 6)+"\n\n\n")
137
138 case operations.AddCommentOperation:
139 comment := op.(operations.AddCommentOperation)
140 header := fmt.Sprintf("%s commented on %s",
141 comment.Author.Name, comment.Time().Format(timeLayout))
142 fmt.Fprintf(v, util.LeftPaddedString(header, maxX, 6)+"\n\n")
143 fmt.Fprintf(v, util.LeftPaddedString(comment.Message, maxX, 6)+"\n\n\n")
144 }
145 }
146
147}
148
149func (sb *showBug) renderSidebar(v *gocui.View) {
150 maxX, _ := v.Size()
151 snap := sb.bug.Snapshot()
152
153 title := util.LeftPaddedString("LABEL", maxX, 2)
154 fmt.Fprintf(v, title+"\n\n")
155
156 for _, label := range snap.Labels {
157 fmt.Fprintf(v, util.LeftPaddedString(label.String(), maxX, 2))
158 fmt.Fprintln(v)
159 }
160}
161
162func (sb *showBug) back(g *gocui.Gui, v *gocui.View) error {
163 sb.bug = nil
164 ui.activateWindow(ui.bugTable)
165 return nil
166}
167
168func (sb *showBug) scrollUp(g *gocui.Gui, v *gocui.View) error {
169 return nil
170}
171
172func (sb *showBug) scrollDown(g *gocui.Gui, v *gocui.View) error {
173 return nil
174}
175
176func (sb *showBug) comment(g *gocui.Gui, v *gocui.View) error {
177 return addCommentWithEditor(sb.bug)
178}
179
180func (sb *showBug) title(g *gocui.Gui, v *gocui.View) error {
181 return setTitleWithEditor(sb.bug)
182}