2023-04-09 10:05:59 +02:00
|
|
|
(in-package :client-bookmark-window)
|
|
|
|
|
|
|
|
(named-readtables:in-readtable nodgui.syntax:nodgui-syntax)
|
|
|
|
|
|
|
|
(defun add-to-bookmark-clsr (toplevel iri-entry section-entry description-entry)
|
|
|
|
(lambda ()
|
|
|
|
(let ((iri (gui:text iri-entry))
|
|
|
|
(section (if (text-utils:string-empty-p (gui:text section-entry))
|
|
|
|
(_ "Default")
|
|
|
|
(gui:text section-entry)))
|
|
|
|
(description (if (text-utils:string-empty-p (gui:text description-entry))
|
|
|
|
iri-entry
|
|
|
|
(gui:text description-entry))))
|
|
|
|
(if (gemini-parser:gemini-iri-p iri)
|
|
|
|
(ev:with-enqueued-process-and-unblock ()
|
|
|
|
(comm:make-request :gemini-bookmark-add 1 iri section description)
|
|
|
|
(gui-goodies:info-dialog toplevel
|
2023-04-09 10:14:18 +02:00
|
|
|
(format nil (_ "The address ~a has been bookmarked") iri))
|
|
|
|
(gui:exit-from-toplevel toplevel))
|
2023-04-09 10:05:59 +02:00
|
|
|
(gui-goodies:error-dialog toplevel
|
2023-04-09 10:14:18 +02:00
|
|
|
(format nil (_ "~s is not a valid gemini address.") iri))))))
|
2023-04-09 10:05:59 +02:00
|
|
|
|
|
|
|
(defun init-window (master iri)
|
|
|
|
(gui:with-toplevel (toplevel :master master :title (_ "Streams"))
|
|
|
|
(gui:transient toplevel master)
|
|
|
|
(let* ((iri-label (make-instance 'gui:label :master toplevel :text (_ "Address")))
|
|
|
|
(section-label (make-instance 'gui:label :master toplevel :text (_ "Section")))
|
|
|
|
(description-label (make-instance 'gui:label :master toplevel :text (_ "Description")))
|
|
|
|
(iri-entry (make-instance 'gui:entry :master toplevel :text iri))
|
|
|
|
(section-entry (make-instance 'gui:entry :master toplevel :text (_ "Default")))
|
|
|
|
(description-entry (make-instance 'gui:entry :master toplevel))
|
|
|
|
(buttons-frame (make-instance 'gui:frame :master toplevel))
|
|
|
|
(add-button (make-instance 'gui:button
|
|
|
|
:master buttons-frame
|
|
|
|
:image icons:*document-add*
|
|
|
|
:command (add-to-bookmark-clsr toplevel
|
|
|
|
iri-entry
|
|
|
|
section-entry
|
|
|
|
description-entry))))
|
|
|
|
(gui-goodies:attach-tooltips (add-button (_ "add address bookmarks page")))
|
|
|
|
(gui:grid iri-label 0 0 :sticky :nwes)
|
|
|
|
(gui:grid iri-entry 1 0 :sticky :nwes)
|
|
|
|
(gui:grid section-label 2 0 :sticky :nwes)
|
|
|
|
(gui:grid section-entry 3 0 :sticky :nwes)
|
|
|
|
(gui:grid description-label 4 0 :sticky :nwes)
|
|
|
|
(gui:grid description-entry 5 0 :sticky :nwes)
|
|
|
|
(gui:grid buttons-frame 6 0 :sticky :s)
|
|
|
|
(gui:grid add-button 0 0 :sticky :s))))
|
2023-04-09 14:00:15 +02:00
|
|
|
|
|
|
|
(defun bookmarks-table->lisbox-items (bookmarks-table)
|
|
|
|
(loop for bookmark in bookmarks-table
|
|
|
|
collect
|
|
|
|
(strcat (getf bookmark :value) " " (getf bookmark :description))))
|
|
|
|
|
|
|
|
(defun delete-bookmark-clsr (toplevel searchbox bookmarks)
|
|
|
|
(lambda ()
|
|
|
|
(a:when-let ((selected-indices (gui:listbox-get-selection-index searchbox)))
|
|
|
|
(ev:with-enqueued-process-and-unblock ()
|
|
|
|
(loop for selected-index in selected-indices do
|
|
|
|
(let ((iri (getf (elt bookmarks selected-index) :value)))
|
|
|
|
(comm:make-request :gemini-bookmark-delete 1 iri)))
|
|
|
|
(gui:listbox-delete searchbox)
|
|
|
|
(let* ((bookmarks-table (comm:make-request :gemini-bookmark-table 1))
|
|
|
|
(items (bookmarks-table->lisbox-items bookmarks-table)))
|
|
|
|
(gui:listbox-append searchbox items))
|
|
|
|
(gui-goodies:info-dialog toplevel
|
|
|
|
(format nil
|
|
|
|
(n_ "~a element deleted"
|
|
|
|
"~a elements deleted"
|
|
|
|
(length selected-indices))
|
|
|
|
(length selected-indices)))))))
|
|
|
|
|
|
|
|
(defun manage-bookmarks (master)
|
|
|
|
(gui:with-toplevel (toplevel :master master :title (_ "Bookmarks"))
|
|
|
|
(gui:transient toplevel master)
|
|
|
|
(let* ((bookmarks (cev:enqueue-request-and-wait-results :gemini-bookmark-table
|
|
|
|
1
|
|
|
|
ev:+standard-event-priority+))
|
|
|
|
(items (bookmarks-table->lisbox-items bookmarks))
|
|
|
|
(searchbox (make-instance 'gui-mw:searchable-listbox
|
|
|
|
:export-selection nil
|
|
|
|
:select-mode :extended
|
|
|
|
:data items
|
|
|
|
:entry-labe (_ "Filter:")
|
|
|
|
:master toplevel
|
|
|
|
:remove-non-matching-p t
|
|
|
|
:matching-fn (lambda (a b)
|
|
|
|
(re:scan (strcat "(?i)" a) b))))
|
|
|
|
(buttons-frame (make-instance 'gui:frame :master toplevel))
|
|
|
|
(delete-button (make-instance 'gui:button
|
|
|
|
:master buttons-frame
|
|
|
|
:image icons:*document-delete*
|
|
|
|
:command (delete-bookmark-clsr toplevel
|
|
|
|
searchbox
|
|
|
|
bookmarks))))
|
|
|
|
(gui:grid searchbox 0 0)
|
|
|
|
(gui:grid buttons-frame 1 0 :sticky :s)
|
|
|
|
(gui:grid delete-button 0 0 :sticky :s))))
|