Skip to content

Instantly share code, notes, and snippets.

@daaku
Created May 15, 2025 18:05
Show Gist options
  • Save daaku/be2cd99b492cfc75ba1efe23ca56acd0 to your computer and use it in GitHub Desktop.
Save daaku/be2cd99b492cfc75ba1efe23ca56acd0 to your computer and use it in GitHub Desktop.
package main
import (
"runtime"
"github.com/progrium/darwinkit/macos/appkit"
"github.com/progrium/darwinkit/macos/foundation"
"github.com/progrium/darwinkit/objc"
)
const (
RowHeight = 20
)
type App struct {
app appkit.Application
}
func main() {
runtime.LockOSThread()
app := appkit.Application_SharedApplication()
tvApp := &App{app}
delegate := &appkit.ApplicationDelegate{}
delegate.SetApplicationDidFinishLaunching(func(foundation.Notification) {
tvApp.mainWindow()
})
delegate.SetApplicationWillFinishLaunching(func(foundation.Notification) {
tvApp.setMainMenu()
})
delegate.SetApplicationShouldTerminateAfterLastWindowClosed(func(appkit.Application) bool {
return true
})
app.SetDelegate(delegate)
app.Run()
}
func (a *App) mainWindow() {
w := appkit.NewWindowWithSize(300, 400)
objc.Retain(&w)
wd := &appkit.WindowDelegate{}
w.SetDelegate(wd)
w.SetTitle("Test table view")
tableView := appkit.NewTableView()
tableView.SetRowHeight(RowHeight)
tableView.SetTranslatesAutoresizingMaskIntoConstraints(false)
tableView.SetHeaderView(appkit.NewTableHeaderViewWithFrame(rectOf(0, 0, 0, RowHeight)))
tableView.SetGridStyleMask(appkit.TableViewSolidVerticalGridLineMask | appkit.TableViewSolidHorizontalGridLineMask)
tableView.SetStyle(appkit.TableViewStylePlain)
tableView.SetRowSizeStyle(appkit.TableViewRowSizeStyleDefault)
tableView.SetColumnAutoresizingStyle(appkit.TableViewUniformColumnAutoresizingStyle)
tableView.SetUsesAlternatingRowBackgroundColors(true)
tableView.SetStyle(appkit.TableViewStyleFullWidth)
tableView.SetTranslatesAutoresizingMaskIntoConstraints(false)
tableColumn1 := appkit.NewTableColumn().InitWithIdentifier("Column1")
tableColumn1.SetTitle("Test 1")
tableColumn1.SetWidth(100)
tableView.AddTableColumn(tableColumn1)
tableColumn2 := appkit.NewTableColumn().InitWithIdentifier("Column2")
tableColumn2.SetTitle("Test 2")
tableColumn2.SetWidth(100)
tableView.AddTableColumn(tableColumn2)
tableView.SetAllowsColumnSelection(true)
tableView.SetAutoresizingMask(appkit.ViewWidthSizable | appkit.ViewHeightSizable)
tds := &TableViewDataSource{
Data: []map[string]string{
{"Column1": "Value1", "Column2": "Value2"},
{"Column1": "Value3", "Column2": "Value4"},
}}
tdsP := objc.WrapAsProtocol("NSTableViewDataSource", any(tds))
objc.SetAssociatedObject(tableView, objc.AssociationKey("setDataSource"), tdsP, objc.ASSOCIATION_RETAIN)
objc.Call[objc.Void](tableView, objc.Sel("setDataSource:"), tdsP)
tsv := appkit.NewScrollView()
tsv.SetFrameSize(foundation.Size{Width: w.ContentView().Frame().Size.Width, Height: w.ContentView().Frame().Size.Height})
tsv.SetFrameOrigin(foundation.Point{X: w.ContentView().Frame().Origin.X, Y: w.ContentView().Frame().Origin.Y})
tsv.SetTranslatesAutoresizingMaskIntoConstraints(false)
tsv.SetDocumentView(tableView)
tsv.SetHasHorizontalScroller(true)
tsv.SetHasVerticalScroller(true)
tsv.SetAutohidesScrollers(true)
tsv.SetTranslatesAutoresizingMaskIntoConstraints(true)
tsv.SetAutoresizingMask(appkit.ViewWidthSizable | appkit.ViewHeightSizable)
w.ContentView().AddSubview(tsv)
w.ContentView().LeadingAnchor().ConstraintEqualToAnchorConstant(tsv.LeadingAnchor(), -10).SetActive(true)
w.ContentView().TopAnchor().ConstraintEqualToAnchorConstant(tsv.TopAnchor(), -10).SetActive(true)
w.ContentView().TrailingAnchor().ConstraintEqualToAnchorConstant(tsv.TrailingAnchor(), 10).SetActive(true)
w.ContentView().BottomAnchor().ConstraintEqualToAnchorConstant(tsv.BottomAnchor(), 10).SetActive(true)
w.Center()
w.MakeKeyAndOrderFront(nil)
a.app.SetActivationPolicy(appkit.ApplicationActivationPolicyRegular)
a.app.ActivateIgnoringOtherApps(true)
}
func (a *App) setMainMenu() {
menuBar := appkit.NewMenuWithTitle("Table View")
a.app.SetMainMenu(menuBar)
appMenuItem := appkit.NewMenuItemWithSelector("Table View", "", objc.Selector{})
appMenu := appkit.NewMenuWithTitle("Table View")
appMenu.AddItem(appkit.NewMenuItemWithAction("Quit", "q", func(sender objc.Object) { a.app.Terminate(nil) }))
appMenuItem.SetSubmenu(appMenu)
menuBar.AddItem(appMenuItem)
}
func rectOf(x, y, width, height float64) foundation.Rect {
return foundation.Rect{Origin: foundation.Point{X: x, Y: y}, Size: foundation.Size{Width: width, Height: height}}
}
type TableViewDataSource struct {
Data []map[string]string
}
func (t *TableViewDataSource) NumberOfRowsInTableView(tableView appkit.TableView) int {
return len(t.Data)
}
func (t *TableViewDataSource) TableViewObjectValueForTableColumnRow(tableView appkit.TableView, tableColumn appkit.TableColumn, row int) objc.Object {
return foundation.String_StringWithString(t.Data[row][string(tableColumn.Identifier())]).Object
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment