[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master a2f9d50: * ampc/ampc.el: Add current song time in status d
From: |
Stefan Monnier |
Subject: |
[elpa] master a2f9d50: * ampc/ampc.el: Add current song time in status display |
Date: |
Wed, 27 Jul 2016 14:37:39 +0000 (UTC) |
branch: master
commit a2f9d508d03787bca03649d58b4d050ab0d2be05
Author: Cédric Chépied <address@hidden>
Commit: Stefan Monnier <address@hidden>
* ampc/ampc.el: Add current song time in status display
(ampc-views): Increase size for `status'.
(ampc-status-timer): New var.
(ampc-status): Add optional `width' argument.
(ampc-fill-status): Use it.
(ampc-handle-current-song): Add "Time".
(ampc-handle-status): Add "elapsed"
(ampc-restart-status-timer, ampc-time-to-progress-bar)
(ampc-current-song-time): New functions.
(ampc-status): Use it.
(ampc-quit): Turn off ampc-status-timer.
(ampc): Turn on ampc-status-timer.
---
packages/ampc/ampc.el | 98 ++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 88 insertions(+), 10 deletions(-)
diff --git a/packages/ampc/ampc.el b/packages/ampc/ampc.el
index 8134c5c..0710c70 100644
--- a/packages/ampc/ampc.el
+++ b/packages/ampc/ampc.el
@@ -548,21 +548,21 @@ modified."
,(kbd "J")
horizontal
(0.4 vertical
- (6 status)
+ (10 status)
(1.0 current-playlist ,@pl-prop))
,rs_a)
("Current playlist view (Genre|Album|Artist)"
,(kbd "M")
horizontal
(0.4 vertical
- (6 status)
+ (10 status)
(1.0 current-playlist ,@pl-prop))
,rs_b)
("Playlist view (Genre|Artist|Album)"
,(kbd "K")
horizontal
(0.4 vertical
- (6 status)
+ (10 status)
(1.0 vertical
(0.4 current-playlist ,@pl-prop)
(0.4 playlist ,@pl-prop)
@@ -572,7 +572,7 @@ modified."
,(kbd "<")
horizontal
(0.4 vertical
- (6 status)
+ (10 status)
(1.0 vertical
(0.4 current-playlist ,@pl-prop)
(0.4 playlist ,@pl-prop)
@@ -582,7 +582,7 @@ modified."
,(kbd "F")
horizontal
(0.4 vertical
- (6 status)
+ (10 status)
(1.0 current-playlist ,@pl-prop))
,search-view)
("Outputs view"
@@ -610,6 +610,7 @@ modified."
(defvar ampc-internal-db nil)
(defvar ampc-status nil)
+(defvar ampc-status-timer nil)
(defvar ampc-tagger-previous-configuration nil)
(defvar ampc-tagger-version-verified nil)
@@ -1860,7 +1861,8 @@ modified."
(erase-buffer)
(funcall (or (plist-get (cadr ampc-type) :filler)
(lambda (_)
- (insert (ampc-status t) "\n")))
+ (insert (ampc-status t (window-width (get-buffer-window)))
+ "\n")))
ampc-status)
(ampc-set-dirty nil)))
@@ -2007,13 +2009,14 @@ modified."
(cl-callf2 assq-delete-all s ampc-status))))
(defun ampc-handle-current-song ()
- (ampc-fill-status-var (append ampc-status-tags '("Artist" "Title" "file")))
+ (ampc-fill-status-var (append ampc-status-tags
+ '("Artist" "Title" "file" "Time")))
(ampc-fill-status)
(run-hook-with-args ampc-status-changed-hook ampc-status))
(defun ampc-handle-status ()
(ampc-fill-status-var '("volume" "repeat" "random" "consume" "xfade" "state"
- "song" "playlistlength"))
+ "song" "playlistlength" "elapsed"))
(ampc-with-buffer 'current-playlist
(if (fboundp 'font-lock-flush)
(font-lock-flush)
@@ -2811,7 +2814,71 @@ If ARG is omitted, use the selected entries in the
current buffer."
(ampc-with-selection arg
(ampc-add-impl)))
-(defun ampc-status (&optional no-print)
+(defun ampc-restart-status-timer ()
+ (when ampc-status-timer
+ (cancel-timer ampc-status-timer)
+ (setq ampc-status-timer nil))
+ (setq ampc-status-timer
+ (run-at-time
+ nil
+ 0.9
+ (lambda ()
+ (when (ampc-on-p)
+ (ampc-send-command 'status))))))
+
+
+(defun ampc-time-to-progress-bar (elapsed total width)
+ "Creates a progess bar like this: |=========>----|
+ELAPSED is the number of seconds represented by '=' signs
+TOTAL is the number of seconds represented by the entire bar
+WIDTH is the max width of the bar. If < 2, 2 characters will be used anyway"
+ (setq width (- width 2)) ;; 2 characters for '||'
+
+ (let ((result "|"))
+ (when (> width 0)
+ (let* ((e (/ (* elapsed width) total)) ;; number of '=' signs
+ (r (- width e))) ;; number of '-' signs
+ (setq result (concat result
+ (make-string (max 0 (1- e)) ?=)
+ ">"
+ (make-string r ?-)))))
+
+ (concat result "|")))
+
+(defun ampc-current-song-time (elapsed total width)
+ "Creates an ASCII representation of elapsed time of the current song.
+ELAPSED is the current time of the song in seconds
+TOTAL is the total time of the song in seconds
+WIDTH is the max desired length of the result"
+ (setq elapsed (truncate elapsed))
+ (when (> elapsed total)
+ (setq elapsed total))
+
+ (let* ((hours (/ elapsed 3600))
+ (minutes (- (/ elapsed 60) (* 60 hours)))
+ (seconds (mod elapsed 60))
+ (result ""))
+ (when (> hours 0)
+ (setq result (format "%d:%s"
+ hours
+ (if (< minutes 10)
+ "0"
+ "")
+ )))
+ (setq result (format "%s%d:%s%d"
+ result
+ minutes
+ (if (< seconds 10)
+ "0"
+ "")
+ seconds))
+
+ (concat (ampc-time-to-progress-bar elapsed total
+ (1- (- width (length result))))
+ " "
+ result)))
+
+(cl-defun ampc-status (&optional no-print (width 50))
"Display and return the information that is displayed in the status window.
If optional argument NO-PRINT is non-nil, just return the text.
If NO-PRINT is nil, the display may be delayed if ampc does not
@@ -2846,6 +2913,13 @@ have enough information yet."
(ampc-clean-tag
'Title
(cdr (assq 'Title ampc-status)))
+ "\n"
+ (ampc-current-song-time
+ (string-to-number (cdr (assq 'elapsed
+ ampc-status)))
+ (string-to-number (cdr (assq 'Time
+ ampc-status)))
+ width)
"\n"))
"Volume: " (cdr (assq 'volume ampc-status)) "\n"
"Crossfade: " (cdr (assq 'xfade ampc-status))
@@ -3103,6 +3177,9 @@ ampc is connected to."
(delete-process ampc-connection))
(when ampc-working-timer
(cancel-timer ampc-working-timer))
+ (when ampc-status-timer
+ (cancel-timer ampc-status-timer)
+ (setq ampc-status-timer nil))
(ampc-suspend nil)
(setf ampc-connection nil
ampc-internal-db nil
@@ -3167,7 +3244,8 @@ default to the ones specified in `ampc-default-server'."
(run-hooks 'ampc-connected-hook)
(when suspend
(ampc-suspend))
- (ampc-filter (process-buffer ampc-connection) nil))
+ (ampc-filter (process-buffer ampc-connection) nil)
+ (ampc-restart-status-timer))
(provide 'ampc)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] master a2f9d50: * ampc/ampc.el: Add current song time in status display,
Stefan Monnier <=