-- Leo's gemini proxy
-- Connecting to typed-hole.org:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
commit 02c42a906efc81cf24aaf653b2bc88d97c8ab832
Author: Julien Blanchard <julien@sideburns.eu>
Date: Fri May 1 16:05:01 2020 +0200
Extract drawing functions in draw.rs
diff --git a/src/draw.rs b/src/draw.rs
new file mode 100644
index 0000000..1fb78cb
--- /dev/null
+++ b/src/draw.rs
@@ -0,0 +1,380 @@
+use glib::clone;
+use gtk::TextBuffer;
+use gtk::prelude::*;
+use std::str::FromStr;
+use std::sync::Arc;
+use url::Url;
+
+use crate::absolute_url::AbsoluteUrl;
+use crate::gemini::link::Link as GeminiLink;
+use crate::gopher::link::Link as GopherLink;
+use crate::gui::Gui;
+use crate::protocols::{Finger, Gemini, Gopher};
+
+
+pub fn gemini_content(
+ gui: &Arc<Gui>,
+ content: Vec<Result<crate::gemini::parser::TextElement, crate::gemini::parser::ParseError>>,
+) -> TextBuffer {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ let mut mono_toggle = false;
+ let font_family = if crate::settings::gemini_monospace() {
+ "monospace"
+ } else {
+ "sans"
+ };
+
+ for el in content {
+ match el {
+ Ok(crate::gemini::parser::TextElement::H1(header)) => {
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" size=\"x-large\" font_family=\"{}\">{}{}</span>\n",
+ crate::settings::h1_color(),
+ font_family,
+ crate::settings::h1_character(),
+ header
+ ),
+ );
+ }
+ Ok(crate::gemini::parser::TextElement::H2(header)) => {
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" size=\"large\" font_family=\"{}\">{}{}</span>\n",
+ crate::settings::h2_color(),
+ font_family,
+ crate::settings::h2_character(),
+ header
+ ),
+ );
+ }
+ Ok(crate::gemini::parser::TextElement::H3(header)) => {
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" size=\"medium\" font_family=\"{}\">{}{}</span>\n",
+ crate::settings::h3_color(),
+ font_family,
+ crate::settings::h3_character(),
+ header
+ ),
+ );
+ }
+ Ok(crate::gemini::parser::TextElement::ListItem(item)) => {
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" font_family=\"{}\">{} {}</span>\n",
+ crate::settings::list_color(),
+ font_family,
+ crate::settings::list_character(),
+ item
+ ),
+ );
+ }
+ Ok(crate::gemini::parser::TextElement::MonoText(_text)) => {
+ mono_toggle = !mono_toggle;
+ }
+ Ok(crate::gemini::parser::TextElement::Text(text)) => {
+ let mut end_iter = buffer.get_end_iter();
+ match mono_toggle {
+ true => {
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" font_family=\"monospace\">{}</span>\n",
+ crate::settings::text_color(),
+ text
+ ),
+ );
+ }
+ false => {
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" font_family=\"{}\">{}</span>\n",
+ crate::settings::text_color(),
+ font_family,
+ text
+ ),
+ );
+ }
+ }
+ }
+ Ok(crate::gemini::parser::TextElement::LinkItem(link_item)) => {
+ gemini_link(&gui, link_item);
+ }
+ Err(_) => println!("Something failed."),
+ }
+ }
+ buffer
+}
+
+pub fn gemini_text_content(
+ gui: &Arc<Gui>,
+ content: Vec<Result<crate::gemini::parser::TextElement, crate::gemini::parser::ParseError>>,
+) -> TextBuffer {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ for el in content {
+ match el {
+ Ok(crate::gemini::parser::TextElement::Text(text)) => {
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" font_family=\"monospace\">{}</span>\n",
+ crate::settings::text_color(),
+ text
+ ),
+ );
+ },
+ Ok(_) => (),
+ Err(_) => println!("Something failed."),
+ }
+ }
+ buffer
+}
+
+pub fn gopher_content(
+ gui: &Arc<Gui>,
+ content: Vec<Result<crate::gopher::parser::TextElement, crate::gopher::parser::ParseError>>,
+) -> TextBuffer {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ for el in content {
+ match el {
+ Ok(crate::gopher::parser::TextElement::Text(text)) => {
+ let mut end_iter = buffer.get_end_iter();
+ let font_family = if crate::settings::gopher_monospace() {
+ "font_family=\"monospace\""
+ } else {
+ "font_family=\"serif\""
+ };
+
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" {}>{}</span>\n",
+ crate::settings::text_color(),
+ font_family,
+ text
+ ),
+ );
+ }
+ Ok(crate::gopher::parser::TextElement::LinkItem(link_item)) => {
+ gopher_link(&gui, link_item);
+ }
+ Ok(crate::gopher::parser::TextElement::ExternalLinkItem(link_item)) => {
+ gopher_link(&gui, link_item);
+ }
+ Ok(crate::gopher::parser::TextElement::Image(link_item)) => {
+ gopher_link(&gui, link_item);
+ }
+ Err(_) => println!("Something failed."),
+ }
+ }
+ buffer
+}
+
+pub fn finger_content(
+ gui: &Arc<Gui>,
+ content: Vec<Result<crate::finger::parser::TextElement, crate::finger::parser::ParseError>>,
+) -> TextBuffer {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ for el in content {
+ match el {
+ Ok(crate::finger::parser::TextElement::Text(text)) => {
+ let mut end_iter = buffer.get_end_iter();
+ let font_family = if crate::settings::finger_monospace() {
+ "font_family=\"monospace\""
+ } else {
+ "font_family=\"serif\""
+ };
+
+ buffer.insert_markup(
+ &mut end_iter,
+ &format!(
+ "<span foreground=\"{}\" {}>{}</span>\n",
+ crate::settings::text_color(),
+ font_family,
+ text
+ ),
+ );
+ }
+ Err(_) => println!("Something failed."),
+ }
+ }
+ buffer
+}
+
+pub fn gemini_link(gui: &Arc<Gui>, link_item: String) {
+ match GeminiLink::from_str(&link_item) {
+ Ok(GeminiLink::Finger(url, label)) => {
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+ let finger_label = format!("{} [Finger]", button_label);
+ insert_button(&gui, url, finger_label);
+ }
+ Ok(GeminiLink::Gemini(url, label)) => {
+ insert_button(&gui, url, label);
+ }
+ Ok(GeminiLink::Gopher(url, label)) => {
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+ let gopher_label = format!("{} [Gopher]", button_label);
+ insert_button(&gui, url, gopher_label);
+ }
+ Ok(GeminiLink::Http(url, label)) => {
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+ let www_label = format!("{} [WWW]", button_label);
+
+ insert_external_button(&gui, url, &www_label);
+ }
+ Ok(GeminiLink::Relative(url, label)) => {
+ let new_url = Gemini { source: url }.to_absolute_url().unwrap();
+ insert_button(&gui, new_url, label);
+ }
+ Ok(GeminiLink::Unknown(_, _)) => (),
+ Err(_) => (),
+ }
+}
+
+pub fn gopher_link(gui: &Arc<Gui>, link_item: String) {
+ match GopherLink::from_str(&link_item) {
+ Ok(GopherLink::Http(url, label)) => {
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+ let www_label = format!("{} [WWW]", button_label);
+
+ insert_external_button(&gui, url, &www_label);
+ }
+ Ok(GopherLink::Gopher(url, label)) => {
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+ let gopher_label = format!("{} [Gopher]", button_label);
+ insert_button(&gui, url, gopher_label);
+ }
+ Ok(GopherLink::Image(url, label)) => {
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+ let image_label = format!("{} [Image]", button_label);
+ insert_gopher_file_button(&gui, url, image_label);
+ }
+ Ok(GopherLink::Gemini(url, label)) => {
+ insert_button(&gui, url, label);
+ }
+ Ok(GopherLink::Relative(url, label)) => {
+ let new_url = Gopher { source: url }.to_absolute_url().unwrap();
+ insert_button(&gui, new_url, label);
+ }
+ Ok(GopherLink::Unknown(_, _)) => (),
+ Err(_) => (),
+ }
+}
+
+pub fn insert_button(gui: &Arc<Gui>, url: Url, label: String) {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+
+ let button = gtk::Button::new_with_label(&button_label);
+ button.set_tooltip_text(Some(&url.to_string()));
+
+ button.connect_clicked(clone!(@weak gui => move |_| {
+ match url.scheme() {
+ "finger" => crate::visit_url(&gui, Finger { source: url.to_string() }),
+ "gemini" => crate::visit_url(&gui, Gemini { source: url.to_string() }),
+ "gopher" => crate::visit_url(&gui, Gopher { source: url.to_string() }),
+ _ => ()
+ }
+ }));
+
+ let mut start_iter = buffer.get_end_iter();
+ let anchor = buffer.create_child_anchor(&mut start_iter).unwrap();
+ content_view.add_child_at_anchor(&button, &anchor);
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert(&mut end_iter, "\n");
+}
+
+pub fn insert_gopher_file_button(gui: &Arc<Gui>, url: Url, label: String) {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ let button_label = if label.is_empty() {
+ url.clone().to_string()
+ } else {
+ label
+ };
+
+ let button = gtk::Button::new_with_label(&button_label);
+ button.set_tooltip_text(Some(&url.to_string()));
+
+ button.connect_clicked(move |_| {
+ let (_meta, content) = crate::gopher::client::get_data(Gopher {
+ source: url.to_string(),
+ })
+ .unwrap();
+ crate::client::download(content);
+ });
+
+ let mut start_iter = buffer.get_end_iter();
+ let anchor = buffer.create_child_anchor(&mut start_iter).unwrap();
+ content_view.add_child_at_anchor(&button, &anchor);
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert(&mut end_iter, "\n");
+}
+
+pub fn insert_external_button(gui: &Arc<Gui>, url: Url, label: &str) {
+ let content_view = gui.content_view();
+ let buffer = content_view.get_buffer().unwrap();
+
+ let button = gtk::Button::new_with_label(&label);
+ button.set_tooltip_text(Some(&url.to_string()));
+
+ button.connect_clicked(move |_| {
+ open::that(url.to_string()).unwrap();
+ });
+
+ let mut start_iter = buffer.get_end_iter();
+ let anchor = buffer.create_child_anchor(&mut start_iter).unwrap();
+ content_view.add_child_at_anchor(&button, &anchor);
+ let mut end_iter = buffer.get_end_iter();
+ buffer.insert(&mut end_iter, "\n");
+}
diff --git a/src/main.rs b/src/main.rs
index fd3742c..e57e67b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,9 +7,8 @@ extern crate lazy_static;
use std::str::FromStr;
use std::sync::Arc;
-use glib::clone;
use gtk::prelude::*;
-use gtk::{ResponseType, TextBuffer};
+use gtk::ResponseType;
use url::{Position, Url};
@@ -20,12 +19,11 @@ use absolute_url::AbsoluteUrl;
mod bookmarks;
mod client;
mod colors;
+mod draw;
mod finger;
mod gemini;
mod gopher;
mod history;
-use gemini::link::Link as GeminiLink;
-use gopher::link::Link as GopherLink;
mod protocols;
use protocols::{Finger, Gemini, Gopher, Protocol, Scheme};
mod settings;
@@ -159,14 +157,14 @@ fn show_bookmarks(gui: &Arc<Gui>) {
let parsed_content = gemini::parser::parse(bookmarks_list);
clear_buffer(&content_view);
- draw_gemini_content(&gui, parsed_content);
+ draw::gemini_content(&gui, parsed_content);
update_url_field(&gui, "::bookmarks");
content_view.show_all();
}
-fn visit_url<T: AbsoluteUrl + Protocol>(gui: &Arc<Gui>, url: T) {
+pub fn visit_url<T: AbsoluteUrl + Protocol>(gui: &Arc<Gui>, url: T) {
if url.get_source_str() == "gemini://::bookmarks" {
show_bookmarks(&gui);
return;
@@ -196,10 +194,10 @@ fn visit_url<T: AbsoluteUrl + Protocol>(gui: &Arc<Gui>, url: T) {
let parsed_content = gemini::parser::parse(content_str);
clear_buffer(&content_view);
if meta == "text/gemini" {
- draw_gemini_content(&gui, parsed_content);
+ draw::gemini_content(&gui, parsed_content);
} else {
// just a text file
- draw_gemini_text_content(&gui, parsed_content);
+ draw::gemini_text_content(&gui, parsed_content);
}
content_view.show_all();
@@ -249,7 +247,7 @@ fn visit_url<T: AbsoluteUrl + Protocol>(gui: &Arc<Gui>, url: T) {
let parsed_content = gopher::parser::parse(content_str);
clear_buffer(&content_view);
- draw_gopher_content(&gui, parsed_content);
+ draw::gopher_content(&gui, parsed_content);
content_view.show_all();
}
@@ -273,7 +271,7 @@ fn visit_url<T: AbsoluteUrl + Protocol>(gui: &Arc<Gui>, url: T) {
let parsed_content = finger::parser::parse(content_str);
clear_buffer(&content_view);
- draw_finger_content(&gui, parsed_content);
+ draw::finger_content(&gui, parsed_content);
content_view.show_all();
}
@@ -289,373 +287,6 @@ fn visit_url<T: AbsoluteUrl + Protocol>(gui: &Arc<Gui>, url: T) {
}
}
-fn draw_gemini_content(
- gui: &Arc<Gui>,
- content: Vec<Result<gemini::parser::TextElement, gemini::parser::ParseError>>,
-) -> TextBuffer {
- let content_view = gui.content_view();
- let buffer = content_view.get_buffer().unwrap();
-
- let mut mono_toggle = false;
- let font_family = if settings::gemini_monospace() {
- "monospace"
- } else {
- "sans"
- };
-
- for el in content {
- match el {
- Ok(gemini::parser::TextElement::H1(header)) => {
- let mut end_iter = buffer.get_end_iter();
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" size=\"x-large\" font_family=\"{}\">{}{}</span>\n",
- settings::h1_color(),
- font_family,
- settings::h1_character(),
- header
- ),
- );
- }
- Ok(gemini::parser::TextElement::H2(header)) => {
- let mut end_iter = buffer.get_end_iter();
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" size=\"large\" font_family=\"{}\">{}{}</span>\n",
- settings::h2_color(),
- font_family,
- settings::h2_character(),
- header
- ),
- );
- }
- Ok(gemini::parser::TextElement::H3(header)) => {
- let mut end_iter = buffer.get_end_iter();
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" size=\"medium\" font_family=\"{}\">{}{}</span>\n",
- settings::h3_color(),
- font_family,
- settings::h3_character(),
- header
- ),
- );
- }
- Ok(gemini::parser::TextElement::ListItem(item)) => {
- let mut end_iter = buffer.get_end_iter();
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" font_family=\"{}\">{} {}</span>\n",
- settings::list_color(),
- font_family,
- settings::list_character(),
- item
- ),
- );
- }
- Ok(gemini::parser::TextElement::MonoText(_text)) => {
- mono_toggle = !mono_toggle;
- }
- Ok(gemini::parser::TextElement::Text(text)) => {
- let mut end_iter = buffer.get_end_iter();
- match mono_toggle {
- true => {
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" font_family=\"monospace\">{}</span>\n",
- settings::text_color(),
- text
- ),
- );
- }
- false => {
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" font_family=\"{}\">{}</span>\n",
- settings::text_color(),
- font_family,
- text
- ),
- );
- }
- }
- }
- Ok(gemini::parser::TextElement::LinkItem(link_item)) => {
- draw_gemini_link(&gui, link_item);
- }
- Err(_) => println!("Something failed."),
- }
- }
- buffer
-}
-
-fn draw_gemini_text_content(
- gui: &Arc<Gui>,
- content: Vec<Result<gemini::parser::TextElement, gemini::parser::ParseError>>,
-) -> TextBuffer {
- let content_view = gui.content_view();
- let buffer = content_view.get_buffer().unwrap();
-
- for el in content {
- match el {
- Ok(gemini::parser::TextElement::Text(text)) => {
- let mut end_iter = buffer.get_end_iter();
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" font_family=\"monospace\">{}</span>\n",
- settings::text_color(),
- text
- ),
- );
- },
- Ok(_) => (),
- Err(_) => println!("Something failed."),
- }
- }
- buffer
-}
-
-fn draw_gopher_content(
- gui: &Arc<Gui>,
- content: Vec<Result<gopher::parser::TextElement, gopher::parser::ParseError>>,
-) -> TextBuffer {
- let content_view = gui.content_view();
- let buffer = content_view.get_buffer().unwrap();
-
- for el in content {
- match el {
- Ok(gopher::parser::TextElement::Text(text)) => {
- let mut end_iter = buffer.get_end_iter();
- let font_family = if settings::gopher_monospace() {
- "font_family=\"monospace\""
- } else {
- "font_family=\"serif\""
- };
-
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" {}>{}</span>\n",
- settings::text_color(),
- font_family,
- text
- ),
- );
- }
- Ok(gopher::parser::TextElement::LinkItem(link_item)) => {
- draw_gopher_link(&gui, link_item);
- }
- Ok(gopher::parser::TextElement::ExternalLinkItem(link_item)) => {
- draw_gopher_link(&gui, link_item);
- }
- Ok(gopher::parser::TextElement::Image(link_item)) => {
- draw_gopher_link(&gui, link_item);
- }
- Err(_) => println!("Something failed."),
- }
- }
- buffer
-}
-
-fn draw_finger_content(
- gui: &Arc<Gui>,
- content: Vec<Result<finger::parser::TextElement, finger::parser::ParseError>>,
-) -> TextBuffer {
- let content_view = gui.content_view();
- let buffer = content_view.get_buffer().unwrap();
-
- for el in content {
- match el {
- Ok(finger::parser::TextElement::Text(text)) => {
- let mut end_iter = buffer.get_end_iter();
- let font_family = if settings::finger_monospace() {
- "font_family=\"monospace\""
- } else {
- "font_family=\"serif\""
- };
-
- buffer.insert_markup(
- &mut end_iter,
- &format!(
- "<span foreground=\"{}\" {}>{}</span>\n",
- settings::text_color(),
- font_family,
- text
- ),
- );
- }
- Err(_) => println!("Something failed."),
- }
- }
- buffer
-}
-
-fn draw_gemini_link(gui: &Arc<Gui>, link_item: String) {
- match GeminiLink::from_str(&link_item) {
- Ok(GeminiLink::Finger(url, label)) => {
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
- let finger_label = format!("{} [Finger]", button_label);
- insert_button(&gui, url, finger_label);
- }
- Ok(GeminiLink::Gemini(url, label)) => {
- insert_button(&gui, url, label);
- }
- Ok(GeminiLink::Gopher(url, label)) => {
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
- let gopher_label = format!("{} [Gopher]", button_label);
- insert_button(&gui, url, gopher_label);
- }
- Ok(GeminiLink::Http(url, label)) => {
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
- let www_label = format!("{} [WWW]", button_label);
-
- insert_external_button(&gui, url, &www_label);
- }
- Ok(GeminiLink::Relative(url, label)) => {
- let new_url = Gemini { source: url }.to_absolute_url().unwrap();
- insert_button(&gui, new_url, label);
- }
- Ok(GeminiLink::Unknown(_, _)) => (),
- Err(_) => (),
- }
-}
-
-fn draw_gopher_link(gui: &Arc<Gui>, link_item: String) {
- match GopherLink::from_str(&link_item) {
- Ok(GopherLink::Http(url, label)) => {
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
- let www_label = format!("{} [WWW]", button_label);
-
- insert_external_button(&gui, url, &www_label);
- }
- Ok(GopherLink::Gopher(url, label)) => {
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
- let gopher_label = format!("{} [Gopher]", button_label);
- insert_button(&gui, url, gopher_label);
- }
- Ok(GopherLink::Image(url, label)) => {
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
- let image_label = format!("{} [Image]", button_label);
- insert_gopher_file_button(&gui, url, image_label);
- }
- Ok(GopherLink::Gemini(url, label)) => {
- insert_button(&gui, url, label);
- }
- Ok(GopherLink::Relative(url, label)) => {
- let new_url = Gopher { source: url }.to_absolute_url().unwrap();
- insert_button(&gui, new_url, label);
- }
- Ok(GopherLink::Unknown(_, _)) => (),
- Err(_) => (),
- }
-}
-
-fn insert_button(gui: &Arc<Gui>, url: Url, label: String) {
- let content_view = gui.content_view();
- let buffer = content_view.get_buffer().unwrap();
-
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
-
- let button = gtk::Button::new_with_label(&button_label);
- button.set_tooltip_text(Some(&url.to_string()));
-
- button.connect_clicked(clone!(@weak gui => move |_| {
- match url.scheme() {
- "finger" => visit_url(&gui, Finger { source: url.to_string() }),
- "gemini" => visit_url(&gui, Gemini { source: url.to_string() }),
- "gopher" => visit_url(&gui, Gopher { source: url.to_string() }),
- _ => ()
- }
- }));
-
- let mut start_iter = buffer.get_end_iter();
- let anchor = buffer.create_child_anchor(&mut start_iter).unwrap();
- content_view.add_child_at_anchor(&button, &anchor);
- let mut end_iter = buffer.get_end_iter();
- buffer.insert(&mut end_iter, "\n");
-}
-
-fn insert_gopher_file_button(gui: &Arc<Gui>, url: Url, label: String) {
- let content_view = gui.content_view();
- let buffer = content_view.get_buffer().unwrap();
-
- let button_label = if label.is_empty() {
- url.clone().to_string()
- } else {
- label
- };
-
- let button = gtk::Button::new_with_label(&button_label);
- button.set_tooltip_text(Some(&url.to_string()));
-
- button.connect_clicked(move |_| {
- let (_meta, content) = gopher::client::get_data(Gopher {
- source: url.to_string(),
- })
- .unwrap();
- client::download(content);
- });
-
- let mut start_iter = buffer.get_end_iter();
- let anchor = buffer.create_child_anchor(&mut start_iter).unwrap();
- content_view.add_child_at_anchor(&button, &anchor);
- let mut end_iter = buffer.get_end_iter();
- buffer.insert(&mut end_iter, "\n");
-}
-
-fn insert_external_button(gui: &Arc<Gui>, url: Url, label: &str) {
- let content_view = gui.content_view();
- let buffer = content_view.get_buffer().unwrap();
-
- let button = gtk::Button::new_with_label(&label);
- button.set_tooltip_text(Some(&url.to_string()));
-
- button.connect_clicked(move |_| {
- open::that(url.to_string()).unwrap();
- });
-
- let mut start_iter = buffer.get_end_iter();
- let anchor = buffer.create_child_anchor(&mut start_iter).unwrap();
- content_view.add_child_at_anchor(&button, &anchor);
- let mut end_iter = buffer.get_end_iter();
- buffer.insert(&mut end_iter, "\n");
-}
-
fn info_dialog(gui: &Arc<Gui>, message: &str) {
let dialog = gtk::Dialog::new_with_buttons(
Some("Info"),
---
Served by Pollux Gemini Server.
-- Response ended
-- Page fetched on Sun May 19 06:33:57 2024