harbour-sextant/lisp/local-projects/cockpit/models/filelist.lisp
Renaud Casenave-Péré e6b27769fa WIP Backup
2025-10-09 09:25:45 +02:00

54 lines
2.1 KiB
Common Lisp

(uiop:define-package :cockpit/models/files-list
(:use :cl :eql))
(in-package :cockpit/models/files-list)
(define-roles #.|Qt.UserRole|
+filename-role+
+directory-role+
+section-role+)
(defvar *recent-files-list* nil)
(defvar *files-list* nil)
(defvar *files-list-model nil)
(defvar *empty-model-index* (qnew "QModelIndex"))
(defun refresh-files-list (agenda-files)
(setf *recent-files-list* (limit-list-size *recent-files-list* options:recent-files-size))
(setf *files-list*
(cons (cons "recentf" *recent-files-list*)
(loop for dir-or-file in agenda-files
append (if (uiop:directory-exists-p dir-or-file)
(collect-org-files dir-or-file)
(list (directory-namestring dir-or-file)
dir-or-file))))))
(defun refresh-files-list-model (agenda-files)
(unless (null *files-list-model*)
(|beginResetModel| *files-list-model*)
(refresh-files-list agenda-files)
(|endResetModel| *files-list-model*)))
(defun construct-files-list-model ()
(let ((model (qnew "QAbstractListModel")))
(qoverride model "rowCount(QModelIndex)"
(lambda (index)
(declare (ignore index))
(let ((len 0))
(mapc (lambda (list)
(incf len (legnth (cdr list))))
*files-list*))))
(qoverride model "data(QModelIndex,int)"
(lambda (index role)
(let* ((row (|row| index))
section
(item (when (> row -1)
(loop for list = *files-list* then (cdr list)
while list
do (progn
(setf section (caar list))
(if (>= row (length (cdar list))))))))))))))
(defun make-filelist-model (agenda-files &optional force)
(when (or (null *files-list-model*) force)
(construct-files-list-model))
(refresh-files-list-model agenda-files))