mirror of
https://github.com/mappu/miqt.git
synced 2024-12-22 08:58:37 +00:00
examples/mdoutliner: add Markdown Outliner example
This commit is contained in:
parent
2b1cf2aa3e
commit
65ebdbd086
2
.gitignore
vendored
2
.gitignore
vendored
@ -6,4 +6,6 @@ cmd/handbindings/handbindings
|
|||||||
cmd/handbindings/bindings_test/direct
|
cmd/handbindings/bindings_test/direct
|
||||||
cmd/handbindings/bindings_test/testapp
|
cmd/handbindings/bindings_test/testapp
|
||||||
cmd/genbindings/genbindings
|
cmd/genbindings/genbindings
|
||||||
|
|
||||||
examples/helloworld/helloworld
|
examples/helloworld/helloworld
|
||||||
|
examples/mdoutliner/mdoutliner
|
||||||
|
136
examples/mdoutliner/main.go
Normal file
136
examples/mdoutliner/main.go
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/mappu/miqt/qt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const sampleContent = `# Markdown Outliner
|
||||||
|
|
||||||
|
This is sample markdown content.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- You can use the outline on the left to jump to parts of the document
|
||||||
|
- Demonstrates use of the MIQT library`
|
||||||
|
|
||||||
|
type AppWindow struct {
|
||||||
|
w *qt.QMainWindow
|
||||||
|
cw *qt.QWidget
|
||||||
|
outline *qt.QListWidget
|
||||||
|
textArea *qt.QTextEdit
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAppWindow() *AppWindow {
|
||||||
|
|
||||||
|
ret := AppWindow{}
|
||||||
|
|
||||||
|
ret.w = qt.NewQMainWindow()
|
||||||
|
ret.w.SetWindowTitle("Markdown Outliner")
|
||||||
|
|
||||||
|
// Menu
|
||||||
|
|
||||||
|
mnu := qt.NewQMenuBar()
|
||||||
|
fileMenu := mnu.AddMenuWithTitle("&File")
|
||||||
|
open := fileMenu.AddAction("Open...")
|
||||||
|
open.SetShortcut(qt.NewQKeySequence2("Ctrl+O"))
|
||||||
|
open.OnTriggered1(ret.handleFileOpen)
|
||||||
|
fileMenu.AddSeparator()
|
||||||
|
exit := fileMenu.AddAction("Exit")
|
||||||
|
exit.OnTriggered1(func() {
|
||||||
|
os.Exit(0)
|
||||||
|
})
|
||||||
|
|
||||||
|
helpMenu := mnu.AddMenuWithTitle("&Help")
|
||||||
|
aboutQt := helpMenu.AddAction("About Qt")
|
||||||
|
aboutQt.SetShortcut(qt.NewQKeySequence2("F1"))
|
||||||
|
aboutQt.OnTriggered1(func() {
|
||||||
|
qt.QApplication_AboutQt()
|
||||||
|
})
|
||||||
|
ret.w.SetMenuBar(mnu)
|
||||||
|
|
||||||
|
// Main widgets
|
||||||
|
|
||||||
|
ret.cw = qt.NewQWidget2(ret.w.QWidget)
|
||||||
|
ret.w.SetCentralWidget(ret.cw)
|
||||||
|
layout := qt.NewQHBoxLayout2(ret.cw)
|
||||||
|
|
||||||
|
panes := qt.NewQSplitter()
|
||||||
|
layout.AddWidget(panes.QWidget)
|
||||||
|
|
||||||
|
ret.outline = qt.NewQListWidget2(ret.cw)
|
||||||
|
panes.AddWidget(ret.outline.QWidget)
|
||||||
|
ret.outline.OnCurrentItemChanged(ret.handleJumpToBookmark)
|
||||||
|
|
||||||
|
ret.textArea = qt.NewQTextEdit3(ret.cw)
|
||||||
|
ret.textArea.OnTextChanged(ret.handleTextChanged)
|
||||||
|
ret.textArea.SetText(sampleContent)
|
||||||
|
panes.AddWidget(ret.textArea.QWidget)
|
||||||
|
|
||||||
|
panes.SetSizes([]int{250, 550})
|
||||||
|
|
||||||
|
return &ret
|
||||||
|
}
|
||||||
|
|
||||||
|
const lineNumberRole = 0x0100 // Qt::UserDataRole
|
||||||
|
|
||||||
|
func (a *AppWindow) handleFileOpen() {
|
||||||
|
fname := qt.QFileDialog_GetOpenFileName4(a.w.QWidget, "Open markdown file...", "", "Markdown files (*.md *.txt);;All Files (*)")
|
||||||
|
if fname == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
contents, err := ioutil.ReadFile(fname)
|
||||||
|
if err != nil {
|
||||||
|
qt.QMessageBox_Warning(a.w.QWidget, "Failed to open file", fmt.Sprintf("Opening file %q: %v", fname, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
a.textArea.SetText(string(contents))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppWindow) handleTextChanged() {
|
||||||
|
content := a.textArea.ToPlainText()
|
||||||
|
a.updateOutlineForContent(content)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppWindow) updateOutlineForContent(content string) {
|
||||||
|
a.outline.Clear()
|
||||||
|
|
||||||
|
lines := strings.Split(content, "\n")
|
||||||
|
|
||||||
|
for lineNumber, line := range lines {
|
||||||
|
if strings.HasPrefix(line, `#`) {
|
||||||
|
|
||||||
|
bookmark := qt.NewQListWidgetItem7(line, a.outline)
|
||||||
|
bookmark.SetData(lineNumberRole, qt.NewQVariant5(lineNumber))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppWindow) handleJumpToBookmark() {
|
||||||
|
itm := a.outline.CurrentItem()
|
||||||
|
if itm == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
lineNumber := itm.Data(lineNumberRole).ToInt()
|
||||||
|
|
||||||
|
targetBlock := a.textArea.Document().FindBlockByLineNumber(lineNumber)
|
||||||
|
a.textArea.SetTextCursor(qt.NewQTextCursor4(targetBlock))
|
||||||
|
|
||||||
|
a.textArea.SetFocus()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
qt.NewQApplication(os.Args)
|
||||||
|
|
||||||
|
app := NewAppWindow()
|
||||||
|
app.w.Show()
|
||||||
|
|
||||||
|
qt.QApplication_Exec()
|
||||||
|
}
|
BIN
examples/mdoutliner/mdoutliner.png
Normal file
BIN
examples/mdoutliner/mdoutliner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
Loading…
Reference in New Issue
Block a user