elisp/stack-mode/checklist.el
author Luke Hoersten <luke@hoersten.org>
Wed, 16 Sep 2015 16:53:07 -0500
changeset 80 e848f1863d6b
permissions -rw-r--r--
Trying stack-ide-mode.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     1
;;; checklist.el --- Simple checklist UI functionality
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     2
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     3
;; Copyright (c) 2015 Chris Done. All rights reserved.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     4
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     5
;; This file is free software; you can redistribute it and/or modify
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     6
;; it under the terms of the GNU General Public License as published by
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     7
;; the Free Software Foundation; either version 3, or (at your option)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     8
;; any later version.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     9
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    10
;; This file is distributed in the hope that it will be useful,
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    11
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    12
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    13
;; GNU General Public License for more details.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    14
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    15
;; You should have received a copy of the GNU General Public License
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    16
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    17
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    18
;;; Code:
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    19
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    20
(defvar checklist-read-checklist-result nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    21
(make-variable-buffer-local 'checklist-read-checklist-result)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    22
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    23
(defun checklist-read-checklist (prompt choices)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    24
  "Prompt with PROMPT to choose one or more from the list of CHOICES."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    25
  (switch-to-buffer (generate-new-buffer-name "checklist"))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    26
  (let ((inhibit-read-only t))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    27
    (special-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    28
    (setq buffer-read-only t)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    29
    (setq cursor-type 'box)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    30
    (insert (concat prompt "\n\n"))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    31
    (use-local-map (copy-keymap special-mode-map))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    32
    (local-set-key "n" 'next-line)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    33
    (local-set-key "p" 'previous-line)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    34
    (local-set-key (kbd "RET") 'checklist-checklist-choose)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    35
    (local-set-key (kbd "SPC") 'checklist-checklist-choose)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    36
    (local-set-key (kbd "C-c C-c") 'checklist-checklist-done)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    37
    (save-excursion
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    38
      (cl-loop for choice in choices
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    39
               do (insert (propertize (concat "[ ] " (cdr choice) "\n")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    40
                                      'checklist-check-item (car choice))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    41
      (insert "\n")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    42
      (insert "Hit " (propertize "C-c C-c" 'face 'bold) " to finish."))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    43
    (add-hook 'post-command-hook #'checklist-highlight-section t t)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    44
    (setq checklist-read-checklist-result nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    45
    (recursive-edit)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    46
    (let ((result  checklist-read-checklist-result)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    47
          (kill-buffer-query-functions nil))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    48
      (kill-buffer (current-buffer))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    49
      result)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    50
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    51
(defun checklist-checklist-done ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    52
  "Done with the checklist, return the result."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    53
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    54
  (throw 'exit nil))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    55
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    56
(defun checklist-highlight-section ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    57
  "Highlight the item at point."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    58
  (remove-overlays)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    59
  (when (get-text-property (point) 'checklist-check-item)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    60
    (let ((o (make-overlay (line-beginning-position)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    61
                           (1+ (line-end-position)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    62
      (overlay-put o 'face 'secondary-selection))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    63
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    64
(defun checklist-checklist-choose ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    65
  "Choose the current item at point."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    66
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    67
  (let ((inhibit-read-only t)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    68
        (checked (get-text-property (point) 'checklist-item-checked)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    69
    (when (get-text-property (point) 'checklist-check-item)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    70
      (if checked
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    71
          (setq checklist-read-checklist-result
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    72
                (delete (get-text-property (point) 'checklist-check-item)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    73
                        checklist-read-checklist-result))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    74
          (add-to-list 'checklist-read-checklist-result
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    75
                       (get-text-property (point) 'checklist-check-item)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    76
                       t))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    77
      (save-excursion (goto-char (line-beginning-position))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    78
                      (delete-region (line-beginning-position)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    79
                                     (+ (line-beginning-position) (length "[ ]")))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    80
                      (if checked
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    81
                          (insert "[ ]")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    82
                        (insert "[x]")))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    83
      (put-text-property (line-beginning-position)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    84
                         (1+ (line-end-position))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    85
                         'checklist-item-checked (not checked))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    86
      (put-text-property (line-beginning-position)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    87
                         (1+ (line-end-position))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    88
                         'face (if checked nil 'bold))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    89
      (put-text-property (line-beginning-position)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    90
                         (1+ (line-end-position))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    91
                         'checklist-check-item t)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    92
      (checklist-highlight-section))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    93
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    94
(provide 'checklist)