diff --git a/META6.json b/META6.json index 813ad33..9d9a441 100644 --- a/META6.json +++ b/META6.json @@ -1,84 +1,91 @@ { - "name": "GTK::Simple", - "description": "Simple GTK 3 binding using NativeCall", - "version": "0.3.0", - "perl": "6.d", - "authors": [ - "Jonathan Worthington", - "Moritz Lenz", - "Timo Paulssen", - "Ahmad M. Zawawi", - "Jonathan Stowe", - "ab5tract", - "momozor", - "Zoffix Znet", - "Nick Logan", - "finanalyst aka Richard Hainsworth" - ], - "auth": "zef:finanalyst", - "depends": [], - "test-depends": [ - "Test" - ], - "provides": { - "GTK::Simple": "lib/GTK/Simple.rakumod", - "GTK::Simple::ActionBar": "lib/GTK/Simple/ActionBar.rakumod", - "GTK::Simple::App": "lib/GTK/Simple/App.rakumod", - "GTK::Simple::Box": "lib/GTK/Simple/Box.rakumod", - "GTK::Simple::Button": "lib/GTK/Simple/Button.rakumod", - "GTK::Simple::Calendar": "lib/GTK/Simple/Calendar.rakumod", - "GTK::Simple::CheckButton": "lib/GTK/Simple/CheckButton.rakumod", - "GTK::Simple::CheckMenuItem": "lib/GTK/Simple/CheckMenuItem.rakumod", - "GTK::Simple::ComboBoxText": "lib/GTK/Simple/ComboBoxText.rakumod", - "GTK::Simple::Common": "lib/GTK/Simple/Common.rakumod", - "GTK::Simple::ConnectionHandler": "lib/GTK/Simple/ConnectionHandler.rakumod", - "GTK::Simple::Container": "lib/GTK/Simple/Container.rakumod", - "GTK::Simple::DrawingArea": "lib/GTK/Simple/DrawingArea.rakumod", - "GTK::Simple::Entry": "lib/GTK/Simple/Entry.rakumod", - "GTK::Simple::FileChooserButton": "lib/GTK/Simple/FileChooserButton.rakumod", - "GTK::Simple::Frame": "lib/GTK/Simple/Frame.rakumod", - "GTK::Simple::GDK": "lib/GTK/Simple/GDK.rakumod", - "GTK::Simple::Grid": "lib/GTK/Simple/Grid.rakumod", - "GTK::Simple::HBox": "lib/GTK/Simple/HBox.rakumod", - "GTK::Simple::Label": "lib/GTK/Simple/Label.rakumod", - "GTK::Simple::LevelBar": "lib/GTK/Simple/LevelBar.rakumod", - "GTK::Simple::LinkButton": "lib/GTK/Simple/LinkButton.rakumod", - "GTK::Simple::ListBox": "lib/GTK/Simple/ListBox.rakumod", - "GTK::Simple::MarkUpLabel": "lib/GTK/Simple/MarkUpLabel.rakumod", - "GTK::Simple::Menu": "lib/GTK/Simple/Menu.rakumod", - "GTK::Simple::MenuBar": "lib/GTK/Simple/MenuBar.rakumod", - "GTK::Simple::MenuItem": "lib/GTK/Simple/MenuItem.rakumod", - "GTK::Simple::MenuToolButton": "lib/GTK/Simple/MenuToolButton.rakumod", - "GTK::Simple::NativeLib": "lib/GTK/Simple/NativeLib.rakumod", - "GTK::Simple::PlacesSidebar": "lib/GTK/Simple/PlacesSidebar.rakumod", - "GTK::Simple::ProgressBar": "lib/GTK/Simple/ProgressBar.rakumod", - "GTK::Simple::PropertyFacade": "lib/GTK/Simple/PropertyFacade.rakumod", - "GTK::Simple::RadioButton": "lib/GTK/Simple/RadioButton.rakumod", - "GTK::Simple::Raw": "lib/GTK/Simple/Raw.rakumod", - "GTK::Simple::Scale": "lib/GTK/Simple/Scale.rakumod", - "GTK::Simple::Scheduler": "lib/GTK/Simple/Scheduler.rakumod", - "GTK::Simple::ScrolledWindow": "lib/GTK/Simple/ScrolledWindow.rakumod", - "GTK::Simple::Separator": "lib/GTK/Simple/Separator.rakumod", - "GTK::Simple::Spinner": "lib/GTK/Simple/Spinner.rakumod", - "GTK::Simple::StatusBar": "lib/GTK/Simple/StatusBar.rakumod", - "GTK::Simple::Switch": "lib/GTK/Simple/Switch.rakumod", - "GTK::Simple::TextView": "lib/GTK/Simple/TextView.rakumod", - "GTK::Simple::ToggleButton": "lib/GTK/Simple/ToggleButton.rakumod", - "GTK::Simple::Toolbar": "lib/GTK/Simple/Toolbar.rakumod", - "GTK::Simple::VBox": "lib/GTK/Simple/VBox.rakumod", - "GTK::Simple::Widget": "lib/GTK/Simple/Widget.rakumod", - "GTK::Simple::Window": "lib/GTK/Simple/Window.rakumod" - }, - "resources": [], - "support": { - "bugtracker": "https://github.com/finanalyst/GTK-Simple/issues", - "email": "rnhainsworth@gmail.com", - "source": "https://github.com/finanalyst/GTK-Simple.git" - }, - "license": "Artistic-2.0", - "tags": [ - "gui" - ], - "source-url": "git://github.com/finanalyst/GTK-Simple.git", - "repo-type": "git" + "name": "GTK::Simple", + "description": "Simple GTK 3 binding using NativeCall", + "version": "0.3.2", + "authors": [ + "Jonathan Worthington", + "Moritz Lenz", + "Timo Paulssen", + "Ahmad M. Zawawi", + "Jonathan Stowe", + "ab5tract", + "momozor", + "Zoffix Znet", + "Nick Logan", + "finanalyst aka Richard Hainsworth" + ], + "auth": "zef:finanalyst", + "depends": { + "by-kernel.name": { + "macos": "MacOS::NativeLib:ver<0.0.5>:auth", + "": "" + } + }, + "test-depends": [ + "Test" + ], + "provides": { + "GTK::Simple": "lib/GTK/Simple.rakumod", + "GTK::Simple::ActionBar": "lib/GTK/Simple/ActionBar.rakumod", + "GTK::Simple::App": "lib/GTK/Simple/App.rakumod", + "GTK::Simple::Box": "lib/GTK/Simple/Box.rakumod", + "GTK::Simple::Button": "lib/GTK/Simple/Button.rakumod", + "GTK::Simple::Calendar": "lib/GTK/Simple/Calendar.rakumod", + "GTK::Simple::CheckButton": "lib/GTK/Simple/CheckButton.rakumod", + "GTK::Simple::CheckMenuItem": "lib/GTK/Simple/CheckMenuItem.rakumod", + "GTK::Simple::ComboBoxText": "lib/GTK/Simple/ComboBoxText.rakumod", + "GTK::Simple::Common": "lib/GTK/Simple/Common.rakumod", + "GTK::Simple::ConnectionHandler": "lib/GTK/Simple/ConnectionHandler.rakumod", + "GTK::Simple::Container": "lib/GTK/Simple/Container.rakumod", + "GTK::Simple::DrawingArea": "lib/GTK/Simple/DrawingArea.rakumod", + "GTK::Simple::Entry": "lib/GTK/Simple/Entry.rakumod", + "GTK::Simple::FileChooserButton": "lib/GTK/Simple/FileChooserButton.rakumod", + "GTK::Simple::Frame": "lib/GTK/Simple/Frame.rakumod", + "GTK::Simple::GDK": "lib/GTK/Simple/GDK.rakumod", + "GTK::Simple::Grid": "lib/GTK/Simple/Grid.rakumod", + "GTK::Simple::HBox": "lib/GTK/Simple/HBox.rakumod", + "GTK::Simple::Image": "lib/GTK/Simple/Image.rakumod", + "GTK::Simple::Label": "lib/GTK/Simple/Label.rakumod", + "GTK::Simple::LevelBar": "lib/GTK/Simple/LevelBar.rakumod", + "GTK::Simple::LinkButton": "lib/GTK/Simple/LinkButton.rakumod", + "GTK::Simple::ListBox": "lib/GTK/Simple/ListBox.rakumod", + "GTK::Simple::MarkUpLabel": "lib/GTK/Simple/MarkUpLabel.rakumod", + "GTK::Simple::Menu": "lib/GTK/Simple/Menu.rakumod", + "GTK::Simple::MenuBar": "lib/GTK/Simple/MenuBar.rakumod", + "GTK::Simple::MenuItem": "lib/GTK/Simple/MenuItem.rakumod", + "GTK::Simple::MenuToolButton": "lib/GTK/Simple/MenuToolButton.rakumod", + "GTK::Simple::NativeLib": "lib/GTK/Simple/NativeLib.rakumod", + "GTK::Simple::PlacesSidebar": "lib/GTK/Simple/PlacesSidebar.rakumod", + "GTK::Simple::ProgressBar": "lib/GTK/Simple/ProgressBar.rakumod", + "GTK::Simple::PropertyFacade": "lib/GTK/Simple/PropertyFacade.rakumod", + "GTK::Simple::RadioButton": "lib/GTK/Simple/RadioButton.rakumod", + "GTK::Simple::Raw": "lib/GTK/Simple/Raw.rakumod", + "GTK::Simple::Scale": "lib/GTK/Simple/Scale.rakumod", + "GTK::Simple::Scheduler": "lib/GTK/Simple/Scheduler.rakumod", + "GTK::Simple::ScrolledWindow": "lib/GTK/Simple/ScrolledWindow.rakumod", + "GTK::Simple::Separator": "lib/GTK/Simple/Separator.rakumod", + "GTK::Simple::Spinner": "lib/GTK/Simple/Spinner.rakumod", + "GTK::Simple::StatusBar": "lib/GTK/Simple/StatusBar.rakumod", + "GTK::Simple::Switch": "lib/GTK/Simple/Switch.rakumod", + "GTK::Simple::TextView": "lib/GTK/Simple/TextView.rakumod", + "GTK::Simple::ToggleButton": "lib/GTK/Simple/ToggleButton.rakumod", + "GTK::Simple::Toolbar": "lib/GTK/Simple/Toolbar.rakumod", + "GTK::Simple::VBox": "lib/GTK/Simple/VBox.rakumod", + "GTK::Simple::Widget": "lib/GTK/Simple/Widget.rakumod", + "GTK::Simple::Window": "lib/GTK/Simple/Window.rakumod", + "GTK::Simple::Distro::Resources": "lib/GTK/Simple/Distro/Resources.rakumod" + }, + "resources": [ + "camelia-logo.png" + ], + "support": { + "email": "rnhainsworth@gmail.com", + "bugtracker": "https://github.com/finanalyst/GTK-Simple/issues", + "source": "https://github.com/finanalyst/GTK-Simple.git" + }, + "license": "Artistic-2.0", + "tags": [ + "gui" + ], + "source-url": "git://github.com/finanalyst/GTK-Simple.git" } \ No newline at end of file diff --git a/README.md b/README.md index 42a60f3..14ff905 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ 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 +Image | An image widget Label | Adds a line of text LevelBar | A bar that can used as a level indicator LinkButton | Create buttons bound to a URL diff --git a/examples/22-image.raku b/examples/22-image.raku new file mode 100644 index 0000000..bf4cf29 --- /dev/null +++ b/examples/22-image.raku @@ -0,0 +1,17 @@ +use v6.e.PREVIEW; + +use lib 'lib'; +use GTK::Simple::App; +use GTK::Simple::Image; +use GTK::Simple::VBox; +use GTK::Simple::Distro::Resources; + +my $app = GTK::Simple::App.new(:title("Image Demo"), :1024width, :768height); + +my $logo-path = $*TMPDIR.add("camelia-logo.png"); +$logo-path.spurt: gtk-simple-resources.slurp(:bin, :close); + +$app.set-content: + GTK::Simple::Image.new: :path($logo-path.absolute); + +$app.run; \ No newline at end of file diff --git a/lib/GTK/Simple.rakumod b/lib/GTK/Simple.rakumod index 13fb68e..2624158 100644 --- a/lib/GTK/Simple.rakumod +++ b/lib/GTK/Simple.rakumod @@ -44,6 +44,7 @@ need GTK::Simple::ScrolledWindow; need GTK::Simple::Calendar; need GTK::Simple::ListBox; need GTK::Simple::CheckMenuItem; +need GTK::Simple::Image; # Exports above class constructors, ex. level-bar => GTK::Simple::LevelBar.new my module EXPORT::subs { diff --git a/lib/GTK/Simple/Distro/Resources.rakumod b/lib/GTK/Simple/Distro/Resources.rakumod new file mode 100644 index 0000000..90ea2ff --- /dev/null +++ b/lib/GTK/Simple/Distro/Resources.rakumod @@ -0,0 +1,7 @@ +use v6.d; + +unit module GTK::Simple::Distro::Resources; + +sub term:() is export { + %?RESOURCES +} diff --git a/lib/GTK/Simple/Image.rakumod b/lib/GTK/Simple/Image.rakumod new file mode 100644 index 0000000..c592728 --- /dev/null +++ b/lib/GTK/Simple/Image.rakumod @@ -0,0 +1,15 @@ +use v6.d; + +use GTK::Simple::Raw :image; +use GTK::Simple::GDK; +use GTK::Simple::Common; +use GTK::Simple::Widget; + +unit class GTK::Simple::Image does GTK::Simple::Widget; + +submethod BUILD(Str :$path, Int :$width = 800, Int :$height = 600) { +# die "Image file '$path' does not exist or could not be accessed" unless $path.IO.e; +# note "Attempting to load image file {$path.IO.absolute} (exists? {$path.IO.e}"; + my $pixbuf = gdk_pixbuf_new_from_file_at_size($path.IO.absolute, $width, $height, my GError $err); + $!gtk_widget = gtk_image_new_from_pixbuf($pixbuf); +} \ No newline at end of file diff --git a/lib/GTK/Simple/NativeLib.rakumod b/lib/GTK/Simple/NativeLib.rakumod index 770017d..7c6af86 100644 --- a/lib/GTK/Simple/NativeLib.rakumod +++ b/lib/GTK/Simple/NativeLib.rakumod @@ -36,6 +36,7 @@ sub gtk-lib is export { try load-pangowin32-lib; $lib = find-bundled('libgtk-3-0.dll'); } else { + try 'use MacOS::NativeLib '.EVAL; $lib = $*VM.platform-library-name('gtk-3'.IO).Str; } } @@ -57,6 +58,7 @@ sub gdk-lib is export { try load-pangocairo-lib; $lib = find-bundled('libgdk-3-0.dll'); } else { + try 'use MacOS::NativeLib '.EVAL; $lib = $*VM.platform-library-name('gdk-3'.IO).Str; } } @@ -70,6 +72,7 @@ sub glib-lib is export { try load-intl-lib; $lib = find-bundled('libglib-2.0-0.dll'); } else { + try 'use MacOS::NativeLib '.EVAL; $lib = $*VM.platform-library-name('glib-2.0'.IO).Str; } } @@ -84,6 +87,7 @@ sub gobject-lib is export { try load-ffi-lib; $lib = find-bundled('libgobject-2.0-0.dll'); } else { + try 'use MacOS::NativeLib '.EVAL; $lib = $*VM.platform-library-name('gobject-2.0'.IO).Str; } } diff --git a/lib/GTK/Simple/Raw.rakumod b/lib/GTK/Simple/Raw.rakumod index 7a73efc..53c10c7 100644 --- a/lib/GTK/Simple/Raw.rakumod +++ b/lib/GTK/Simple/Raw.rakumod @@ -1263,4 +1263,41 @@ sub gtk_list_box_row_is_selected(GtkWidget $row) sub gtk_list_box_row_changed(GtkWidget $row) is native(>k-lib) is export(:list-box-row) - { * } \ No newline at end of file + { * } + +## Image +## These could live in GDK, but then we would need to import the GDK module into this one +class GError is repr('CPointer') is export(:image) {} +class GdkPixbuf is repr('CPointer') is export(:image) {} + +sub gdk_pixbuf_new_from_file(Str $file-path, GError $error) + returns GdkPixbuf + is native(&gdk-lib) + is export(:image) + { * } + +sub gdk_pixbuf_new_from_file_at_size(Str $file-path, int32 $width, int32 $height, GError $error) + returns GdkPixbuf + is native(&gdk-lib) + is export(:image) + { * } + + +sub gtk_image_new_from_file(Str $file-path) + returns GtkWidget + is native(>k-lib) + is export(:image) + { * } + +sub gtk_image_new_from_resource(Str $resource-path) + returns GtkWidget + is native(>k-lib) + is export(:image) + { * } + +sub gtk_image_new_from_pixbuf(GdkPixbuf $pixbuf) + returns GtkWidget + is native(>k-lib) + is export(:image) + { * } + diff --git a/resources/camelia-logo.png b/resources/camelia-logo.png new file mode 100644 index 0000000..a239a74 Binary files /dev/null and b/resources/camelia-logo.png differ diff --git a/t/02-export-subs.rakutest b/t/02-export-subs.rakutest index 30cda4a..2b409d1 100644 --- a/t/02-export-subs.rakutest +++ b/t/02-export-subs.rakutest @@ -22,7 +22,7 @@ if %*ENV or $*DISTRO.is-win { next if skip-test($sub-name); my $widget; - lives-ok { $widget = ::{$sub-name}(:label("For Button(s)"), :uri("For LinkButton")) }, + lives-ok { $widget = ::{$sub-name}(:label("For Button(s)"), :uri("For LinkButton"), :path("/for/image.png")) }, "There is a subroutine in scope called '$sub-name'"; ok $widget ~~ $class, "'$sub-name' returns a { $class.^name } object"; }