split cursor

This commit is contained in:
Dongdong Zhou 2018-02-15 02:26:39 +00:00
parent fa8af303be
commit c2c501ebd9
4 changed files with 73 additions and 21 deletions

View File

@ -1,8 +1,17 @@
package main
import "github.com/dzhou121/xi-go/editor"
import (
"net/http"
_ "net/http/pprof"
"github.com/dzhou121/xi-go/editor"
)
func main() {
go func() {
http.ListenAndServe("localhost:6020", nil)
}()
editor, err := editor.NewEditor()
if err != nil {
return

View File

@ -111,6 +111,7 @@ func NewEditor() (*Editor, error) {
defer e.winsRWMutext.RUnlock()
for _, win := range e.wins {
win.view.SetStyleSheet(scrollBarStyleSheet)
win.cline.SetStyleSheet(e.getClineStylesheet())
}
}
})
@ -123,6 +124,15 @@ func NewEditor() (*Editor, error) {
return e, nil
}
func (e *Editor) getClineStylesheet() string {
if e.theme == nil {
return ""
}
cline := e.theme.Theme.LineHighlight
styleSheet := fmt.Sprintf("background-color: rgba(%d, %d, %d, %f);", cline.R, cline.G, cline.B, float64(cline.A)/255)
return styleSheet
}
func (e *Editor) getScrollbarStylesheet() string {
bg := e.theme.Theme.Background
guide := e.theme.Theme.LineHighlight
@ -232,10 +242,8 @@ func (e *Editor) initMainWindow() {
editor: e,
}
e.topWin = NewWindow(e, e.topFrame)
e.topWin.view.Move2(0, 0)
e.topWin.view.Resize2(e.width, e.height)
e.topWin.loadBuffer(NewBuffer(e, "/Users/Lulu/xi-editor/rust/core-lib/src/rpc.rs"))
e.topWin.setScroll()
e.equalWins()
e.cursor = widgets.NewQWidget(nil, 0)
e.cursor.Resize2(1, 20)
@ -278,6 +286,9 @@ func (e *Editor) organizeWins() {
win.view.Move2(win.frame.x, win.frame.y)
win.view.Hide()
win.view.Show()
win.cline.Resize2(win.frame.width, int(win.buffer.font.lineHeight))
win.cline.Hide()
win.cline.Show()
win.setScroll()
}
}

View File

@ -67,6 +67,7 @@ func (f *Frame) split(vertical bool) {
win.editor.equalWins()
newWin.view.HorizontalScrollBar().SetValue(win.view.HorizontalScrollBar().Value())
newWin.view.VerticalScrollBar().SetValue(win.view.VerticalScrollBar().Value())
newWin.scrollto(newWin.col, newWin.row)
f.setFocus()
}
@ -295,8 +296,11 @@ type Window struct {
id int
editor *Editor
view *widgets.QGraphicsView
cline *widgets.QWidget
frame *Frame
buffer *Buffer
x float64
y float64
cursorX int
cursorY int
row int
@ -313,7 +317,32 @@ func NewWindow(editor *Editor, frame *Frame) *Window {
editor: editor,
frame: frame,
view: widgets.NewQGraphicsView(nil),
cline: widgets.NewQWidget(nil, 0),
}
w.view.ConnectEventFilter(func(watched *core.QObject, event *core.QEvent) bool {
if event.Type() == core.QEvent__MouseButtonPress {
mousePress := gui.NewQMouseEventFromPointer(event.Pointer())
w.view.MousePressEvent(mousePress)
return true
}
// else if event.Type() == core.QEvent__Wheel {
// wheelEvent := gui.NewQWheelEventFromPointer(event.Pointer())
// // delta := wheelEvent.PixelDelta()
// // w.view.ScrollContentsByDefault(delta.X(), delta.Y())
// // fmt.Println("scroll by", delta.X(), delta.Y())
// w.view.WheelEventDefault(wheelEvent)
// return true
// }
return w.view.EventFilterDefault(watched, event)
})
w.cline.SetParent(w.view)
w.cline.SetStyleSheet(editor.getClineStylesheet())
w.cline.SetFocusPolicy(core.Qt__NoFocus)
w.cline.InstallEventFilter(w.view)
w.cline.ConnectWheelEvent(func(event *gui.QWheelEvent) {
w.view.WheelEventDefault(event)
})
frame.win = w
editor.winIndex++
editor.wins[w.id] = w
@ -428,8 +457,20 @@ func (w *Window) update() {
}
}
func (w *Window) updateCursor() {
w.cursorX = int(w.x+0.5) - w.view.HorizontalScrollBar().Value()
w.cursorY = int(w.y+0.5) - w.view.VerticalScrollBar().Value()
cursor := w.editor.cursor
cursor.Move2(w.cursorX, w.cursorY)
cursor.Resize2(1, int(w.buffer.font.lineHeight+0.5))
cursor.Hide()
cursor.Show()
w.cline.Move2(0, w.cursorY)
}
func (w *Window) setScroll() {
w.update()
w.updateCursor()
w.buffer.xiView.Scroll(w.start, w.end)
}
@ -440,25 +481,17 @@ func (w *Window) loadBuffer(buffer *Buffer) {
func (w *Window) scrollto(col, row int) {
b := w.buffer
x := b.font.fontMetrics.Width(b.lines[row].text[:col]) - 0.5
y := float64(row) * b.font.lineHeight
w.x = b.font.fontMetrics.Width(b.lines[row].text[:col]) - 0.5
w.y = float64(row) * b.font.lineHeight
w.view.EnsureVisible2(
x,
y,
w.x,
w.y,
1,
b.font.lineHeight,
20,
20,
)
x -= float64(w.view.HorizontalScrollBar().Value())
y -= float64(w.view.VerticalScrollBar().Value())
w.row = row
w.col = col
w.cursorX = int(x + 0.5)
w.cursorY = int(y + 0.5)
cursor := w.editor.cursor
cursor.Move2(w.cursorX, w.cursorY)
cursor.Resize2(1, int(b.font.lineHeight+0.5))
cursor.Hide()
cursor.Show()
w.updateCursor()
}

View File

@ -4,7 +4,6 @@ import (
"bufio"
"context"
"encoding/json"
"fmt"
"io"
"os/exec"
@ -139,9 +138,9 @@ func (h *handler) Handle(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2
if err != nil {
return
}
fmt.Println("-------------------------")
fmt.Println(req.Method)
fmt.Println(string(params))
// fmt.Println("-------------------------")
// fmt.Println(req.Method)
// fmt.Println(string(params))
switch req.Method {
case "update":
var notification UpdateNotification