]> git.lizzy.rs Git - micro.git/commitdiff
Allow plugins to resize panes
authorZachary Yedidia <zyedidia@gmail.com>
Wed, 5 Feb 2020 22:16:31 +0000 (17:16 -0500)
committerZachary Yedidia <zyedidia@gmail.com>
Wed, 5 Feb 2020 22:16:31 +0000 (17:16 -0500)
cmd/micro/initlua.go
internal/action/bufpane.go
internal/action/command.go
internal/action/infopane.go
internal/action/pane.go
internal/action/rawpane.go
internal/action/tab.go
internal/action/terminal_supported.go
internal/action/termpane.go
internal/config/plugin.go

index 08c808c201ac38a1485d965b104372c0e6d3a3aa..4a3f327af3d56cbafa2e8c0b20df47e102e10fd1 100644 (file)
@@ -121,6 +121,9 @@ func luaImportMicroBuffer() *lua.LTable {
        ulua.L.SetField(pkg, "BTScratch", luar.New(ulua.L, buffer.BTScratch.Kind))
        ulua.L.SetField(pkg, "BTRaw", luar.New(ulua.L, buffer.BTRaw.Kind))
        ulua.L.SetField(pkg, "BTInfo", luar.New(ulua.L, buffer.BTInfo.Kind))
+       ulua.L.SetField(pkg, "NewBuffer", luar.New(ulua.L, func(text, path string) *buffer.Buffer {
+               return buffer.NewBufferFromString(text, path, buffer.BTDefault)
+       }))
        ulua.L.SetField(pkg, "NewBufferFromFile", luar.New(ulua.L, func(path string) (*buffer.Buffer, error) {
                return buffer.NewBufferFromFile(path, buffer.BTDefault)
        }))
index 6137b81f0a46c59a16b2d77808ca44788a56ce78..e23b9a64a1abdacc08da70befecff8d4dc2f2fd2 100644 (file)
@@ -175,15 +175,17 @@ type BufPane struct {
        multiWord bool
 
        splitID uint64
+       tab     *Tab
 
        // remember original location of a search in case the search is canceled
        searchOrig buffer.Loc
 }
 
-func NewBufPane(buf *buffer.Buffer, win display.BWindow) *BufPane {
+func NewBufPane(buf *buffer.Buffer, win display.BWindow, tab *Tab) *BufPane {
        h := new(BufPane)
        h.Buf = buf
        h.BWindow = win
+       h.tab = tab
 
        h.Cursor = h.Buf.GetActiveCursor()
        h.mouseReleased = true
@@ -193,9 +195,23 @@ func NewBufPane(buf *buffer.Buffer, win display.BWindow) *BufPane {
        return h
 }
 
-func NewBufPaneFromBuf(buf *buffer.Buffer) *BufPane {
+func NewBufPaneFromBuf(buf *buffer.Buffer, tab *Tab) *BufPane {
        w := display.NewBufWindow(0, 0, 0, 0, buf)
-       return NewBufPane(buf, w)
+       return NewBufPane(buf, w, tab)
+}
+
+func (h *BufPane) SetTab(t *Tab) {
+       h.tab = t
+}
+
+func (h *BufPane) Tab() *Tab {
+       return h.tab
+}
+
+func (h *BufPane) ResizePane(size int) {
+       n := h.tab.GetNode(h.splitID)
+       n.ResizeSplit(size)
+       h.tab.Resize()
 }
 
 // PluginCB calls all plugin callbacks with a certain name and
@@ -433,22 +449,29 @@ func (h *BufPane) DoRuneInsert(r rune) {
        }
 }
 
-func (h *BufPane) VSplitBuf(buf *buffer.Buffer) *BufPane {
-       e := NewBufPaneFromBuf(buf)
-       e.splitID = MainTab().GetNode(h.splitID).VSplit(h.Buf.Settings["splitright"].(bool))
+func (h *BufPane) VSplitIndex(buf *buffer.Buffer, right bool) *BufPane {
+       e := NewBufPaneFromBuf(buf, h.tab)
+       e.splitID = MainTab().GetNode(h.splitID).VSplit(right)
        MainTab().Panes = append(MainTab().Panes, e)
        MainTab().Resize()
        MainTab().SetActive(len(MainTab().Panes) - 1)
        return e
 }
-func (h *BufPane) HSplitBuf(buf *buffer.Buffer) *BufPane {
-       e := NewBufPaneFromBuf(buf)
-       e.splitID = MainTab().GetNode(h.splitID).HSplit(h.Buf.Settings["splitbottom"].(bool))
+func (h *BufPane) HSplitIndex(buf *buffer.Buffer, bottom bool) *BufPane {
+       e := NewBufPaneFromBuf(buf, h.tab)
+       e.splitID = MainTab().GetNode(h.splitID).HSplit(bottom)
        MainTab().Panes = append(MainTab().Panes, e)
        MainTab().Resize()
        MainTab().SetActive(len(MainTab().Panes) - 1)
        return e
 }
+
+func (h *BufPane) VSplitBuf(buf *buffer.Buffer) *BufPane {
+       return h.VSplitIndex(buf, h.Buf.Settings["splitright"].(bool))
+}
+func (h *BufPane) HSplitBuf(buf *buffer.Buffer) *BufPane {
+       return h.HSplitIndex(buf, h.Buf.Settings["splitbottom"].(bool))
+}
 func (h *BufPane) Close() {
        h.Buf.Close()
 }
index d6c7c3aec40f7fba2dab8270a434a2cd0b022616..baf2bf8df5d335d39bd21bc984b5fca0d0769d0a 100644 (file)
@@ -147,7 +147,7 @@ func (h *BufPane) RetabCmd(args []string) {
 func (h *BufPane) RawCmd(args []string) {
        width, height := screen.Screen.Size()
        iOffset := config.GetInfoBarOffset()
-       tp := NewTabFromPane(0, 0, width, height-iOffset, NewRawPane())
+       tp := NewTabFromPane(0, 0, width, height-iOffset, NewRawPane(nil))
        Tabs.AddTab(tp)
        Tabs.SetActive(len(Tabs.List) - 1)
 }
@@ -830,7 +830,7 @@ func (h *BufPane) ReplaceAllCmd(args []string) {
 
 // TermCmd opens a terminal in the current view
 func (h *BufPane) TermCmd(args []string) {
-       ps := MainTab().Panes
+       ps := h.tab.Panes
 
        if len(args) == 0 {
                sh := os.Getenv("SHELL")
@@ -855,7 +855,7 @@ func (h *BufPane) TermCmd(args []string) {
                }
 
                v := h.GetView()
-               MainTab().Panes[i] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id)
+               MainTab().Panes[i] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id, MainTab())
                MainTab().SetActive(i)
        }
 
index 9c137c52de3b8cb3f07511e40cc52a55b7cc8d4e..210bc1545bb0d10c432e4db36428a1c658d268ac 100644 (file)
@@ -17,10 +17,10 @@ type InfoPane struct {
        *info.InfoBuf
 }
 
-func NewInfoPane(ib *info.InfoBuf, w display.BWindow) *InfoPane {
+func NewInfoPane(ib *info.InfoBuf, w display.BWindow, tab *Tab) *InfoPane {
        ip := new(InfoPane)
        ip.InfoBuf = ib
-       ip.BufPane = NewBufPane(ib.Buffer, w)
+       ip.BufPane = NewBufPane(ib.Buffer, w, tab)
 
        return ip
 }
@@ -28,7 +28,7 @@ func NewInfoPane(ib *info.InfoBuf, w display.BWindow) *InfoPane {
 func NewInfoBar() *InfoPane {
        ib := info.NewBuffer()
        w := display.NewInfoWindow(ib)
-       return NewInfoPane(ib, w)
+       return NewInfoPane(ib, w, nil)
 }
 
 func (h *InfoPane) Close() {
index f6f68d3ee611d158e0143826998e9b24c1cf6f56..bcf1767e578e6056ae55574f2e7904bb3d690354 100644 (file)
@@ -11,4 +11,6 @@ type Pane interface {
        SetID(i uint64)
        Name() string
        Close()
+       SetTab(t *Tab)
+       Tab() *Tab
 }
index cdeade478cee53a3dc6192028f20e6965ea76530..db6e917197559a1c6a8353ac37178362bd263810 100644 (file)
@@ -13,17 +13,17 @@ type RawPane struct {
        *BufPane
 }
 
-func NewRawPaneFromWin(b *buffer.Buffer, win display.BWindow) *RawPane {
+func NewRawPaneFromWin(b *buffer.Buffer, win display.BWindow, tab *Tab) *RawPane {
        rh := new(RawPane)
-       rh.BufPane = NewBufPane(b, win)
+       rh.BufPane = NewBufPane(b, win, tab)
 
        return rh
 }
 
-func NewRawPane() *RawPane {
+func NewRawPane(tab *Tab) *RawPane {
        b := buffer.NewBufferFromString("", "", buffer.BTRaw)
        w := display.NewBufWindow(0, 0, 0, 0, b)
-       return NewRawPaneFromWin(b, w)
+       return NewRawPaneFromWin(b, w, tab)
 }
 
 func (h *RawPane) HandleEvent(event tcell.Event) {
index 39e7ee8f5a95219d7f9c0dd2df6732ebf1aaed3d..ac49edb957e43885e4842accc7a9da7a5465b2f2 100644 (file)
@@ -167,7 +167,7 @@ func NewTabFromBuffer(x, y, width, height int, b *buffer.Buffer) *Tab {
        t.Node = views.NewRoot(x, y, width, height)
        t.UIWindow = display.NewUIWindow(t.Node)
 
-       e := NewBufPaneFromBuf(b)
+       e := NewBufPaneFromBuf(b, t)
        e.SetID(t.ID())
 
        t.Panes = append(t.Panes, e)
@@ -178,7 +178,7 @@ func NewTabFromPane(x, y, width, height int, pane Pane) *Tab {
        t := new(Tab)
        t.Node = views.NewRoot(x, y, width, height)
        t.UIWindow = display.NewUIWindow(t.Node)
-
+       pane.SetTab(t)
        pane.SetID(t.ID())
 
        t.Panes = append(t.Panes, pane)
@@ -196,7 +196,6 @@ func (t *Tab) HandleEvent(event tcell.Event) {
                mx, my := e.Position()
                switch e.Buttons() {
                case tcell.Button1:
-                       resizeID := t.GetMouseSplitID(buffer.Loc{mx, my})
                        if t.resizing != nil {
                                var size int
                                if t.resizing.Kind == views.STVert {
@@ -209,6 +208,7 @@ func (t *Tab) HandleEvent(event tcell.Event) {
                                return
                        }
 
+                       resizeID := t.GetMouseSplitID(buffer.Loc{mx, my})
                        if resizeID != 0 {
                                t.resizing = t.GetNode(uint64(resizeID))
                                return
index 3ae19ff1e0de51cf2538b2d0ffba24d7f9817a36..f30f2755ba0777c00c9cb92b82e2bea839adb56c 100644 (file)
@@ -25,7 +25,7 @@ func RunTermEmulator(h *BufPane, input string, wait bool, getOutput bool, callba
        id := MainTab().Panes[0].ID()
 
        v := h.GetView()
-       MainTab().Panes[0] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id)
+       MainTab().Panes[0] = NewTermPane(v.X, v.Y, v.Width, v.Height, t, id, MainTab())
        MainTab().SetActive(0)
 
        return nil
index 1f9b57970afc21800e93a9206dfa394afecbb1ff..6928856fc49b0ee4c6a6507c3811c24e5920d7a8 100644 (file)
@@ -17,14 +17,16 @@ type TermPane struct {
 
        mouseReleased bool
        id            uint64
+       tab           *Tab
 }
 
-func NewTermPane(x, y, w, h int, t *shell.Terminal, id uint64) *TermPane {
+func NewTermPane(x, y, w, h int, t *shell.Terminal, id uint64, tab *Tab) *TermPane {
        th := new(TermPane)
        th.Terminal = t
        th.id = id
        th.mouseReleased = true
        th.Window = display.NewTermWindow(x, y, w, h, t)
+       th.tab = tab
        return th
 }
 
@@ -36,6 +38,14 @@ func (t *TermPane) SetID(i uint64) {
        t.id = i
 }
 
+func (t *TermPane) SetTab(tab *Tab) {
+       t.tab = tab
+}
+
+func (t *TermPane) Tab() *Tab {
+       return t.tab
+}
+
 func (t *TermPane) Close() {}
 
 func (t *TermPane) Quit() {
index 1e1f96858d71bb4042bee1314a89e127763973dc..9dceb60b04e679761f184809b019c3d7c4a82010 100644 (file)
@@ -57,9 +57,7 @@ func RunPluginFnBool(fn string, args ...lua.LValue) (bool, error) {
                        reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
                        continue
                }
-               if v, ok := val.(lua.LBool); !ok {
-                       reterr = errors.New(p.Name + "." + fn + " should return a boolean")
-               } else {
+               if v, ok := val.(lua.LBool); ok {
                        retbool = retbool && bool(v)
                }
        }