emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Thorsten Jolitz <tjolitz@gmail.com>
To: emacs-orgmode@gnu.org
Subject: Re: [FYI] Programming with org-dp (by example)
Date: Mon, 05 Mar 2018 01:12:43 +0100	[thread overview]
Message-ID: <871sgzs7lw.fsf@gmail.com> (raw)
In-Reply-To: 877eqrs8xh.fsf@gmail.com

Thorsten Jolitz <tjolitz@gmail.com> 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	other threads:[~2018-03-05  0:13 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-04 23:44 [FYI] Programming with org-dp (by example) Thorsten Jolitz
2018-03-05  0:12 ` Thorsten Jolitz [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871sgzs7lw.fsf@gmail.com \
    --to=tjolitz@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).