From c7c2cfdf3a4aa47a41a493369c0c9e2512712dd1 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Sun, 27 Oct 2024 09:41:24 +0100 Subject: refactor mastodon-widget.el, add profile tagged statuses to widget. #607 --- lisp/mastodon-widget.el | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 lisp/mastodon-widget.el (limited to 'lisp/mastodon-widget.el') diff --git a/lisp/mastodon-widget.el b/lisp/mastodon-widget.el new file mode 100644 index 0000000..0c1026c --- /dev/null +++ b/lisp/mastodon-widget.el @@ -0,0 +1,98 @@ +;;; mastodon-widget.el --- Widget utilities -*- lexical-binding: t -*- + +;; Copyright (C) 2020-2024 Marty Hiatt +;; Author: Marty Hiatt +;; Maintainer: Marty Hiatt +;; Homepage: https://codeberg.org/martianh/mastodon.el + +;; This file is not part of GNU Emacs. + +;; This file is part of mastodon.el. + +;; mastodon.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. + +;; mastodon.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 mastodon.el. If not, see . + +;;; Commentary: + +;; some widget utilities for mastodon.el + +;;; Code: + +(require 'cl-lib) + +(defvar mastodon-widget-keymap + (let ((map (make-sparse-keymap))) + (define-key map [down-mouse-2] 'widget-button-click) + (define-key map [down-mouse-1] 'widget-button-click) + (define-key map [touchscreen-begin] 'widget-button-click) + ;; The following definition needs to avoid using escape sequences that + ;; might get converted to ^M when building loaddefs.el + (define-key map [(control ?m)] 'widget-button-press) + map) + "Keymap containing useful binding for buffers containing widgets. +Recommended as a parent keymap for modes using widgets. +Note that such modes will need to require wid-edit.") + +(defface mastodon-widget-face + '((t :inherit font-lock-function-name-face :weight bold :underline t)) + "Face for widgets.") + +(defun mastodon-widget--return-item-widgets (list) + "Return a list of item widgets for each item, a string, in LIST." + (cl-loop for x in list + collect `(choice-item :value ,x :format "%[%v%] "))) + +(defun mastodon-widget--format (str &optional padding) + "Return a widget format string for STR, its name. +PADDING is an integer, for how much right-side padding to add." + (concat "%[" (propertize str + 'face 'mastodon-widget-face + 'mastodon-tab-stop t) + "%]: %v" + (make-string padding ? ))) + +(defun mastodon-widget--create (kind type value notify-fun) + "Return a widget of KIND, with TYPE elements, and default VALUE. +KIND is a string, either Listing, Sort, Items, or Inbox, and will +be used for the widget's tag. +VALUE is a string, a member of TYPE. +NOTIFY-FUN is the widget's notify function." + (let* ((val-length (length (if (symbolp value) + (symbol-name value) + value))) + (type-list (symbol-value type)) + (longest (apply #'max + (mapcar #'length + (if (symbolp (car type-list)) + (mapcar #'symbol-name type-list) + type-list)))) + (padding (- longest val-length))) + (if (not (member value type-list)) + (user-error "%s is not a member of %s" value type-list) + (widget-create + 'menu-choice + :tag kind + :value value + :args (mastodon-widget--return-item-widgets type-list) + :help-echo (format "Select a %s kind" kind) + :format (mastodon-widget--format kind padding) + :notify notify-fun + ;; eg format of notify-fun: + ;; (lambda (widget &rest ignore) + ;; (let ((value (widget-value widget)) + ;; (tag (widget-get widget :tag))) + ;; (notify-fun value))) + :keymap mastodon-widget-keymap)))) + +(provide 'mastodon-widget) +;;; mastodon-widget.el ends here -- cgit v1.2.3 From 6d46a197b338ae1e3cbc758fc7901350f084a381 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Sun, 27 Oct 2024 10:12:47 +0100 Subject: widget: remove mastodon-profile--views-plist --- lisp/mastodon-profile.el | 9 ++------- lisp/mastodon-widget.el | 4 +++- 2 files changed, 5 insertions(+), 8 deletions(-) (limited to 'lisp/mastodon-widget.el') diff --git a/lisp/mastodon-profile.el b/lisp/mastodon-profile.el index b7cbc7f..b4a8d4f 100644 --- a/lisp/mastodon-profile.el +++ b/lisp/mastodon-profile.el @@ -554,9 +554,6 @@ The endpoint only holds a few preferences. For others, see ;;; PROFILE WIDGET -(defvar mastodon-profile--views-plist - `(:kind "View" :types mastodon-profile--view-types :default statuses)) - (defvar mastodon-profile--view-types '(statuses no-boosts no-replies only-media followers following tag)) @@ -752,12 +749,10 @@ MAX-ID is a flag to include the max_id pagination parameter." (mastodon-media--inline-images (point-min) (point)) ;; widget items description (mastodon-widget--create - (plist-get mastodon-profile--views-plist :kind) - (plist-get mastodon-profile--views-plist :types) - ;; TODO: hand current view to the widget: + "View" mastodon-profile--view-types (or (mastodon-profile--current-view-type endpoint-type no-reblogs no-replies only-media tag) - (plist-get mastodon-profile--views-plist :default)) + 'statuses) (lambda (widget &rest _ignore) (let ((value (widget-value widget))) (mastodon-profile--view-fun-call value)))) diff --git a/lisp/mastodon-widget.el b/lisp/mastodon-widget.el index 0c1026c..0c6542a 100644 --- a/lisp/mastodon-widget.el +++ b/lisp/mastodon-widget.el @@ -70,7 +70,9 @@ NOTIFY-FUN is the widget's notify function." (let* ((val-length (length (if (symbolp value) (symbol-name value) value))) - (type-list (symbol-value type)) + (type-list (if (symbolp type) + (symbol-value type) + type)) (longest (apply #'max (mapcar #'length (if (symbolp (car type-list)) -- cgit v1.2.3 From 0ae090a836327baeb29373457bf4a3b547635219 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Sun, 27 Oct 2024 16:26:53 +0100 Subject: widget: add keymap to subitems too! --- lisp/mastodon-widget.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lisp/mastodon-widget.el') diff --git a/lisp/mastodon-widget.el b/lisp/mastodon-widget.el index 0c6542a..a326800 100644 --- a/lisp/mastodon-widget.el +++ b/lisp/mastodon-widget.el @@ -50,7 +50,8 @@ Note that such modes will need to require wid-edit.") (defun mastodon-widget--return-item-widgets (list) "Return a list of item widgets for each item, a string, in LIST." (cl-loop for x in list - collect `(choice-item :value ,x :format "%[%v%] "))) + collect `(choice-item :value ,x :format "%[%v%] " + :keymap ,mastodon-widget-keymap))) (defun mastodon-widget--format (str &optional padding) "Return a widget format string for STR, its name. -- cgit v1.2.3