diff --git a/cmd/micro/action/command.go b/cmd/micro/action/command.go index 6a89a98d..dc2dcf72 100644 --- a/cmd/micro/action/command.go +++ b/cmd/micro/action/command.go @@ -1,7 +1,6 @@ package action import ( - "log" "os" "github.com/zyedidia/micro/cmd/micro/buffer" @@ -206,7 +205,6 @@ func VSplit(args []string) { return } - log.Println("loaded") MainTab().CurPane().vsplit(buf) } diff --git a/cmd/micro/action/tab.go b/cmd/micro/action/tab.go index 91794be9..0dd8e662 100644 --- a/cmd/micro/action/tab.go +++ b/cmd/micro/action/tab.go @@ -10,8 +10,7 @@ import ( type TabList struct { *display.TabWindow - List []*TabPane - Active int + List []*TabPane } func NewTabList(bufs []*buffer.Buffer) *TabList { @@ -50,14 +49,28 @@ func (t *TabList) HandleEvent(event tcell.Event) { p.Resize() } } else { - t.List[0].Node.Resize(w, h-2) + t.List[0].Node.Resize(w, h-1) t.List[0].Resize() } case *tcell.EventMouse: + mx, my := e.Position() switch e.Buttons() { case tcell.Button1: + ind := t.GetMouseLoc(buffer.Loc{mx, my}) + if ind != -1 { + t.Active = ind + } + case tcell.WheelUp: + if my == t.Y { + t.Scroll(4) + return + } + case tcell.WheelDown: + if my == t.Y { + t.Scroll(-4) + return + } } - } t.List[t.Active].HandleEvent(event) } @@ -99,10 +112,9 @@ type TabPane struct { func (t *TabPane) HandleEvent(event tcell.Event) { switch e := event.(type) { case *tcell.EventMouse: + mx, my := e.Position() switch e.Buttons() { case tcell.Button1: - mx, my := e.Position() - resizeID := t.GetMouseSplitID(buffer.Loc{mx, my}) if t.resizing != nil { var size int @@ -133,6 +145,15 @@ func (t *TabPane) HandleEvent(event tcell.Event) { } case tcell.ButtonNone: t.resizing = nil + default: + for _, p := range t.Panes { + v := p.GetView() + inpane := mx >= v.X && mx < v.X+v.Width && my >= v.Y && my < v.Y+v.Height + if inpane { + p.HandleEvent(event) + return + } + } } } @@ -170,11 +191,11 @@ func (t *TabPane) RemovePane(i int) { // Resize resizes all panes according to their corresponding split nodes func (t *TabPane) Resize() { - for i, p := range t.Panes { + for _, p := range t.Panes { n := t.GetNode(p.splitID) pv := p.GetView() offset := 0 - if i != 0 { + if n.X != 0 { offset = 1 } pv.X, pv.Y = n.X+offset, n.Y diff --git a/cmd/micro/display/tabbar.go b/cmd/micro/display/tabbar.go deleted file mode 100644 index 4527aa0f..00000000 --- a/cmd/micro/display/tabbar.go +++ /dev/null @@ -1,57 +0,0 @@ -package display - -import ( - "log" - - "github.com/zyedidia/micro/cmd/micro/config" - "github.com/zyedidia/micro/cmd/micro/screen" -) - -type TabWindow struct { - Names []string - Active int - width int - hscroll int - y int -} - -func NewTabWindow(w int, y int) *TabWindow { - tw := new(TabWindow) - tw.width = w - tw.y = y - return tw -} - -func (w *TabWindow) Display() { - x := -w.hscroll - - draw := func(r rune, n int) { - for i := 0; i < n; i++ { - screen.Screen.SetContent(x, w.y, r, nil, config.DefStyle.Reverse(true)) - x++ - log.Println(x) - } - } - - for i, n := range w.Names { - if i == w.Active { - draw('[', 1) - } - for _, c := range n { - draw(c, 1) - } - if i == w.Active { - draw(']', 1) - draw(' ', 3) - } else { - draw(' ', 4) - } - if x >= w.width { - break - } - } - - if x < w.width { - draw(' ', w.width-x) - } -} diff --git a/cmd/micro/display/tabwindow.go b/cmd/micro/display/tabwindow.go new file mode 100644 index 00000000..6c1e9946 --- /dev/null +++ b/cmd/micro/display/tabwindow.go @@ -0,0 +1,105 @@ +package display + +import ( + "unicode/utf8" + + "github.com/zyedidia/micro/cmd/micro/buffer" + "github.com/zyedidia/micro/cmd/micro/config" + "github.com/zyedidia/micro/cmd/micro/screen" + "github.com/zyedidia/micro/cmd/micro/util" +) + +type TabWindow struct { + Names []string + Active int + Y int + width int + hscroll int +} + +func NewTabWindow(w int, y int) *TabWindow { + tw := new(TabWindow) + tw.width = w + tw.Y = y + return tw +} + +func (w *TabWindow) GetMouseLoc(vloc buffer.Loc) int { + x := -w.hscroll + + for i, n := range w.Names { + x++ + s := utf8.RuneCountInString(n) + if vloc.Y == w.Y && vloc.X < x+s { + return i + } + x += s + x += 3 + if x >= w.width { + break + } + } + return -1 +} + +func (w *TabWindow) Scroll(amt int) { + w.hscroll += amt + w.hscroll = util.Clamp(w.hscroll, 0, w.TotalSize()-w.width) +} + +func (w *TabWindow) TotalSize() int { + sum := 2 + for _, n := range w.Names { + sum += utf8.RuneCountInString(n) + 4 + } + return sum - 4 +} + +// TODO: handle files with character width >=2 + +func (w *TabWindow) Display() { + x := -w.hscroll + done := false + + draw := func(r rune, n int) { + for i := 0; i < n; i++ { + if x == w.width-1 && !done { + screen.Screen.SetContent(w.width-1, w.Y, '>', nil, config.DefStyle.Reverse(true)) + x++ + break + } else if x == 0 && w.hscroll > 0 { + screen.Screen.SetContent(0, w.Y, '<', nil, config.DefStyle.Reverse(true)) + } else if x >= 0 && x < w.width { + screen.Screen.SetContent(x, w.Y, r, nil, config.DefStyle.Reverse(true)) + } + x++ + } + } + + for i, n := range w.Names { + if i == w.Active { + draw('[', 1) + } else { + draw(' ', 1) + } + for _, c := range n { + draw(c, 1) + } + if i == len(w.Names)-1 { + done = true + } + if i == w.Active { + draw(']', 1) + draw(' ', 2) + } else { + draw(' ', 3) + } + if x >= w.width { + break + } + } + + if x < w.width { + draw(' ', w.width-x) + } +} diff --git a/cmd/micro/micro.go b/cmd/micro/micro.go index 50e36d86..1870911b 100644 --- a/cmd/micro/micro.go +++ b/cmd/micro/micro.go @@ -225,7 +225,7 @@ func main() { if action.InfoBar.HasPrompt { action.InfoBar.HandleEvent(event) } else { - action.MainTab().HandleEvent(event) + action.Tabs.HandleEvent(event) } } } diff --git a/cmd/micro/util/message.go b/cmd/micro/util/message.go index 3b31cd17..2a1ddce1 100644 --- a/cmd/micro/util/message.go +++ b/cmd/micro/util/message.go @@ -3,7 +3,6 @@ package util import ( "bufio" "fmt" - "log" "os" "strconv" @@ -17,9 +16,7 @@ import ( // This will write the message, and wait for the user // to press and key to continue func TermMessage(msg ...interface{}) { - log.Println(msg) screen.TempFini() - log.Println("fini") fmt.Println(msg...) fmt.Print("\nPress enter to continue")