commit db5a4b7
delthas
·
2022-04-20 13:05:14 +0000 UTC
parent 82acaac
Show/hide the channel & member list with F7/F8 This patch is inspired and modified from a patch by mooff. Also this switches the default configuration to *display* the channel & member list by default.
4 files changed,
+123,
-60
M
app.go
+17,
-11
1@@ -122,9 +122,11 @@ func NewApp(cfg Config) (app *App, err error) {
2 mouse := cfg.Mouse
3
4 app.win, err = ui.New(ui.Config{
5- NickColWidth: cfg.NickColWidth,
6- ChanColWidth: cfg.ChanColWidth,
7- MemberColWidth: cfg.MemberColWidth,
8+ NickColWidth: cfg.NickColWidth,
9+ ChanColWidth: cfg.ChanColWidth,
10+ ChanColEnabled: cfg.ChanColEnabled,
11+ MemberColWidth: cfg.MemberColWidth,
12+ MemberColEnabled: cfg.MemberColEnabled,
13 AutoComplete: func(cursorIdx int, text []rune) []ui.Completion {
14 return app.completions(cursorIdx, text)
15 },
16@@ -432,9 +434,9 @@ func (app *App) handleMouseEvent(ev *tcell.EventMouse) {
17 x, y := ev.Position()
18 w, _ := app.win.Size()
19 if ev.Buttons()&tcell.WheelUp != 0 {
20- if x < app.cfg.ChanColWidth {
21+ if x < app.win.ChannelWidth() {
22 app.win.ScrollChannelUpBy(4)
23- } else if x > w-app.cfg.MemberColWidth {
24+ } else if x > w-app.win.MemberWidth() {
25 app.win.ScrollMemberUpBy(4)
26 } else {
27 app.win.ScrollUpBy(4)
28@@ -442,27 +444,27 @@ func (app *App) handleMouseEvent(ev *tcell.EventMouse) {
29 }
30 }
31 if ev.Buttons()&tcell.WheelDown != 0 {
32- if x < app.cfg.ChanColWidth {
33+ if x < app.win.ChannelWidth() {
34 app.win.ScrollChannelDownBy(4)
35- } else if x > w-app.cfg.MemberColWidth {
36+ } else if x > w-app.win.MemberWidth() {
37 app.win.ScrollMemberDownBy(4)
38 } else {
39 app.win.ScrollDownBy(4)
40 }
41 }
42 if ev.Buttons()&tcell.ButtonPrimary != 0 {
43- if x < app.cfg.ChanColWidth {
44+ if x < app.win.ChannelWidth() {
45 app.win.ClickBuffer(y + app.win.ChannelOffset())
46- } else if x > w-app.cfg.MemberColWidth {
47+ } else if x > w-app.win.MemberWidth() {
48 app.win.ClickMember(y + app.win.MemberOffset())
49 }
50 }
51 if ev.Buttons() == 0 {
52- if x < app.cfg.ChanColWidth {
53+ if x < app.win.ChannelWidth() {
54 if i := y + app.win.ChannelOffset(); i == app.win.ClickedBuffer() {
55 app.win.GoToBufferNo(i)
56 }
57- } else if x > w-app.cfg.MemberColWidth {
58+ } else if x > w-app.win.MemberWidth() {
59 if i := y + app.win.MemberOffset(); i == app.win.ClickedMember() {
60 netID, target := app.win.CurrentBuffer()
61 s := app.sessions[netID]
62@@ -580,6 +582,10 @@ func (app *App) handleKeyEvent(ev *tcell.EventKey) {
63 }
64 case tcell.KeyEscape:
65 app.win.CloseOverlay()
66+ case tcell.KeyF7:
67+ app.win.ToggleChannelList()
68+ case tcell.KeyF8:
69+ app.win.ToggleMemberList()
70 case tcell.KeyCR, tcell.KeyLF:
71 netID, buffer := app.win.CurrentBuffer()
72 input := app.win.InputEnter()
+41,
-27
1@@ -62,11 +62,13 @@ type Config struct {
2 Typings bool
3 Mouse bool
4
5- Highlights []string
6- OnHighlightPath string
7- NickColWidth int
8- ChanColWidth int
9- MemberColWidth int
10+ Highlights []string
11+ OnHighlightPath string
12+ NickColWidth int
13+ ChanColWidth int
14+ ChanColEnabled bool
15+ MemberColWidth int
16+ MemberColEnabled bool
17
18 Colors ConfigColors
19
20@@ -83,20 +85,22 @@ func DefaultHighlightPath() (string, error) {
21
22 func Defaults() (cfg Config, err error) {
23 cfg = Config{
24- Addr: "",
25- Nick: "",
26- Real: "",
27- User: "",
28- Password: nil,
29- TLS: true,
30- Channels: nil,
31- Typings: true,
32- Mouse: true,
33- Highlights: nil,
34- OnHighlightPath: "",
35- NickColWidth: 16,
36- ChanColWidth: 0,
37- MemberColWidth: 0,
38+ Addr: "",
39+ Nick: "",
40+ Real: "",
41+ User: "",
42+ Password: nil,
43+ TLS: true,
44+ Channels: nil,
45+ Typings: true,
46+ Mouse: true,
47+ Highlights: nil,
48+ OnHighlightPath: "",
49+ NickColWidth: 14,
50+ ChanColWidth: 16,
51+ ChanColEnabled: true,
52+ MemberColWidth: 16,
53+ MemberColEnabled: true,
54 Colors: ConfigColors{
55 Prompt: Color(tcell.ColorDefault),
56 },
57@@ -204,23 +208,33 @@ func unmarshal(filename string, cfg *Config) (err error) {
58 return err
59 }
60 case "channels":
61- var channels string
62- if err := child.ParseParams(&channels); err != nil {
63+ var channelsStr string
64+ if err := child.ParseParams(&channelsStr); err != nil {
65 return err
66 }
67-
68- if cfg.ChanColWidth, err = strconv.Atoi(channels); err != nil {
69+ channels, err := strconv.Atoi(channelsStr)
70+ if err != nil {
71 return err
72 }
73+ if channels == 0 {
74+ cfg.ChanColEnabled = false
75+ } else {
76+ cfg.ChanColWidth = channels
77+ }
78 case "members":
79- var members string
80- if err := child.ParseParams(&members); err != nil {
81+ var membersStr string
82+ if err := child.ParseParams(&membersStr); err != nil {
83 return err
84 }
85-
86- if cfg.MemberColWidth, err = strconv.Atoi(members); err != nil {
87+ members, err := strconv.Atoi(membersStr)
88+ if err != nil {
89 return err
90 }
91+ if members == 0 {
92+ cfg.MemberColEnabled = false
93+ } else {
94+ cfg.MemberColWidth = members
95+ }
96 default:
97 return fmt.Errorf("unknown directive %q", child.Name)
98 }
+6,
-0
1@@ -109,6 +109,12 @@ of messages are in the timeline:
2 *CTRL-L*
3 Refresh the window.
4
5+*F7*
6+ Show/hide the vertical channel list.
7+
8+*F8*
9+ Show/hide the vertical member list.
10+
11 # COMMANDS
12
13 If you type and send a message that starts with a slash (*/*), it will instead
M
ui/ui.go
+59,
-22
1@@ -11,12 +11,14 @@ import (
2 )
3
4 type Config struct {
5- NickColWidth int
6- ChanColWidth int
7- MemberColWidth int
8- AutoComplete func(cursorIdx int, text []rune) []Completion
9- Mouse bool
10- MergeLine func(former *Line, addition Line)
11+ NickColWidth int
12+ ChanColWidth int
13+ ChanColEnabled bool
14+ MemberColWidth int
15+ MemberColEnabled bool
16+ AutoComplete func(cursorIdx int, text []rune) []Completion
17+ Mouse bool
18+ MergeLine func(former *Line, addition Line)
19 }
20
21 type UI struct {
22@@ -33,12 +35,21 @@ type UI struct {
23 channelOffset int
24 memberClicked int
25 memberOffset int
26+
27+ channelWidth int
28+ memberWidth int
29 }
30
31 func New(config Config) (ui *UI, err error) {
32 ui = &UI{
33 config: config,
34 }
35+ if config.ChanColEnabled {
36+ ui.channelWidth = config.ChanColWidth
37+ }
38+ if config.MemberColEnabled {
39+ ui.memberWidth = config.MemberColWidth
40+ }
41
42 ui.screen, err = tcell.NewScreen()
43 if err != nil {
44@@ -177,6 +188,32 @@ func (ui *UI) MemberOffset() int {
45 return ui.memberOffset
46 }
47
48+func (ui *UI) ChannelWidth() int {
49+ return ui.channelWidth
50+}
51+
52+func (ui *UI) MemberWidth() int {
53+ return ui.memberWidth
54+}
55+
56+func (ui *UI) ToggleChannelList() {
57+ if ui.channelWidth == 0 {
58+ ui.channelWidth = ui.config.ChanColWidth
59+ } else {
60+ ui.channelWidth = 0
61+ }
62+ ui.Resize()
63+}
64+
65+func (ui *UI) ToggleMemberList() {
66+ if ui.memberWidth == 0 {
67+ ui.memberWidth = ui.config.MemberColWidth
68+ } else {
69+ ui.memberWidth = 0
70+ }
71+ ui.Resize()
72+}
73+
74 func (ui *UI) ScrollMemberUpBy(n int) {
75 ui.memberOffset -= n
76 if ui.memberOffset < 0 {
77@@ -353,9 +390,9 @@ func (ui *UI) InputBackSearch() {
78
79 func (ui *UI) Resize() {
80 w, h := ui.screen.Size()
81- innerWidth := w - 9 - ui.config.ChanColWidth - ui.config.NickColWidth - ui.config.MemberColWidth
82+ innerWidth := w - 9 - ui.channelWidth - ui.config.NickColWidth - ui.memberWidth
83 ui.e.Resize(innerWidth)
84- if ui.config.ChanColWidth == 0 {
85+ if ui.channelWidth == 0 {
86 ui.bs.ResizeTimeline(innerWidth, h-3)
87 } else {
88 ui.bs.ResizeTimeline(innerWidth, h-2)
89@@ -370,37 +407,37 @@ func (ui *UI) Size() (int, int) {
90 func (ui *UI) Draw(members []irc.Member) {
91 w, h := ui.screen.Size()
92
93- if ui.config.ChanColWidth == 0 {
94+ if ui.channelWidth == 0 {
95 ui.e.Draw(ui.screen, 9+ui.config.NickColWidth, h-2)
96 } else {
97- ui.e.Draw(ui.screen, 9+ui.config.ChanColWidth+ui.config.NickColWidth, h-1)
98+ ui.e.Draw(ui.screen, 9+ui.channelWidth+ui.config.NickColWidth, h-1)
99 }
100
101- ui.bs.DrawTimeline(ui.screen, ui.config.ChanColWidth, 0, ui.config.NickColWidth)
102- if ui.config.ChanColWidth == 0 {
103- ui.bs.DrawHorizontalBufferList(ui.screen, 0, h-1, w-ui.config.MemberColWidth)
104+ ui.bs.DrawTimeline(ui.screen, ui.channelWidth, 0, ui.config.NickColWidth)
105+ if ui.channelWidth == 0 {
106+ ui.bs.DrawHorizontalBufferList(ui.screen, 0, h-1, w-ui.memberWidth)
107 } else {
108- ui.bs.DrawVerticalBufferList(ui.screen, 0, 0, ui.config.ChanColWidth, h, &ui.channelOffset)
109+ ui.bs.DrawVerticalBufferList(ui.screen, 0, 0, ui.channelWidth, h, &ui.channelOffset)
110 }
111- if ui.config.MemberColWidth != 0 {
112- ui.drawVerticalMemberList(ui.screen, w-ui.config.MemberColWidth, 0, ui.config.MemberColWidth, h, members, &ui.memberOffset)
113+ if ui.memberWidth != 0 {
114+ ui.drawVerticalMemberList(ui.screen, w-ui.memberWidth, 0, ui.memberWidth, h, members, &ui.memberOffset)
115 }
116- if ui.config.ChanColWidth == 0 {
117- ui.drawStatusBar(ui.config.ChanColWidth, h-3, w-ui.config.MemberColWidth)
118+ if ui.channelWidth == 0 {
119+ ui.drawStatusBar(ui.channelWidth, h-3, w-ui.memberWidth)
120 } else {
121- ui.drawStatusBar(ui.config.ChanColWidth, h-2, w-ui.config.ChanColWidth-ui.config.MemberColWidth)
122+ ui.drawStatusBar(ui.channelWidth, h-2, w-ui.channelWidth-ui.memberWidth)
123 }
124
125- if ui.config.ChanColWidth == 0 {
126+ if ui.channelWidth == 0 {
127 for x := 0; x < 9+ui.config.NickColWidth; x++ {
128 ui.screen.SetContent(x, h-2, ' ', nil, tcell.StyleDefault)
129 }
130 printIdent(ui.screen, 7, h-2, ui.config.NickColWidth, ui.prompt)
131 } else {
132- for x := ui.config.ChanColWidth; x < 9+ui.config.ChanColWidth+ui.config.NickColWidth; x++ {
133+ for x := ui.channelWidth; x < 9+ui.channelWidth+ui.config.NickColWidth; x++ {
134 ui.screen.SetContent(x, h-1, ' ', nil, tcell.StyleDefault)
135 }
136- printIdent(ui.screen, ui.config.ChanColWidth+7, h-1, ui.config.NickColWidth, ui.prompt)
137+ printIdent(ui.screen, ui.channelWidth+7, h-1, ui.config.NickColWidth, ui.prompt)
138 }
139
140 ui.screen.Show()