[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