Skip to content

Commit

Permalink
Version 4.17.2.3 changes:
Browse files Browse the repository at this point in the history
- Maintain image file path upon scaling an ImageProxy
- Add a glimmer rake task that wraps the juwelier rake gemspec:generate task
- Accept `ImageProxy` as arg for `image` and `background_image` property methods
- (EXPERIMENTAL) Animate gif images when set as a `background_image` on a `composite`
- Fix issue with table redraw after data-binding changes leaving old removed table items visible (even if user cannot interact with anymore)
- Fix issue with running package rake task from `glimmer` command TUI
  • Loading branch information
AndyObtiva committed Oct 16, 2020
1 parent 60e9fb1 commit ee28ea4
Show file tree
Hide file tree
Showing 11 changed files with 119 additions and 48 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,14 @@
# Change Log

### 4.17.2.3

- Maintain image file path upon scaling an ImageProxy
- Add a glimmer rake task that wraps the juwelier rake gemspec:generate task
- Accept `ImageProxy` as arg for `image` and `background_image` property methods
- (EXPERIMENTAL) Animate gif images when set as a `background_image` on a `composite`
- Fix issue with table redraw after data-binding changes leaving old removed table items visible (even if user cannot interact with anymore)
- Fix issue with running package rake task from `glimmer` command TUI

### 4.17.2.2

- Small updates/refactorings in samples
Expand Down
19 changes: 10 additions & 9 deletions README.md
@@ -1,4 +1,4 @@
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for SWT 4.17.2.2
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for SWT 4.17.2.3
## JRuby Desktop Development GUI Library
[![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)
[![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)
Expand Down Expand Up @@ -428,7 +428,7 @@ jgem install glimmer-dsl-swt

Or this command if you want a specific version:
```
jgem install glimmer-dsl-swt -v 4.17.2.2
jgem install glimmer-dsl-swt -v 4.17.2.3
```

Note: Gem version numbers are in sync with the SWT library versions. The first two digits represent the SWT version number. The last two digits represent the minor and patch versions of Glimmer DSL for SWT.
Expand Down Expand Up @@ -505,7 +505,7 @@ bin/glimmer sample:run[hello_world]
Below are the full usage instructions that come up when running `glimmer` without args.

```
Glimmer (Ruby Desktop Development GUI Library) - JRuby Gem: glimmer-dsl-swt v4.17.2.2
Glimmer (Ruby Desktop Development GUI Library) - JRuby Gem: glimmer-dsl-swt v4.17.2.3
Usage: glimmer [--bundler] [--pd] [--quiet] [--debug] [--log-level=VALUE] [[ENV_VAR=VALUE]...] [[-jruby-option]...] (application.rb or task[task_args]) [[application2.rb]...]
Expand Down Expand Up @@ -534,6 +534,7 @@ Select a Glimmer task to run: (Press ↑/↓ arrow to move, Enter to select and
glimmer package[type] # Package app for distribution (generating config, jar, and native files) (type is optional)
glimmer package:clean # Clean by removing "dist" and "packages" directories
glimmer package:config # Generate JAR config file
glimmer package:gemspec # Generate gemspec
glimmer package:jar # Generate JAR file
glimmer package:lock_jars # Lock JARs
glimmer package:native[type] # Generate Native files
Expand Down Expand Up @@ -620,7 +621,7 @@ This will run the hello_tab sample and output its code:
```
$ glimmer sample:run[hello_tab]
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.2/samples/hello/hello_tab.rb
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.3/samples/hello/hello_tab.rb
class HelloTab
include Glimmer
Expand Down Expand Up @@ -665,7 +666,7 @@ Example:
```
$ glimmer sample:code[tic_tac_toe]
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.2/samples/elaborate/tic_tac_toe.rb
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.3/samples/elaborate/tic_tac_toe.rb
require_relative "tic_tac_toe/board"
Expand Down Expand Up @@ -726,7 +727,7 @@ TicTacToe.new.open
# # #
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.2/samples/elaborate/tic_tac_toe/cell.rb
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.3/samples/elaborate/tic_tac_toe/cell.rb
class TicTacToe
class Cell
Expand Down Expand Up @@ -759,7 +760,7 @@ end
# # #
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.2/samples/elaborate/tic_tac_toe/board.rb
# /Users/User/.rvm/gems/jruby-9.2.13.0@glimmerapp/gems/glimmer-dsl-swt-4.17.2.3/samples/elaborate/tic_tac_toe/board.rb
require_relative 'cell'
Expand Down Expand Up @@ -1191,7 +1192,7 @@ Output:
Css glimmer-dsl-css 1.1.0 AndyMaleh Glimmer DSL for CSS
Opal glimmer-dsl-opal 0.3.0 AndyMaleh Glimmer DSL for Opal
Swt glimmer-dsl-swt 4.17.2.2 AndyMaleh Glimmer DSL for SWT
Swt glimmer-dsl-swt 4.17.2.3 AndyMaleh Glimmer DSL for SWT
Tk glimmer-dsl-tk 0.0.5 AndyMaleh Glimmer DSL for Tk
Xml glimmer-dsl-xml 1.1.0 AndyMaleh Glimmer DSL for XML
```
Expand Down Expand Up @@ -3892,7 +3893,7 @@ require 'glimmer/rake_task'

The Glimmer packaging process done in the `glimmer package` command consists of the following steps:
1. Generate gemspec via [Juwelier](https://rubygems.org/gems/juwelier) (`rake gemspec:generate`): Having a gemspec is required by the [`jar-dependencies`](https://github.com/mkristian/jar-dependencies) JRuby gem, used by JRuby libraries to declare JAR dependencies.
1. Lock JAR versions (`glimmer package:lock_jars`): This locks versions of JAR dependencies leveraged by the `jar-dependencies` JRuby gem, downloading them into the `./vendor` directory so they would get inside the top-level Glimmer app/gem JAR file.
1. Lock JAR versions (`glimmer package:4.17.2.3`): This locks versions of JAR dependencies leveraged by the `jar-dependencies` JRuby gem, downloading them into the `./vendor` directory so they would get inside the top-level Glimmer app/gem JAR file.
1. Generate [Warbler](https://github.com/jruby/warbler) config (`glimmer package:config`): Generates initial Warbler config file (under `./config/warble.rb`) to use for generating JAR file.
1. Generate JAR file using [Warbler](https://github.com/jruby/warbler) (`glimmer package:jar`): Enables bundling a Glimmer app into a JAR file under the `./dist` directory
1. Generate native executable using [javapackager](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javapackager.html) (`glimmer package:native`): Enables packaging a JAR file as a DMG/PKG/APP file on Mac, MSI/EXE/APP on Windows, and DEB/RPM/APP on Linux (Glimmer does not officially support Linux with the `glimmer package` command yet, but it generates the JAR file successfully, and you could use `javapackager` manually afterwards if needed).
Expand Down
10 changes: 6 additions & 4 deletions TODO.md
Expand Up @@ -5,14 +5,18 @@ Here is a list of tasks to do (moved to [CHANGELOG.md](CHANGELOG.md) once done).
## Next

- glimmer scaffold:web2desktop[appname,website]

## Soon

- Support a clean way of specifying different widget properties per OS (e.g. taking a hash of OS mappings instead of raw property values or supporting mac, windows, linux Glimmer keywords that wrap blocks around platform specific logic, perhaps make a web equivalent in opal)
- Ensure support for packaging on Linux
- Remove default margins from composites/layouts. They are not as helpful as they seemed.
- Make shell activation on show an option, not the default
- Remove name column from listing of gems
- Investigate Gladiator issue with shrinking on opening files
- Support glimmer list:gems (listing all types of gems together)

### Soon
### Soonish

- Consider a dual gemspec strategy (one for rake tasks and one for glimmer run of apps)
- Log exceptions that occur in event listener blocks
Expand All @@ -24,8 +28,7 @@ Here is a list of tasks to do (moved to [CHANGELOG.md](CHANGELOG.md) once done).
- Run glimmer command rake task presents a TUI file chooser
- Windows support for glimmer command TUI
- Validate/Indicate required glimmer task first args (e.g. name for custom shell gem)
- Support building standalone images via `img` keyword instead of `image` to avoid clashing with `image` property
- Accept `ImageProxy` as arg for image property method
- Make `image` keyword generate and set image on parent if called inside a widget declaration
- Provide a way to scale images via `image` property keyword by passing width/height hash args (can be in pixels or :widget)
- Support background_image property without stretching of image on resize
- Fix issue with no_margin messing with the composite style (-7 isn't working without interference)
Expand Down Expand Up @@ -73,7 +76,6 @@ bind_content(model, 'addresses').each { |address|
}
}
```
- Image custom widget similar to video, and supporting gif
- Scroll bar listener support
- Extract FileTree Glimmer Custom widget from Gladiator
- Support Cygwin with glimmer command
Expand Down
2 changes: 1 addition & 1 deletion VERSION
@@ -1 +1 @@
4.17.2.2
4.17.2.3
6 changes: 3 additions & 3 deletions glimmer-dsl-swt.gemspec
Expand Up @@ -2,16 +2,16 @@
# DO NOT EDIT THIS FILE DIRECTLY
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
# -*- encoding: utf-8 -*-
# stub: glimmer-dsl-swt 4.17.2.2 ruby lib
# stub: glimmer-dsl-swt 4.17.2.3 ruby lib

Gem::Specification.new do |s|
s.name = "glimmer-dsl-swt".freeze
s.version = "4.17.2.2"
s.version = "4.17.2.3"

s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
s.require_paths = ["lib".freeze]
s.authors = ["AndyMaleh".freeze]
s.date = "2020-10-14"
s.date = "2020-10-16"
s.description = "Glimmer DSL for SWT (JRuby Desktop Development GUI Library)".freeze
s.email = "andy.am@gmail.com".freeze
s.executables = ["glimmer".freeze, "girb".freeze]
Expand Down
1 change: 1 addition & 0 deletions lib/ext/glimmer/config.rb
Expand Up @@ -144,6 +144,7 @@ def reset_logger!
result ||= method == 'dispose' && is_a?(Glimmer::UI::CustomWidget) && respond_to?(method)
result ||= ['drag_source_proxy', 'drop_target_proxy'].include?(method) && is_a?(Glimmer::UI::CustomWidget)
result ||= method == 'post_initialize_child'
result ||= method == 'handle'
result ||= method.end_with?('=')
result ||= ['finish_edit!', 'search', 'all_tree_items', 'depth_first_search'].include?(method) && is_a?(Glimmer::UI::CustomWidget) && body_root.respond_to?(method)
end
1 change: 1 addition & 0 deletions lib/glimmer/data_binding/table_items_binding.rb
Expand Up @@ -80,6 +80,7 @@ def populate_table(model_collection, parent, column_properties)
selected_table_items = [parent.swt_widget.getItems.first].to_java(TableItem) if selected_table_items.empty? && !parent.swt_widget.getItems.empty?
parent.swt_widget.setSelection(selected_table_items) unless selected_table_items.empty?
parent.sort
parent.swt_widget.redraw if parent&.swt_widget&.respond_to?(:redraw)
end
end
end
Expand Down
7 changes: 6 additions & 1 deletion lib/glimmer/rake_task.rb
Expand Up @@ -76,6 +76,11 @@ module RakeTask
Glimmer::RakeTask::Package.clean
end

desc 'Generate gemspec'
task :gemspec do
Glimmer::RakeTask::Package.gemspec
end

desc 'Generate JAR config file'
task :config do
Glimmer::RakeTask::Package.config
Expand All @@ -100,7 +105,7 @@ module RakeTask

desc 'Package app for distribution (generating config, jar, and native files) (type is optional)'
task :package, [:type] do |t, args|
Rake::Task['gemspec:generate'].execute
Rake::Task['glimmer:package:gemspec'].execute
Rake::Task['glimmer:package:lock_jars'].execute
Rake::Task['glimmer:package:config'].execute
Rake::Task['glimmer:package:jar'].execute
Expand Down
20 changes: 12 additions & 8 deletions lib/glimmer/rake_task/package.rb
Expand Up @@ -35,6 +35,18 @@ def clean
FileUtils.rm_rf('packages')
end

def gemspec
system 'rake gemspec:generate'
end

def lock_jars
puts 'Locking gem jar-dependencies by downloading & storing in vendor/jars...'
FileUtils.mkdir_p('vendor/jars')
command = "lock_jars --vendor-dir vendor/jars"
puts command
system command
end

def config
project_name = File.basename(File.expand_path('.'))
if !File.exists?('config/warble.rb')
Expand Down Expand Up @@ -72,14 +84,6 @@ def jar
system('warble')
end

def lock_jars
puts 'Locking gem jar-dependencies by downloading & storing in vendor/jars...'
FileUtils.mkdir_p('vendor/jars')
command = "lock_jars --vendor-dir vendor/jars"
puts command
system command
end

def native(native_type=nil, native_extra_args)
puts "Generating native executable with javapackager/jpackage..."
require 'facets/string/titlecase'
Expand Down
29 changes: 20 additions & 9 deletions lib/glimmer/swt/image_proxy.rb
Expand Up @@ -39,27 +39,38 @@ class ImageProxy
def initialize(*args)
@args = args
@file_path = @args.first if @args.first.is_a?(String) && @args.size == 1
if @file_path
if @file_path.start_with?('uri:classloader')
@jar_file_path = @file_path
@file_path = @jar_file_path.sub(/^uri\:classloader\:/, '').sub('//', '/') # the latter sub is needed for Mac
object = java.lang.Object.new
file_input_stream = object.java_class.resource_as_stream(file_path)
buffered_file_input_stream = java.io.BufferedInputStream.new(file_input_stream)
end
@image_data = ImageData.new(buffered_file_input_stream || @file_path)
options = @args.delete_at(-1) if @args.last.is_a?(Hash)
if options&.keys&.include?(:swt_image)
@swt_image = options[:swt_image]
@image_data = @swt_image.image_data
elsif @file_path
@image_data = ImageData.new(input_stream || @file_path)
@swt_image = Image.new(DisplayProxy.instance.swt_display, @image_data)
else
@swt_image = Image.new(*@args)
@image_data = @swt_image.image_data
end
end

def input_stream
if @file_path.start_with?('uri:classloader')
@jar_file_path = @file_path
file_path = @jar_file_path.sub(/^uri\:classloader\:/, '').sub('//', '/') # the latter sub is needed for Mac
object = java.lang.Object.new
file_input_stream = object.java_class.resource_as_stream(file_path)
else
file_input_stream = java.io.FileInputStream.new(@file_path)
end
java.io.BufferedInputStream.new(file_input_stream) if file_input_stream
end

def scale_to(width, height)
scaled_image_data = image_data.scaledTo(width, height)
device = swt_image.device
swt_image.dispose
@swt_image = Image.new(device, scaled_image_data)
@image_data = @swt_image.image_data
self
end

def method_missing(method, *args, &block)
Expand Down
63 changes: 50 additions & 13 deletions lib/glimmer/swt/widget_proxy.rb
Expand Up @@ -23,6 +23,7 @@
require 'glimmer/swt/color_proxy'
require 'glimmer/swt/font_proxy'
require 'glimmer/swt/swt_proxy'
require 'glimmer/swt/display_proxy'
require 'glimmer/swt/dnd_proxy'
require 'glimmer/swt/image_proxy'

Expand Down Expand Up @@ -204,7 +205,7 @@ def set_attribute(attribute_name, *args)
widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
if widget_custom_attribute
widget_custom_attribute[:setter][:invoker].call(@swt_widget, args)
elsif @swt_widget.respond_to?(attribute_setter(attribute_name), args)
elsif @swt_widget.respond_to?(attribute_setter(attribute_name))
apply_property_type_converters(attribute_name, args)
@swt_widget.send(attribute_setter(attribute_name), *args) unless @swt_widget.send(attribute_getter(attribute_name)) == args.first
else
Expand Down Expand Up @@ -683,21 +684,54 @@ def property_type_converters
},
:background => color_converter,
:background_image => lambda do |value|
image_proxy = nil
if value.is_a?(String)
image_proxy = ImageProxy.new(value)
# TODO push this code to ImageProxy
image_proxy = if value.is_a?(String)
ImageProxy.new(value)
elsif value.is_a?(Array)
image_proxy = ImageProxy.new(*value)
end
if image_proxy
on_swt_Resize do |resize_event|
image_proxy.scale_to(@swt_widget.getSize.x, @swt_widget.getSize.y)
@swt_widget.setBackgroundImage(image_proxy.swt_image)
end
image_proxy.swt_image
ImageProxy.new(*value)
elsif value.is_a?(Image)
ImageProxy.new(swt_image: value)
else
value
end

if image_proxy&.file_path&.end_with?('.gif')
image = image_proxy.swt_image
width = image.get_bounds.width.to_i
height = image.get_bounds.height.to_i
image_number = 0
loader = ImageLoader.new
loader.load(image_proxy.input_stream)
image.dispose
image = org.eclipse.swt.graphics.Image.new(DisplayProxy.instance.swt_display,loader.data[0].scaledTo(width, height))
gc = org.eclipse.swt.graphics.GC.new(image)
on_paint_control { |event|
image_number = (image_number == loader.data.length - 1) ? 0 : image_number + 1
next_frame_data = loader.data[image_number]
image = org.eclipse.swt.graphics.Image.new(DisplayProxy.instance.swt_display, next_frame_data.scaledTo(width, height))
event.gc.drawImage(image, 0, 0, width, height, 0, 0, width, height)
image.dispose
}
Thread.new {
last_image_number = -1
while last_image_number != image_number
last_image_number = image_number
sync_exec {
redraw
}
delayTime = loader.data[image_number].delayTime.to_f / 100.0
sleep(delayTime)
end
};
image_proxy = nil
else
on_swt_Resize do |resize_event|
image_proxy.scale_to(@swt_widget.getSize.x, @swt_widget.getSize.y)
@swt_widget.setBackgroundImage(image_proxy.swt_image)
end
end

image_proxy&.swt_image
end,
:cursor => lambda do |value|
cursor_proxy = nil
Expand All @@ -718,13 +752,16 @@ def property_type_converters
end
end,
:image => lambda do |value|
if value.is_a?(String)
image_proxy = if value.is_a?(String)
ImageProxy.new(value).swt_image
elsif value.is_a?(Array)
ImageProxy.new(*value).swt_image
elsif value.is_a?(Image)
ImageProxy.new(swt_image: value)
else
value
end
image_proxy.swt_image
end,
:images => lambda do |array|
array.to_a.map do |value|
Expand Down

0 comments on commit ee28ea4

Please sign in to comment.