@@ -5,15 +5,20 @@ use input::{Input, Button};
55use input:: keyboard:: Key ;
66use input:: mouse:: MouseButton ;
77use position:: Point ;
8+ use std:: marker:: PhantomData ;
89
910
1011/// Trait for something that provides events to be consumed by a widget.
12+ ///
1113/// Provides a bunch of convenience methods for filtering out specific types of events.
12- pub trait InputProvider < ' a , T : Iterator < Item =& ' a UiEvent > > {
14+ pub trait InputProvider < ' a > {
15+ /// An iterator yielding references to the `InputProvider`'s `UiEvent`s.
16+ type Events : Iterator < Item =& ' a UiEvent > ;
17+
1318 /// This is the only method that needs to be implemented.
1419 /// Just provided a reference to a `Vec<UiEvent>` that contains
1520 /// all the events for this update cycle.
16- fn all_events ( & ' a self ) -> T ;
21+ fn all_events ( & ' a self ) -> Self :: Events ;
1722
1823 /// Returns the current input state. The returned state is assumed to be up to
1924 /// date with all of the events so far.
@@ -27,54 +32,43 @@ pub trait InputProvider<'a, T: Iterator<Item=&'a UiEvent>> {
2732 // Methods that just check the stream of events //
2833 //////////////////////////////////////////////////
2934
30- /// Returns a `String` containing _all_ the text that was entered since
31- /// the last update cycle.
32- fn text_just_entered ( & ' a self ) -> Option < String > {
33- let all_text: String = self . all_events ( ) . filter_map ( |evt| {
34- match * evt {
35- UiEvent :: Raw ( Input :: Text ( ref text) ) => Some ( text) ,
36- _ => None
37- }
38- } ) . fold ( String :: new ( ) , |acc, item| {
39- acc + item
40- } ) ;
41-
42- if all_text. is_empty ( ) {
43- None
44- } else {
45- Some ( all_text)
35+ /// Returns a reference to each slice of `Text` that was entered since the last update.
36+ fn text_just_entered ( & ' a self ) -> TextJustEntered < ' a , Self :: Events > {
37+ TextJustEntered {
38+ events : self . all_events ( ) ,
39+ lifetime : PhantomData ,
4640 }
4741 }
4842
4943 /// Returns all of the `Key`s that were released since the last update.
50- fn keys_just_released ( & ' a self ) -> KeysJustReleased < ' a , T > {
44+ fn keys_just_released ( & ' a self ) -> KeysJustReleased < ' a , Self :: Events > {
5145 KeysJustReleased {
5246 event_iter : self . all_events ( ) ,
53- lifetime : :: std :: marker :: PhantomData
47+ lifetime : PhantomData
5448 }
5549 }
5650
5751 /// Returns all of the keyboard `Key`s that were pressed since the last update.
58- fn keys_just_pressed ( & ' a self ) -> KeysJustPressed < ' a , T > {
52+ fn keys_just_pressed ( & ' a self ) -> KeysJustPressed < ' a , Self :: Events > {
5953 KeysJustPressed {
6054 event_iter : self . all_events ( ) ,
61- lifetime : :: std :: marker :: PhantomData
55+ lifetime : PhantomData
6256 }
6357 }
6458
6559 /// Returns all of the `MouseButton`s that were pressed since the last update.
66- fn mouse_buttons_just_pressed ( & ' a self ) -> MouseButtonsJustPressed < ' a , T > {
60+ fn mouse_buttons_just_pressed ( & ' a self ) -> MouseButtonsJustPressed < ' a , Self :: Events > {
6761 MouseButtonsJustPressed {
6862 event_iter : self . all_events ( ) ,
69- lifetime : :: std :: marker :: PhantomData
63+ lifetime : PhantomData
7064 }
7165 }
7266
7367 /// Returns all of the `MouseButton`s that were released since the last update.
74- fn mouse_buttons_just_released ( & ' a self ) -> MouseButtonsJustReleased < ' a , T > {
68+ fn mouse_buttons_just_released ( & ' a self ) -> MouseButtonsJustReleased < ' a , Self :: Events > {
7569 MouseButtonsJustReleased {
7670 event_iter : self . all_events ( ) ,
77- lifetime : :: std :: marker :: PhantomData
71+ lifetime : PhantomData
7872 }
7973 }
8074
@@ -173,11 +167,34 @@ pub trait InputProvider<'a, T: Iterator<Item=&'a UiEvent>> {
173167
174168}
175169
170+ /// An iterator yielding the `&str` of each `Text` event's `String` that was just entered.
171+ #[ derive( Clone , Debug ) ]
172+ pub struct TextJustEntered < ' a , I >
173+ where I : Iterator < Item =& ' a UiEvent > ,
174+ {
175+ events : I ,
176+ lifetime : PhantomData < & ' a ( ) > ,
177+ }
178+
179+ impl < ' a , I > Iterator for TextJustEntered < ' a , I >
180+ where I : Iterator < Item =& ' a UiEvent > ,
181+ {
182+ type Item =& ' a str ;
183+ fn next ( & mut self ) -> Option < Self :: Item > {
184+ while let Some ( event) = self . events . next ( ) {
185+ if let UiEvent :: Raw ( Input :: Text ( ref text) ) = * event {
186+ return Some ( text) ;
187+ }
188+ }
189+ None
190+ }
191+ }
192+
176193/// An Iterator over `input::keyboard::Key`s that were just released.
177- #[ derive( Debug ) ]
194+ #[ derive( Clone , Debug ) ]
178195pub struct KeysJustReleased < ' a , T : Iterator < Item =& ' a UiEvent > + Sized > {
179196 event_iter : T ,
180- lifetime : :: std :: marker :: PhantomData < & ' a ( ) >
197+ lifetime : PhantomData < & ' a ( ) >
181198}
182199
183200impl < ' a , T > Iterator for KeysJustReleased < ' a , T > where T : Iterator < Item =& ' a UiEvent > + Sized {
@@ -194,10 +211,10 @@ impl<'a, T> Iterator for KeysJustReleased<'a, T> where T: Iterator<Item=&'a UiEv
194211}
195212
196213/// An Iterator over `input::keyboard::Key`s that were just pressed.
197- #[ derive( Debug ) ]
214+ #[ derive( Clone , Debug ) ]
198215pub struct KeysJustPressed < ' a , T : Iterator < Item =& ' a UiEvent > + Sized > {
199216 event_iter : T ,
200- lifetime : :: std :: marker :: PhantomData < & ' a ( ) >
217+ lifetime : PhantomData < & ' a ( ) >
201218}
202219
203220impl < ' a , T > Iterator for KeysJustPressed < ' a , T > where T : Iterator < Item =& ' a UiEvent > + Sized {
@@ -214,10 +231,10 @@ impl<'a, T> Iterator for KeysJustPressed<'a, T> where T: Iterator<Item=&'a UiEve
214231}
215232
216233/// An Iterator over `input::mouse::MouseButton`s that were just pressed.
217- #[ derive( Debug ) ]
234+ #[ derive( Clone , Debug ) ]
218235pub struct MouseButtonsJustPressed < ' a , T : Iterator < Item =& ' a UiEvent > + Sized > {
219236 event_iter : T ,
220- lifetime : :: std :: marker :: PhantomData < & ' a ( ) >
237+ lifetime : PhantomData < & ' a ( ) >
221238}
222239
223240impl < ' a , T > Iterator for MouseButtonsJustPressed < ' a , T > where T : Iterator < Item =& ' a UiEvent > + Sized {
@@ -234,10 +251,10 @@ impl<'a, T> Iterator for MouseButtonsJustPressed<'a, T> where T: Iterator<Item=&
234251}
235252
236253/// An Iterator over `input::mouse::MouseButton`s that were just released.
237- #[ derive( Debug ) ]
254+ #[ derive( Clone , Debug ) ]
238255pub struct MouseButtonsJustReleased < ' a , T : Iterator < Item =& ' a UiEvent > + Sized > {
239256 event_iter : T ,
240- lifetime : :: std :: marker :: PhantomData < & ' a ( ) >
257+ lifetime : PhantomData < & ' a ( ) >
241258}
242259
243260impl < ' a , T > Iterator for MouseButtonsJustReleased < ' a , T > where T : Iterator < Item =& ' a UiEvent > + Sized {
0 commit comments