@@ -23,15 +23,15 @@ use forms::*;
2323use state:: * ;
2424use ui:: * ;
2525use util:: * ;
26- use yewdux:: prelude:: { use_store, Dispatch } ;
26+ use yewdux:: { prelude:: use_store, use_dispatch , YewduxRoot } ;
2727use zip:: { write:: FileOptions , CompressionMethod , ZipWriter } ;
2828
2929#[ function_component]
3030fn App ( _props : & ( ) ) -> Html {
3131 let generating = use_state_eq ( || false ) ;
3232 let generating_setter = generating. setter ( ) ;
3333
34- let form_dispatch = Dispatch :: < FormState > :: new ( ) ;
34+ let form_dispatch = use_dispatch :: < FormState > ( ) ;
3535 let ( app_store, app_dispatch) = use_store :: < AppState > ( ) ;
3636
3737 // TODO: come up with a less awkward way to do this.
@@ -54,7 +54,7 @@ fn App(_props: &()) -> Html {
5454 let opts = FileOptions :: default ( ) . compression_method ( CompressionMethod :: Stored ) ;
5555
5656 if app_store. svgs . len ( ) > 1 {
57- zip. add_directory ( "svg2gcode_output" , opts. clone ( ) ) . unwrap ( ) ;
57+ zip. add_directory ( "svg2gcode_output" , opts) . unwrap ( ) ;
5858 }
5959
6060 for svg in app_store. svgs . iter ( ) {
@@ -109,36 +109,39 @@ fn App(_props: &()) -> Html {
109109 Path :: new ( svg. filename . as_str ( ) ) . with_extension ( "gcode" )
110110 } ;
111111
112- if app_store. svgs . len ( ) > 1 {
113- zip. start_file ( filepath. to_string_lossy ( ) , opts. clone ( ) )
114- . unwrap ( ) ;
112+ match app_store. svgs . len ( ) {
113+ 0 => unreachable ! ( ) ,
114+ 1 => {
115+ let gcode = {
116+ let mut acc = String :: new ( ) ;
117+ format_gcode_fmt (
118+ & program,
119+ FormatOptions {
120+ checksums : app_store. settings . postprocess . checksums ,
121+ line_numbers : app_store. settings . postprocess . line_numbers ,
122+ ..Default :: default ( )
123+ } ,
124+ & mut acc,
125+ )
126+ . unwrap ( ) ;
127+ acc
128+ } ;
129+ prompt_download ( filepath, gcode. as_bytes ( ) ) ;
130+ }
131+ _multiple => {
132+ zip. start_file ( filepath. to_string_lossy ( ) , opts) . unwrap ( ) ;
115133
116- format_gcode_io (
117- & program,
118- FormatOptions {
119- checksums : app_store. settings . postprocess . checksums ,
120- line_numbers : app_store. settings . postprocess . line_numbers ,
121- ..Default :: default ( )
122- } ,
123- & mut zip,
124- )
125- . unwrap ( ) ;
126- } else if app_store. svgs . len ( ) == 1 {
127- let gcode = {
128- let mut acc = String :: new ( ) ;
129- format_gcode_fmt (
134+ format_gcode_io (
130135 & program,
131136 FormatOptions {
132137 checksums : app_store. settings . postprocess . checksums ,
133138 line_numbers : app_store. settings . postprocess . line_numbers ,
134139 ..Default :: default ( )
135140 } ,
136- & mut acc ,
141+ & mut zip ,
137142 )
138143 . unwrap ( ) ;
139- acc
140- } ;
141- prompt_download ( filepath, gcode. as_bytes ( ) ) ;
144+ }
142145 }
143146 }
144147
@@ -160,81 +163,83 @@ fn App(_props: &()) -> Html {
160163 } ;
161164
162165 html ! {
163- <div class="container" >
164- <div class={ classes!( "column" ) } >
165- <h1>
166- { "svg2gcode" }
167- </h1>
168- <p>
169- { env!( "CARGO_PKG_DESCRIPTION" ) }
170- </p>
171- <SvgForm />
172- <ButtonGroup >
173- <Button
174- title="Generate G-Code"
175- style={ ButtonStyle :: Primary }
176- loading={ * generating}
177- icon={
178- html_nested! (
179- <Icon name={ IconName :: Download } />
180- )
181- }
182- disabled={ generate_disabled}
183- onclick={ generate_onclick}
184- />
185- <HyperlinkButton
186- title="Settings"
187- style={ ButtonStyle :: Default }
188- icon={ IconName :: Edit }
189- href="#settings"
190- />
191- </ButtonGroup >
192- <div class={ classes!( "card-container" , "columns" ) } >
193- {
194- for app_store. svgs. iter( ) . enumerate( ) . map( |( i, svg) | {
195- let svg_base64 = base64:: engine:: general_purpose:: STANDARD_NO_PAD . encode( svg. content. as_bytes( ) ) ;
196- let remove_svg_onclick = app_dispatch. reduce_mut_callback( move |app| {
197- app. svgs. remove( i) ;
198- } ) ;
199- let footer = html!{
200- <Button
201- title="Remove"
202- style={ ButtonStyle :: Primary }
203- icon={
204- html_nested!(
205- <Icon name={ IconName :: Delete } />
206- )
207- }
208- onclick={ remove_svg_onclick}
209- />
210- } ;
211- html!{
212- <div class={ classes!( "column" , "col-6" , "col-xs-12" ) } >
213- <Card
214- title={ svg. filename. clone( ) }
215- img={ html_nested!(
216- <img class="img-responsive" src={ format!( "data:image/svg+xml;base64,{}" , svg_base64) } alt={ svg. filename. clone( ) } />
217- ) }
218- footer={ footer}
219- />
220- </div>
166+ <YewduxRoot >
167+ <div class="container" >
168+ <div class={ classes!( "column" ) } >
169+ <h1>
170+ { "svg2gcode" }
171+ </h1>
172+ <p>
173+ { env!( "CARGO_PKG_DESCRIPTION" ) }
174+ </p>
175+ <SvgForm />
176+ <ButtonGroup >
177+ <Button
178+ title="Generate G-Code"
179+ style={ ButtonStyle :: Primary }
180+ loading={ * generating}
181+ icon={
182+ html_nested! (
183+ <Icon name={ IconName :: Download } />
184+ )
221185 }
222- } )
223- }
186+ disabled={ generate_disabled}
187+ onclick={ generate_onclick}
188+ />
189+ <HyperlinkButton
190+ title="Settings"
191+ style={ ButtonStyle :: Default }
192+ icon={ IconName :: Edit }
193+ href="#settings"
194+ />
195+ </ButtonGroup >
196+ <div class={ classes!( "card-container" , "columns" ) } >
197+ {
198+ for app_store. svgs. iter( ) . enumerate( ) . map( |( i, svg) | {
199+ let svg_base64 = base64:: engine:: general_purpose:: STANDARD_NO_PAD . encode( svg. content. as_bytes( ) ) ;
200+ let remove_svg_onclick = app_dispatch. reduce_mut_callback( move |app| {
201+ app. svgs. remove( i) ;
202+ } ) ;
203+ let footer = html!{
204+ <Button
205+ title="Remove"
206+ style={ ButtonStyle :: Primary }
207+ icon={
208+ html_nested!(
209+ <Icon name={ IconName :: Delete } />
210+ )
211+ }
212+ onclick={ remove_svg_onclick}
213+ />
214+ } ;
215+ html!{
216+ <div class={ classes!( "column" , "col-6" , "col-xs-12" ) } >
217+ <Card
218+ title={ svg. filename. clone( ) }
219+ img={ html_nested!(
220+ <img class="img-responsive" src={ format!( "data:image/svg+xml;base64,{}" , svg_base64) } alt={ svg. filename. clone( ) } />
221+ ) }
222+ footer={ footer}
223+ />
224+ </div>
225+ }
226+ } )
227+ }
228+ </div>
229+ <SettingsForm />
230+ <ImportExportModal />
231+ </div>
232+ <div class={ classes!( "text-right" , "column" ) } >
233+ <p>
234+ { "See the project " }
235+ <a href={ env!( "CARGO_PKG_REPOSITORY" ) } >
236+ { "on GitHub" }
237+ </a>
238+ { " for support" }
239+ </p>
224240 </div>
225- <SettingsForm />
226- <ImportExportModal />
227- </div>
228- <div class={ classes!( "text-right" , "column" ) } >
229- <p>
230- { "See the project " }
231- <a href={ env!( "CARGO_PKG_REPOSITORY" ) } >
232- { "on GitHub" }
233- </a>
234- { " for support" }
235- </p>
236241 </div>
237- </div >
242+ </YewduxRoot >
238243 }
239244}
240245
0 commit comments