diff options
Diffstat (limited to 'lisp/net/newst-treeview.el')
-rw-r--r-- | lisp/net/newst-treeview.el | 212 |
1 files changed, 121 insertions, 91 deletions
diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el index cf55f66e780..d524e6dd173 100644 --- a/lisp/net/newst-treeview.el +++ b/lisp/net/newst-treeview.el @@ -31,10 +31,6 @@ ;; See newsticker.el ;; ====================================================================== -;;; History: -;; - -;; ====================================================================== ;;; Code: (require 'cl-lib) (require 'newst-reader) @@ -52,72 +48,73 @@ (defface newsticker-treeview-face '((((class color) (background dark)) :foreground "white") (((class color) (background light)) :foreground "black")) - "Face for newsticker tree." - :group 'newsticker-treeview) + "Face for newsticker tree.") (defface newsticker-treeview-new-face '((t :inherit newsticker-treeview-face :weight bold)) - "Face for newsticker tree." - :group 'newsticker-treeview) + "Face for newsticker tree.") (defface newsticker-treeview-old-face '((t :inherit newsticker-treeview-face)) - "Face for newsticker tree." - :group 'newsticker-treeview) + "Face for newsticker tree.") (defface newsticker-treeview-immortal-face '((default :inherit newsticker-treeview-face :slant italic) (((class color) (background dark)) :foreground "orange") (((class color) (background light)) :foreground "blue")) - "Face for newsticker tree." - :group 'newsticker-treeview) + "Face for newsticker tree.") (defface newsticker-treeview-obsolete-face '((t :inherit newsticker-treeview-face :strike-through t)) - "Face for newsticker tree." - :group 'newsticker-treeview) + "Face for newsticker tree.") (defface newsticker-treeview-selection-face '((((class color) (background dark)) :background "#4444aa") (((class color) (background light)) :background "#bbbbff")) - "Face for newsticker selection." - :group 'newsticker-treeview) + "Face for newsticker selection.") (defcustom newsticker-treeview-date-format "%d.%m.%y, %H:%M" "Format for the date column in the treeview list buffer. See `format-time-string' for a list of valid specifiers." :version "25.1" - :type 'string - :group 'newsticker-treeview) + :type 'string) (defcustom newsticker-treeview-own-frame nil "Decides whether newsticker treeview creates and uses its own frame." - :type 'boolean - :group 'newsticker-treeview) + :type 'boolean) (defcustom newsticker-treeview-treewindow-width 30 "Width of tree window in treeview layout. See also `newsticker-treeview-listwindow-height'." - :type 'integer - :group 'newsticker-treeview) + :type 'integer) (defcustom newsticker-treeview-listwindow-height 10 "Height of list window in treeview layout. See also `newsticker-treeview-treewindow-width'." - :type 'integer - :group 'newsticker-treeview) + :type 'integer) (defcustom newsticker-treeview-automatically-mark-displayed-items-as-old t "Decides whether to automatically mark displayed items as old. If t an item is marked as old as soon as it is displayed. This applies to newsticker only." - :type 'boolean - :group 'newsticker-treeview) + :type 'boolean) + +(defcustom newsticker-treeview-use-feed-name-from-url-list-in-treeview + t + "Use the feed names from 'newsticker-url-list' for display in treeview." + :version "28.1" + :type 'boolean) + +(defcustom newsticker-treeview-use-feed-name-from-url-list-in-itemview + t + "Use feed names from 'newsticker-url-list' in itemview." + :version "28.1" + :type 'boolean) (defvar newsticker-groups '("Feeds") @@ -152,14 +149,16 @@ Example: (\"Topmost group\" \"feed1\" (\"subgroup1\" \"feed 2\") (defvar newsticker--treeview-feed-tree nil) (defvar newsticker--treeview-vfeed-tree nil) +(declare-function newsticker-handle-url "newst-plainview" ()) + ;; maps for the clickable portions (defvar newsticker--treeview-url-keymap (let ((map (make-sparse-keymap 'newsticker--treeview-url-keymap))) - (define-key map [mouse-1] 'newsticker-treeview-mouse-browse-url) - (define-key map [mouse-2] 'newsticker-treeview-mouse-browse-url) - (define-key map "\n" 'newsticker-treeview-browse-url) - (define-key map "\C-m" 'newsticker-treeview-browse-url) - (define-key map [(control return)] 'newsticker-handle-url) + (define-key map [mouse-1] #'newsticker-treeview-mouse-browse-url) + (define-key map [mouse-2] #'newsticker-treeview-mouse-browse-url) + (define-key map "\n" #'newsticker-treeview-browse-url) + (define-key map "\C-m" #'newsticker-treeview-browse-url) + (define-key map [(control return)] #'newsticker-handle-url) map) "Key map for click-able headings in the newsticker treeview buffers.") @@ -328,9 +327,9 @@ If string SHOW-FEED is non-nil it is shown in the item string." (replace-match " ")) (let ((map (make-sparse-keymap))) (dolist (key'([mouse-1] [mouse-3])) - (define-key map key 'newsticker-treeview-tree-click)) - (define-key map "\n" 'newsticker-treeview-show-item) - (define-key map "\C-m" 'newsticker-treeview-show-item) + (define-key map key #'newsticker-treeview-tree-click)) + (define-key map "\n" #'newsticker-treeview-show-item) + (define-key map "\C-m" #'newsticker-treeview-show-item) (add-text-properties pos1 (point-max) (list :nt-item item :nt-feed feed @@ -612,9 +611,9 @@ If CLEAR-BUFFER is non-nil the list buffer is completely erased." (defvar newsticker-treeview-list-sort-button-map (let ((map (make-sparse-keymap))) (define-key map [header-line mouse-1] - 'newsticker--treeview-list-sort-by-column) + #'newsticker--treeview-list-sort-by-column) (define-key map [header-line mouse-2] - 'newsticker--treeview-list-sort-by-column) + #'newsticker--treeview-list-sort-by-column) map) "Local keymap for newsticker treeview list window sort buttons.") @@ -738,11 +737,14 @@ for the button." (img (newsticker--image-read feed-name-symbol nil 40))) (if (and (display-images-p) img) (newsticker--insert-image img (car item)) - (insert (newsticker--real-feed-name feed-name-symbol)))) + (insert (if newsticker-treeview-use-feed-name-from-url-list-in-itemview + (symbol-name feed-name-symbol) + (newsticker--real-feed-name feed-name-symbol))))) (add-text-properties (point-min) (point) (list 'face 'newsticker-feed-face 'mouse-face 'highlight - 'help-echo "Visit in web browser." + 'help-echo (concat (newsticker--real-feed-name feed-name-symbol) + "\nClick to visit in web browser.") :nt-link (newsticker--link item) 'keymap newsticker--treeview-url-keymap)) (setq pos (point)) @@ -933,31 +935,31 @@ Optional arguments CHANGED-WIDGET and EVENT are ignored." (newsticker-treeview-mode))) (defun newsticker--treeview-propertize-tag (tag &optional num-new nt-id feed - vfeed) + vfeed tooltip) "Return propertized copy of string TAG. Optional argument NUM-NEW is used for choosing face, other -arguments NT-ID, FEED, and VFEED are added as properties." +arguments NT-ID, FEED, VFEED and TOOLTIP are added as properties." ;;(message "newsticker--treeview-propertize-tag `%s' %s" feed nt-id) (let ((face 'newsticker-treeview-face) (map (make-sparse-keymap))) (if (and num-new (> num-new 0)) (setq face 'newsticker-treeview-new-face)) (dolist (key '([mouse-1] [mouse-3])) - (define-key map key 'newsticker-treeview-tree-click)) - (define-key map "\n" 'newsticker-treeview-tree-do-click) - (define-key map "\C-m" 'newsticker-treeview-tree-do-click) + (define-key map key #'newsticker-treeview-tree-click)) + (define-key map "\n" #'newsticker-treeview-tree-do-click) + (define-key map "\C-m" #'newsticker-treeview-tree-do-click) (propertize tag 'face face 'keymap map :nt-id nt-id :nt-feed feed :nt-vfeed vfeed - 'help-echo tag + 'help-echo tooltip 'mouse-face 'highlight))) (defun newsticker--treeview-tree-get-tag (feed-name vfeed-name &optional nt-id) "Return a tag string for either FEED-NAME or, if it is nil, for VFEED-NAME. Optional argument NT-ID is added to the tag's properties." - (let (tag (num-new 0)) + (let (tag tooltip (num-new 0)) (cond (vfeed-name (cond ((string= vfeed-name "new") (setq num-new (newsticker--stat-num-items-total 'new)) @@ -970,18 +972,29 @@ Optional argument NT-ID is added to the tag's properties." (setq tag (format "Obsolete items (%d)" num-new))) ((string= vfeed-name "all") (setq num-new (newsticker--stat-num-items-total)) - (setq tag (format "All items (%d)" num-new))))) + (setq tag (format "All items (%d)" num-new)))) + (setq tooltip tag)) (feed-name (setq num-new (newsticker--stat-num-items-for-group (intern feed-name) 'new 'immortal)) (setq tag (format "%s (%d)" - (newsticker--real-feed-name (intern feed-name)) - num-new)))) + (if newsticker-treeview-use-feed-name-from-url-list-in-itemview + feed-name + (newsticker--real-feed-name (intern feed-name))) + num-new)) + (setq tooltip + (if (newsticker--group-get-group feed-name) + tag + (format "%s (%d)\n%s" + feed-name + num-new + (newsticker--real-feed-name (intern feed-name))))))) (if tag (newsticker--treeview-propertize-tag tag num-new nt-id - feed-name vfeed-name)))) + feed-name vfeed-name + tooltip)))) (defun newsticker--stat-num-items-for-group (feed-name-symbol &rest ages) "Count number of items in feed FEED-NAME-SYMBOL that have an age matching AGES." @@ -1085,6 +1098,7 @@ Arguments are ignored." ;; ====================================================================== (defvar newsticker-treeview-tool-bar-map (when (boundp 'tool-bar-map) + (defvar tool-bar-map) (let ((tool-bar-map (make-sparse-keymap))) (tool-bar-add-item "newsticker/prev-feed" 'newsticker-treeview-prev-feed @@ -1434,6 +1448,15 @@ Move to next item unless DONT-PROCEED is non-nil." newsticker--treeview-current-vfeed) (newsticker--treeview-get-selected-item))) +(defun newsticker-treeview-customize-current-feed () + "Open customization buffer for `newsticker-url-list' and move to current feed." + (interactive) + (let ((cur-feed (or newsticker--treeview-current-feed + newsticker--treeview-current-vfeed))) + (if (newsticker--group-get-group cur-feed) + (message "Cannot customize groups. Please select a feed.") + (newsticker-customize-feed cur-feed)))) + (defun newsticker--treeview-set-current-node (node) "Make NODE the current node." (with-current-buffer (newsticker--treeview-tree-buffer) @@ -1626,7 +1649,7 @@ Return t if a new feed was activated, nil otherwise." (interactive (list (let ((completion-ignore-case t)) (completing-read - "Jump to feed: " + "Jump to feed/group: " (append '("new" "obsolete" "immortal" "all") (mapcar #'car (append newsticker-url-list newsticker-url-list-defaults))) @@ -1852,28 +1875,34 @@ of the shift. If MOVE-GROUP is nil the currently selected feed `newsticker--treeview-current-feed' is shifted, if it is t then the current feed's parent group is shifted.." (let* ((cur-feed newsticker--treeview-current-feed) - (thing (if move-group - (newsticker--group-find-parent-group cur-feed) + (thing (if (and move-group + (not (newsticker--group-get-group cur-feed))) + (car (newsticker--group-find-parent-group cur-feed)) cur-feed)) (parent-group (newsticker--group-find-parent-group - (if move-group (car thing) thing)))) + ;;(if move-group (car thing) thing) + thing))) (unless parent-group (error "Group not found!")) (let* ((siblings (cdr parent-group)) - (pos (cl-position thing siblings :test 'equal)) + (pos (cl-position thing siblings :test + (lambda (o1 o2) + (equal (if (listp o1) (car o1) o1) + (if (listp o2) (car o2) o2))))) (tpos (+ pos delta )) (new-pos (max 0 (min (length siblings) tpos))) (beg (cl-subseq siblings 0 (min pos new-pos))) (end (cl-subseq siblings (+ 1 (max pos new-pos)))) (p (elt siblings new-pos))) (when (not (= pos new-pos)) - (setcdr parent-group - (cl-concatenate 'list - beg - (if (> delta 0) - (list p thing) - (list thing p)) - end)) + (let ((th (or (newsticker--group-get-group thing) thing))) + (setcdr parent-group + (cl-concatenate 'list + beg + (if (> delta 0) + (list p th) + (list th p)) + end))) (newsticker--treeview-tree-update) (newsticker-treeview-update) (newsticker-treeview-jump cur-feed))))) @@ -1986,36 +2015,37 @@ Return t if groups have changed, nil otherwise." (defvar newsticker-treeview-mode-map (let ((map (make-sparse-keymap 'newsticker-treeview-mode-map))) - (define-key map " " 'newsticker-treeview-next-page) - (define-key map "a" 'newsticker-add-url) - (define-key map "b" 'newsticker-treeview-browse-url-item) - (define-key map "F" 'newsticker-treeview-prev-feed) - (define-key map "f" 'newsticker-treeview-next-feed) - (define-key map "g" 'newsticker-treeview-get-news) - (define-key map "G" 'newsticker-get-all-news) - (define-key map "i" 'newsticker-treeview-toggle-item-immortal) - (define-key map "j" 'newsticker-treeview-jump) - (define-key map "n" 'newsticker-treeview-next-item) - (define-key map "N" 'newsticker-treeview-next-new-or-immortal-item) - (define-key map "O" 'newsticker-treeview-mark-list-items-old) - (define-key map "o" 'newsticker-treeview-mark-item-old) - (define-key map "p" 'newsticker-treeview-prev-item) - (define-key map "P" 'newsticker-treeview-prev-new-or-immortal-item) - (define-key map "q" 'newsticker-treeview-quit) - (define-key map "S" 'newsticker-treeview-save-item) - (define-key map "s" 'newsticker-treeview-save) - (define-key map "u" 'newsticker-treeview-update) - (define-key map "v" 'newsticker-treeview-browse-url) - ;;(define-key map "\n" 'newsticker-treeview-scroll-item) - ;;(define-key map "\C-m" 'newsticker-treeview-scroll-item) - (define-key map "\M-m" 'newsticker-group-move-feed) - (define-key map "\M-a" 'newsticker-group-add-group) - (define-key map "\M-d" 'newsticker-group-delete-group) - (define-key map "\M-r" 'newsticker-group-rename-group) - (define-key map [M-down] 'newsticker-group-shift-feed-down) - (define-key map [M-up] 'newsticker-group-shift-feed-up) - (define-key map [M-S-down] 'newsticker-group-shift-group-down) - (define-key map [M-S-up] 'newsticker-group-shift-group-up) + (define-key map " " #'newsticker-treeview-next-page) + (define-key map "a" #'newsticker-add-url) + (define-key map "b" #'newsticker-treeview-browse-url-item) + (define-key map "c" #'newsticker-treeview-customize-current-feed) + (define-key map "F" #'newsticker-treeview-prev-feed) + (define-key map "f" #'newsticker-treeview-next-feed) + (define-key map "g" #'newsticker-treeview-get-news) + (define-key map "G" #'newsticker-get-all-news) + (define-key map "i" #'newsticker-treeview-toggle-item-immortal) + (define-key map "j" #'newsticker-treeview-jump) + (define-key map "n" #'newsticker-treeview-next-item) + (define-key map "N" #'newsticker-treeview-next-new-or-immortal-item) + (define-key map "O" #'newsticker-treeview-mark-list-items-old) + (define-key map "o" #'newsticker-treeview-mark-item-old) + (define-key map "p" #'newsticker-treeview-prev-item) + (define-key map "P" #'newsticker-treeview-prev-new-or-immortal-item) + (define-key map "q" #'newsticker-treeview-quit) + (define-key map "S" #'newsticker-treeview-save-item) + (define-key map "s" #'newsticker-treeview-save) + (define-key map "u" #'newsticker-treeview-update) + (define-key map "v" #'newsticker-treeview-browse-url) + ;;(define-key map "\n" #'newsticker-treeview-scroll-item) + ;;(define-key map "\C-m" #'newsticker-treeview-scroll-item) + (define-key map "\M-m" #'newsticker-group-move-feed) + (define-key map "\M-a" #'newsticker-group-add-group) + (define-key map "\M-d" #'newsticker-group-delete-group) + (define-key map "\M-r" #'newsticker-group-rename-group) + (define-key map [M-down] #'newsticker-group-shift-feed-down) + (define-key map [M-up] #'newsticker-group-shift-feed-up) + (define-key map [M-S-down] #'newsticker-group-shift-group-down) + (define-key map [M-S-up] #'newsticker-group-shift-group-up) map) "Mode map for newsticker treeview.") |