aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryonirabkin <yonirabkin>2005-12-09 16:34:00 +0000
committeryonirabkin <mwolson@gnu.org>2005-12-09 16:34:00 +0000
commitd6dd7526befbbfd49c15cd14ff1f14938b908bf8 (patch)
tree30ce8f5f5d44108f40c1c40006dfea52a48d4d57
parent41e4e89f944c12bc9187da62d7ec65f22b4fe232 (diff)
killing and yanking in the interactive playlist buffer
darcs-hash:20051209163432-be80e-eb60a5e8cb71fe56aa3ef9f09513a84f3c7a57ac.gz
-rw-r--r--emms-playlist-mode.el57
1 files changed, 42 insertions, 15 deletions
diff --git a/emms-playlist-mode.el b/emms-playlist-mode.el
index 81d641e..554bed7 100644
--- a/emms-playlist-mode.el
+++ b/emms-playlist-mode.el
@@ -161,11 +161,16 @@ function switches back to the remembered buffer."
(defun emms-playlist-mode-between-p (p a b)
"Return t if P is a point between points A and B."
- (if (eq a b)
+ (if (or (eq a b)
+ (and (> b a)
+ (= p b)))
nil
(eq p (cadr (sort (list a b p) #'<=)))))
;; C-k
+;;
+;; Currently this kills as regular GNU/Emacs would and not like a
+;; typical music player would.
(defun emms-playlist-mode-kill-track ()
"Kill track at point."
(interactive)
@@ -189,21 +194,21 @@ function switches back to the remembered buffer."
(m (mark)) ; throw error if no mark
(p (point))
(sm emms-playlist-selected-marker))
- (kill-region p m)
+ ;; Are we killing the playing/selected track?
(when (emms-playlist-mode-between-p
- (marker-position sm) p m)
+ (marker-position sm) m p)
(setq emms-playlist-selected-marker nil)
(setq emms-playlist-mode-selected-overlay-marker nil)
- (emms-stop)))) ; regardless of state
+ (emms-stop))
+ (kill-region p m)))
;; C-y
(defun emms-playlist-mode-yank ()
"Yank into the playlist buffer."
(interactive)
(let ((inhibit-read-only t))
- (emms-playlist-mode-remove-overlay-selected)
- (yank)
- (emms-playlist-mode-overlay-selected)))
+ (yank))
+ (emms-playlist-mode-overlay-refresh))
;; M-y
(defun emms-playlist-mode-yank-pop ()
@@ -239,17 +244,19 @@ FACE should be a... face."
(defun emms-playlist-mode-overlay-selected ()
"Place an overlay over the currently selected track."
(emms-playlist-mode-remove-overlay-selected)
- (save-excursion
- (goto-char emms-playlist-selected-marker)
- (setq emms-playlist-mode-selected-overlay-marker
- (point-marker))
- (setq emms-playlist-mode-selected-overlay
- (emms-playlist-mode-overlay-at-point
- 'emms-playlist-selected-face 2))))
+ (when (not (and (null emms-playlist-selected-marker)
+ (null emms-playlist-mode-selected-overlay-marker))) ; ugh
+ (save-excursion
+ (goto-char emms-playlist-selected-marker)
+ (setq emms-playlist-mode-selected-overlay-marker
+ (point-marker))
+ (setq emms-playlist-mode-selected-overlay
+ (emms-playlist-mode-overlay-at-point
+ 'emms-playlist-selected-face 2)))))
(defun emms-playlist-mode-remove-overlay-selected ()
"Remove the overlay from the currently selected track"
- (unless (null emms-playlist-mode-selected-overlay-marker)
+ (when (not (null emms-playlist-mode-selected-overlay-marker))
(save-excursion
(goto-char emms-playlist-mode-selected-overlay-marker)
(remove-overlays (point-at-bol)
@@ -257,6 +264,22 @@ FACE should be a... face."
(emms-playlist-mode-overlay-at-point
'emms-playlist-track-face 1))))
+(defun emms-playlist-mode-overlay-all ()
+ "Place an low-priority overlay over the entire buffer."
+ (emms-playlist-mode-overlay-track (point-min)
+ (point-max)
+ 'emms-playlist-track-face
+ 1))
+
+;; not graceful, but avoids growing as the number of tracks grow.
+(defun emms-playlist-mode-overlay-refresh ()
+ "Remove and re-apply all the overlays in the buffer."
+ (remove-overlays (point-min)
+ (point-max))
+ (emms-playlist-mode-overlay-all)
+ (setq emms-playlist-mode-selected-overlay-marker nil)
+ (emms-playlist-mode-overlay-selected))
+
;;; --------------------------------------------------------
;;; Saving/Restoring
;;; --------------------------------------------------------
@@ -367,11 +390,15 @@ WINDOW-WIDTH is `emms-playlist-mode-window-width'."
(defun emms-playlist-mode-startup ()
"Instigate emms-playlist-mode on the current buffer."
+ ;; when there is neither a current emms track or a playing one...
(when (not (or emms-playlist-selected-marker
emms-player-playing-p))
+ ;; ...then stop the player.
(emms-stop)
+ ;; why select the first track?
(when emms-playlist-buffer-p
(emms-playlist-select-first)))
+ ;; when there is a selected track.
(when emms-playlist-selected-marker
(emms-playlist-mode-overlay-selected)
(goto-char (or emms-playlist-mode-selected-overlay-marker