Genie Image Viewer 2 (GtkStack)
プログラムを実行したところ
一覧表示(List)から画像を選択し、拡大表示(Large)ボタンを押すとページが
遷移し拡大画像が表示される。
前回のimage-viewerプログラムをGtkStackを使って書き直しました。
clutter-gtkを使用しています。
・ファイルの読み込み、前回と同様。
・ファイルパスリストの作成、前回と同様。
・画像の表示、前回と同様。
## image-viewer-stack-gs.gs
uses
GtkClutter
Clutter
init
if GtkClutter.init(ref args) != InitError.SUCCESS
print "Clutter init error"
var win = new MainWindow ()
win.show_all ()
Gtk.main ()
class MainWindow : Gtk.Window
image : Image
actor2 : Clutter.Actor
filename : string
IMAGE_DIR_PATH : string = "../images/"
STAGE_WIDTH : int = 600
STAGE_HEIGHT : int = 600
THUMBNAIL_SIZE : int = 150
ROW_COUNT : int = 4
COL_COUNT : int = 3
init
title = "ImageViewer"
window_position = Gtk.WindowPosition.CENTER
default_width = 620
default_height = 650
border_width = 10
destroy.connect(Gtk.main_quit)
var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 5)
add(box)
var stack = new Gtk.Stack()
stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT
stack.transition_duration = 1000
var widget1 = new Embed ()
var stage1 = widget1.get_stage ()
stage1.width = stage1.height = STAGE_WIDTH
var widget2 = new Embed ()
var stage2 = widget2.get_stage ()
stage2.width = stage2.height = STAGE_WIDTH
var img_path_list = new list of string
try
var directory = File.new_for_path (IMAGE_DIR_PATH)
var enumerator = directory.enumerate_children (FileAttribute.STANDARD_NAME, 0)
file_info : FileInfo
while (file_info = enumerator.next_file ()) != null
filename = file_info.get_name ()
//stdout.printf ("%s\n", file_info.get_name ());
//stdout.printf ("%s\n", filename)
img_path_list.add (filename)
except e:Error
print "Message: %s", e.message
//stdout.printf ("%s\n", filename)
print " "
for s in img_path_list
print s
for var row = 0 to (ROW_COUNT - 1)
for var col = 0 to (COL_COUNT - 1)
var s = img_path_list[row * COL_COUNT + col]
try
var pixbuf = new Gdk.Pixbuf.from_file (IMAGE_DIR_PATH + s)
image = new Image ()
image.set_data (pixbuf.get_pixels (),
pixbuf.has_alpha ? Cogl.PixelFormat.RGBA_8888 : Cogl.PixelFormat.RGB_888,
pixbuf.width,
pixbuf.height,
pixbuf.rowstride)
except e:Error
print "Message: %s", e.message
var actor = new Clutter.Actor ()
actor.content = image
actor.set_size (THUMBNAIL_SIZE, THUMBNAIL_SIZE)
actor.set_position (row * THUMBNAIL_SIZE, col * THUMBNAIL_SIZE)
actor.reactive = true
actor.button_press_event.connect (actor_clicked_cb)
stage1.add_child (actor);
stack.add_titled(widget1, "list", "List")
actor2 = new Clutter.Actor ()
actor2.set_size (STAGE_WIDTH, STAGE_HEIGHT)
stage2.add_child (actor2)
stack.add_titled(widget2, "large", "Large")
var switcher = new Gtk.StackSwitcher()
switcher.set_stack(stack)
box.pack_start(switcher, false, false, 0)
box.pack_start(stack, true, true, 0)
def actor_clicked_cb (actor:Clutter.Actor, evt:ButtonEvent) : bool
print "Clicked"
var image2 = new Clutter.Image ()
image2 = (Clutter.Image)actor.content
actor2.content = image2
return true
ビルド
valac --pkg gtk+-3.0 --pkg clutter-gtk-1.0 --pkg gee-0.8 image-viewer-stack-gs.gs