aboutsummaryrefslogtreecommitdiff
path: root/org-drill.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-11-12 22:19:55 -0600
committerCraig Jennings <c@cjennings.net>2025-11-12 22:19:55 -0600
commit2442235f1aa86dcfba1909ddeba0cf37b46922a3 (patch)
tree4d4816a4b48ffdaf9294333734b40841e12c38b7 /org-drill.el
parent6c2b9dc58b93aa77319ed73025b1e432e8d74c7a (diff)
downloadorg-drill-2442235f1aa86dcfba1909ddeba0cf37b46922a3.tar.gz
org-drill-2442235f1aa86dcfba1909ddeba0cf37b46922a3.zip
feat: Add display management with customizable settings
Add built-in display management for drill sessions with user-configurable settings. No external dependencies required. New features: - Customizable font size in points (org-drill-text-size-during-session) - Optional variable-pitch mode (org-drill-use-variable-pitch) - Optional modeline hiding (org-drill-hide-modeline-during-session) - Automatic drawer hiding with new org-drill-hide-drawers function - Session lifecycle hooks (org-drill-before-session-hook, org-drill-after-session-hook) Display settings are automatically saved and restored when sessions end, including on quit, error, or normal completion via unwind-protect. All settings use proper package naming (org-drill-*) with no external dependencies. Works out of the box for all users.
Diffstat (limited to 'org-drill.el')
-rw-r--r--org-drill.el90
1 files changed, 90 insertions, 0 deletions
diff --git a/org-drill.el b/org-drill.el
index 44390d2..cbbf7a2 100644
--- a/org-drill.el
+++ b/org-drill.el
@@ -528,9 +528,54 @@ to preserve the formatting in a displayed table, for example."
:group 'org-drill
:type 'boolean)
+(defcustom org-drill-hide-modeline-during-session
+ t
+ "If non-nil, hide the modeline during drill sessions.
+This provides a cleaner, more focused display for reading drill cards.
+The modeline is automatically restored when the session ends."
+ :group 'org-drill
+ :type 'boolean)
+
+(defcustom org-drill-text-size-during-session
+ 20
+ "Font size (in points) to use during drill sessions.
+Set to nil to use the default font size without scaling.
+Typical values are 16-24 for comfortable reading."
+ :group 'org-drill
+ :type '(choice (const :tag "Use default size" nil)
+ (integer :tag "Font size in points")))
+
+(defcustom org-drill-use-variable-pitch
+ t
+ "If non-nil, use variable-pitch font during drill sessions.
+This can make text more readable for long-form content."
+ :group 'org-drill
+ :type 'boolean)
+
+(defvar org-drill--saved-modeline-format nil
+ "Saved modeline format before drill session started.")
+
+(defvar org-drill--saved-text-scale nil
+ "Saved text scale level before drill session started.")
+
+(defvar org-drill--saved-variable-pitch-mode nil
+ "Saved variable-pitch-mode state before drill session started.")
+
(defvar org-drill-display-answer-hook nil
"Hook called when `org-drill' answers are displayed.")
+(defvar org-drill-before-session-hook nil
+ "Hook run before starting a drill session.
+Called in the drill buffer after opening the file but before
+presenting the first card. Useful for setting up display preferences
+like fonts, text scale, or window layout.")
+
+(defvar org-drill-after-session-hook nil
+ "Hook run after ending a drill session.
+Called when the session ends normally, is quit by the user, or
+encounters an error. Useful for restoring display preferences
+or performing cleanup.")
+
(defclass org-drill-session ()
((qualities :initform nil)
(start-time
@@ -1848,6 +1893,44 @@ This is more reliable than `org-cycle-hide-drawers' for drill display."
(when drawer-end
(org-drill-hide-region drawer-start drawer-end)))))))
+(defun org-drill--setup-display ()
+ "Set up display settings for drill session.
+Saves current settings and applies drill-specific display preferences."
+ ;; Save current text scale and apply new size
+ (when org-drill-text-size-during-session
+ (setq org-drill--saved-text-scale
+ (face-attribute 'default :height nil 'default))
+ (set-face-attribute 'default nil :height (* org-drill-text-size-during-session 10)))
+
+ ;; Save and enable variable-pitch mode
+ (when org-drill-use-variable-pitch
+ (setq org-drill--saved-variable-pitch-mode
+ (if (boundp 'variable-pitch-mode) variable-pitch-mode nil))
+ (variable-pitch-mode 1))
+
+ ;; Save and hide modeline
+ (when org-drill-hide-modeline-during-session
+ (setq org-drill--saved-modeline-format mode-line-format)
+ (setq-local mode-line-format nil)))
+
+(defun org-drill--restore-display ()
+ "Restore display settings after drill session ends."
+ ;; Restore text size
+ (when org-drill--saved-text-scale
+ (set-face-attribute 'default nil :height org-drill--saved-text-scale)
+ (setq org-drill--saved-text-scale nil))
+
+ ;; Restore variable-pitch mode
+ (when (and org-drill-use-variable-pitch
+ (not (eq org-drill--saved-variable-pitch-mode 'unbound)))
+ (variable-pitch-mode (if org-drill--saved-variable-pitch-mode 1 -1))
+ (setq org-drill--saved-variable-pitch-mode nil))
+
+ ;; Restore modeline
+ (when org-drill--saved-modeline-format
+ (setq-local mode-line-format org-drill--saved-modeline-format)
+ (setq org-drill--saved-modeline-format nil)))
+
(defun org-drill-unhide-text ()
"Unhide text."
(save-excursion
@@ -2954,6 +3037,10 @@ work correctly with older versions of org mode. Your org mode version (%s) appea
(length (oref session overdue-entries)))))
(setf (oref session due-entry-count)
(org-drill-pending-entry-count session))
+ ;; Set up display and run before-session hook
+ (unless resume-p
+ (org-drill--setup-display)
+ (run-hooks 'org-drill-before-session-hook))
(cond
((and (null (oref session current-item))
(null (oref session new-entries))
@@ -2969,6 +3056,9 @@ work correctly with older versions of org mode. Your org mode version (%s) appea
(message nil)
)))
(progn
+ ;; Cleanup: restore display and run after-session hook
+ (org-drill--restore-display)
+ (run-hooks 'org-drill-after-session-hook)
(unless (oref session end-pos)
(setf (oref session cram-mode) nil)
(org-drill-free-markers session (oref session done-entries))))))