Skip to content

finanalyst/GTK-Simple

Repository files navigation

badge

GTK::Simple

GTK::Simple is a set of simple GTK 3 bindings using NativeCall. Only some GTK widgets are currently implemented. However, these are enough to create a reasonable interactive GUI for an idiomatic Raku program.

The GTK Widgets in this distribution include the following:

Widget Description
ActionBar Group multiple buttons and arrange in 'left', 'middle', and 'right'
Button A simple button with a label and a callback
Calendar A calendar for selecting a date
CheckButton A check button with a label
CheckMenuItem A checkable menu item
ComboBoxText A simple combo box
DrawingArea A drawing area (requires the 'Cairo' module)
Entry Allows for text to be provided by the user
FileChooserButton A button that opens a file chooser dialog
Frame A bin with a decorative frame and optional label
Grid A table-like container for widgets for window design
Label Adds a line of text
LevelBar A bar that can used as a level indicator
LinkButton Create buttons bound to a URL
ListBox A vertical listbox where each row is selectable
MarkUpLabel Adds text with GTK mark up (e.g. color and font manipulation)
Menu A simple menu with a menu item label
MenuBar A simple menu bar that contain one or more menus
MenuItem A simple menu item that can have a sub menu
MenuToolButton A menu tool button with a label or an icon
PlacesSidebar Sidebar that displays frequently-used places in the file system
ProgressBar Show progress via a filling bar
Scale Allows for a number to be provided by the user
ScrolledWindow Container for widgets needing scrolling, eg., multiline texts
RadioButton A choice from multiple radio buttons
Spinner Showing that something is happening
TextView Adds multiple lines of text
ToggleButton A toggle-able button
Toolbar A tool bar that can contain one or more menu tool buttons
VBox, HBox Widget containers which enable window layout design

Example

use GTK::Simple;

my $app = GTK::Simple::App.new( title => "Hello GTK!" );

$app.set-content(
    GTK::Simple::VBox.new(
        my $button = GTK::Simple::Button.new(label => "Hello World!"),
        my $second = GTK::Simple::Button.new(label => "Goodbye!")
    )
);

$app.border-width = 20;
$second.sensitive = False;
$button.clicked.tap({ .sensitive = False; $second.sensitive = True });
$second.clicked.tap({ $app.exit; });
$app.run;

Using :subs option

Another approach is to specify :subs on import. This provides subroutine aliases for the constructors of all of the available GTK::Simple widgets, converted from CamelCase to kebab-case.

GTK::Simple::MenuToolButton becomes menu-tool-button, GTK::Simple::ProgressBar becomes progress-bar, etc.

The above example can be equivalently written as:

use GTK::Simple :subs;

my $app = app(title => "Hello GTK!");

$app.set-content(
    v-box(
        my $button1 = button(label => "Hello World"),
        my $button2 = button(label => "Goodbye!")
    )
);

# ...

Further examples

The first four examples were written as mini tutorials to show how the system works:

For more examples, please see the examples/ folder.

Limitations

The full functionality of GTK 3 is not available in this module.

Prerequisites

This module requires the GTK3 library to be installed. Please follow the instructions below based on your platform:

Debian Linux

sudo apt-get install libgtk-3-dev

Mac OS X

brew update
brew install gtk+3

Windows

The GTK team describes how to do this for Windows at Setting up GTK for Window

Installation and sanity tests

Use the zef package manager

$ zef install GTK::Simple

Author

Jonathan Worthington, jnthn on #raku, https://github.com/jnthn/

Contributors

The Raku team

License

The Artistic License 2.0