diff --git a/po/POTFILES.in b/po/POTFILES.in index b2a7000..1a983d3 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -54,7 +54,7 @@ src/gui/client/os-utils.lisp src/gui/client/program-events.lisp src/gui/client/scheduler.lisp src/gui/client/search-frame.lisp -src/gui/client/stream-window.lisp +src/gui/client/stream-frame.lisp src/gui/client/titan-window.lisp src/gui/client/tour-window.lisp src/gui/client/validation.lisp diff --git a/po/it.po b/po/it.po index 0576208..2c7a554 100644 --- a/po/it.po +++ b/po/it.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: tinmop 0.0.1\n" "Report-Msgid-Bugs-To: https://codeberg.org/cage/tinmop/\n" -"POT-Creation-Date: 2023-07-22 16:51+0200\n" -"PO-Revision-Date: 2023-07-22 16:54+0200\n" +"POT-Creation-Date: 2023-07-27 16:28+0200\n" +"PO-Revision-Date: 2023-07-27 16:29+0200\n" "Last-Translator: cage \n" "Language-Team: Italian \n" @@ -84,7 +84,7 @@ msgstr "" "Errore: non sono stato in grado di creare il socket per la cattura del " "codice di autorizzazione" -#: src/api-client.lisp:895 +#: src/api-client.lisp:901 #, lisp-format msgid "Initializing empty credentials file in ~a" msgstr "Inizializzo credenziali vuote (segnaposto) nel file ~a" @@ -199,7 +199,7 @@ msgstr "Opzioni diponibili" msgid "Error: command ~a not found" msgstr "Errore: comando ~a non trovato" -#: src/conditions.lisp:77 src/conditions.lisp:81 src/db.lisp:2935 +#: src/conditions.lisp:77 src/conditions.lisp:81 src/db.lisp:2936 #: src/message-rendering-utils.lisp:155 src/message-rendering-utils.lisp:189 #: src/message-rendering-utils.lisp:194 msgid "unknown" @@ -225,7 +225,7 @@ msgstr "diretta" msgid "home" msgstr "home" -#: src/db.lisp:3254 +#: src/db.lisp:3255 msgid "no description" msgstr "nessuna descrizione" @@ -323,7 +323,7 @@ msgid "Redirects to ~s, follows redirect? [y/N] " msgstr "Seguire la redirezione a ~s? [s/N] " #: src/gemini-viewer.lisp:807 src/gui/server/public-api-gemini-stream.lisp:275 -#: src/tui-utils.lisp:509 src/tui-utils.lisp:520 src/ui-goodies.lisp:2980 +#: src/tui-utils.lisp:510 src/tui-utils.lisp:521 src/ui-goodies.lisp:2980 #, lisp-format msgid "Error: ~a" msgstr "Errore: ~a" @@ -364,21 +364,21 @@ msgstr "Il certificato dell'host ~a è cambiato dall'ultima visita" msgid "Connection prematurely closed from the server: ~a" msgstr "Connessione interrotta prematuramente da parte del server: ~a" -#: src/gempub.lisp:104 +#: src/gempub.lisp:105 msgid "Syncing gempub library" msgstr "Sincronizzo la biblioteca dei file gempub" -#: src/gempub.lisp:123 +#: src/gempub.lisp:124 #, lisp-format msgid "Removed gempub ~s from library, missing file" msgstr "Rimosso il gempub ~s dalla biblioteca, file non presente" -#: src/gempub.lisp:125 +#: src/gempub.lisp:126 #, lisp-format msgid "Added gempub ~s into the library" msgstr "Aggiunto il gempub ~s alla biblioteca" -#: src/gempub.lisp:308 +#: src/gempub.lisp:309 msgid "Gempub library" msgstr "Biblioteca dei gempub" @@ -412,13 +412,12 @@ msgid "~s is not a valid gemini address" msgstr "~s non è un indirizzo gemini valido" #: src/gui/client/bookmark-window.lisp:28 src/gui/client/main-window.lisp:215 -#: src/gui/client/stream-window.lisp:73 msgid "Streams" msgstr "Flussi" #: src/gui/client/bookmark-window.lisp:34 #: src/gui/client/certificates-window.lisp:39 -#: src/gui/client/gemlog-window.lisp:71 src/gui/client/stream-window.lisp:43 +#: src/gui/client/gemlog-window.lisp:71 src/gui/client/stream-frame.lisp:58 #: src/gui/client/tour-window.lisp:41 msgid "Address" msgstr "Indirizzo" @@ -624,16 +623,16 @@ msgstr "Rimescola" msgid "file ~a not found" msgstr "file ~a non trovato" -#: src/gui/client/main-window.lisp:383 src/gui/client/main-window.lisp:993 +#: src/gui/client/main-window.lisp:383 src/gui/client/main-window.lisp:996 msgid "Server certificate error" msgstr "Errore sul certificato del server" -#: src/gui/client/main-window.lisp:399 src/gui/client/main-window.lisp:1014 +#: src/gui/client/main-window.lisp:399 src/gui/client/main-window.lisp:1017 #, lisp-format msgid "Follow redirection to ~a?" msgstr "Seguire la redirezione a ~a?" -#: src/gui/client/main-window.lisp:400 src/gui/client/main-window.lisp:1015 +#: src/gui/client/main-window.lisp:400 src/gui/client/main-window.lisp:1018 msgid "Redirection" msgstr "Redirezione" @@ -694,20 +693,20 @@ msgstr "Apri collegamento in backgroud" msgid "No such file or directory: ~a" msgstr "Non esiste il file o la directory ~a" -#: src/gui/client/main-window.lisp:896 +#: src/gui/client/main-window.lisp:899 #, lisp-format msgid "The server asks:~2%~a" msgstr "Il server chiede:~2%~a" -#: src/gui/client/main-window.lisp:898 +#: src/gui/client/main-window.lisp:901 msgid "Submit" msgstr "Inoltra" -#: src/gui/client/main-window.lisp:899 +#: src/gui/client/main-window.lisp:902 msgid "Input query" msgstr "Input" -#: src/gui/client/main-window.lisp:992 +#: src/gui/client/main-window.lisp:995 msgid "" "The certificate for this address has changed, replace the old with the one I " "just received?" @@ -715,39 +714,39 @@ msgstr "" "Il certificato relativo a questo indirizzo è cambiato dall'ultima visita, lo " "rimpiazzo con quello appena ottenuto?" -#: src/gui/client/main-window.lisp:1174 +#: src/gui/client/main-window.lisp:1177 msgid "Tour is terminated" msgstr "Il tour è terminato" -#: src/gui/client/main-window.lisp:1237 +#: src/gui/client/main-window.lisp:1240 msgid "go back" msgstr "indietro" -#: src/gui/client/main-window.lisp:1238 +#: src/gui/client/main-window.lisp:1241 msgid "reload address" msgstr "ricarica l'indirizzo" -#: src/gui/client/main-window.lisp:1239 +#: src/gui/client/main-window.lisp:1242 msgid "go to address" msgstr "vai all'indirizzo" -#: src/gui/client/main-window.lisp:1240 +#: src/gui/client/main-window.lisp:1243 msgid "one level up" msgstr "un livello in alto" -#: src/gui/client/main-window.lisp:1241 +#: src/gui/client/main-window.lisp:1244 msgid "add or remove bookmark" msgstr "Aggiungi o rimuovi segnalibro" -#: src/gui/client/main-window.lisp:1242 +#: src/gui/client/main-window.lisp:1245 msgid "go to the next link in tour" msgstr "vai al prossimo indirizzo del tour" -#: src/gui/client/main-window.lisp:1243 +#: src/gui/client/main-window.lisp:1246 msgid "subscribe/unsubscribe to this gemlog" msgstr "Abbonati/disdici l'abbonamento a questo gemlog" -#: src/gui/client/main-window.lisp:1244 +#: src/gui/client/main-window.lisp:1247 msgid "inline images" msgstr "includi nella pagina le immagini" @@ -761,19 +760,19 @@ msgstr "" "Nessun programma è stato definito nel file di configurazione per modificare " "questo tipo di file" -#: src/gui/client/scheduler.lisp:50 +#: src/gui/client/scheduler.lisp:62 msgid "Gemlogs subscriptions updating in progress…" msgstr "Aggiornamento dei gemlog in corso…" -#: src/gui/client/scheduler.lisp:52 +#: src/gui/client/scheduler.lisp:64 msgid "Gemlogs subscriptions updated" msgstr "Gemlog aggiornati" -#: src/gui/client/scheduler.lisp:56 +#: src/gui/client/scheduler.lisp:68 msgid "Old gemlog posts deleted" msgstr "Cancellati gli articoli più vecchi dei gemlog" -#: src/gui/client/scheduler.lisp:60 +#: src/gui/client/scheduler.lisp:72 msgid "Old history entries removed" msgstr "Eliminati gli elementi della cronologia più vecchi" @@ -797,22 +796,26 @@ msgstr "rendi visibile la precedente occorrenza" msgid "end searching" msgstr "termina la ricerca" -#: src/gui/client/stream-window.lisp:39 +#: src/gui/client/stream-frame.lisp:54 msgid "Status" msgstr "Stato" -#: src/gui/client/stream-window.lisp:40 +#: src/gui/client/stream-frame.lisp:55 msgid "Number of octects downloaded" msgstr "Numero di ottetti scaricati" -#: src/gui/client/stream-window.lisp:85 +#: src/gui/client/stream-frame.lisp:106 msgid "delete selected stream" msgstr "cancella i flussi selezionati" -#: src/gui/client/stream-window.lisp:86 +#: src/gui/client/stream-frame.lisp:107 msgid "show selected stream" msgstr "Mostra i flussi selezionati" +#: src/gui/client/stream-frame.lisp:108 +msgid "close" +msgstr "chiudi" + #: src/gui/client/titan-window.lisp:74 msgid "" "Neither a file to upload has been specified nor text data has been typed" @@ -1366,38 +1369,38 @@ msgstr "Nessuna timeline selezionata" msgid "no folder selected" msgstr "Nessuna cartella selezionata" -#: src/thread-window.lisp:426 +#: src/thread-window.lisp:428 msgid "Missing subject" msgstr "Oggetto mancante" -#: src/thread-window.lisp:781 +#: src/thread-window.lisp:783 #, lisp-format msgid "No message with index ~a exists" msgstr "Nessun messaggio esiste alla posizione ~a" -#: src/thread-window.lisp:905 +#: src/thread-window.lisp:907 msgid "No message to delete" msgstr "Nessun messaggio da cancellare" -#: src/thread-window.lisp:915 +#: src/thread-window.lisp:917 msgid "No message to undelete" msgstr "Nessun messaggio segnato come cancellato da ripristinare" -#: src/thread-window.lisp:948 src/thread-window.lisp:982 +#: src/thread-window.lisp:950 src/thread-window.lisp:984 #, lisp-format msgid "No next message that contains ~s exists" msgstr "Nessun messaggio successivo che contenga ~s esiste" -#: src/thread-window.lisp:954 src/thread-window.lisp:988 +#: src/thread-window.lisp:956 src/thread-window.lisp:990 #, lisp-format msgid "No previous message that contains ~s exists" msgstr "Nessun messaggio precedente che contenga ~s esiste" -#: src/thread-window.lisp:1004 +#: src/thread-window.lisp:1006 msgid "No others unread messages exist" msgstr "Non ci sono altri messaggi non letti" -#: src/thread-window.lisp:1031 +#: src/thread-window.lisp:1033 msgid "Threads" msgstr "Discussioni" diff --git a/po/tinmop.pot b/po/tinmop.pot index 06fbee2..8f88432 100644 --- a/po/tinmop.pot +++ b/po/tinmop.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: tinmop 0.9.9.1414\n" "Report-Msgid-Bugs-To: https://codeberg.org/cage/tinmop/\n" -"POT-Creation-Date: 2023-07-22 16:51+0200\n" +"POT-Creation-Date: 2023-07-27 16:28+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -76,7 +76,7 @@ msgid "" "Error: was not able to create server socket to listen for authorization code" msgstr "" -#: src/api-client.lisp:895 +#: src/api-client.lisp:901 #, lisp-format msgid "Initializing empty credentials file in ~a" msgstr "" @@ -189,7 +189,7 @@ msgstr "" msgid "Error: command ~a not found" msgstr "" -#: src/conditions.lisp:77 src/conditions.lisp:81 src/db.lisp:2935 +#: src/conditions.lisp:77 src/conditions.lisp:81 src/db.lisp:2936 #: src/message-rendering-utils.lisp:155 src/message-rendering-utils.lisp:189 #: src/message-rendering-utils.lisp:194 msgid "unknown" @@ -215,7 +215,7 @@ msgstr "" msgid "home" msgstr "" -#: src/db.lisp:3254 +#: src/db.lisp:3255 msgid "no description" msgstr "" @@ -310,7 +310,7 @@ msgid "Redirects to ~s, follows redirect? [y/N] " msgstr "" #: src/gemini-viewer.lisp:807 src/gui/server/public-api-gemini-stream.lisp:275 -#: src/tui-utils.lisp:509 src/tui-utils.lisp:520 src/ui-goodies.lisp:2980 +#: src/tui-utils.lisp:510 src/tui-utils.lisp:521 src/ui-goodies.lisp:2980 #, lisp-format msgid "Error: ~a" msgstr "" @@ -351,21 +351,21 @@ msgstr "" msgid "Connection prematurely closed from the server: ~a" msgstr "" -#: src/gempub.lisp:104 +#: src/gempub.lisp:105 msgid "Syncing gempub library" msgstr "" -#: src/gempub.lisp:123 +#: src/gempub.lisp:124 #, lisp-format msgid "Removed gempub ~s from library, missing file" msgstr "" -#: src/gempub.lisp:125 +#: src/gempub.lisp:126 #, lisp-format msgid "Added gempub ~s into the library" msgstr "" -#: src/gempub.lisp:308 +#: src/gempub.lisp:309 msgid "Gempub library" msgstr "" @@ -399,13 +399,12 @@ msgid "~s is not a valid gemini address" msgstr "" #: src/gui/client/bookmark-window.lisp:28 src/gui/client/main-window.lisp:215 -#: src/gui/client/stream-window.lisp:73 msgid "Streams" msgstr "" #: src/gui/client/bookmark-window.lisp:34 #: src/gui/client/certificates-window.lisp:39 -#: src/gui/client/gemlog-window.lisp:71 src/gui/client/stream-window.lisp:43 +#: src/gui/client/gemlog-window.lisp:71 src/gui/client/stream-frame.lisp:58 #: src/gui/client/tour-window.lisp:41 msgid "Address" msgstr "" @@ -611,16 +610,16 @@ msgstr "" msgid "file ~a not found" msgstr "" -#: src/gui/client/main-window.lisp:383 src/gui/client/main-window.lisp:993 +#: src/gui/client/main-window.lisp:383 src/gui/client/main-window.lisp:996 msgid "Server certificate error" msgstr "" -#: src/gui/client/main-window.lisp:399 src/gui/client/main-window.lisp:1014 +#: src/gui/client/main-window.lisp:399 src/gui/client/main-window.lisp:1017 #, lisp-format msgid "Follow redirection to ~a?" msgstr "" -#: src/gui/client/main-window.lisp:400 src/gui/client/main-window.lisp:1015 +#: src/gui/client/main-window.lisp:400 src/gui/client/main-window.lisp:1018 msgid "Redirection" msgstr "" @@ -681,58 +680,58 @@ msgstr "" msgid "No such file or directory: ~a" msgstr "" -#: src/gui/client/main-window.lisp:896 +#: src/gui/client/main-window.lisp:899 #, lisp-format msgid "The server asks:~2%~a" msgstr "" -#: src/gui/client/main-window.lisp:898 +#: src/gui/client/main-window.lisp:901 msgid "Submit" msgstr "" -#: src/gui/client/main-window.lisp:899 +#: src/gui/client/main-window.lisp:902 msgid "Input query" msgstr "" -#: src/gui/client/main-window.lisp:992 +#: src/gui/client/main-window.lisp:995 msgid "" "The certificate for this address has changed, replace the old with the one I " "just received?" msgstr "" -#: src/gui/client/main-window.lisp:1174 +#: src/gui/client/main-window.lisp:1177 msgid "Tour is terminated" msgstr "" -#: src/gui/client/main-window.lisp:1237 +#: src/gui/client/main-window.lisp:1240 msgid "go back" msgstr "" -#: src/gui/client/main-window.lisp:1238 +#: src/gui/client/main-window.lisp:1241 msgid "reload address" msgstr "" -#: src/gui/client/main-window.lisp:1239 +#: src/gui/client/main-window.lisp:1242 msgid "go to address" msgstr "" -#: src/gui/client/main-window.lisp:1240 +#: src/gui/client/main-window.lisp:1243 msgid "one level up" msgstr "" -#: src/gui/client/main-window.lisp:1241 +#: src/gui/client/main-window.lisp:1244 msgid "add or remove bookmark" msgstr "" -#: src/gui/client/main-window.lisp:1242 +#: src/gui/client/main-window.lisp:1245 msgid "go to the next link in tour" msgstr "" -#: src/gui/client/main-window.lisp:1243 +#: src/gui/client/main-window.lisp:1246 msgid "subscribe/unsubscribe to this gemlog" msgstr "" -#: src/gui/client/main-window.lisp:1244 +#: src/gui/client/main-window.lisp:1247 msgid "inline images" msgstr "" @@ -744,19 +743,19 @@ msgstr "" msgid "No program defined in configuration file to edit this kind of files" msgstr "" -#: src/gui/client/scheduler.lisp:50 +#: src/gui/client/scheduler.lisp:62 msgid "Gemlogs subscriptions updating in progress…" msgstr "" -#: src/gui/client/scheduler.lisp:52 +#: src/gui/client/scheduler.lisp:64 msgid "Gemlogs subscriptions updated" msgstr "" -#: src/gui/client/scheduler.lisp:56 +#: src/gui/client/scheduler.lisp:68 msgid "Old gemlog posts deleted" msgstr "" -#: src/gui/client/scheduler.lisp:60 +#: src/gui/client/scheduler.lisp:72 msgid "Old history entries removed" msgstr "" @@ -780,22 +779,26 @@ msgstr "" msgid "end searching" msgstr "" -#: src/gui/client/stream-window.lisp:39 +#: src/gui/client/stream-frame.lisp:54 msgid "Status" msgstr "" -#: src/gui/client/stream-window.lisp:40 +#: src/gui/client/stream-frame.lisp:55 msgid "Number of octects downloaded" msgstr "" -#: src/gui/client/stream-window.lisp:85 +#: src/gui/client/stream-frame.lisp:106 msgid "delete selected stream" msgstr "" -#: src/gui/client/stream-window.lisp:86 +#: src/gui/client/stream-frame.lisp:107 msgid "show selected stream" msgstr "" +#: src/gui/client/stream-frame.lisp:108 +msgid "close" +msgstr "" + #: src/gui/client/titan-window.lisp:74 msgid "" "Neither a file to upload has been specified nor text data has been typed" @@ -1335,38 +1338,38 @@ msgstr "" msgid "no folder selected" msgstr "" -#: src/thread-window.lisp:426 +#: src/thread-window.lisp:428 msgid "Missing subject" msgstr "" -#: src/thread-window.lisp:781 +#: src/thread-window.lisp:783 #, lisp-format msgid "No message with index ~a exists" msgstr "" -#: src/thread-window.lisp:905 +#: src/thread-window.lisp:907 msgid "No message to delete" msgstr "" -#: src/thread-window.lisp:915 +#: src/thread-window.lisp:917 msgid "No message to undelete" msgstr "" -#: src/thread-window.lisp:948 src/thread-window.lisp:982 +#: src/thread-window.lisp:950 src/thread-window.lisp:984 #, lisp-format msgid "No next message that contains ~s exists" msgstr "" -#: src/thread-window.lisp:954 src/thread-window.lisp:988 +#: src/thread-window.lisp:956 src/thread-window.lisp:990 #, lisp-format msgid "No previous message that contains ~s exists" msgstr "" -#: src/thread-window.lisp:1004 +#: src/thread-window.lisp:1006 msgid "No others unread messages exist" msgstr "" -#: src/thread-window.lisp:1031 +#: src/thread-window.lisp:1033 msgid "Threads" msgstr "" diff --git a/src/gui/client/stream-frame.lisp b/src/gui/client/stream-frame.lisp new file mode 100644 index 0000000..34a4a86 --- /dev/null +++ b/src/gui/client/stream-frame.lisp @@ -0,0 +1,116 @@ +(in-package :client-stream-frame) + +(named-readtables:in-readtable nodgui.syntax:nodgui-syntax) + +(defclass stream-frame (gui:frame) + ((table + :initform nil + :initarg :table + :accessor table))) + +(defclass stream-table (gui-goodies:table-frame) ()) + +(defun resync-rows (stream-table new-rows) + (with-accessors ((tree gui-goodies:tree) + (rows gui-goodies:rows)) stream-table + (gui:treeview-delete-all tree) + (setf rows new-rows) + (loop for row in rows do + (let* ((iri (getf row :download-iri)) + (stream-client-wrapper (client-main-window:find-db-stream-url iri)) + (stream-status (to-s (client-main-window::status stream-client-wrapper))) + (tree-row (make-instance 'gui:tree-item + :id iri + :text iri + :column-values + (list stream-status + (to-s (getf row :octect-count))) + :index gui:+treeview-last-index+))) + (gui:treeview-insert-item tree :item tree-row))) + (gui:treeview-refit-columns-width (gui-goodies:tree stream-table)) + stream-table)) + +(defun all-rows () + (let ((rows (cev:enqueue-request-and-wait-results :gemini-all-stream-info + 1 + ev:+standard-event-priority+))) + (setf rows (sort rows + (lambda (a b) (string< (getf a :download-iri) + (getf b :download-iri))))) + rows)) + +(defun refresh-all-streams (stream-table) + (with-accessors ((tree gui-goodies:tree) + (rows gui-goodies:rows)) stream-table + (let ((new-rows (all-rows))) + (resync-rows stream-table new-rows) + stream-table))) + +(defmethod initialize-instance :after ((object stream-table) &key &allow-other-keys) + (with-accessors ((tree gui-goodies:tree)) object + (let ((treeview (make-instance 'gui:scrolled-treeview + :master object + :pack '(:side :top :expand t :fill :both) + :columns (list (_ "Status") + (_ "Number of octects downloaded"))))) + (gui:treeview-heading treeview + gui:+treeview-first-column-id+ + :text (_ "Address")) + (setf tree treeview) + (refresh-all-streams object)))) + +(defun delete-stream-clsr (stream-table) + (with-accessors ((tree gui-goodies:tree)) stream-table + (lambda () + (a:when-let* ((selections (gui:treeview-get-selection tree))) + (loop for selection in selections do + (let* ((url (gui:id selection)) + (stream-client-wrapper (client-main-window::find-db-stream-url url))) + (when (eq (client-main-window:status stream-client-wrapper) + client-main-window:+stream-status-streaming+) + (ev:with-enqueued-process-and-unblock () + (client-main-window:stop-steaming-stream-thread))) + (ev:with-enqueued-process-and-unblock () + (client-main-window:remove-db-stream stream-client-wrapper) + (comm:make-request :gemini-remove-stream 1 url)) + (let ((new-rows (all-rows))) + (resync-rows stream-table new-rows)))))))) + +(defun revive-stream-clsr (stream-table) + (with-accessors ((tree gui-goodies:tree)) stream-table + (lambda () + (a:when-let* ((selections (gui:treeview-get-selection tree)) + (selection (first selections))) + (let* ((url (gui:id selection)) + (new-rows (all-rows))) + (client-main-window::open-iri url gui-goodies:*main-frame* t) + (resync-rows stream-table new-rows)))))) + +(defun init-frame (main-window) + (let* ((wrapper-frame (make-instance 'stream-frame :master main-window)) + (table (make-instance 'stream-table :master wrapper-frame)) + (buttons-frame (make-instance 'gui:frame :master wrapper-frame)) + (delete-button (make-instance 'gui:button + :master buttons-frame + :image icons:*document-delete* + :command (delete-stream-clsr table))) + (revive-button (make-instance 'gui:button + :master buttons-frame + :image icons:*document-accept* + :command (revive-stream-clsr table))) + (close-button (make-instance 'gui:button :image icons:*cross* + :master buttons-frame + :command (lambda () + (gui:grid-forget wrapper-frame))))) + (setf (table wrapper-frame) table) + (gui-goodies:attach-tooltips (delete-button (_ "delete selected stream")) + (revive-button (_ "show selected stream")) + (close-button (_ "close"))) + (gui:grid table 0 0 :sticky :news) + (gui:grid buttons-frame 1 0 :sticky :s) + (gui:grid delete-button 0 0 :sticky :s) + (gui:grid revive-button 0 1 :sticky :s) + (gui:grid close-button 0 2 :sticky :s) + (gui:grid-columnconfigure wrapper-frame 0 :weight 1) + (gui:grid-rowconfigure wrapper-frame 1 :weight 1) + wrapper-frame))