54 lines
2.1 KiB
Common Lisp
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))
|