UNPKG

nihilqui

Version:

Typescript .d.ts generator from GIR for gjs and node-gtk

127 lines (105 loc) 3.74 kB
// This example is based on https://github.com/romgrk/node-gtk/blob/master/examples/gtk-4-custom-widget.js // TODO? https://github.com/romgrk/node-gtk/issues/341 import gi from './@types/node-gtk.js'; import GLib from './@types/node-glib-2.0.js'; import Gtk from './@types/node-gtk-4.0.js'; import Gdk from './@types/node-gdk-4.0.js'; import Graphene from './@types/node-graphene-1.0.js'; Gtk.init() console.log('Init Gtk DONE') /* Define our custom widget */ class CustomWidget extends Gtk.Widget { customMethod() { console.log("Hello from CustomWidget.customMethod") } measure(orientation: Gtk.Orientation, forSize: number) { const [minWidth, natWidth] = [100, 200] const [minHeight, natHeight] = [20, 40] const isHorizontal = orientation === Gtk.Orientation.HORIZONTAL const minimum = isHorizontal ? minWidth : minHeight const natural = isHorizontal ? natWidth : natHeight const minimumBaseline = !isHorizontal ? minWidth : minHeight const naturalBaseline = !isHorizontal ? natWidth : natHeight return [minimum, natural, minimumBaseline, naturalBaseline] as [number, number, number, number] } snapshot(snapshot: Gtk.Snapshot) { const width = this.getAllocatedWidth() const color = Gdk.RGBA.create('red') const rect = Graphene.Rect.create(10, 10, width / 2, 10) snapshot.appendColor(color, rect) } } gi.registerClass(CustomWidget) console.log('registerClass DONE') /* Setup & start the application */ const loop = new GLib.MainLoop(null, false) const app = new Gtk.Application('com.github.romgrk.node-gtk.demo', 0) app.on('activate', onActivate) const status = app.run([]) console.log('Finished with status:', status) /* Event handlers */ function onActivate() { console.log('onActivate...') const window = new Gtk.ApplicationWindow(app) window.setTitle('Window') window.setDefaultSize(200, 200) window.on('close-request', onQuit) const ui = getUI() const builder = Gtk.Builder.newFromString(ui, ui.length) const root = builder.getObject('root') as Gtk.Box console.log('getObject root:', root) const custom = new CustomWidget() root.append(custom) const actionButton = builder.getObject('actionButton') as Gtk.Button actionButton?.on('clicked', () => { console.log('actionButton clicked...') custom.customMethod() }) const closeButton = builder.getObject('closeButton') as Gtk.Button closeButton?.on('clicked', () => { console.log('closeButton clicked...') window.close() }) window.setChild(root) window.present() console.log('startLoop...') gi.startLoop() loop.run() console.log('startLoop DONE') } function onQuit() { console.log('onQuit...') loop.quit() app.quit() console.log('onQuit DONE') return false } function getUI() { return ` <?xml version="1.0" encoding="UTF-8"?> <interface> <requires lib="gtk" version="4.0"/> <object class="GtkBox" id="root"> <property name="orientation">vertical</property> <child> <object class="GtkLabel" id="helloLabel"> <property name="vexpand">1</property> <property name="label">Hello World!</property> </object> </child> <child> <object class="GtkButton" id="actionButton"> <property name="label" translatable="yes">Action</property> <property name="receives_default">1</property> </object> </child> <child> <object class="GtkButton" id="closeButton"> <property name="label" translatable="yes">Close</property> <property name="receives_default">1</property> </object> </child> </object> </interface> ` }