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
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
+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()