From 0912f2c68d6aaf233a888ae3ac0df94d7d8d4ed8 Mon Sep 17 00:00:00 2001 From: yggverse Date: Wed, 30 Oct 2024 02:48:00 +0200 Subject: [PATCH] select entire text on first request entry focus --- .../item/page/navigation/request/widget.rs | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/app/browser/window/tab/item/page/navigation/request/widget.rs b/src/app/browser/window/tab/item/page/navigation/request/widget.rs index 12140384..393ec007 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/widget.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/widget.rs @@ -3,10 +3,11 @@ mod database; use database::Database; use gtk::{ + gdk::BUTTON_PRIMARY, gio::SimpleAction, glib::{timeout_add_local, ControlFlow, GString, SourceId}, - prelude::{ActionExt, EditableExt, EntryExt, ToVariant}, - Entry, + prelude::{ActionExt, EditableExt, EntryExt, ToVariant, WidgetExt}, + Entry, GestureClick, }; use sqlite::Transaction; use std::{cell::RefCell, sync::Arc, time::Duration}; @@ -39,12 +40,20 @@ impl Widget { source_id: RefCell::new(None), }); + // Init additional controllers + let primary_button_controller = GestureClick::builder().button(BUTTON_PRIMARY).build(); + // Init widget let gobject = Entry::builder() .placeholder_text(PLACEHOLDER_TEXT) .hexpand(true) .build(); + gobject + .first_child() + .unwrap() // text widget should be there + .add_controller(primary_button_controller.clone()); + // Connect events gobject.connect_changed(move |_| { action_update.activate(Some(&"".to_variant())); // @TODO @@ -54,6 +63,24 @@ impl Widget { action_tab_page_navigation_reload.activate(None); }); + primary_button_controller.connect_pressed({ + let gobject = gobject.clone(); + move |_, _, _, _| { + let gobject = gobject.clone(); + // Select entire text on first focus at entry + // this behavior implemented in most web-browsers, + // to simply overwrite current request with new value + if !gobject.first_child().unwrap().has_focus() { + // Small trick to overwrite default GTK behavior + // @TODO find another way to prevent defaults but with timeout + timeout_add_local(Duration::from_millis(100), move || { + gobject.select_region(0, gobject.text_length().into()); + ControlFlow::Break + }); + } + } + }); + // Return activated struct Arc::new(Self { gobject, progress }) }