cutego/internal/examples/widgets/dropsite/dropsite.go

205 lines
4.8 KiB
Go
Raw Normal View History

//source: http://doc.qt.io/qt-5/qtwidgets-draganddrop-dropsite-example.html
package main
import (
"fmt"
"os"
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/gui"
"github.com/therecipe/qt/widgets"
)
type DropSiteWindow struct {
widgets.QWidget
2016-10-30 00:28:13 +03:00
_ func(mimeData *core.QMimeData) `slot:"updateFormatsTable"`
}
func main() {
widgets.NewQApplication(len(os.Args), os.Args)
var window = NewDropSiteWindow(nil, 0)
var abstractLabel = widgets.NewQLabel2("This example accepts drags from other applications and displays the MIME types provided by the drag object.", nil, 0)
abstractLabel.SetWordWrap(true)
abstractLabel.AdjustSize()
var dropArea = initDropArea()
dropArea.ConnectChanged(func(mimeData *core.QMimeData) { window.UpdateFormatsTable(mimeData) })
var formatsTable = widgets.NewQTableWidget(nil)
formatsTable.SetColumnCount(2)
formatsTable.SetEditTriggers(widgets.QAbstractItemView__NoEditTriggers)
formatsTable.SetHorizontalHeaderLabels([]string{"Format", "Content"})
formatsTable.HorizontalHeader().SetStretchLastSection(true)
window.ConnectUpdateFormatsTable(func(mimeData *core.QMimeData) {
formatsTable.SetRowCount(0)
if mimeData == nil {
return
}
for _, format := range mimeData.Formats() {
var formatItem = widgets.NewQTableWidgetItem2(format, 0)
formatItem.SetFlags(core.Qt__ItemIsEnabled)
formatItem.SetTextAlignment(int(core.Qt__AlignTop | core.Qt__AlignLeft))
var text string
switch format {
case "text/plain":
{
text = mimeData.Text()
}
case "text/html":
{
text = mimeData.Html()
}
case "text/uri-list":
{
2016-11-16 01:07:05 +03:00
var urlList = mimeData.Urls()
for i := 0; i < len(urlList) && i < 32; i++ {
text += urlList[i].ToString(0) + " "
}
}
default:
{
var data = []byte(mimeData.Data(format).ConstData())
text = fmt.Sprintf("len %v: %v", len(data), data)
}
}
var row = formatsTable.RowCount()
formatsTable.InsertRow(row)
formatsTable.SetItem(row, 0, widgets.NewQTableWidgetItem2(format, 0))
formatsTable.SetItem(row, 1, widgets.NewQTableWidgetItem2(text, 0))
}
formatsTable.ResizeColumnToContents(0)
})
var (
clearButton = widgets.NewQPushButton2("Clear", nil)
quitButton = widgets.NewQPushButton2("Quit", nil)
buttonBox = widgets.NewQDialogButtonBox(nil)
)
buttonBox.AddButton(clearButton, widgets.QDialogButtonBox__ActionRole)
buttonBox.AddButton(quitButton, widgets.QDialogButtonBox__RejectRole)
quitButton.ConnectPressed(func() { window.Close() })
clearButton.ConnectPressed(func() {
dropArea.Clear()
formatsTable.ClearContents()
formatsTable.SetRowCount(0)
})
var mainLayout = widgets.NewQVBoxLayout()
mainLayout.AddWidget(abstractLabel, 0, 0)
mainLayout.AddWidget(dropArea, 0, 0)
mainLayout.AddWidget(formatsTable, 0, 0)
mainLayout.AddWidget(buttonBox, 0, 0)
window.SetLayout(mainLayout)
window.SetWindowTitle("Drop Site")
window.SetMinimumSize2(350, 500)
window.Show()
widgets.QApplication_Exec()
}
type DropArea struct {
widgets.QLabel
2016-10-30 00:28:13 +03:00
_ func(mimeData *core.QMimeData) `signal:"changed"`
}
func initDropArea() *DropArea {
var dropArea = NewDropArea(nil, 0)
dropArea.SetMinimumSize2(200, 200)
dropArea.SetFrameStyle(int(widgets.QFrame__Sunken) | int(widgets.QFrame__StyledPanel))
dropArea.SetAlignment(core.Qt__AlignCenter)
dropArea.SetAcceptDrops(true)
dropArea.SetAutoFillBackground(true)
dropArea.Clear()
dropArea.ConnectDragEnterEvent(func(e *gui.QDragEnterEvent) {
dropArea.SetText("<drop content>")
dropArea.SetBackgroundRole(gui.QPalette__Highlight)
e.AcceptProposedAction()
dropArea.Changed(e.MimeData())
})
dropArea.ConnectDragMoveEvent(func(e *gui.QDragMoveEvent) {
e.AcceptProposedAction()
})
dropArea.ConnectDropEvent(func(e *gui.QDropEvent) {
var mimeData = e.MimeData()
switch {
case mimeData.HasImage():
{
2016-11-13 21:09:06 +03:00
dropArea.SetPixmap(gui.QPixmap_FromImage(gui.NewQImageFromPointer(mimeData.ImageData().ToImage()), 0))
}
case mimeData.HasHtml():
{
dropArea.SetText(mimeData.Html())
dropArea.SetTextFormat(core.Qt__RichText)
}
2016-11-16 01:07:05 +03:00
case mimeData.HasUrls():
{
2016-11-16 01:07:05 +03:00
var (
urlList = mimeData.Urls()
text string
)
for i := 0; i < len(urlList) && i < 32; i++ {
text += urlList[i].Path(0) + "\n"
}
dropArea.SetText(text)
}
2016-11-16 01:07:05 +03:00
case mimeData.HasText():
{
dropArea.SetText(mimeData.Text())
dropArea.SetTextFormat(core.Qt__PlainText)
}
default:
{
dropArea.SetText("can't display data")
}
}
dropArea.SetBackgroundRole(gui.QPalette__Dark)
e.AcceptProposedAction()
})
dropArea.ConnectDragLeaveEvent(func(e *gui.QDragLeaveEvent) {
dropArea.Clear()
e.Accept()
})
dropArea.ConnectClear(func() {
dropArea.SetText("<drop content>")
dropArea.SetBackgroundRole(gui.QPalette__Dark)
dropArea.Changed(nil)
})
return dropArea
}