Changeset 19871 for lang/ruby

Show
Ignore:
Timestamp:
09/25/08 08:24:58 (2 months ago)
Author:
hogelog
Message:

* ディレクトリ選択画面: ←で開いたときには末尾画像を表示
* ディレクトリ選択画面: Deleteキーでディレクトリ削除
* 画像表示画面 Endキーでからディレクトリ表示画面への移動
* 画像表示画面: /キーで拡大縮小アルゴリズムの切り替え
* Ruby側からはSDL資源の増大が把握できないため適時GCを呼び出すように

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/ruby/misc/fitview.rb

    r19838 r19871  
    77# ruby/SDL (http://www.kmc.gr.jp/~ohai/rubysdl.html)入ってる環境で 
    88# $ ruby fitview.rb 画像ファイルかディレクトリ 
    9 # で画像を適当に拡縮して全画面表示(1024x768) 
    10 # 
    11 # ディレクトリ移動する機能が欲しい 
    12 # 
    13 # ・操作 
     9# で画像を適当に拡大縮小して全画面表示(1024x768) 
     10# 
     11# ・画像表示画面の操作 
    1412#   ←: 前の画像を表示 
    1513#   →: 次の画像を表示 
     
    1715#   ↓: 画像の下部分に移動。既に下を表示してるなら次の画像を表示 
    1816#   Q, Esc: プログラムの終了 
     17#   End: ディレクトリ選択へ 
     18#   /: 拡大縮小アルゴリズムの高速/高性能切り替え 
     19# 
     20# ・ディレクトリ選択画面の操作 
     21#   ←: 選択しているディレクトリを開く。"."を選択で画像表示(先頭から) 
     22#   →: 選択しているディレクトリを開く。"."を選択で画像表示(末尾から) 
     23#   Delete: ディレクトリをTRASHDIRに移動 
    1924# 
    2025 
     
    2429WIDTH = 1024 
    2530HEIGHT = 768 
    26 j 
     31 
    2732EXTS = %w[png jpg jpeg gif bmp].map{|ext| ".#{ext}" } 
    2833 
    2934FONTS_PATH = ['c:\hoge\sys\mplus_j12r.bdf', 'c:\hoge\sys\mplus_f12r.bdf'] 
    3035FONTSIZE = 12 
     36 
     37TRASHDIR = 'C:/TEMP' 
    3138 
    3239class SDL::Surface 
     
    4047        self.update_rect(0, 0, self.w, self.h) 
    4148    end 
    42     def scale_draw(surface, scale) 
    43         SDL::Surface.transform_draw(surface, self, 0, scale, scale, 0, 0, 0, 0, SDL::Surface::TRANSFORM_AA) 
    44     end 
    45     def scale_transform(scale) 
    46         self.transform_surface(0, 0, scale, scale,  SDL::Surface::TRANSFORM_AA) 
    47     end 
    48 end 
    49  
    50 def open_path(path) 
     49    def scale_draw(surface, scale, flags) 
     50        SDL::Surface.transform_draw(surface, self, 0, scale, scale, 0, 0, 0, 0, flags) 
     51    end 
     52    def scale_transform(scale, flags) 
     53        self.transform_surface(0, 0, scale, scale, flags) 
     54    end 
     55end 
     56 
     57def open_path(path, reverse) 
    5158    basename = nil 
    5259    if File.directory?(path) 
     
    5764    end 
    5865    entries = Dir.entries('.').reject!{|x| 
    59         !EXTS.include?(File.extname(x).downcase) 
     66        !EXTS.include?(File.extname(x).downcase)  
    6067    } 
    6168 
     
    6572    end 
    6673 
    67     return entries, (basename ? entries.index(basename) : 0) 
     74    return entries, (basename ? entries.index(basename) : (reverse ? entries.length-1 : 0)) 
    6875end 
    6976class Pages 
    70     def initialize(entries) 
     77    ## @tableはweakrefあたり使ってキャッシュすると良さそう 
     78    def initialize(entries, curpage) 
    7179        @entries = entries 
    7280        @table = [] 
    73         @curpage = 0 
     81        @curpage = curpage 
     82        @fastmode = false 
    7483    end 
    7584    def load(page) 
     
    8493                    h = image.h * scale 
    8594 
    86                     @table[page] = image.scale_transform(scale) 
     95                    if @fastmode 
     96                        @table[page] = image.scale_transform(scale, 0) 
     97                    else 
     98                        @table[page] = image.scale_transform(scale, SDL::Surface::TRANSFORM_AA) 
     99                    end 
    87100                rescue SDL::Error 
    88101                    text = "cannot open #{path}" 
     
    95108        @table[page] 
    96109    end 
    97     def preload 
    98         self.load(@curpage==self.length-1 ? 0 : @curpage+1) 
     110    def unload(page) 
     111        @table[page] = nil 
     112        GC.start 
     113    end 
     114    def reload 
     115        self.unload(@curpage-1) 
     116        self.unload(@curpage+1) 
     117        self.unload(@curpage) 
     118        GC.start 
     119        self.load(@curpage-1) 
     120        self.load(@curpage+1) 
     121        self.load(@curpage) 
    99122    end 
    100123    def length 
     
    105128            raise SelectDirectoryEvent 
    106129        end 
     130        self.unload(@curpage-1) 
    107131        @curpage = @curpage+1 
     132        self.load(@curpage+1) 
    108133        self.load(@curpage) 
    109134    end 
     
    112137            raise SelectDirectoryEvent 
    113138        end 
     139        self.unload(@curpage+1) 
    114140        @curpage = @curpage-1 
     141        self.load(@curpage-1) 
    115142        self.load(@curpage) 
    116143    end 
    117 end 
    118 def fitview(input_path) 
     144 
     145    attr_accessor :fastmode 
     146end 
     147def paint(image, upview) 
     148    copy = image 
     149    unless image.h <= SCREEN.h 
     150        h = upview ? 0 : image.h - SCREEN.h 
     151        copy = image.copy_rect(0, h, SCREEN.w, SCREEN.h) 
     152    end 
     153 
     154    SCREEN.fill(0) 
     155    SCREEN.put(copy, 0, 0) 
     156    SCREEN.update 
     157end 
     158def fitview(input_path, reverse) 
    119159    basename = File.basename(input_path) 
    120     entries, curpage = open_path(input_path) 
     160    entries, curpage = open_path(input_path, reverse) 
    121161 
    122162    upview = true 
    123163 
    124     pages = Pages.new(entries) 
     164    pages = Pages.new(entries, curpage) 
    125165    image = pages.load(curpage) 
    126166 
    127167    loop do 
    128         copy = image 
    129         unless image.h <= SCREEN.h 
    130             h = upview ? 0 : image.h - SCREEN.h 
    131             copy = image.copy_rect(0, h, SCREEN.w, SCREEN.h) 
    132         end 
    133  
    134         SCREEN.fill(0) 
    135         SCREEN.put(copy, 0, 0) 
    136         SCREEN.update 
    137         pages.preload 
     168        paint(image, upview) 
    138169 
    139170        case event = SDL::Event.wait 
     
    164195                    upview = false 
    165196                end 
     197            when SDL::Key::END 
     198                raise SelectDirectoryEvent 
     199            when SDL::Key::SLASH 
     200                pages.fastmode = !pages.fastmode 
     201                image = pages.reload 
    166202            end 
    167203        end 
     
    186222            when SDL::Key::Q, SDL::Key::ESCAPE 
    187223                raise QuitException 
    188             when SDL::Key::LEFT, SDL::Key::RIGHT 
    189                 return dirs[select] 
     224            when SDL::Key::LEFT 
     225                return dirs[select], true 
     226            when SDL::Key::RIGHT 
     227                return dirs[select], false 
    190228            when SDL::Key::UP 
    191229                select = select==0? dirs.length-1 : select-1 
    192230            when SDL::Key::DOWN 
    193231                select = select==dirs.length-1? 0 : select+1 
     232            when SDL::Key::DELETE 
     233                name = dirs[select] 
     234                begin 
     235                    File.rename(name, "#{TRASHDIR}/#{name}") 
     236                #rescue Errno::EXXX 
     237                rescue SystemCallError 
     238                    puts "cannot delete #{name}" 
     239                end 
     240                dirs = Dir.entries('.').reject{|file| !File.directory?(file)} 
     241                if select==dirs.length 
     242                    select = 0 
     243                end 
    194244            end 
    195245        end 
     
    223273    image_path = ARGV[0] 
    224274 
    225     prev_select = File.expand_path(image_path) 
    226     if File.directory?(prev_select) 
    227         prev_select = File.basename(prev_select) 
    228     else 
    229         prev_select = File.basename(File.dirname(prev_select)) 
    230     end 
     275    prev_select = '.' 
     276    reverse = false 
    231277 
    232278    loop do 
    233279        begin 
    234             fitview(image_path) 
     280            fitview(image_path, reverse) 
    235281        rescue SelectDirectoryEvent 
    236             while dir = dirselect(prev_select) 
     282            GC.start 
     283            loop do 
     284                dir, reverse = dirselect(prev_select) 
    237285                if dir == '.' 
    238286                    image_path = '.' 
    239287                    break 
    240288                else 
    241                     if dir!='..' 
    242                         prev_select = dir 
     289                    if dir=='..' 
     290                        prev_select = File.basename(File.expand_path('.')) 
    243291                    end 
    244292                    Dir.chdir(dir)