如何使用 Ruby Gtk 进行图像缩放和拖动-select?
How to make image zoom and drag-select with Ruby Gtk?
目前,我可以通过单击按钮等 refresh/reload 更改图像 window 中的图像
但是,我无法弄清楚如何使用 Ruby-Gtk 进行拖动 select,甚至无法做到这一点。
基本上,我想制作类似 this 的东西,您可以在其中放大和缩小图像,然后使用鼠标指针拖动和滚动以查看图像。
我该怎么做?
非常欢迎任何有关有用功能和示例的提示。
Currently, I am capable of making Image Zoom using RMagick with Ruby and changing images in the image window by refresh/reload with button clicks etc.
您能否提供一个代码片段来说明您是如何创建图像小部件和图像的window?
我试着写了一个示例。(不是拖动)
require 'gtk3'
path = ARGV[0]
win = Gtk::Window.new('MyApp')
win.signal_connect('destroy') { Gtk.main_quit }
box = Gtk::Box.new(:vertical)
scr = Gtk::HScale.new(0.1, 5.0, 0.1)
scr.value = 1.0
swi = Gtk::ScrolledWindow.new
swi.set_size_request(300, 300)
img = Gtk::Image.new
pxb = Gdk::Pixbuf.new(file: path)
img.pixbuf = pxb
v_old = scr.value
scr.signal_connect('value-changed') do
v = scr.value
pxb_resized = pxb.scale(pxb.width * v, pxb.height * v, :hyper)
img.pixbuf = pxb_resized
# To keep center of image when you zoom up
w = swi.allocation.width
swi.vadjustment = swi.vadjustment.set_value(
(swi.vadjustment.value + w / 2.0) * (v / v_old) - w / 2.0
)
h = swi.allocation.height
swi.hadjustment = swi.hadjustment.set_value(
(swi.hadjustment.value + h / 2.0) * (v / v_old) - h / 2.0
)
v_old = v
end
# packing
win.add box
box.pack_start scr
box.pack_start swi, expand: true, fill: true
swi.add img
win.show_all
Gtk.main
但是在Mac pixbuf 上有一些麻烦。
https://github.com/ruby-gnome2/ruby-gnome2/issues/1079
目前,我可以通过单击按钮等 refresh/reload 更改图像 window 中的图像
但是,我无法弄清楚如何使用 Ruby-Gtk 进行拖动 select,甚至无法做到这一点。
基本上,我想制作类似 this 的东西,您可以在其中放大和缩小图像,然后使用鼠标指针拖动和滚动以查看图像。
我该怎么做?
非常欢迎任何有关有用功能和示例的提示。
Currently, I am capable of making Image Zoom using RMagick with Ruby and changing images in the image window by refresh/reload with button clicks etc.
您能否提供一个代码片段来说明您是如何创建图像小部件和图像的window?
我试着写了一个示例。(不是拖动)
require 'gtk3'
path = ARGV[0]
win = Gtk::Window.new('MyApp')
win.signal_connect('destroy') { Gtk.main_quit }
box = Gtk::Box.new(:vertical)
scr = Gtk::HScale.new(0.1, 5.0, 0.1)
scr.value = 1.0
swi = Gtk::ScrolledWindow.new
swi.set_size_request(300, 300)
img = Gtk::Image.new
pxb = Gdk::Pixbuf.new(file: path)
img.pixbuf = pxb
v_old = scr.value
scr.signal_connect('value-changed') do
v = scr.value
pxb_resized = pxb.scale(pxb.width * v, pxb.height * v, :hyper)
img.pixbuf = pxb_resized
# To keep center of image when you zoom up
w = swi.allocation.width
swi.vadjustment = swi.vadjustment.set_value(
(swi.vadjustment.value + w / 2.0) * (v / v_old) - w / 2.0
)
h = swi.allocation.height
swi.hadjustment = swi.hadjustment.set_value(
(swi.hadjustment.value + h / 2.0) * (v / v_old) - h / 2.0
)
v_old = v
end
# packing
win.add box
box.pack_start scr
box.pack_start swi, expand: true, fill: true
swi.add img
win.show_all
Gtk.main
但是在Mac pixbuf 上有一些麻烦。
https://github.com/ruby-gnome2/ruby-gnome2/issues/1079