mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-03-31 16:45:27 +00:00
connect file open action
This commit is contained in:
parent
4c0200799b
commit
9fe6713bc8
3 changed files with 60 additions and 13 deletions
|
|
@ -126,6 +126,13 @@ impl Window {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
action.open.on_activate({
|
||||||
|
let tab = tab.clone();
|
||||||
|
move |position, request| {
|
||||||
|
tab.open(position, &request, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Init struct
|
// Init struct
|
||||||
Self { action, tab, g_box }
|
Self { action, tab, g_box }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
use gtk::{
|
use gtk::{
|
||||||
gio::SimpleAction,
|
gio::{Cancellable, SimpleAction},
|
||||||
glib::uuid_string_random,
|
glib::SignalHandlerId,
|
||||||
prelude::{ActionExt, ToVariant},
|
prelude::{ActionExt, ToVariant},
|
||||||
};
|
};
|
||||||
|
use std::cell::RefCell;
|
||||||
|
|
||||||
// Defaults
|
// Defaults
|
||||||
|
|
||||||
|
|
@ -11,6 +12,7 @@ const DEFAULT_STATE: i32 = -1;
|
||||||
|
|
||||||
/// [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html) wrapper for `Open` action
|
/// [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html) wrapper for `Open` action
|
||||||
pub struct Open {
|
pub struct Open {
|
||||||
|
cancellable: RefCell<Cancellable>,
|
||||||
pub simple_action: SimpleAction,
|
pub simple_action: SimpleAction,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -26,8 +28,9 @@ impl Open {
|
||||||
/// Create new `Self`
|
/// Create new `Self`
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
cancellable: RefCell::new(Cancellable::new()),
|
||||||
simple_action: SimpleAction::new_stateful(
|
simple_action: SimpleAction::new_stateful(
|
||||||
&uuid_string_random(),
|
>k::glib::uuid_string_random(),
|
||||||
None,
|
None,
|
||||||
&DEFAULT_STATE.to_variant(),
|
&DEFAULT_STATE.to_variant(),
|
||||||
),
|
),
|
||||||
|
|
@ -48,11 +51,16 @@ impl Open {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Events
|
// Actions
|
||||||
|
|
||||||
|
/// Formatted action connector for external implementation
|
||||||
|
pub fn on_activate(&self, callback: impl Fn(Option<i32>, String) + 'static) -> SignalHandlerId {
|
||||||
|
use gtk::{prelude::FileExt, FileDialog, Window};
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
let cancellable = self.cancellable();
|
||||||
|
let callback = Rc::new(callback);
|
||||||
|
|
||||||
/// Define callback function for
|
|
||||||
/// [SimpleAction::activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal
|
|
||||||
pub fn connect_activate(&self, callback: impl Fn(Option<i32>) + 'static) {
|
|
||||||
self.simple_action.connect_activate(move |this, _| {
|
self.simple_action.connect_activate(move |this, _| {
|
||||||
let state = this
|
let state = this
|
||||||
.state()
|
.state()
|
||||||
|
|
@ -60,11 +68,37 @@ impl Open {
|
||||||
.get::<i32>()
|
.get::<i32>()
|
||||||
.expect("Parameter type does not match `i32`");
|
.expect("Parameter type does not match `i32`");
|
||||||
|
|
||||||
callback(if state == DEFAULT_STATE {
|
FileDialog::builder()
|
||||||
None
|
.build()
|
||||||
} else {
|
.open(Window::NONE, Some(&cancellable), {
|
||||||
Some(state)
|
let callback = callback.clone();
|
||||||
})
|
move |result| {
|
||||||
});
|
if let Ok(file) = result {
|
||||||
|
callback(
|
||||||
|
if state == DEFAULT_STATE {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(state)
|
||||||
|
},
|
||||||
|
format!("file://{}", file.path().unwrap().to_str().unwrap()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tools
|
||||||
|
|
||||||
|
/// Gent new `Cancellable` by cancel previous one
|
||||||
|
fn cancellable(&self) -> Cancellable {
|
||||||
|
use gtk::prelude::CancellableExt;
|
||||||
|
|
||||||
|
let cancellable = self.cancellable.replace(Cancellable::new());
|
||||||
|
if !cancellable.is_cancelled() {
|
||||||
|
cancellable.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
self.cancellable.borrow().clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -303,6 +303,12 @@ impl Tab {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn open(&self, page_position: Option<i32>, request: &str, is_snap_history: bool) {
|
||||||
|
if let Some(item) = self.item(page_position) {
|
||||||
|
item.action.load.activate(Some(request), is_snap_history);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn clean(
|
pub fn clean(
|
||||||
&self,
|
&self,
|
||||||
transaction: &Transaction,
|
transaction: &Transaction,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue