@@ -25,7 +25,10 @@ enum PopupType {
25
25
None ,
26
26
DeleteInstallation ( String ) ,
27
27
EditVersion ( String ) ,
28
- Version ( Version ) ,
28
+ AddVersion {
29
+ version_selection : Version ,
30
+ session_version_selection : Option < String > ,
31
+ } ,
29
32
}
30
33
31
34
#[ derive( Clone , PartialEq , Eq ) ]
@@ -67,47 +70,56 @@ impl Launcher {
67
70
}
68
71
}
69
72
70
- fn version_popup ( & self , ctx : & Context , mut version : Version ) -> PopupType {
73
+ fn version_popup (
74
+ & self ,
75
+ ctx : & Context ,
76
+ mut version : Version ,
77
+ mut session_version : Option < String > ,
78
+ ) -> PopupType {
71
79
let response = alvr_gui_common:: modal (
72
80
ctx,
73
81
"Add version" ,
74
82
{
75
83
// Safety: unwrap is safe because the "Add release" button is available after populating the release_channels_info.
76
84
let release_channels_info = self . release_channels_info . as_ref ( ) . unwrap ( ) ;
77
85
Some ( |ui : & mut Ui | {
78
- let ( channel , version_str, versions ) : ( & str , String , Vec < Version > ) =
79
- match & version. release_channel {
80
- ReleaseChannelType :: Stable => (
81
- "Stable" ,
82
- version . string . clone ( ) ,
83
- release_channels_info
84
- . stable
85
- . iter ( )
86
- . map ( |release| Version {
87
- string : release . version . clone ( ) ,
88
- release_channel : ReleaseChannelType :: Stable ,
89
- } )
90
- . collect ( ) ,
91
- ) ,
92
- ReleaseChannelType :: Nightly => (
93
- "Nightly" ,
94
- version . string . clone ( ) ,
95
- release_channels_info
96
- . nightly
97
- . iter ( )
98
- . map ( |release| Version {
99
- string : release . version . clone ( ) ,
100
- release_channel : ReleaseChannelType :: Nightly ,
101
- } )
102
- . collect ( ) ,
103
- ) ,
104
- } ;
86
+ let version_str = version . string . clone ( ) ;
87
+ let versions : Vec < _ > = match & version. release_channel {
88
+ ReleaseChannelType :: Stable => release_channels_info
89
+ . stable
90
+ . iter ( )
91
+ . map ( |release| Version {
92
+ string : release . version . clone ( ) ,
93
+ release_channel : ReleaseChannelType :: Stable ,
94
+ } )
95
+ . collect ( ) ,
96
+
97
+ ReleaseChannelType :: Nightly => release_channels_info
98
+ . nightly
99
+ . iter ( )
100
+ . map ( |release| Version {
101
+ string : release . version . clone ( ) ,
102
+ release_channel : ReleaseChannelType :: Nightly ,
103
+ } )
104
+ . collect ( ) ,
105
+ } ;
106
+ let installations_with_session : Vec < _ > = self
107
+ . installations
108
+ . iter ( )
109
+ . filter ( |installation| installation . has_session_json )
110
+ . map ( |installation| installation . version . clone ( ) )
111
+ . collect ( ) ;
112
+
105
113
Grid :: new ( "add-version-grid" ) . num_columns ( 2 ) . show ( ui, |ui| {
106
114
ui. label ( "Channel" ) ;
107
-
108
115
ui. with_layout ( Layout :: right_to_left ( Align :: Min ) , |ui| {
116
+ let channel_str = match version. release_channel {
117
+ ReleaseChannelType :: Stable => "Stable" ,
118
+ ReleaseChannelType :: Nightly => "Nightly" ,
119
+ } ;
120
+
109
121
ComboBox :: from_id_salt ( "channel" )
110
- . selected_text ( channel )
122
+ . selected_text ( channel_str )
111
123
. show_ui ( ui, |ui| {
112
124
ui. selectable_value (
113
125
& mut version,
@@ -142,6 +154,25 @@ impl Launcher {
142
154
} )
143
155
} ) ;
144
156
ui. end_row ( ) ;
157
+
158
+ if cfg ! ( windows) {
159
+ ui. label ( "Copy session from:" ) ;
160
+ ui. with_layout ( Layout :: right_to_left ( Align :: Min ) , |ui| {
161
+ ComboBox :: from_id_salt ( "session" )
162
+ . selected_text ( session_version. clone ( ) . unwrap_or ( "None" . into ( ) ) )
163
+ . show_ui ( ui, |ui| {
164
+ ui. selectable_value ( & mut session_version, None , "None" ) ;
165
+ for ver_str in installations_with_session {
166
+ ui. selectable_value (
167
+ & mut session_version,
168
+ Some ( ver_str. clone ( ) ) ,
169
+ ver_str,
170
+ ) ;
171
+ }
172
+ } )
173
+ } ) ;
174
+ ui. end_row ( ) ;
175
+ }
145
176
} ) ;
146
177
} )
147
178
} ,
@@ -151,32 +182,40 @@ impl Launcher {
151
182
match response {
152
183
Some ( ModalButton :: Cancel ) => PopupType :: None ,
153
184
Some ( ModalButton :: Custom ( _) ) => {
185
+ let release_info = match & version. release_channel {
186
+ ReleaseChannelType :: Stable => self
187
+ . release_channels_info
188
+ . as_ref ( )
189
+ . unwrap ( )
190
+ . stable
191
+ . iter ( )
192
+ . find ( |release| release. version == version. string )
193
+ . unwrap ( )
194
+ . clone ( ) ,
195
+ ReleaseChannelType :: Nightly => self
196
+ . release_channels_info
197
+ . as_ref ( )
198
+ . unwrap ( )
199
+ . nightly
200
+ . iter ( )
201
+ . find ( |release| release. version == version. string )
202
+ . unwrap ( )
203
+ . clone ( ) ,
204
+ } ;
205
+
154
206
self . ui_message_sender
155
- . send ( UiMessage :: InstallServer ( match & version. release_channel {
156
- ReleaseChannelType :: Stable => self
157
- . release_channels_info
158
- . as_ref ( )
159
- . unwrap ( )
160
- . stable
161
- . iter ( )
162
- . find ( |release| release. version == version. string )
163
- . unwrap ( )
164
- . clone ( ) ,
165
- ReleaseChannelType :: Nightly => self
166
- . release_channels_info
167
- . as_ref ( )
168
- . unwrap ( )
169
- . nightly
170
- . iter ( )
171
- . find ( |release| release. version == version. string )
172
- . unwrap ( )
173
- . clone ( ) ,
174
- } ) )
207
+ . send ( UiMessage :: InstallServer {
208
+ release_info,
209
+ session_version,
210
+ } )
175
211
. ok ( ) ;
176
212
177
213
PopupType :: None
178
214
}
179
- _ => PopupType :: Version ( version) ,
215
+ _ => PopupType :: AddVersion {
216
+ version_selection : version,
217
+ session_version_selection : session_version,
218
+ } ,
180
219
}
181
220
}
182
221
@@ -343,16 +382,22 @@ impl eframe::App for Launcher {
343
382
)
344
383
. clicked ( )
345
384
{
346
- self . popup = PopupType :: Version ( Version {
347
- string : self . release_channels_info . as_ref ( ) . unwrap ( ) . stable [ 0 ]
348
- . version
349
- . clone ( ) ,
350
- release_channel : ReleaseChannelType :: Stable ,
351
- } ) ;
385
+ self . popup = PopupType :: AddVersion {
386
+ version_selection : Version {
387
+ string : self . release_channels_info . as_ref ( ) . unwrap ( ) . stable [ 0 ]
388
+ . version
389
+ . clone ( ) ,
390
+ release_channel : ReleaseChannelType :: Stable ,
391
+ } ,
392
+ session_version_selection : None ,
393
+ } ;
352
394
}
353
395
354
396
let popup = match mem:: take ( & mut self . popup ) {
355
- PopupType :: Version ( version) => self . version_popup ( ctx, version) ,
397
+ PopupType :: AddVersion {
398
+ version_selection,
399
+ session_version_selection,
400
+ } => self . version_popup ( ctx, version_selection, session_version_selection) ,
356
401
PopupType :: EditVersion ( version) => self . edit_popup ( ctx, version) ,
357
402
PopupType :: DeleteInstallation ( version) => self . delete_popup ( ctx, version) ,
358
403
PopupType :: None => PopupType :: None ,
0 commit comments