dbordak / telephone-line

A new implementation of Powerline for Emacs
GNU General Public License v3.0
550 stars 51 forks source link

Any interest in creating a hud segment? #72

Closed suyashbire1 closed 6 years ago

suyashbire1 commented 6 years ago

The following hud-segment is stolen from https://github.com/milkypostman/powerline/blob/master/powerline.el#L268. Would it be possible to adapt it for telephone-line?

(defun pl/make-xpm (name color1 color2 data)
  "Return an XPM image with NAME using COLOR1 for enabled and COLOR2 for disabled bits specified in DATA."
  (when window-system
    (create-image
     (concat
      (format "/* XPM */
static char * %s[] = {
\"%i %i 2 1\",
\". c %s\",
\"  c %s\",
"
              (downcase (replace-regexp-in-string " " "_" name))
              (length (car data))
              (length data)
              (or (pl/hex-color color1) "None")
              (or (pl/hex-color color2) "None"))
      (let ((len  (length data))
            (idx  0))
        (apply 'concat
               (mapcar #'(lambda (dl)
                           (setq idx (+ idx 1))
                           (concat
                            "\""
                            (concat
                             (mapcar #'(lambda (d)
                                         (if (eq d 0)
                                             (string-to-char " ")
                                           (string-to-char ".")))
                                     dl))
                            (if (eq idx len)
                                "\"};"
                              "\",\n")))
                       data))))
     'xpm t :ascent 'center)))

(defun pl/percent-xpm
  (height pmax pmin winend winstart width color1 color2)
  "Generate percentage xpm of HEIGHT for PMAX to PMIN given WINEND and WINSTART with WIDTH and COLOR1 and COLOR2."
  (let* ((height- (1- height))
         (fillstart (round (* height- (/ (float winstart) (float pmax)))))
         (fillend (round (* height- (/ (float winend) (float pmax)))))
         (data nil)
         (i 0))
    (while (< i height)
      (setq data (cons
                  (if (and (<= fillstart i)
                           (<= i fillend))
                      (append (make-list width 1))
                    (append (make-list width 0)))
                  data))
      (setq i (+ i 1)))
    (pl/make-xpm "percent" color1 color2 (reverse data))))

(pl/memoize 'pl/percent-xpm)

;;;###autoload
(defun powerline-hud (face1 face2 &optional width)
  "Return an XPM of relative buffer location using FACE1 and FACE2 of optional WIDTH."
  (unless width (setq width 2))
  (let ((color1 (if face1 (face-background face1) "None"))
        (color2 (if face2 (face-background face2) "None"))
        (height (or powerline-height (frame-char-height)))
        pmax
        pmin
        (ws (window-start))
        (we (window-end)))
    (save-restriction
      (widen)
      (setq pmax (point-max))
      (setq pmin (point-min)))
    (pl/percent-xpm height pmax pmin we ws
(* (frame-char-width) width) color1 color2)))
dbordak commented 6 years ago

Just added this as telephone-line-hud-segment (it's built on top of a separator object, so it should also work as a separator using telephone-line-hud if you want... but that's kinda silly :P)

dbordak commented 6 years ago

Oh right, do keep in mind, though, that it'll negatively affect scrolling performance. Normally, separators are initialized on (or near) startup (the first time they're rendered, they're saved into a cache) -- but since this one shows a whole ton of different possible images, each one is added to the cache the first time you, for example, scroll 50% down a buffer on which you can see 20% of the screen. It's all still cached, but it'll be slower the first time you scroll through a file after a cold start.

dbordak commented 6 years ago

(it'll also be significantly more demanding than anything else in terms of memory due to said cache; it's O(n^3), but n in this case is the vertical height of your font, so it is still bounded pretty low. I'll need to see if I can limit the number of entries in the hash)

suyashbire1 commented 6 years ago

Thank you for this! Just tried it out and it works like a charm!

I did not notice any degradation of scrolling performance. It was perhaps imperceptible if there was any. Also, I have nlinum and nlinum-relative installed which slow down scrolling too, so hud segment's slowdown might be masked by them.

I'll keep an eye on its memory usage and report if I notice anything abnormal.

dbordak commented 6 years ago

Going to close this now; feel free to reopen if any of those potential issues turn out to be disruptive.