summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs117
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