Allow clipboard access in Widget::on_event

This commit is contained in:
Héctor Ramón Jiménez 2019-12-18 07:45:49 +01:00
parent 0f2e20f5e5
commit a14b39555e
20 changed files with 89 additions and 26 deletions

View File

@ -8,6 +8,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: hecrj/setup-rust-action@v1
- name: Install xcb libraries
run: sudo apt-get install -y libxcb-shape0-dev libxcb-xfixes0-dev
- name: Install cargo-deb
run: cargo install cargo-deb
- uses: actions/checkout@master

View File

@ -12,6 +12,9 @@ jobs:
with:
rust-version: ${{ matrix.rust }}
- uses: actions/checkout@master
- name: Install xcb libraries
if: matrix.os == 'ubuntu-latest'
run: sudo apt-get install -y libxcb-shape0-dev libxcb-xfixes0-dev
- name: Run tests
run: |
cargo test --verbose --all

8
native/src/clipboard.rs Normal file
View File

@ -0,0 +1,8 @@
/// A buffer for short-term storage and transfer within and between
/// applications.
pub trait Clipboard {
/// Returns the current content of the [`Clipboard`] as text.
///
/// [`Clipboard`]: trait.Clipboard.html
fn content(&self) -> Option<String>;
}

View File

@ -1,5 +1,6 @@
use crate::{
layout, renderer, Color, Event, Hasher, Layout, Length, Point, Widget,
layout, renderer, Clipboard, Color, Event, Hasher, Layout, Length, Point,
Widget,
};
/// A generic [`Widget`].
@ -293,6 +294,7 @@ where
cursor_position: Point,
messages: &mut Vec<B>,
renderer: &Renderer,
clipboard: Option<&dyn Clipboard>,
) {
let mut original_messages = Vec::new();
@ -302,6 +304,7 @@ where
cursor_position,
&mut original_messages,
renderer,
clipboard,
);
original_messages
@ -366,6 +369,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
renderer: &Renderer,
clipboard: Option<&dyn Clipboard>,
) {
self.element.widget.on_event(
event,
@ -373,6 +377,7 @@ where
cursor_position,
messages,
renderer,
clipboard,
)
}

View File

@ -45,6 +45,7 @@ pub mod renderer;
pub mod subscription;
pub mod widget;
mod clipboard;
mod element;
mod event;
mod hasher;
@ -57,6 +58,7 @@ pub use iced_core::{
Point, Rectangle, Vector, VerticalAlignment,
};
pub use clipboard::Clipboard;
pub use element::Element;
pub use event::Event;
pub use hasher::Hasher;

View File

@ -1,4 +1,6 @@
use crate::{input::mouse, layout, Element, Event, Layout, Point, Size};
use crate::{
input::mouse, layout, Clipboard, Element, Event, Layout, Point, Size,
};
use std::hash::Hasher;
@ -185,7 +187,7 @@ where
/// );
///
/// // Update the user interface
/// let messages = user_interface.update(&renderer, events.drain(..));
/// let messages = user_interface.update(&renderer, None, events.drain(..));
///
/// cache = user_interface.into_cache();
///
@ -198,6 +200,7 @@ where
pub fn update(
&mut self,
renderer: &Renderer,
clipboard: Option<&dyn Clipboard>,
events: impl Iterator<Item = Event>,
) -> Vec<Message> {
let mut messages = Vec::new();
@ -213,6 +216,7 @@ where
self.cursor_position,
&mut messages,
renderer,
clipboard,
);
}
@ -282,7 +286,7 @@ where
/// &mut renderer,
/// );
///
/// let messages = user_interface.update(&renderer, events.drain(..));
/// let messages = user_interface.update(&renderer, None, events.drain(..));
///
/// // Draw the user interface
/// let mouse_cursor = user_interface.draw(&mut renderer);

View File

@ -24,12 +24,12 @@ pub mod button;
pub mod checkbox;
pub mod column;
pub mod container;
pub mod svg;
pub mod image;
pub mod radio;
pub mod row;
pub mod scrollable;
pub mod slider;
pub mod svg;
pub mod text;
pub mod text_input;
@ -58,7 +58,7 @@ pub use text::Text;
#[doc(no_inline)]
pub use text_input::TextInput;
use crate::{layout, Event, Hasher, Layout, Length, Point};
use crate::{layout, Clipboard, Event, Hasher, Layout, Length, Point};
/// A component that displays information and allows interaction.
///
@ -142,6 +142,7 @@ where
_cursor_position: Point,
_messages: &mut Vec<Message>,
_renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>,
) {
}
}

View File

@ -6,8 +6,8 @@
//! [`State`]: struct.State.html
use crate::{
input::{mouse, ButtonState},
layout, Background, Element, Event, Hasher, Layout, Length, Point,
Rectangle, Widget,
layout, Background, Clipboard, Element, Event, Hasher, Layout, Length,
Point, Rectangle, Widget,
};
use std::hash::Hash;
@ -192,6 +192,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
_renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>,
) {
match event {
Event::Mouse(mouse::Event::Input {

View File

@ -3,7 +3,7 @@ use std::hash::Hash;
use crate::{
input::{mouse, ButtonState},
layout, row, text, Align, Color, Element, Event, Font, Hasher,
layout, row, text, Align, Clipboard, Color, Element, Event, Font, Hasher,
HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text,
VerticalAlignment, Widget,
};
@ -114,6 +114,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
_renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>,
) {
match event {
Event::Mouse(mouse::Event::Input {

View File

@ -2,7 +2,8 @@
use std::hash::Hash;
use crate::{
layout, Align, Element, Event, Hasher, Layout, Length, Point, Widget,
layout, Align, Clipboard, Element, Event, Hasher, Layout, Length, Point,
Widget,
};
use std::u32;
@ -153,6 +154,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
renderer: &Renderer,
clipboard: Option<&dyn Clipboard>,
) {
self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| {
@ -162,6 +164,7 @@ where
cursor_position,
messages,
renderer,
clipboard,
)
},
);

View File

@ -2,7 +2,8 @@
use std::hash::Hash;
use crate::{
layout, Align, Element, Event, Hasher, Layout, Length, Point, Widget,
layout, Align, Clipboard, Element, Event, Hasher, Layout, Length, Point,
Widget,
};
use std::u32;
@ -131,6 +132,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
renderer: &Renderer,
clipboard: Option<&dyn Clipboard>,
) {
self.content.widget.on_event(
event,
@ -138,6 +140,7 @@ where
cursor_position,
messages,
renderer,
clipboard,
)
}

View File

@ -1,7 +1,7 @@
//! Create choices using radio buttons.
use crate::{
input::{mouse, ButtonState},
layout, row, text, Align, Color, Element, Event, Font, Hasher,
layout, row, text, Align, Clipboard, Color, Element, Event, Font, Hasher,
HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text,
VerticalAlignment, Widget,
};
@ -113,6 +113,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
_renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>,
) {
match event {
Event::Mouse(mouse::Event::Input {

View File

@ -2,7 +2,8 @@
use std::hash::Hash;
use crate::{
layout, Align, Element, Event, Hasher, Layout, Length, Point, Widget,
layout, Align, Clipboard, Element, Event, Hasher, Layout, Length, Point,
Widget,
};
use std::u32;
@ -154,6 +155,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
renderer: &Renderer,
clipboard: Option<&dyn Clipboard>,
) {
self.children.iter_mut().zip(layout.children()).for_each(
|(child, layout)| {
@ -163,6 +165,7 @@ where
cursor_position,
messages,
renderer,
clipboard,
)
},
);

View File

@ -2,8 +2,8 @@
use crate::{
column,
input::{mouse, ButtonState},
layout, Align, Column, Element, Event, Hasher, Layout, Length, Point,
Rectangle, Size, Widget,
layout, Align, Clipboard, Column, Element, Event, Hasher, Layout, Length,
Point, Rectangle, Size, Widget,
};
use std::{f32, hash::Hash, u32};
@ -143,6 +143,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
renderer: &Renderer,
clipboard: Option<&dyn Clipboard>,
) {
let bounds = layout.bounds();
let is_mouse_over = bounds.contains(cursor_position);
@ -247,6 +248,7 @@ where
cursor_position,
messages,
renderer,
clipboard,
)
}

View File

@ -6,8 +6,8 @@
//! [`State`]: struct.State.html
use crate::{
input::{mouse, ButtonState},
layout, Element, Event, Hasher, Layout, Length, Point, Rectangle, Size,
Widget,
layout, Clipboard, Element, Event, Hasher, Layout, Length, Point,
Rectangle, Size, Widget,
};
use std::{hash::Hash, ops::RangeInclusive};
@ -133,6 +133,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
_renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>,
) {
let mut change = || {
let bounds = layout.bounds();

View File

@ -6,8 +6,8 @@
//! [`State`]: struct.State.html
use crate::{
input::{keyboard, mouse, ButtonState},
layout, Element, Event, Hasher, Layout, Length, Point, Rectangle, Size,
Widget,
layout, Clipboard, Element, Event, Hasher, Layout, Length, Point,
Rectangle, Size, Widget,
};
use unicode_segmentation::UnicodeSegmentation;
@ -172,6 +172,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
renderer: &Renderer,
_clipboard: Option<&dyn Clipboard>,
) {
match event {
Event::Mouse(mouse::Event::Input {

View File

@ -13,6 +13,7 @@ debug = []
[dependencies]
iced_native = { version = "0.1.0-alpha", path = "../native" }
winit = { version = "0.20.0-alpha3", git = "https://github.com/rust-windowing/winit", rev = "709808eb4e69044705fcb214bcc30556db761405"}
window_clipboard = "=0.1.0-alpha.1"
futures = { version = "0.3", features = ["thread-pool"] }
log = "0.4"

View File

@ -2,8 +2,8 @@ use crate::{
conversion,
input::{keyboard, mouse},
renderer::{Target, Windowed},
subscription, Cache, Command, Container, Debug, Element, Event, Length,
MouseCursor, Settings, Subscription, UserInterface,
subscription, Cache, Clipboard, Command, Container, Debug, Element, Event,
Length, MouseCursor, Settings, Subscription, UserInterface,
};
/// An interactive, native cross-platform application.
@ -139,6 +139,7 @@ pub trait Application: Sized {
let mut size = window.inner_size();
let mut resized = false;
let clipboard = Clipboard::new(&window);
let mut renderer = Self::Renderer::new();
let mut target = {
@ -193,8 +194,13 @@ pub trait Application: Sized {
subscription_pool.broadcast_event(*event)
});
let mut messages =
user_interface.update(&renderer, events.drain(..));
let mut messages = user_interface.update(
&renderer,
clipboard
.as_ref()
.map(|c| c as &dyn iced_native::Clipboard),
events.drain(..),
);
messages.extend(external_messages.drain(..));
debug.event_processing_finished();

13
winit/src/clipboard.rs Normal file
View File

@ -0,0 +1,13 @@
pub struct Clipboard(window_clipboard::Clipboard);
impl Clipboard {
pub fn new(window: &winit::window::Window) -> Option<Clipboard> {
window_clipboard::Clipboard::new(window).map(Clipboard).ok()
}
}
impl iced_native::Clipboard for Clipboard {
fn content(&self) -> Option<String> {
self.0.read().ok()
}
}

View File

@ -29,11 +29,9 @@ pub mod conversion;
pub mod settings;
mod application;
mod clipboard;
mod subscription;
pub use application::Application;
pub use settings::Settings;
// We disable debug capabilities on release builds unless the `debug` feature
// is explicitly enabled.
#[cfg(feature = "debug")]
@ -43,4 +41,8 @@ mod debug;
#[path = "debug/null.rs"]
mod debug;
pub use application::Application;
pub use settings::Settings;
use clipboard::Clipboard;
use debug::Debug;