141 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package stone
 | |
| 
 | |
| import "image"
 | |
| 
 | |
| // Application represents an application.
 | |
| type Application struct {
 | |
| 	DamageBuffer
 | |
| 	
 | |
| 	title string
 | |
| 	icons []image.Image
 | |
| 	backend Backend
 | |
| 	config Config
 | |
| 	callbackManager CallbackManager
 | |
| }
 | |
| 
 | |
| // Run initializes the application, starts it, and then returns a channel that
 | |
| // broadcasts events. If no suitable backend can be found, an error is returned.
 | |
| func (application *Application) Run () (
 | |
| 	err     error,
 | |
| ) {
 | |
| 	// default values for certain parameters
 | |
| 	width, height := application.Size()
 | |
| 	if width  < 1 { width  = 80 }
 | |
| 	if height < 1 { height = 20 }
 | |
| 	application.DamageBuffer.SetSize(width, height)
 | |
| 
 | |
| 	application.config.load()
 | |
| 
 | |
| 	application.backend, err = instantiateBackend(application)
 | |
| 	if err != nil { return }
 | |
| 	
 | |
| 	application.backend.Run()
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // OnQuit registers an event handler to be called just before the application
 | |
| // quits. This can happen when the user closes the application, or the backend
 | |
| // experiences an unrecoverable error.
 | |
| func (application *Application) OnQuit (
 | |
| 	onQuit func (),
 | |
| ) {
 | |
| 	application.callbackManager.onQuit = onQuit
 | |
| }
 | |
| 
 | |
| // OnPress registers an event handler to be called when a key or mouse button
 | |
| // is pressed.
 | |
| func (application *Application) OnPress (
 | |
| 	onPress func (button Button, modifiers Modifiers),
 | |
| ) {
 | |
| 	application.callbackManager.onPress = onPress
 | |
| }
 | |
| 
 | |
| // OnPress registers an event handler to be called when a key or mouse button
 | |
| // is released.
 | |
| func (application *Application) OnRelease (
 | |
| 	onRelease func (button Button),
 | |
| ) {
 | |
| 	application.callbackManager.onRelease = onRelease
 | |
| }
 | |
| 
 | |
| // OnResize registers an event handler to be called when the application window
 | |
| // is resized. After the event handler is called, any updates it makes will
 | |
| // automatically be pushed to the screen.
 | |
| func (application *Application) OnResize (
 | |
| 	onResize func (),
 | |
| ) {
 | |
| 	application.callbackManager.onResize = onResize
 | |
| }
 | |
| 
 | |
| // OnMouseMove registers an event handler to be called when mouse motion is
 | |
| // detected. The coordinates of the cell that the mouse now hovers over are
 | |
| // given as input.
 | |
| func (application *Application) OnMouseMove (
 | |
| 	onMouseMove func (x, y int),
 | |
| ) {
 | |
| 	application.callbackManager.onMouseMove = onMouseMove
 | |
| }
 | |
| 
 | |
| // OnScroll registers an event handler to be called when the user uses the mouse
 | |
| // scroll wheel. Horizontal and vertical amounts are given as input.
 | |
| func (application *Application) OnScroll (
 | |
| 	onScroll func (x, y int),
 | |
| ) {
 | |
| 	application.callbackManager.onScroll = onScroll
 | |
| }
 | |
| 
 | |
| // OnStart registers an event handler to be called once when the application
 | |
| // starts, right before the first time updates are pushed to the screen.
 | |
| // Anything done in here will be the first thing to appear on screen.
 | |
| func (application *Application) OnStart (
 | |
| 	onStart func (),
 | |
| ) {
 | |
| 	application.callbackManager.onStart = onStart
 | |
| }
 | |
| 
 | |
| // Draw "commits" changes made in the buffer to the display.
 | |
| func (application *Application) Draw () {
 | |
| 	application.backend.Draw()
 | |
| }
 | |
| 
 | |
| // SetTitle sets the application's title. If in a window, it will appear as the
 | |
| // window's name.
 | |
| func (application *Application) SetTitle (title string) (err error) {
 | |
| 	application.title = title
 | |
| 	if application.backend != nil {
 | |
| 		err = application.backend.SetTitle(title)
 | |
| 	}
 | |
| 
 | |
| 	return 
 | |
| }
 | |
| 
 | |
| // Title returns the application's title.
 | |
| func (application *Application) Title () (title string) {
 | |
| 	title = application.title
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // SetIcon takes in a list of different sizes of an icon, and sets it as the
 | |
| // application's icon.
 | |
| func (application *Application) SetIcon (sizes []image.Image) (err error) {
 | |
| 	application.icons = sizes
 | |
| 	if application.backend != nil {
 | |
| 		err = application.backend.SetIcon(sizes)
 | |
| 	}
 | |
| 
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // Icon returns all available sizes of the application's icon. If there is no
 | |
| // icon, nil is returned.
 | |
| func (application *Application) Icon () (sizes []image.Image) {
 | |
| 	sizes = application.icons
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // Config returns a pointer to the application's configuration.
 | |
| func (application *Application) Config () (config *Config) {
 | |
| 	config = &application.config
 | |
| 	return
 | |
| }
 |