emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] [FYI] Programming with org-dp (by example)


From: Thorsten Jolitz
Subject: Re: [O] [FYI] Programming with org-dp (by example)
Date: Mon, 05 Mar 2018 01:12:43 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)

Thorsten Jolitz <address@hidden> writes:

PS
Ups ... a few little bugs in the code, here is version 2

#+BEGIN_SRC emacs-lisp  
(defconst tj/radio-rgxp "^#\\+attr_org:[[:space:]]+:radio")
(defconst tj/radio-temp "temp")
(defconst tj/radio-wind "wind")

(defvar tj/radio-rw '("temp" "wind")) ;read/write
(defvar tj/radio-r '("take-a-walk")) ;read only

(defvar tj/radio-temp-red '("freezing" "tropical"))
(defvar tj/radio-temp-yellow '("cold" "hot"))
(defvar tj/radio-temp-green '("normal" "warm"))

(defvar tj/radio-wind-red '("hurricane"))
(defvar tj/radio-wind-yellow '("storm"))
(defvar tj/radio-wind-green '("breeze"))

;; rewire function
(defun tj/radio-switch ()
  "docstring"
  (interactive)
  (let ((stmp (time-stamp-string)))
    (forward-line)
    (org-dp-rewire 'plain-list
                   'tj/radio-cont ;cont
                   t ;ins 
                   `(:attr_last_changed (,stmp)) ;aff 
                   nil ;elem 
                   )))

;; mapping function
(defun tj/radio-map ()
  "docstring"
  (interactive)
  (let (temp wind)
  (org-dp-map '(tj/radio-switch) tj/radio-rgxp)))



;; HELPER FUNCTIONS
;; helper function to actually modify the content
(defun tj/radio-cont (cont elem)
  "docstring"
  (let ((name (org-element-property :name elem))
        (prompt-options (tj/radio-get-itm-labels cont))
        (new-cont)
        (users-choice)
        (box-checked-p))
    (cond
     ((member name tj/radio-rw) ;prompt user for value
      (progn
        (setq users-choice (ido-completing-read name prompt-options))
        (set (intern name) users-choice)
        (setq new-cont (mapcar 'tj/radio-itm-rw cont))))
     ((member name tj/radio-r) ;set value
      (setq new-cont
            (mapcar 'tj/radio-itm-r cont)))
     (t)) ;do nothing
    (or new-cont cont)))


(defun tj/radio-get-itm-labels (cont)
  "docstring"
  (mapcar #'(lambda (itm)
              (string-remove-suffix
               "\n"
               (org-dp-contents itm t t)))
           cont))

(defun tj/radio-itm-rw (itm)
  "docstring"
  (let ((label (string-remove-suffix
                "\n" (org-dp-contents itm t t))))
    (if (string-equal label users-choice)
        (org-element-put-property itm :checkbox 'on)
        (org-element-put-property itm :checkbox 'off))
    itm))

(defun tj/radio-itm-r (itm)
  "docstring"
  (let ((label (string-remove-suffix
                "\n" (org-dp-contents itm t t))))

    (org-element-put-property itm :checkbox 'off)

    (cond
     ((and (string-equal label "red")
           (not box-checked-p)
           (or (member temp tj/radio-temp-red)
               (member wind tj/radio-wind-red)))
      (org-element-put-property itm :checkbox 'on)
      (setq box-checked-p t))

     ((and (string-equal label "yellow")
           (not box-checked-p)
           (or (member temp tj/radio-temp-yellow)
               (member wind tj/radio-wind-yellow)))
      (org-element-put-property itm :checkbox 'on)
      (setq box-checked-p t))

     ((and (string-equal label "green")
           (not box-checked-p)
           (or (member temp tj/radio-temp-green)
               (member wind tj/radio-wind-green)))
      (org-element-put-property itm :checkbox 'on)
      (setq box-checked-p t)))
    itm))
#+END_SRC


> Hello List,
> due to some interest in org-dp recently on this list, I actually took
> the challenge of implementing a feature request by John Kitchin (without
> actually sticking close to the specification, this is just a showcase
> for org-dp).
>
> Task: implement a radio-list with org checkboxes 
> Extra feature: a read only radio-list that changes its values
> conditional on the values of read/write radio-lists (when mapping the
> buffer)

-- 
cheers,
Thorsten




reply via email to

[Prev in Thread] Current Thread [Next in Thread]