emacs-wiki-discuss
[Top][All Lists]
Advanced

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

[emacs-wiki-discuss] Re: weekly-view, cyclic tasks and planner-appts


From: Edgar Gonçalves
Subject: [emacs-wiki-discuss] Re: weekly-view, cyclic tasks and planner-appts
Date: Tue, 14 Mar 2006 09:31:08 +0000
User-agent: Gnus/5.110004 (No Gnus v0.4)

Yesterday morning, Jim Ottaway wrote:
[snip]
>
>> I still have one problem, that is related to the weekly-view
>> production. Right now I have a function that collects the appts for 6 days,
>> starting from the beginning of the week. My problem is how to get the right
>> Monday date from (planner-today). There's a function that works with the
>> calendar cursor, but that's no good, because it messes the weekly-view
>> code. I'd like to calculate it, but didn't put much thought into it - I was
>> hoping there was already a nice elisp function to do it for me! (Btw, if you
>> want to test this, it already works, but only if calendar cursor is under a
>> Monday!)
>
> Does this work?:
>
> (defun planner-beginning-of-week (planner-date)
>   (let ((date (planner-filename-to-calendar-date planner-date)))
>     (planner-date-to-filename
>      (calendar-gregorian-from-absolute
>       (+ (calendar-absolute-from-gregorian date)
>          (- calendar-week-start-day
>             (calendar-day-of-week date)))))))
>
> It uses calendar-week-start-day for consistency with calendar [0 for
> Sunday, 1 for Monday, etc.].

Thanks, it works fine! It's better than something I've arranged myself, that
would do a recursion subtracting one day at a time and asking "is it Monday
yet?" :)

I've now come to decent results. I was having some problems because I had
forgotten to fix `planner-appt-forthcoming-get-cyclic'. I don't really know how
the first dolist "was" working (because it was!), but I had to add a START-DAY
optional argument (not affecting callers of the previous function), and this is
working for me:

(defun planner-appt-forthcoming-get-cyclic (n &optional start-day)
  (let ((appts '())
        (cyclic-task-descriptions '())
        (start-day (or start-day (planner-today)))
        date line time text task-info task-data)
  (dolist (entry (planner-list-diary-entries
                  planner-cyclic-diary-file
                  (planner-filename-to-calendar-date
                   (planner-calculate-date-from-day-offset
                    start-day 0))
                  (1+ n)))
    (setq date (planner-date-to-filename (car entry))
          line (cadr entry))
    (if (string-match planner-appt-schedule-appt-regexp line)
        (setq time (save-match-data
                     (appt-convert-time (match-string 1 line)))
              text (match-string 0 line))
      (when (string-match planner-appt-forthcoming-task-regexp line)
        (setq task-info (planner-task-info-from-string date line))
        (setq task-data (planner-appt-forthcoming-task-data task-info))
        (when task-data
          ;; For duplicate checking: remember the description as
          ;; it would be transformed by planner-cyclic.
          (push (format planner-cyclic-task-description-format
                        (planner-task-description task-info) date)
                cyclic-task-descriptions)
          (setq time (car task-data)
                text (cdr task-data)))))
    (when (and time text)
      (add-to-list
       'appts
       (list (calendar-absolute-from-gregorian (car entry))
             time date text))
      (setq time nil text nil)))
  (cons appts cyclic-task-descriptions)))


So now I have a weekly-view by adding the appts only to the diary entries with
this advice:

(defadvice week-graph-view-diary-entries (around show-planner-appts activate)
  (let ((list-diary-entries-hook '(planner-include-appt-entries)))
    ad-do-it))


And the "magic" function is:

(defun planner-include-appt-entries ()
  "Add diary entries with todays planner appointments."
  (declare (special original-date))
  (let ((start-day (planner-beginning-of-week
                    (planner-date-to-filename original-date))))
    ;; Cycle through forthcoming appts for all the week days:
    (dolist (appt (planner-appt-forthcoming-get-appts 4 start-day))
      (let ((date (car appt))   ;; date       : YYYY.MM.DD
            (text (cadr appt))) ;; description: @START-TIME | END-TIME | TEXT
        (add-to-diary-list (planner-filename-to-calendar-date date)
                           text
                           "")))))

Don't forget you have to change cal-desk's regexp recognition (unfortunately
they're hard coded, it'd be better to have some variable regexp list!), and add
the regexps I've mentioned in a previous post in this thread to
`diary-time-regexp-list'.


On my TODO list are the following interesting (at least for me) issues:
- Make tooltips to weekly-view entries, with start and end times and
  description
- Make buttons with links in weekly-view entries
- Give different colors to weekly-view entries (e.g., tasks priorities)
- Make entries editable. This could be tricky, because I'd have to detect
  cyclic entries (changing the diary file) and task entries (and I'd use
  `planner-edit-task-description').

Hope someone will enjoy this! ;)
    

-- 
Edgar Gonçalves
Software Engineering Group @ INESC-ID
IST/Technical University of Lisbon
Rua Alves Redol, 9, Room 635              
1000-029 Lisboa, Portugal                 
mailto:edgar[DOT]goncalves[AT]inesc[DASH]id[DOT]pt
http://www.esw.inesc-id.pt/~eemg





reply via email to

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