Skip to content

Commit 4e703d2

Browse files
committed
split out http; start adding tcell
1 parent 824ef3a commit 4e703d2

File tree

4 files changed

+127
-51
lines changed

4 files changed

+127
-51
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ require (
1010
github.com/cli/safeexec v1.0.0
1111
github.com/cpuguy83/go-md2man/v2 v2.0.0
1212
github.com/enescakir/emoji v1.0.0
13+
github.com/gdamore/tcell/v2 v2.0.0
1314
github.com/google/go-cmp v0.5.2
1415
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
1516
github.com/hashicorp/go-version v1.2.1

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ github.com/enescakir/emoji v1.0.0/go.mod h1:Bt1EKuLnKDTYpLALApstIkAjdDrS/8IAgTkK
7070
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
7171
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
7272
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
73+
github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
74+
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
75+
github.com/gdamore/tcell v1.4.0 h1:vUnHwJRvcPQa3tzi+0QI4U9JINXYJlOz9yiaiPQ2wMU=
76+
github.com/gdamore/tcell/v2 v2.0.0 h1:GRWG8aLfWAlekj9Q6W29bVvkHENc6hp79XOqG4AWDOs=
77+
github.com/gdamore/tcell/v2 v2.0.0/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA=
7378
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
7479
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
7580
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -343,6 +348,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
343348
golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
344349
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
345350
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
351+
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
346352
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
347353
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
348354
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

pkg/cmd/project/http.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package project
2+
3+
import (
4+
"encoding/json"
5+
6+
"github.com/cli/cli/api"
7+
"github.com/cli/cli/internal/ghrepo"
8+
)
9+
10+
func getProject(client *api.Client, baseRepo ghrepo.Interface, projectID int) (*Project, error) {
11+
data, err := client.GetProject(baseRepo, projectID)
12+
if err != nil {
13+
return nil, err
14+
}
15+
16+
project := &Project{}
17+
18+
err = json.Unmarshal(data, project)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
data, err = client.GetProjectColumns(baseRepo, projectID)
24+
if err != nil {
25+
return nil, err
26+
}
27+
28+
err = json.Unmarshal(data, &project.Columns)
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
for _, column := range project.Columns {
34+
data, err := client.GetProjectCards(baseRepo, column.ID)
35+
if err != nil {
36+
return nil, err
37+
}
38+
39+
err = json.Unmarshal(data, &column.Cards)
40+
if err != nil {
41+
return nil, err
42+
}
43+
}
44+
45+
return project, nil
46+
}

pkg/cmd/project/project.go

Lines changed: 74 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package project
22

33
import (
4-
"encoding/json"
5-
"fmt"
64
"net/http"
5+
"time"
76

87
"github.com/cli/cli/api"
98
"github.com/cli/cli/internal/ghrepo"
109
"github.com/cli/cli/pkg/cmdutil"
1110
"github.com/cli/cli/pkg/iostreams"
11+
"github.com/gdamore/tcell/v2"
12+
"github.com/mattn/go-runewidth"
1213
"github.com/spf13/cobra"
1314
)
1415

@@ -47,35 +48,6 @@ func NewCmdProject(f *cmdutil.Factory, runF func(*ProjectOptions) error) *cobra.
4748
return cmd
4849
}
4950

50-
func projectRun(opts *ProjectOptions) error {
51-
// TODO interactively ask which project they want since these IDs are not easy to get
52-
projectID := 3514315
53-
54-
c, err := opts.HttpClient()
55-
if err != nil {
56-
return err
57-
}
58-
client := api.NewClientFromHTTP(c)
59-
60-
baseRepo, err := opts.BaseRepo()
61-
if err != nil {
62-
return err
63-
}
64-
65-
project, err := getProject(client, baseRepo, projectID)
66-
if err != nil {
67-
return err
68-
}
69-
70-
fmt.Printf("DBG %#v\n", project)
71-
72-
for _, c := range project.Columns {
73-
fmt.Printf("DBG %s: %d cards\n", c.Name, len(c.Cards))
74-
}
75-
76-
return nil
77-
}
78-
7951
type Card struct {
8052
Note string
8153
ID int
@@ -93,40 +65,91 @@ type Project struct {
9365
Columns []*Column
9466
}
9567

96-
func getProject(client *api.Client, baseRepo ghrepo.Interface, projectID int) (*Project, error) {
97-
data, err := client.GetProject(baseRepo, projectID)
68+
func projectRun(opts *ProjectOptions) error {
69+
// TODO interactively ask which project they want since these IDs are not easy to get
70+
projectID := 3514315
71+
72+
c, err := opts.HttpClient()
9873
if err != nil {
99-
return nil, err
74+
return err
10075
}
76+
client := api.NewClientFromHTTP(c)
10177

102-
project := &Project{}
103-
104-
err = json.Unmarshal(data, project)
78+
baseRepo, err := opts.BaseRepo()
10579
if err != nil {
106-
return nil, err
80+
return err
10781
}
10882

109-
data, err = client.GetProjectColumns(baseRepo, projectID)
83+
project, err := getProject(client, baseRepo, projectID)
11084
if err != nil {
111-
return nil, err
85+
return err
11286
}
11387

114-
err = json.Unmarshal(data, &project.Columns)
88+
style := tcell.StyleDefault
89+
90+
s, err := tcell.NewScreen()
11591
if err != nil {
116-
return nil, err
92+
return err
93+
}
94+
if err = s.Init(); err != nil {
95+
return err
11796
}
11897

119-
for _, column := range project.Columns {
120-
data, err := client.GetProjectCards(baseRepo, column.ID)
121-
if err != nil {
122-
return nil, err
98+
s.SetStyle(style)
99+
100+
// some kind of controller struct to track modal state?
101+
102+
quit := make(chan struct{})
103+
go func() {
104+
for {
105+
ev := s.PollEvent()
106+
switch ev := ev.(type) {
107+
case *tcell.EventKey:
108+
switch ev.Rune() {
109+
case 'q':
110+
close(quit)
111+
return
112+
}
113+
switch ev.Key() {
114+
case tcell.KeyEscape:
115+
close(quit)
116+
return
117+
case tcell.KeyCtrlL:
118+
s.Sync()
119+
}
120+
case *tcell.EventResize:
121+
s.Sync()
122+
}
123123
}
124-
125-
err = json.Unmarshal(data, &column.Cards)
126-
if err != nil {
127-
return nil, err
124+
}()
125+
126+
loop:
127+
for {
128+
select {
129+
case <-quit:
130+
break loop
131+
case <-time.After(time.Millisecond * 500):
128132
}
133+
s.Clear()
134+
drawStr(s, 0, 0, style, project.Name)
135+
s.Show()
129136
}
130137

131-
return project, nil
138+
s.Fini()
139+
140+
return nil
141+
}
142+
143+
func drawStr(s tcell.Screen, x, y int, style tcell.Style, str string) {
144+
for _, c := range str {
145+
var comb []rune
146+
w := runewidth.RuneWidth(c)
147+
if w == 0 {
148+
comb = []rune{c}
149+
c = ' '
150+
w = 1
151+
}
152+
s.SetContent(x, y, c, comb, style)
153+
x += w
154+
}
132155
}

0 commit comments

Comments
 (0)