;;; artist.el --- draw ascii graphics with your mouse
-;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
-;; 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 2000-2012 Free Software Foundation, Inc.
;; Author: Tomas Abrahamsson <tab@lysator.liu.se>
;; Maintainer: Tomas Abrahamsson <tab@lysator.liu.se>
(defvar artist-pointer-shape (if (eq window-system 'x) x-pointer-crosshair nil)
- "*If in X Windows, use this pointer shape while drawing with the mouse.")
+ "If in X Windows, use this pointer shape while drawing with the mouse.")
(defcustom artist-text-renderer-function 'artist-figlet
;; This is a defvar, not a defcustom, since the custom
;; package shows lists of characters as a lists of integers,
;; which is confusing
- "*Characters (``color'') to use when spraying.
+ "Characters (``color'') to use when spraying.
They should be ordered from the ``lightest'' to the ``heaviest''
since spraying replaces a light character with the next heavier one.")
(defvar artist-spray-new-char ?.
- "*Initial character to use when spraying.
+ "Initial character to use when spraying.
This character is used if spraying upon a character that is not in
`artist-spray-chars'. The character defined by this variable should
be in `artist-spray-chars', or spraying will behave strangely.")
(defvar artist-mode-name " Artist"
"Name of Artist mode beginning with a space (appears in the mode-line).")
-(defvar artist-curr-go 'pen-char
+(defvar artist-curr-go 'pen-line
"Current selected graphics operation.")
(make-variable-buffer-local 'artist-curr-go)
(defvar artist-arrow-point-1 nil)
(defvar artist-arrow-point-2 nil)
\f
+(defvar artist-menu-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map [spray-chars]
+ '(menu-item "Characters for Spray" artist-select-spray-chars
+ :help "Choose characters for sprayed by the spray-can"))
+ (define-key map [borders]
+ '(menu-item "Draw Shape Borders" artist-toggle-borderless-shapes
+ :help "Toggle whether shapes are drawn with borders"
+ :button (:toggle . (not artist-borderless-shapes))))
+ (define-key map [trimming]
+ '(menu-item "Trim Line Endings" artist-toggle-trim-line-endings
+ :help "Toggle trimming of line-endings"
+ :button (:toggle . artist-trim-line-endings)))
+ (define-key map [rubber-band]
+ '(menu-item "Rubber-banding" artist-toggle-rubber-banding
+ :help "Toggle rubber-banding"
+ :button (:toggle . artist-rubber-banding)))
+ (define-key map [set-erase]
+ '(menu-item "Character to Erase..." artist-select-erase-char
+ :help "Choose a specific character to erase"))
+ (define-key map [set-line]
+ '(menu-item "Character for Line..." artist-select-line-char
+ :help "Choose the character to insert when drawing lines"))
+ (define-key map [set-fill]
+ '(menu-item "Character for Fill..." artist-select-fill-char
+ :help "Choose the character to insert when filling in shapes"))
+ (define-key map [artist-separator] '(menu-item "--"))
+ (dolist (op '(("Vaporize" artist-select-op-vaporize-lines vaporize-lines)
+ ("Erase" artist-select-op-erase-rectangle erase-rect)
+ ("Spray-can" artist-select-op-spray-set-size spray-get-size)
+ ("Text" artist-select-op-text-overwrite text-ovwrt)
+ ("Ellipse" artist-select-op-circle circle)
+ ("Poly-line" artist-select-op-straight-poly-line spolyline)
+ ("Square" artist-select-op-square square)
+ ("Rectangle" artist-select-op-rectangle rectangle)
+ ("Line" artist-select-op-straight-line s-line)
+ ("Pen" artist-select-op-pen-line pen-line)))
+ (define-key map (vector (nth 2 op))
+ `(menu-item ,(nth 0 op)
+ ,(nth 1 op)
+ :help ,(format "Draw using the %s style" (nth 0 op))
+ :button (:radio . (eq artist-curr-go ',(nth 2 op))))))
+ map))
+
(defvar artist-mode-map
(let ((map (make-sparse-keymap)))
(setq artist-mode-map (make-sparse-keymap))
(define-key map "\C-c\C-a\C-y" 'artist-select-op-paste)
(define-key map "\C-c\C-af" 'artist-select-op-flood-fill)
(define-key map "\C-c\C-a\C-b" 'artist-submit-bug-report)
+ (define-key map [menu-bar artist] (cons "Artist" artist-menu-map))
map)
"Keymap for `artist-minor-mode'.")
;;; ---------------------------------
;;;###autoload
-(defun artist-mode (&optional state)
+(define-minor-mode artist-mode
"Toggle Artist mode.
-With argument STATE, turn Artist mode on if STATE is positive.
+With argument ARG, turn Artist mode on if ARG is positive.
Artist lets you draw lines, squares, rectangles and poly-lines,
ellipses and circles with your mouse and/or keyboard.
Hooks
- When entering artist-mode, the hook `artist-mode-init-hook' is called.
- When quitting artist-mode, the hook `artist-mode-exit-hook' is called.
+ Turning the mode on or off runs `artist-mode-hook'.
Keymap summary
\\{artist-mode-map}"
- (interactive)
- (if (setq artist-mode
- (if (null state) (not artist-mode)
- (> (prefix-numeric-value state) 0)))
- (artist-mode-init)
- (artist-mode-exit)))
-
-;; insert our minor mode string
-(or (assq 'artist-mode minor-mode-alist)
- (setq minor-mode-alist
- (cons '(artist-mode artist-mode-name)
- minor-mode-alist)))
-
-;; insert our minor mode keymap
-(or (assq 'artist-mode minor-mode-map-alist)
- (setq minor-mode-map-alist
- (cons (cons 'artist-mode artist-mode-map)
- minor-mode-map-alist)))
-
+ :init-value nil :group 'artist :lighter artist-mode-name
+ :keymap artist-mode-map
+ (cond ((null artist-mode)
+ ;; Turn mode off
+ (artist-mode-exit))
+ (t
+ ;; Turn mode on
+ (artist-mode-init))))
;; Init and exit
(defun artist-mode-init ()
- "Init Artist mode. This will call the hook `artist-mode-init-hook'."
+ "Init Artist mode. This will call the hook `artist-mode-hook'."
;; Set up a conversion table for mapping tabs and new-lines to spaces.
;; the last case, 0, is for the last position in buffer/region, where
;; the `following-char' function returns 0.
(progn
(picture-mode)
(message "")))
- (run-hooks 'artist-mode-init-hook)
(artist-mode-line-show-curr-operation artist-key-is-drawing))
(defun artist-mode-exit ()
- "Exit Artist mode. This will call the hook `artist-mode-exit-hook'."
+ "Exit Artist mode. This will call the hook `artist-mode-hook'."
(if (and artist-picture-compatibility (eq major-mode 'picture-mode))
(picture-mode-exit))
- (kill-local-variable 'next-line-add-newlines)
- (run-hooks 'artist-mode-exit-hook))
+ (kill-local-variable 'next-line-add-newlines))
(defun artist-mode-off ()
"Turn Artist mode off."
;;
;; Example: In the figure below, the `X' is the very last
;; character in the buffer ("a non-empty line at the
- ;; end"). Suppose point is at at P. Then (forward-line 1)
+ ;; end"). Suppose point is at P. Then (forward-line 1)
;; returns 0 and puts point after the `X'.
;;
;; --------top of buffer--------
"Retrieve a replacement for character C from `artist-replacement-table'.
The replacement is used to convert tabs and new-lines to spaces."
;; Characters may be outside the range of the `artist-replacement-table',
- ;; for example if they are unicode code points >= 256.
+ ;; for example if they are Unicode code points >= 256.
;; Check so we don't attempt to access the array out of its bounds,
;; assuming no such character needs to be replaced.
(if (< c (length artist-replacement-table))
;; Things for drawing lines in all directions.
-;; The line drawing engine is the eight-point alrogithm.
+;; The line drawing engine is the eight-point algorithm.
;;
;; A line is here a list of (x y saved-char new-char)s.
;;
5
6))))
-;; Some inline funtions for creating, setting and reading
+;; Some inline functions for creating, setting and reading
;; members of a coordinate
;;
point-list))
;; artist-save-chars-under-point-list
-;; Remebers the chars that were there before we did draw the line.
+;; Remembers the chars that were there before we did draw the line.
;; Returns point-list.
;;
(defun artist-save-chars-under-point-list (point-list)
;;
-;; functions for accessing endoints and elements in object requiring
+;; functions for accessing endpoints and elements in object requiring
;; 2 endpoints
;;
;; 2| |
;; 3+-----+
;;
-;; We will then pop (0,0) and remove the left-most vertival line while
+;; We will then pop (0,0) and remove the left-most vertical line while
;; pushing the lower left corner (0,3) on the stack, and so on until
;; the entire rectangle is vaporized.
;;
(width (abs (- x2 x1)))
(height (abs (- y2 y1)))
;; When drawing our circle, we want it to through the cursor
- ;; just as when drawing the ellispe, but we have to take
+ ;; just as when drawing the ellipse, but we have to take
;; care for the aspect-ratio.
;; The equation for the ellipse (where a is the x-radius and
;; b is the y-radius):
;; Implementation note: This really should honor the interval-fn entry
;; in the master table, `artist-mt', which would mean leaving a timer
;; that calls `draw-fn' every now and then. That timer would then have
-;; to be cancelled and reinstalled whenever the user moves the cursor.
+;; to be canceled and reinstalled whenever the user moves the cursor.
;; This could be done, but what if the user suddenly switches to another
;; drawing mode, or even kills the buffer! In the mouse case, it is much
;; simpler: when at the end of `artist-mouse-draw-continously', the
-;; user has released the button, so the timer will always be cancelled
+;; user has released the button, so the timer will always be canceled
;; at that point.
(defun artist-key-draw-continously (x y)
"Draw current continuous shape at X,Y."
(defun artist-draw-region-trim-line-endings (min-y max-y)
"Trim lines in current draw-region from MIN-Y to MAX-Y.
Trimming here means removing white space at end of a line."
- ;; Safetyc check: switch min-y and max-y if if max-y is smaller
+ ;; Safety check: switch min-y and max-y if max-y is smaller
(if (< max-y min-y)
(let ((tmp min-y))
(setq min-y max-y)
"Set current fill character to be C."
(interactive "cType fill char (type RET to turn off): ")
(cond ((eq c ?\r) (setq artist-fill-char-set nil)
- (message "Fill cancelled"))
+ (message "Fill canceled"))
(t (setq artist-fill-char-set t)
(setq artist-fill-char c)
(message "Fill set to \"%c\"" c))))
(artist-arrow-point-set-state artist-arrow-point-2 new-state)))))
+(defun artist-select-op-pen-line ()
+ "Select drawing pen lines."
+ (interactive)
+ (artist-select-operation "Pen Line"))
(defun artist-select-op-line ()
"Select drawing lines."
;; of drawing mode.
;;
;; You should provide these functions. You might think that
-;; only you is using your type of mode, so noone will be able
+;; only you is using your type of mode, so no one will be able
;; to switch to another operation of the same type of mode,
;; but someone else might base a new drawing mode upon your
;; work.
;; Don't hesitate to ask me any questions.
-;; arch-tag: 3e63b881-aaaa-4b83-a072-220d4661a8a3
;;; artist.el ends here