Browse Source

replace GestureClick with StateFlags implementation

master
yggverse 1 month ago
parent
commit
6a04692ad3
  1. 32
      src/app/browser/window/tab/item/page/navigation/request/widget.rs

32
src/app/browser/window/tab/item/page/navigation/request/widget.rs

@ -3,11 +3,10 @@ mod database; @@ -3,11 +3,10 @@ mod database;
use database::Database;
use gtk::{
gdk::BUTTON_PRIMARY,
gio::SimpleAction,
glib::{timeout_add_local, ControlFlow, GString, SourceId},
prelude::{ActionExt, EditableExt, EntryExt, ToVariant, WidgetExt},
Entry, GestureClick,
Entry, StateFlags,
};
use sqlite::Transaction;
use std::{cell::RefCell, sync::Arc, time::Duration};
@ -40,20 +39,12 @@ impl Widget { @@ -40,20 +39,12 @@ 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
@ -63,20 +54,17 @@ impl Widget { @@ -63,20 +54,17 @@ impl Widget {
action_page_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
gobject.connect_state_flags_changed(|this, state| {
// Select entire text on key release
// 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
});
// Note:
// * Custom GestureClick is not option here, as GTK Entry already has default one
println!("{:?}", state);
if state.contains(StateFlags::ACTIVE) && state.contains(StateFlags::FOCUS_WITHIN) {
// Continue on first focus event
if this.selection_bounds().is_none() {
this.select_region(0, this.text_length().into());
}
}
});

Loading…
Cancel
Save