diff options
Diffstat (limited to 'gnu/installer/newt/page.scm')
-rw-r--r-- | gnu/installer/newt/page.scm | 133 |
1 files changed, 80 insertions, 53 deletions
diff --git a/gnu/installer/newt/page.scm b/gnu/installer/newt/page.scm index 630efde9cc..8aea5a1109 100644 --- a/gnu/installer/newt/page.scm +++ b/gnu/installer/newt/page.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com> -;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2019, 2020 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr> ;;; ;;; This file is part of GNU Guix. @@ -107,7 +107,7 @@ input box, such as FLAG-PASSWORD." (list GRID-ELEMENT-COMPONENT input-visible-cb) '()))) GRID-ELEMENT-COMPONENT ok-button)) - (form (make-form))) + (form (make-form #:flags FLAG-NOF12))) (add-component-callback input-visible-cb @@ -181,7 +181,7 @@ of the page is set to TITLE." (horizontal-stacked-grid GRID-ELEMENT-COMPONENT ok-button GRID-ELEMENT-COMPONENT exit-button))) - (form (make-form))) + (form (make-form #:flags FLAG-NOF12))) (add-form-to-grid grid form #t) (make-wrapped-grid-window grid title) @@ -315,7 +315,7 @@ the current listbox item has to be selected by key." (if listbox-allow-multiple? FLAG-MULTIPLE 0)))) - (form (make-form)) + (form (make-form #:flags FLAG-NOF12)) (info-textbox (make-reflowed-textbox -1 -1 info-text info-textbox-width @@ -516,7 +516,7 @@ ITEMS when 'Ok' is pressed." GRID-ELEMENT-COMPONENT ok-button GRID-ELEMENT-COMPONENT exit-button))) (keys (fill-checkbox-tree checkbox-tree items)) - (form (make-form))) + (form (make-form #:flags FLAG-NOF12))) (add-form-to-grid grid form #t) (make-wrapped-grid-window grid title) @@ -541,6 +541,17 @@ ITEMS when 'Ok' is pressed." (lambda () (destroy-form-and-pop form)))))) +(define* (edit-file file #:key locale) + "Spawn an editor for FILE." + (clear-screen) + (newt-suspend) + ;; Use Nano because it syntax-highlights Scheme by default. + ;; TODO: Add a menu to choose an editor? + (run-shell-command (string-append "/run/current-system/profile/bin/nano " + file) + #:locale locale) + (newt-resume)) + (define* (run-file-textbox-page #:key info-text title @@ -549,55 +560,71 @@ ITEMS when 'Ok' is pressed." (file-textbox-width 50) (file-textbox-height 30) (exit-button? #t) + (edit-button? #f) + (editor-locale #f) (ok-button-callback-procedure (const #t)) (exit-button-callback-procedure (const #t))) - (let* ((info-textbox - (make-reflowed-textbox -1 -1 info-text - info-textbox-width - #:flags FLAG-BORDER)) - (file-text (read-all file)) - (file-textbox - (make-textbox -1 -1 - file-textbox-width - file-textbox-height - (logior FLAG-SCROLL FLAG-BORDER))) - (ok-button (make-button -1 -1 (G_ "OK"))) - (exit-button (make-button -1 -1 (G_ "Exit"))) - (grid (vertically-stacked-grid - GRID-ELEMENT-COMPONENT info-textbox - GRID-ELEMENT-COMPONENT file-textbox - GRID-ELEMENT-SUBGRID - (apply - horizontal-stacked-grid - GRID-ELEMENT-COMPONENT ok-button - `(,@(if exit-button? - (list GRID-ELEMENT-COMPONENT exit-button) - '()))))) - (form (make-form))) - - (set-textbox-text file-textbox - (receive (_w _h text) - (reflow-text file-text - file-textbox-width - 0 0) - text)) - (add-form-to-grid grid form #t) - (make-wrapped-grid-window grid title) - - (receive (exit-reason argument) - (run-form form) - (dynamic-wind - (const #t) - (lambda () - (case exit-reason - ((exit-component) - (cond - ((components=? argument ok-button) - (ok-button-callback-procedure)) - ((and exit-button? - (components=? argument exit-button)) - (exit-button-callback-procedure)))))) - (lambda () - (destroy-form-and-pop form)))))) + (let loop () + (let* ((info-textbox + (make-reflowed-textbox -1 -1 info-text + info-textbox-width + #:flags FLAG-BORDER)) + (file-textbox + (make-textbox -1 -1 + file-textbox-width + file-textbox-height + (logior FLAG-SCROLL FLAG-BORDER))) + (ok-button (make-button -1 -1 (G_ "OK"))) + (exit-button (make-button -1 -1 (G_ "Exit"))) + (edit-button (and edit-button? + (make-button -1 -1 (G_ "Edit")))) + (grid (vertically-stacked-grid + GRID-ELEMENT-COMPONENT info-textbox + GRID-ELEMENT-COMPONENT file-textbox + GRID-ELEMENT-SUBGRID + (apply + horizontal-stacked-grid + GRID-ELEMENT-COMPONENT ok-button + `(,@(if edit-button? + (list GRID-ELEMENT-COMPONENT edit-button) + '()) + ,@(if exit-button? + (list GRID-ELEMENT-COMPONENT exit-button) + '()))))) + (form (make-form #:flags FLAG-NOF12))) + + (add-form-to-grid grid form #t) + (make-wrapped-grid-window grid title) + + (set-textbox-text file-textbox + (receive (_w _h text) + (reflow-text (read-all file) + file-textbox-width + 0 0) + text)) + + (receive (exit-reason argument) + (run-form form) + (define result + (dynamic-wind + (const #t) + (lambda () + (case exit-reason + ((exit-component) + (cond + ((components=? argument ok-button) + (ok-button-callback-procedure)) + ((and exit-button? + (components=? argument exit-button)) + (exit-button-callback-procedure)) + ((and edit-button? + (components=? argument edit-button)) + (edit-file file)))))) + (lambda () + (destroy-form-and-pop form)))) + + (if (components=? argument edit-button) + (loop) ;recurse in tail position + result))))) |