@@ -146,86 +146,75 @@ static void load_file_list(const std::string &directory) {
146
146
147
147
game_list.clear ();
148
148
149
- auto files = list_files (directory, [](auto &file) {
149
+ auto files = list_files (directory, [& ](auto &file) {
150
150
if (file.flags & FileFlags::directory)
151
151
return false ;
152
152
153
- if (file.name .length () < 6 ) // minimum length for single-letter game (a.blit)
154
- return false ;
155
-
156
153
if (file.name [0 ] == ' .' ) // hidden file
157
154
return false ;
158
155
159
- if (file. name . find_last_of ( ' . ' ) == std::string::npos) // no extension
160
- return false ;
156
+ auto path = directory == " / " ? file. name : directory + " / " + file. name ;
157
+ auto res = api. can_launch (path. c_str ()) ;
161
158
162
- return true ;
159
+ if (res == CanLaunchResult::UnknownType) {
160
+ // special case for images
161
+ auto last_dot = file.name .find_last_of (' .' );
162
+
163
+ auto ext = last_dot == std::string::npos ? " " : file.name .substr (last_dot + 1 );
164
+
165
+ for (auto &c : ext)
166
+ c = tolower (c);
167
+
168
+ if (ext == " bmp" || ext == " blim" )
169
+ return true ;
170
+ }
171
+
172
+ return res == CanLaunchResult::Success;
163
173
});
164
174
165
175
game_list.reserve (files.size ()); // worst case
166
176
167
177
for (auto &file : files) {
168
178
auto last_dot = file.name .find_last_of (' .' );
169
179
170
- auto ext = file.name .substr (last_dot + 1 );
180
+ auto ext = last_dot == std::string::npos ? " " : file.name .substr (last_dot + 1 );
171
181
172
182
for (auto &c : ext)
173
183
c = tolower (c);
174
184
185
+ GameInfo game;
186
+ game.title = file.name .substr (0 , file.name .length () - ext.length () - 1 );
187
+ game.filename = directory == " /" ? file.name : directory + " /" + file.name ;
188
+ game.size = file.size ;
189
+
175
190
if (ext == " blit" ) {
176
- GameInfo game;
177
191
game.type = GameType::game;
178
- game.title = file.name .substr (0 , file.name .length () - 5 );
179
- game.filename = directory == " /" ? file.name : directory + " /" + file.name ;
180
- game.size = file.size ;
181
192
182
193
// check for metadata
183
194
BlitGameMetadata meta;
184
- if (parse_file_metadata (game.filename , meta)) {
195
+ if (parse_file_metadata (game.filename , meta))
185
196
game.title = meta.title ;
186
- }
187
197
188
- game_list.push_back (game);
189
- continue ;
190
- }
191
-
192
- if (ext == " bmp" || ext == " blim" ) {
193
- GameInfo game;
198
+ } else if (ext == " bmp" || ext == " blim" ) {
194
199
game.type = GameType::screenshot;
195
- game.title = file.name .substr (0 , file.name .length () - ext.length () - 1 );
196
- game.filename = directory == " /" ? file.name : directory + " /" + file.name ;
197
- game.size = file.size ;
198
200
199
201
// Special case check for an installed handler for these types, ie: a sprite editor
200
202
game.can_launch = api.get_type_handler_metadata && api.get_type_handler_metadata (ext.c_str ());
201
- game_list.push_back (game);
202
- continue ;
203
- }
204
-
205
- if (!api.get_type_handler_metadata ) continue ;
206
-
207
- // check for installed handler
208
- auto handler_meta = api.get_type_handler_metadata (ext.c_str ());
209
-
210
- if (handler_meta) {
211
- GameInfo game;
203
+ } else {
204
+ // it's launch-able so there must be a handler
212
205
game.type = GameType::file;
213
- game.filename = directory == " /" ? file.name : directory + " /" + file.name ;
214
206
strncpy (game.ext , ext.c_str (), 5 );
215
207
game.ext [4 ] = 0 ;
216
- game.size = file.size ;
217
208
game.can_launch = true ;
218
209
219
210
// check for a metadata file (fall back to handler's metadata)
220
211
BlitGameMetadata meta;
221
212
auto meta_filename = game.filename + " .blmeta" ;
222
213
if (parse_file_metadata (meta_filename, meta))
223
214
game.title = meta.title ;
224
- else
225
- game.title = file.name ;
226
-
227
- game_list.push_back (game);
228
215
}
216
+
217
+ game_list.push_back (game);
229
218
}
230
219
231
220
int total_items = (int )game_list.size ();
0 commit comments