diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..9bae187 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,117 @@ +use gtk4::prelude::*; +use gtk4::{Application, + ApplicationWindow, + Box, + Button, + Entry, + HeaderBar, + Orientation, + ScrolledWindow}; + +use webkit6::prelude::*; +use webkit6::WebView; + +const APP_ID: &str = "com.namilsk.i2p-browser"; + +fn main() -> glib::ExitCode { + let app = Application::builder().application_id(APP_ID).build(); + app.connect_activate(build_ui); + app.run() +} + +fn build_ui(app: &Application) { + let window = ApplicationWindow::builder() + .application(app) + .title("I2P Browser") + .default_width(1024) + .default_height(768) + .build(); + + let header_bar = HeaderBar::new(); + window.set_titlebar(Some(&header_bar)); + + let url_entry = Entry::builder() + .placeholder_text("Enter I2P URL (e.g., http://example.i2p)") + .build(); + + let button_back = Button::with_label("<"); + let button_forward = Button::with_label(">"); + let button_reload = Button::with_label("R"); + let button_home = Button::with_label("H"); + + header_bar.pack_start(&button_back); + header_bar.pack_start(&button_forward); + header_bar.pack_start(&button_reload); + header_bar.pack_start(&button_home); + header_bar.set_title_widget(Some(&url_entry)); + + let main_box = Box::new(Orientation::Vertical, 0); + window.set_child(Some(&main_box)); + + let web_view = WebView::new(); + + let scrolled_window = ScrolledWindow::builder() + .child(&web_view) + .build(); + + main_box.append(&scrolled_window); + + let web_view_for_entry = web_view.clone(); + let url_entry_for_entry = url_entry.clone(); + url_entry.connect_activate(move |entry| { + let url = entry.text(); + let full_url = if url.starts_with("http://") || url.starts_with("https://") { + url.to_string() + } else { + format!("http://{}", url) + }; + + if glib::Uri::parse(&full_url, glib::UriFlags::NONE).is_ok() { + web_view_for_entry.load_uri(&full_url); + } else { + eprintln!("Invalid URI: {}", full_url); + } + url_entry_for_entry.set_text(&full_url); + }); + + + let web_view_for_back = web_view.clone(); + button_back.connect_clicked(move |_| { + if web_view_for_back.can_go_back() { + web_view_for_back.go_back(); + } + }); + + + let web_view_for_forward = web_view.clone(); + button_forward.connect_clicked(move |_| { + if web_view_for_forward.can_go_forward() { + web_view_for_forward.go_forward(); + } + }); + + let web_view_for_reload = web_view.clone(); + button_reload.connect_clicked(move |_| { + web_view_for_reload.reload(); + }); + + + let web_view_for_home = web_view.clone(); + let url_entry_for_home = url_entry.clone(); + button_home.connect_clicked(move |_| { + let home_url = "http://reg.i2p/"; + web_view_for_home.load_uri(home_url); + url_entry_for_home.set_text(home_url); + }); + + let url_entry_for_notify = url_entry.clone(); + web_view.connect_notify_local(Some("uri"), move |web_view, _| { + if let Some(uri) = web_view.uri() { + url_entry_for_notify.set_text(&uri); + } + }); + + web_view.load_uri("http://legwork.i2p/"); + + window.present(); +}
\ No newline at end of file |
