如何使用 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