@@ -31,14 +31,18 @@ pub struct Builder<G> {
3131}
3232
3333impl < G : GlobalEventHandler > Builder < G > {
34- /// Create a new runtime builder
35- pub ( super ) fn new ( document : Document , size : Size , global_event_handler : G ) -> Self {
34+ /// Create a new runtime builder with a reciver.
35+ /// Use this if the `Emitter` was created outside of the runtime.
36+ pub ( super ) fn with_receiver (
37+ message_receiver : flume:: Receiver < ViewMessage > ,
38+ emitter : Emitter ,
39+ document : Document ,
40+ size : Size ,
41+ global_event_handler : G ,
42+ ) -> Self {
3643 let mut factory = Factory :: new ( ) ;
3744 register_default_widgets ( & mut factory) ;
3845
39- let ( tx, message_receiver) = flume:: unbounded ( ) ;
40- let emitter = tx. into ( ) ;
41-
4246 Self {
4347 factory,
4448 document,
@@ -53,6 +57,13 @@ impl<G: GlobalEventHandler> Builder<G> {
5357 }
5458 }
5559
60+ /// Create a new runtime builder
61+ pub ( super ) fn new ( document : Document , size : Size , global_event_handler : G ) -> Self {
62+ let ( tx, rx) = flume:: unbounded ( ) ;
63+ let emitter = Emitter :: from ( tx) ;
64+ Self :: with_receiver ( rx, emitter. clone ( ) , document, size, global_event_handler)
65+ }
66+
5667 /// Enable/Disable hot reloading
5768 pub fn hot_reload ( & mut self , value : bool ) {
5869 self . hot_reload = value;
@@ -172,9 +183,15 @@ impl<G: GlobalEventHandler> Builder<G> {
172183 let ( blueprint, globals) = loop {
173184 match self . document . compile ( ) {
174185 Ok ( val) => break val,
175- Err ( error) => {
176- show_error ( error, backend, & mut self . document ) ?;
177- }
186+ // This can only show template errors.
187+ // Widget errors doesn't become available until after the first tick.
188+ Err ( error) => match show_error ( error. into ( ) , backend, & self . document ) {
189+ Ok ( ( ) ) => return Err ( Error :: Stop ) ,
190+ Err ( Error :: Reload ) if self . hot_reload => {
191+ _ = self . document . reload_templates ( ) ;
192+ }
193+ err => err?,
194+ } ,
178195 }
179196 } ;
180197
@@ -193,42 +210,10 @@ impl<G: GlobalEventHandler> Builder<G> {
193210 self . fps ,
194211 self . global_event_handler ,
195212 self . function_table ,
213+ self . hot_reload ,
196214 ) ;
197215
198- // NOTE:
199- // this enables hot reload,
200- // however with this enabled the `with_frame` function
201- // on the runtime will repeat
202- loop {
203- match f ( & mut inst, backend) {
204- Ok ( ( ) ) => ( ) ,
205- e => match e {
206- Ok ( _) => continue ,
207- Err ( Error :: Stop ) => break Ok ( ( ) ) ,
208- Err ( Error :: Template ( error) ) => match show_error ( error, backend, & mut inst. document ) {
209- Ok ( _) => continue ,
210- Err ( err) => panic ! ( "error console failed: {err}" ) ,
211- } ,
212- Err ( Error :: Widget ( err) ) => panic ! ( "this should not panic in the future: {err}" ) ,
213- Err ( e) => break Err ( e) ,
214- } ,
215- }
216-
217- if !self . hot_reload {
218- break Ok ( ( ) ) ;
219- }
220-
221- match inst. reload ( ) {
222- Ok ( ( ) ) => continue ,
223- Err ( Error :: Stop ) => todo ! ( ) ,
224- Err ( Error :: Template ( error) ) => match show_error ( error, backend, & mut inst. document ) {
225- Ok ( _) => continue ,
226- Err ( err) => panic ! ( "error console failed: {err}" ) ,
227- } ,
228- Err ( Error :: Widget ( _error) ) => todo ! ( ) ,
229- Err ( e) => break Err ( e) ,
230- }
231- }
216+ f ( & mut inst, backend)
232217 }
233218
234219 fn set_watcher ( & mut self , hot_reload : bool ) -> Result < Option < RecommendedWatcher > > {
0 commit comments