*** empty log message ***
authorgc <gc>
Sat, 14 Jul 2007 19:36:00 +0000 (19:36 +0000)
committergc <gc>
Sat, 14 Jul 2007 19:36:00 +0000 (19:36 +0000)
bin/booh-classifier

index 5f5415a8959e5a3a5fab4e451dcd89f9e78beb1d..a181dd34b873b84976f45e27aa7da91ce5bcb2cf 100644 (file)
@@ -83,6 +83,15 @@ def memfree
     return memfree.to_i + buffers.to_i + cached.to_i
 end
 
+def set_cache_memory_use_figure
+    if $config['cache-memory-use'] =~ /memfree_(\d+)/
+        $config['cache-memory-use-figure'] = memfree*$1.to_f/100
+    else
+        $config['cache-memory-use-figure'] = $config['cache-memory-use'].to_i
+    end
+    msg 2, "Set cache memory use figure: #{$config['cache-memory-use-figure']} kB"
+end
+
 def read_config
     $config = {}
     $config_file = File.expand_path('~/.booh-classifier-rc')
@@ -108,14 +117,10 @@ def read_config
         }
     end
     $config['video-viewer'] ||= '/usr/bin/mplayer %f'
-    $config['preload-distance'] ||= 5
+    $config['preload-distance'] ||= '5'
     $config['cache-memory-use'] ||= 'memfree_50%'
-    if $config['cache-memory-use'] =~ /memfree_(\d+)/
-        $config['cache-memory-use-figure'] = memfree*$1.to_f/100
-    else
-        $config['cache-memory-use-figure'] = $config['cache-memory-use'].to_i
-    end
-    msg 2, "Set cache memory use figure: #{$config['cache-memory-use-figure']} kB"
+    $config['rotate-set-exif'] ||= 'true'
+    set_cache_memory_use_figure
 end
 
 def check_config
@@ -166,8 +171,8 @@ end
 
 def save_undo(name, closure, *params)
     UndoHandler.save_undo(name, closure, [ *params ])
-    $undo_tb.sensitive = $undo_mb.sensitive = true
-    $redo_tb.sensitive = $redo_mb.sensitive = false
+    $undo_mb.sensitive = true
+    $redo_mb.sensitive = false
 end
 
 def get_mem
@@ -405,19 +410,27 @@ class MainView < Gtk::DrawingArea
     end
 
     def set_shown_entry(index)
-        if index == @index
+        if index == @index || index < 0 || index >= $allentries.size
             return
         end
+        old_index = @index
         @index = index
         if index.nil?
             @entry = nil
         else
             @entry = $allentries[index]
         end
+        if ! @entry.button
+            #- not loaded yet
+            @index = old_index
+            return
+        end
         redraw        
         @preloader.run
+        @entry.button.grab_focus
     end
 
+
     def get_shown_entry
         return @index
     end
@@ -453,14 +466,6 @@ class MainView < Gtk::DrawingArea
             window.draw_pixbuf(nil, @pixbuf, 0, 0, @xpos, @ypos, -1, -1, Gdk::RGB::DITHER_NONE, -1, -1)
         end
     end
-
-    def show_next
-        if @index < $allentries.size - 1
-            next_entry = $allentries[get_shown_entry + 1]
-            next_entry.button.grab_focus
-        end
-    end
-
 end
 
 def check_memory_free_cache_if_needed
@@ -599,7 +604,7 @@ def show_popup(parent, msg, *options)
     end
 end
 
-def thumbnail_keypressed(entry, event)
+def thumbnail_keypressed(entry, i, event)
     if event.state & Gdk::Window::MOD1_MASK != 0
         #- ALT pressed: Alt-Left and Alft-Right rotate
         if event.keyval == Gdk::Keyval::GDK_Left || event.keyval == Gdk::Keyval::GDK_Right
@@ -615,18 +620,58 @@ def thumbnail_keypressed(entry, event)
             entry.button.set_image(img = Gtk::Image.new(entry.pixbuf_thumbnail))
         end
 
+    elsif event.state & Gdk::Window::CONTROL_MASK != 0
+        #- CONTROL pressed: Ctrl-z and Ctrl-r for undo/redo
+        if event.keyval == Gdk::Keyval::GDK_z
+            perform_undo
+        end
+        if event.keyval == Gdk::Keyval::GDK_r
+            perform_redo
+        end
+
     else
+        removed_before = entry.removed
+        tag_before = entry.tagged
+
         if event.keyval == Gdk::Keyval::GDK_Delete
             entry.removed = true
             entry.tagged = nil
             entry.show_bg
-            $mainview.show_next
+            $mainview.set_shown_entry(i + 1)
+
+            save_undo(_("set for removal"),
+                      proc {
+                          entry.removed = removed_before
+                          entry.tagged = tag_before
+                          entry.show_bg
+                          $mainview.set_shown_entry(i)
+                          proc {
+                              entry.removed = true
+                              entry.tagged = nil
+                              entry.show_bg
+                              $mainview.set_shown_entry(i)
+                          }
+                      })
 
         elsif event.keyval == Gdk::Keyval::GDK_space
             entry.removed = false
             entry.tagged = nil
             entry.show_bg
-            $mainview.show_next
+            $mainview.set_shown_entry(i + 1)
+
+            save_undo(_("remove tag"),
+                      proc {
+                          entry.removed = removed_before
+                          entry.tagged = tag_before
+                          entry.show_bg
+                          $mainview.set_shown_entry(i)
+                          proc {
+                              entry.removed = false
+                              entry.tagged = nil
+                              entry.show_bg
+                              $mainview.set_shown_entry(i)
+                          }
+                      })
 
         else
             char = [ Gdk::Keyval.to_unicode(event.keyval) ].pack("C*")
@@ -674,7 +719,21 @@ def thumbnail_keypressed(entry, event)
                     entry.removed = false
                     entry.tagged = tag
                     entry.show_bg
-                    $mainview.show_next
+                    $mainview.set_shown_entry(i + 1)
+
+                    save_undo(_("set tag"),
+                              proc {
+                                  entry.removed = removed_before
+                                  entry.tagged = tag_before
+                                  entry.show_bg
+                                  $mainview.set_shown_entry(i)
+                                  proc {
+                                      entry.removed = false
+                                      entry.tagged = tag
+                                      entry.show_bg
+                                      $mainview.set_shown_entry(i)
+                                  }
+                              })
                 end
             end
         end
@@ -705,7 +764,7 @@ def show_entries
                                        $imagesline.pack_start(entry.button.show_all, false, false)
                                        entry.button.signal_connect('clicked') { $mainview.set_shown_entry(i) }
                                        entry.button.signal_connect('focus-in-event') { entry.button.clicked; autoscroll_if_needed(entry.button) }
-                                       entry.button.signal_connect('key-press-event') { |w, e| thumbnail_keypressed(entry, e) }
+                                       entry.button.signal_connect('key-press-event') { |w, e| thumbnail_keypressed(entry, i, e) }
                                        if i == 0
                                            entry.button.grab_focus
                                        end
@@ -928,29 +987,150 @@ def execute
                     show_popup(dialog, utf8(_("You have not confirmed that you noticed the permanent removal of the pictures marked for deletion.")))
                     break
                 end
+                problem = false
+                tag2entries = {}
+                $tags.values.each { |tag| tag2entries[tag] = [] }
+                $allentries.each { |entry| entry.tagged and tag2entries[entry.tagged] << entry }
                 stuff.keys.each { |key|
                     if key.is_a?(Tag) && stuff[key][:combo].active == 0
                         path = stuff[key][:pathlabel].text
-                        puts path
-                        puts stuff[key][:pathlabel].markup
-                        if path == utf8(_("<i>(unset)</i>"))
+                        if path[0] != ?/
                             show_popup(dialog, utf8(_("You have not selected a directory where to move %s.") % key.name))
+                            problem = true
                             break
                         end
                         st = File.stat(path)
                         if ! st.directory? || ! st.writable?
                             show_popup(dialog, utf8(_("Directory where to move %s is not valid or not writable.") % key.name))
+                            problem = true
+                            break
+                        end
+                        tag2entries[key].each { |entry|
+                            begin
+                                File.stat(File.join(path, File.basename(entry.path)))
+                                show_popup(dialog, utf8(_("Sorry, a file '%s' already exists in '%s'.") % [ File.basename(entry.path), path ]))
+                                problem = true
+                                break
+                            rescue
+                            end
+                        }
+                        if problem
                             break
                         end
                     end
                 }
+                if ! problem
+                    puts "execute!"
+                    dialog.destroy
+                    return
+                end
+
+            else
+                dialog.destroy
+                return
             end
-            dialog.destroy
-            return
         }
     end
 end
 
+def preferences
+    dialog = Gtk::Dialog.new(utf8(_("Edit preferences")),
+                             $main_window,
+                             Gtk::Dialog::MODAL | Gtk::Dialog::DESTROY_WITH_PARENT,
+                             [Gtk::Stock::OK, Gtk::Dialog::RESPONSE_OK],
+                             [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL])
+
+#    $config['cache-memory-use'] ||= 'memfree_50%'
+#    if $config['cache-memory-use'] =~ /memfree_(\d+)/
+#        $config['cache-memory-use-figure'] = memfree*$1.to_f/100
+#    else
+#        $config['cache-memory-use-figure'] = $config['cache-memory-use'].to_i
+#    end
+    tooltips = Gtk::Tooltips.new
+    
+    dialog.vbox.add(tbl = Gtk::Table.new(0, 0, false))
+    tbl.attach(Gtk::Alignment.new(1, 0.5, 0, 0).add(Gtk::Label.new.set_markup(utf8(_("Command for watching videos: ")))),
+               0, 1, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 2)
+    tbl.attach(Gtk::Alignment.new(0, 0.5, 1, 0).add(video_viewer_entry = Gtk::Entry.new.set_text($config['video-viewer']).set_size_request(250, -1)),
+               1, 2, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 2)
+    tooltips.set_tip(video_viewer_entry, utf8(_("Use %f to specify the filename;\nfor example: /usr/bin/mplayer %f")), nil)
+
+    tbl.attach(Gtk::Alignment.new(1, 0.5, 0, 0).add(Gtk::Label.new.set_markup(utf8(_("Preloading distance: ")))),
+               0, 1, 1, 2, Gtk::FILL, Gtk::SHRINK, 2, 2)
+    tbl.attach(Gtk::Alignment.new(0, 0.5, 1, 0).add(preload_distance = Gtk::SpinButton.new(0, 50, 1).set_value($config['preload-distance'].to_i)),
+               1, 2, 1, 2, Gtk::FILL, Gtk::SHRINK, 2, 2)
+    tooltips.set_tip(preload_distance, utf8(_("Amount of pictures preloaded left and right to the currently shown")), nil)
+
+    tbl.attach(Gtk::Alignment.new(1, 0.5, 0, 0).add(Gtk::Label.new.set_markup(utf8(_("Cache memory use: ")))),
+               0, 1, 2, 3, Gtk::FILL, Gtk::SHRINK, 2, 2)
+    tbl.attach(Gtk::Alignment.new(0, 0.5, 1, 0).add(cache_vbox = Gtk::VBox.new(false, 0)),
+               1, 2, 2, 3, Gtk::FILL, Gtk::SHRINK, 2, 2)
+    cache_vbox.pack_start(Gtk::HBox.new(false, 0).pack_start(cache_memfree_radio = Gtk::RadioButton.new(''), false, false).
+                                                  pack_start(cache_memfree_spin = Gtk::SpinButton.new(0, 100, 10), false, false).
+                                                  pack_start(cache_memfree_label = Gtk::Label.new(utf8(_("% of free memory"))), false, false), false, false)
+    cache_memfree_spin.signal_connect('value-changed') { cache_memfree_radio.active = true }
+    tooltips.set_tip(cache_memfree_spin, utf8(_("Percentage of free memory (+ buffers/cache) measured at startup")), nil)
+    cache_vbox.pack_start(Gtk::HBox.new(false, 0).pack_start(cache_specify_radio = Gtk::RadioButton.new(cache_memfree_radio, ''), false, false).
+                                                  pack_start(cache_specify_spin = Gtk::SpinButton.new(0, 4000, 50), false, false).
+                                                  pack_start(cache_specify_label = Gtk::Label.new(utf8(_("MB"))).set_sensitive(false), false, false), false, false)
+    cache_specify_spin.signal_connect('value-changed') { cache_specify_radio.active = true }
+    cache_memfree_radio.signal_connect('toggled') {
+        if cache_memfree_radio.active?
+            cache_memfree_label.sensitive = true
+            cache_specify_label.sensitive = false
+        else
+            cache_specify_label.sensitive = true
+            cache_memfree_label.sensitive = false
+        end
+    }
+    tooltips.set_tip(cache_specify_spin, utf8(_("Amount of memory in megabytes")), nil)
+    if $config['cache-memory-use'] =~ /memfree_(\d+)/
+        cache_memfree_spin.value = $1.to_i
+    else
+        cache_specify_spin.value = $config['cache-memory-use'].to_i
+    end
+
+    tbl.attach(update_exif_orientation_check = Gtk::CheckButton.new(utf8(_("Update file's EXIF orientation when rotating a picture"))),
+               0, 2, 3, 4, Gtk::FILL, Gtk::SHRINK, 2, 2)
+    tooltips.set_tip(update_exif_orientation_check, utf8(_("")), nil)
+    update_exif_orientation_check.active = $config['rotate-set-exif']
+
+    dialog.vbox.show_all
+    dialog.run { |response|
+        if response == Gtk::Dialog::RESPONSE_OK
+            $config['video-viewer'] = from_utf8(video_viewer_entry.text)
+            $config['preload-distance'] = preload_distance.value
+            $config['rotate-set-exif'] = update_exif_orientation_check.active?
+            if cache_memfree_radio.active?
+                $config['cache-memory-use'] = "memfree_#{cache_memfree_spin.value}%"
+            else
+                $config['cache-memory-use'] = cache_specify_spin.value
+            end
+            set_cache_memory_use_figure
+            p $config
+        end
+    }
+    dialog.destroy
+end
+
+def perform_undo
+    if $undo_mb.sensitive?
+        $redo_mb.sensitive = true
+        if not more_undoes = UndoHandler.undo($statusbar)
+            $undo_mb.sensitive = false
+        end
+    end
+end
+
+def perform_redo
+    if $redo_mb.sensitive?
+        $undo_mb.sensitive = true
+        if not more_redoes = UndoHandler.redo($statusbar)
+            $redo_mb.sensitive = false
+        end
+    end
+end
+
 def create_menubar    
     #- menu
     mb = Gtk::MenuBar.new