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')
}
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
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
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
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
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
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*")
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
$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
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