Categorygithub.com/codeation/impress
modulepackage
1.0.1
Repository: https://github.com/codeation/impress.git
Documentation: pkg.go.dev

# README

impress. Go GUI cross-platform library

PkgGoDev

See the project site for technical details and a library overview.

Some usage examples are in the examples folder.

Hello World Example

Let's say hello:

package main

import (
    "image"
    "image/color"

    "github.com/codeation/impress"
    "github.com/codeation/impress/event"

    _ "github.com/codeation/impress/duo"
)

func main() {
    app := impress.NewApplication(image.Rect(0, 0, 480, 240), "Hello World Application")
    defer app.Close()

    font := app.NewFont(15, map[string]string{"family": "Verdana"})
    defer font.Close()

    w := app.NewWindow(image.Rect(0, 0, 480, 240), color.RGBA{255, 255, 255, 255})
    defer w.Drop()

    w.Text("Hello, world!", font, image.Pt(200, 100), color.RGBA{0, 0, 0, 255})
    w.Line(image.Pt(200, 120), image.Pt(300, 120), color.RGBA{255, 0, 0, 255})
    w.Show()
    app.Sync()

    for {
        e := <-app.Chan()
        if e == event.DestroyEvent || e == event.KeyExit {
            break
        }
    }
}

See an explanation of the source code in a library overview.

To run this example on Debian/Ubuntu:

  1. Install gcc, make, pkg-config if you don't have them installed.

  2. Install GTK+ 3 libraries if you don't have them installed:

sudo apt-get install libgtk-3-dev
  1. Build impress terminal from source:
git clone https://github.com/codeation/it.git
cd it
make
cd ..
  1. Then run the example:
git clone https://github.com/codeation/impress.git
cd impress
IMPRESS_TERMINAL_PATH=../it/it go run ./examples/simple/

Steps 0-2 are needed to build an impress terminal binary. See the impress terminal page for other options for downloading or building the impress terminal.

Technical details

Basic Principles of Library Design:

  • Performance of the application as well as native applications.
  • Simple and clean application code.
  • Creating a GUI application without a form designer or hard-coded widgets.

The main idea is to stay away from the event-driven programming paradigm. See the "What's wrong with event-driven programming" page for more details.

The library uses a separate application (GTK+ 3 terminal) for drawing instead of binding a low-level library to Golang.

Project State

  • The project is currently in its beta stage. It is highly suitable for the development of in-house applications.
  • The project was tested on Debian 12.9 and macOS 15.3.
  • While the API remains stable, please note that the specific details may be subject to change.

The project roadmap includes both short-term and long-term project stages.

A cross-platform mind-map application is being developed to showcase the core principles of the library.

Contributing

First, welcome:

  • Any clue to keep the project going (star, post, link, etc.).
  • Any recommendations about library design principles.
  • Contributions to the project, documentation, examples.
  • Bug report, open an issue.
  • Or any help to fix grammatical or writing errors (PR or issue).

# Packages

Package to register WebAssembly driver as default impress driver.
No description provided by the author
No description provided by the author
Package to register GTK driver as default impress driver.
Package event defines various types of GUI events.
No description provided by the author
No description provided by the author

# Functions

MakeApplication creates the top application window for the specified GUI driver.
Register is an internal function that makes the GUI driver available.

# Variables

NewApplication creates the main application window for the default GUI driver.
NewFont returns a Font struct for the default GUI driver.
NewImage returns an Image struct containing the image resources for the default GUI driver.

# Structs

Application represents the top-level window of the application.
Font represents a font selection.
Frame represents a GUI frame.
Image represents a drawable image.
Menu represents any menu node.
Window represents an inner window.