First attempt at resizable panes
This commit is contained in:
parent
612658d9c4
commit
8c403655a7
4 changed files with 100 additions and 60 deletions
|
@ -62,13 +62,21 @@ func (v *View) MousePress(usePlugin bool, e *tcell.EventMouse) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
x, y := e.Position()
|
rawX, rawY := e.Position()
|
||||||
x -= v.lineNumOffset - v.leftCol + v.x
|
|
||||||
y += v.Topline - v.y
|
x := rawX - v.lineNumOffset - v.leftCol + v.x
|
||||||
|
y := rawY + v.Topline - v.y
|
||||||
|
|
||||||
// This is usually bound to left click
|
// This is usually bound to left click
|
||||||
|
if !(rawX == v.x+v.Width || rawY == v.y+v.Height || v.resizeX || v.resizeY) {
|
||||||
v.MoveToMouseClick(x, y)
|
v.MoveToMouseClick(x, y)
|
||||||
|
}
|
||||||
if v.mouseReleased {
|
if v.mouseReleased {
|
||||||
|
if rawX == v.x+v.Width {
|
||||||
|
v.resizeX = true
|
||||||
|
} else if rawY == v.y+v.Height {
|
||||||
|
v.resizeY = true
|
||||||
|
} else {
|
||||||
if len(v.Buf.cursors) > 1 {
|
if len(v.Buf.cursors) > 1 {
|
||||||
for i := 1; i < len(v.Buf.cursors); i++ {
|
for i := 1; i < len(v.Buf.cursors); i++ {
|
||||||
v.Buf.cursors[i] = nil
|
v.Buf.cursors[i] = nil
|
||||||
|
@ -107,9 +115,18 @@ func (v *View) MousePress(usePlugin bool, e *tcell.EventMouse) bool {
|
||||||
v.Cursor.CurSelection[0] = v.Cursor.Loc
|
v.Cursor.CurSelection[0] = v.Cursor.Loc
|
||||||
v.Cursor.CurSelection[1] = v.Cursor.Loc
|
v.Cursor.CurSelection[1] = v.Cursor.Loc
|
||||||
}
|
}
|
||||||
|
}
|
||||||
v.mouseReleased = false
|
v.mouseReleased = false
|
||||||
} else if !v.mouseReleased {
|
} else if !v.mouseReleased {
|
||||||
if v.tripleClick {
|
if v.resizeX {
|
||||||
|
v.Width = rawX - v.x
|
||||||
|
v.LockWidth = true
|
||||||
|
v.splitNode.parent.ResizeSplits()
|
||||||
|
} else if v.resizeY {
|
||||||
|
v.Height = rawY - v.y
|
||||||
|
v.LockHeight = true
|
||||||
|
v.splitNode.parent.ResizeSplits()
|
||||||
|
} else if v.tripleClick {
|
||||||
v.Cursor.AddLineToSelection()
|
v.Cursor.AddLineToSelection()
|
||||||
} else if v.doubleClick {
|
} else if v.doubleClick {
|
||||||
v.Cursor.AddWordToSelection()
|
v.Cursor.AddWordToSelection()
|
||||||
|
|
|
@ -112,6 +112,9 @@ func (c *CellView) Draw(buf *Buffer, top, height, left, width int) {
|
||||||
// We'll either draw the length of the line, or the width of the screen
|
// We'll either draw the length of the line, or the width of the screen
|
||||||
// whichever is smaller
|
// whichever is smaller
|
||||||
lineLength := min(StringWidth(lineStr, tabsize), width)
|
lineLength := min(StringWidth(lineStr, tabsize), width)
|
||||||
|
if lineLength < 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
c.lines = append(c.lines, make([]*Char, lineLength))
|
c.lines = append(c.lines, make([]*Char, lineLength))
|
||||||
|
|
||||||
wrap := false
|
wrap := false
|
||||||
|
@ -133,40 +136,52 @@ func (c *CellView) Draw(buf *Buffer, top, height, left, width int) {
|
||||||
char := line[colN]
|
char := line[colN]
|
||||||
|
|
||||||
if viewCol >= 0 {
|
if viewCol >= 0 {
|
||||||
|
if viewCol < len(c.lines[viewLine]) {
|
||||||
c.lines[viewLine][viewCol] = &Char{Loc{viewCol, viewLine}, Loc{colN, lineN}, char, char, curStyle, 1}
|
c.lines[viewLine][viewCol] = &Char{Loc{viewCol, viewLine}, Loc{colN, lineN}, char, char, curStyle, 1}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if char == '\t' {
|
if char == '\t' {
|
||||||
charWidth := tabsize - (viewCol+left)%tabsize
|
charWidth := tabsize - (viewCol+left)%tabsize
|
||||||
if viewCol >= 0 {
|
if viewCol >= 0 {
|
||||||
|
if viewCol < len(c.lines[viewLine]) {
|
||||||
c.lines[viewLine][viewCol].drawChar = indentchar
|
c.lines[viewLine][viewCol].drawChar = indentchar
|
||||||
c.lines[viewLine][viewCol].width = charWidth
|
c.lines[viewLine][viewCol].width = charWidth
|
||||||
|
}
|
||||||
|
|
||||||
indentStyle := curStyle
|
indentStyle := curStyle
|
||||||
if group, ok := colorscheme["indent-char"]; ok {
|
if group, ok := colorscheme["indent-char"]; ok {
|
||||||
indentStyle = group
|
indentStyle = group
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if viewCol < len(c.lines[viewLine]) {
|
||||||
c.lines[viewLine][viewCol].style = indentStyle
|
c.lines[viewLine][viewCol].style = indentStyle
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for i := 1; i < charWidth; i++ {
|
for i := 1; i < charWidth; i++ {
|
||||||
viewCol++
|
viewCol++
|
||||||
if viewCol >= 0 && viewCol < lineLength {
|
if viewCol >= 0 && viewCol < lineLength {
|
||||||
|
if viewCol < len(c.lines[viewLine]) {
|
||||||
c.lines[viewLine][viewCol] = &Char{Loc{viewCol, viewLine}, Loc{colN, lineN}, char, ' ', curStyle, 1}
|
c.lines[viewLine][viewCol] = &Char{Loc{viewCol, viewLine}, Loc{colN, lineN}, char, ' ', curStyle, 1}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
viewCol++
|
viewCol++
|
||||||
} else if runewidth.RuneWidth(char) > 1 {
|
} else if runewidth.RuneWidth(char) > 1 {
|
||||||
charWidth := runewidth.RuneWidth(char)
|
charWidth := runewidth.RuneWidth(char)
|
||||||
if viewCol >= 0 {
|
if viewCol >= 0 {
|
||||||
|
if viewCol < len(c.lines[viewLine]) {
|
||||||
c.lines[viewLine][viewCol].width = charWidth
|
c.lines[viewLine][viewCol].width = charWidth
|
||||||
}
|
}
|
||||||
|
}
|
||||||
for i := 1; i < charWidth; i++ {
|
for i := 1; i < charWidth; i++ {
|
||||||
viewCol++
|
viewCol++
|
||||||
if viewCol >= 0 && viewCol < lineLength {
|
if viewCol >= 0 && viewCol < lineLength {
|
||||||
|
if viewCol < len(c.lines[viewLine]) {
|
||||||
c.lines[viewLine][viewCol] = &Char{Loc{viewCol, viewLine}, Loc{colN, lineN}, char, ' ', curStyle, 1}
|
c.lines[viewLine][viewCol] = &Char{Loc{viewCol, viewLine}, Loc{colN, lineN}, char, ' ', curStyle, 1}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
viewCol++
|
viewCol++
|
||||||
} else {
|
} else {
|
||||||
viewCol++
|
viewCol++
|
||||||
|
|
|
@ -476,7 +476,7 @@ func main() {
|
||||||
// We loop through each view in the current tab and make sure the current view
|
// We loop through each view in the current tab and make sure the current view
|
||||||
// is the one being clicked in
|
// is the one being clicked in
|
||||||
for _, v := range tabs[curTab].views {
|
for _, v := range tabs[curTab].views {
|
||||||
if x >= v.x && x < v.x+v.Width && y >= v.y && y < v.y+v.Height {
|
if x > v.x && x <= v.x+v.Width && y > v.y && y <= v.y+v.Height {
|
||||||
tabs[curTab].CurView = v.Num
|
tabs[curTab].CurView = v.Num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,9 @@ type View struct {
|
||||||
cellview *CellView
|
cellview *CellView
|
||||||
|
|
||||||
splitNode *LeafNode
|
splitNode *LeafNode
|
||||||
|
|
||||||
|
resizeX bool
|
||||||
|
resizeY bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewView returns a new fullscreen view
|
// NewView returns a new fullscreen view
|
||||||
|
@ -599,6 +602,10 @@ func (v *View) HandleEvent(event tcell.Event) {
|
||||||
// Mouse event with no click
|
// Mouse event with no click
|
||||||
if !v.mouseReleased {
|
if !v.mouseReleased {
|
||||||
// Mouse was just released
|
// Mouse was just released
|
||||||
|
if v.resizeX || v.resizeY {
|
||||||
|
v.resizeX = false
|
||||||
|
v.resizeY = false
|
||||||
|
} else {
|
||||||
|
|
||||||
x, y := e.Position()
|
x, y := e.Position()
|
||||||
x -= v.lineNumOffset - v.leftCol + v.x
|
x -= v.lineNumOffset - v.leftCol + v.x
|
||||||
|
@ -615,6 +622,7 @@ func (v *View) HandleEvent(event tcell.Event) {
|
||||||
v.Cursor.SetSelectionEnd(v.Cursor.Loc)
|
v.Cursor.SetSelectionEnd(v.Cursor.Loc)
|
||||||
v.Cursor.CopySelection("primary")
|
v.Cursor.CopySelection("primary")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
v.mouseReleased = true
|
v.mouseReleased = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue