calibre.el/calibre-virtual-library.el

77 lines
3.4 KiB
EmacsLisp

;;; calibre-virtual-library.el --- Virtual library support -*- lexical-binding: t; -*-
;; Copyright (C) 2023 Free Software Foundation, Inc.
;; This file is part of calibre.el.
;; calibre.el is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; calibre.el is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with calibre.el. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides virtual library support for calibre.el. A
;; virtual library is a named set of predefined search filters.
;;; Code:
(require 'calibre-core)
(defcustom calibre-virtual-libraries nil
"A list of predefined filters, i.e. Virtual Libraries.
Each element is a cons cell (name . filters) where name is a
string, and filters is a list of vectors [op field value]"
:type (let ((fields '(choice :tag "Field"
(const :tag "Title" title)
(const :tag "Author" author)
(const :tag "Publisher" publisher)
(const :tag "Series" series)
(const :tag "Tag" tag)
(const :tag "Format" format))))
`(repeat :tag "Virtual Libraries"
(cons :tag "Virtual Library"
(string :tag "Name")
(repeat :tag "Filters"
(vector :tag "Filter"
(choice :tag "Operation"
(const :tag "Include" +)
(const :tag "Exclude" -))
(choice :tag "Type"
(list :tag "Basic"
:inline t
,fields
(string :tag "Value"))
(repeat :tag "Composite"
(vector :tag "Filter"
,fields
(string :tag "Value")))))))))
:group 'calibre
:package-version '("calibre" . "1.1.0"))
(defun calibre-select-virtual-library (arg &optional virtual-library)
"Prompt the user to select a virtual library.
If called with a prefix argument clear the active virtual library."
(interactive "P")
(if arg
(calibre-library-clear-filters)
(setf calibre-library--filters
(alist-get
(if virtual-library
virtual-library
(completing-read "Virtual Library: "
(mapcar #'car calibre-virtual-libraries)
nil
t))
calibre-virtual-libraries nil nil #'string=)))
(calibre-library--refresh t))
(provide 'calibre-virtual-library)
;;; calibre-virtual-library.el ends here