emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Additon to tumme.el


From: Mathias Dahl
Subject: Additon to tumme.el
Date: Sun, 16 Jul 2006 11:21:44 +0200

I would like to add the following code to tumme.el. It provides a
facility to very easily edit file tags and comments of image files in
a buffer using widgets. It is actually quite simple but in my opinion
a very nice piece of functionality for end users. The code does not
affect any old functionality in tumme (only new functions and
variables are added). I also propose yet another key binding (C-t e)
in Dired that will call `tumme-dired-edit-comment-and-tags'.

Is it a bad time now for things like this?

;;;; Code begins here

(require 'widget)

(eval-when-compile
 (require 'wid-edit))

(defvar tumme-widget-list nil
 "List to keep track of meta data in edit buffer")

(defun tumme-dired-edit-comment-and-tags ()
 "Edit comment and tags of current or marked image files.
Edit comment and tags for all marked image files in an
easy-to-use form."
 (interactive)
 (setq tumme-widget-list nil)
 ;; Setup buffer.
 (let ((files (dired-get-marked-files)))
   (switch-to-buffer "*Tumme Edit Meta Data*")
   (kill-all-local-variables)
   (make-local-variable 'widget-example-repeat)
   (let ((inhibit-read-only t))
     (erase-buffer))
   (remove-overlays)
   ;; Some help for the user.
   (widget-insert
"\nEdit comments and tags for each image.  Separate multiple tags
with a comma.  Move forward between fields using TAB or RET.
Move to the previous field using backtab (S-TAB).  Save by
activating the Save button at the bottom of the form or cancel
the operation by activating the Cancel button.\n\n")
   ;; Here comes all images and a comment and tag field for each
   ;; image.
   (mapc
    (lambda (file)
      (let* ((thumb-file (tumme-thumb-name file))
             (img (create-image thumb-file))
             comment-widget tag-widget)
        (insert-image img)
        (widget-insert "\n\nComment: ")
        (setq comment-widget
              (widget-create 'editable-field
                             :size 60
                             :format "%v "
                             :value (or (tumme-get-comment file) "")))
        (widget-insert "\nTags:    ")
        (setq tag-widget
              (widget-create 'editable-field
                             :size 60
                             :format "%v "
                             :value (or (mapconcat
                                         (lambda (tag)
                                           tag)
                                         (tumme-list-tags file)
                                         ",") "")))
        ;; Save information in all widgets so that we can use it when
        ;; the user saves the form.
        (setq tumme-widget-list
              (append tumme-widget-list
                      (list (list file comment-widget tag-widget))))
        (widget-insert "\n\n")))
    files))
 ;; Footer with Save and Cancel button.
 (widget-insert "\n")
 (widget-create 'push-button
                :notify
                (lambda (&rest ignore)
                  (tumme-save-information-from-widgets)
                  (bury-buffer)
                  (message "Done."))
                "Save")
 (widget-insert " ")
 (widget-create 'push-button
                :notify
                (lambda (&rest ignore)
                  (bury-buffer)
                  (message "Operation canceled."))
                "Cancel")
 (widget-insert "\n")
 (use-local-map widget-keymap)
 (widget-setup)
 ;; Jump to the first widget.
 (widget-forward 1))

(defun tumme-save-information-from-widgets ()
 "Save information found in `tumme-widget-list'.
Use the information in `tumme-widget-list' to save comments and
tags to their respective image file.  Internal function used by
`tumme-dired-edit-comment-and-tags'."
 (mapc
  (lambda (x)
    (let ((file (car x))
          (comment (widget-value (cadr x)))
          (tags (widget-value (caddr x))))
      (tumme-write-comment file comment)
      (mapc
       (lambda (tag)
         (tumme-write-tag file tag))
       (split-string tags ","))))
  tumme-widget-list))

;;;; Code ends here

/Mathias




reply via email to

[Prev in Thread] Current Thread [Next in Thread]