Vala プログラミング

Rust プログラミング

おながのブログ

Genie Image Viewer 2 (GtkStack)

f:id:onagat12:20150619121114p:plain

プログラムを実行したところ

 

f:id:onagat12:20150619121135p:plain

一覧表示(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