15
15
#include < gtkmm/cssprovider.h>
16
16
#include < gtkmm/entry.h>
17
17
#include < gtkmm/filechooserdialog.h>
18
+ #define HAVE_GTK_FILECHOOSERNATIVE
19
+ #if defined(HAVE_GTK_FILECHOOSERNATIVE)
20
+ # include < gtkmm/filechoosernative.h>
21
+ #endif
18
22
#include < gtkmm/fixed.h>
19
23
#include < gtkmm/glarea.h>
20
24
#include < gtkmm/main.h>
@@ -1187,32 +1191,27 @@ MessageDialogRef CreateMessageDialog(WindowRef parentWindow) {
1187
1191
// File dialogs
1188
1192
// -----------------------------------------------------------------------------
1189
1193
1190
- class FileDialogImplGtk final : public FileDialog {
1194
+ class FileDialogImplGtk : public FileDialog {
1191
1195
public:
1192
- Gtk::FileChooserDialog gtkDialog ;
1196
+ Gtk::FileChooser *gtkChooser ;
1193
1197
std::vector<std::string> extensions;
1194
1198
1195
- FileDialogImplGtk (Gtk::FileChooserDialog &&dialog)
1196
- : gtkDialog(std::move(dialog))
1197
- {
1198
- gtkDialog.property_filter ().signal_changed ().
1199
+ void InitFileChooser (Gtk::FileChooser &chooser) {
1200
+ gtkChooser = &chooser;
1201
+ gtkChooser->property_filter ().signal_changed ().
1199
1202
connect (sigc::mem_fun (this , &FileDialogImplGtk::FilterChanged));
1200
1203
}
1201
1204
1202
- void SetTitle (std::string title) override {
1203
- gtkDialog.set_title (PrepareTitle (title));
1204
- }
1205
-
1206
1205
void SetCurrentName (std::string name) override {
1207
- gtkDialog. set_current_name (name);
1206
+ gtkChooser-> set_current_name (name);
1208
1207
}
1209
1208
1210
1209
Platform::Path GetFilename () override {
1211
- return Path::From (gtkDialog. get_filename ());
1210
+ return Path::From (gtkChooser-> get_filename ());
1212
1211
}
1213
1212
1214
1213
void SetFilename (Platform::Path path) override {
1215
- gtkDialog. set_filename (path.raw );
1214
+ gtkChooser-> set_filename (path.raw );
1216
1215
}
1217
1216
1218
1217
void AddFilter (std::string name, std::vector<std::string> extensions) override {
@@ -1233,13 +1232,13 @@ class FileDialogImplGtk final : public FileDialog {
1233
1232
gtkFilter->set_name (name + " (" + desc + " )" );
1234
1233
1235
1234
this ->extensions .push_back (extensions.front ());
1236
- gtkDialog. add_filter (gtkFilter);
1235
+ gtkChooser-> add_filter (gtkFilter);
1237
1236
}
1238
1237
1239
1238
std::string GetExtension () {
1240
- auto filters = gtkDialog. list_filters ();
1239
+ auto filters = gtkChooser-> list_filters ();
1241
1240
size_t filterIndex =
1242
- std::find (filters.begin (), filters.end (), gtkDialog. get_filter ()) -
1241
+ std::find (filters.begin (), filters.end (), gtkChooser-> get_filter ()) -
1243
1242
filters.begin ();
1244
1243
if (filterIndex < extensions.size ()) {
1245
1244
return extensions[filterIndex];
@@ -1249,14 +1248,14 @@ class FileDialogImplGtk final : public FileDialog {
1249
1248
}
1250
1249
1251
1250
void SetExtension (std::string extension) {
1252
- auto filters = gtkDialog. list_filters ();
1251
+ auto filters = gtkChooser-> list_filters ();
1253
1252
size_t extensionIndex =
1254
1253
std::find (extensions.begin (), extensions.end (), extension) -
1255
1254
extensions.begin ();
1256
1255
if (extensionIndex < filters.size ()) {
1257
- gtkDialog. set_filter (filters[extensionIndex]);
1256
+ gtkChooser-> set_filter (filters[extensionIndex]);
1258
1257
} else {
1259
- gtkDialog. set_filter (filters.front ());
1258
+ gtkChooser-> set_filter (filters.front ());
1260
1259
}
1261
1260
}
1262
1261
@@ -1270,21 +1269,46 @@ class FileDialogImplGtk final : public FileDialog {
1270
1269
1271
1270
void FreezeChoices (SettingsRef settings, const std::string &key) override {
1272
1271
settings->FreezeString (" Dialog_" + key + " _Folder" ,
1273
- gtkDialog. get_current_folder ());
1272
+ gtkChooser-> get_current_folder ());
1274
1273
settings->FreezeString (" Dialog_" + key + " _Filter" , GetExtension ());
1275
1274
}
1276
1275
1277
1276
void ThawChoices (SettingsRef settings, const std::string &key) override {
1278
- gtkDialog. set_current_folder (settings->ThawString (" Dialog_" + key + " _Folder" ));
1277
+ gtkChooser-> set_current_folder (settings->ThawString (" Dialog_" + key + " _Folder" ));
1279
1278
SetExtension (settings->ThawString (" Dialog_" + key + " _Filter" ));
1280
1279
}
1281
1280
1282
- bool RunModal () override {
1283
- if (gtkDialog. get_action () == Gtk::FILE_CHOOSER_ACTION_SAVE &&
1284
- Path::From (gtkDialog. get_current_name ()).FileStem ().empty ()) {
1285
- gtkDialog. set_current_name (std::string (_ (" untitled" )) + " ." + GetExtension ());
1281
+ void CheckForUntitledFile () {
1282
+ if (gtkChooser-> get_action () == Gtk::FILE_CHOOSER_ACTION_SAVE &&
1283
+ Path::From (gtkChooser-> get_current_name ()).FileStem ().empty ()) {
1284
+ gtkChooser-> set_current_name (std::string (_ (" untitled" )) + " ." + GetExtension ());
1286
1285
}
1286
+ }
1287
+ };
1287
1288
1289
+ class FileDialogGtkImplGtk final : public FileDialogImplGtk {
1290
+ public:
1291
+ Gtk::FileChooserDialog gtkDialog;
1292
+
1293
+ FileDialogGtkImplGtk (Gtk::Window >kParent, bool isSave)
1294
+ : gtkDialog(gtkParent,
1295
+ isSave ? C_(" title" , " Save File" )
1296
+ : C_(" title" , " Open File" ),
1297
+ isSave ? Gtk::FILE_CHOOSER_ACTION_SAVE
1298
+ : Gtk::FILE_CHOOSER_ACTION_OPEN) {
1299
+ gtkDialog.add_button (C_ (" button" , " _Cancel" ), Gtk::RESPONSE_CANCEL);
1300
+ gtkDialog.add_button (isSave ? C_ (" button" , " _Save" )
1301
+ : C_ (" button" , " _Open" ), Gtk::RESPONSE_OK);
1302
+ gtkDialog.set_default_response (Gtk::RESPONSE_OK);
1303
+ InitFileChooser (gtkDialog);
1304
+ }
1305
+
1306
+ void SetTitle (std::string title) override {
1307
+ gtkDialog.set_title (PrepareTitle (title));
1308
+ }
1309
+
1310
+ bool RunModal () override {
1311
+ CheckForUntitledFile ();
1288
1312
if (gtkDialog.run () == Gtk::RESPONSE_OK) {
1289
1313
return true ;
1290
1314
} else {
@@ -1293,26 +1317,56 @@ class FileDialogImplGtk final : public FileDialog {
1293
1317
}
1294
1318
};
1295
1319
1320
+ #if defined(HAVE_GTK_FILECHOOSERNATIVE)
1321
+
1322
+ class FileDialogNativeImplGtk final : public FileDialogImplGtk {
1323
+ public:
1324
+ Glib::RefPtr<Gtk::FileChooserNative> gtkNative;
1325
+
1326
+ FileDialogNativeImplGtk (Gtk::Window >kParent, bool isSave) {
1327
+ gtkNative = Gtk::FileChooserNative::create (
1328
+ isSave ? C_ (" title" , " Save File" )
1329
+ : C_ (" title" , " Open File" ),
1330
+ gtkParent,
1331
+ isSave ? Gtk::FILE_CHOOSER_ACTION_SAVE
1332
+ : Gtk::FILE_CHOOSER_ACTION_OPEN,
1333
+ isSave ? C_ (" button" , " _Save" )
1334
+ : C_ (" button" , " _Open" ),
1335
+ C_ (" button" , " _Cancel" ));
1336
+ // Seriously, GTK?!
1337
+ InitFileChooser (*gtkNative.operator ->());
1338
+ }
1339
+
1340
+ void SetTitle (std::string title) override {
1341
+ gtkNative->set_title (PrepareTitle (title));
1342
+ }
1343
+
1344
+ bool RunModal () override {
1345
+ CheckForUntitledFile ();
1346
+ if (gtkNative->run () == Gtk::RESPONSE_OK) {
1347
+ return true ;
1348
+ } else {
1349
+ return false ;
1350
+ }
1351
+ }
1352
+ };
1353
+
1354
+ #endif
1355
+
1356
+ #if defined(HAVE_GTK_FILECHOOSERNATIVE)
1357
+ # define FILE_DIALOG_IMPL FileDialogNativeImplGtk
1358
+ #else
1359
+ # define FILE_DIALOG_IMPL FileDialogGtkImplGtk
1360
+ #endif
1361
+
1296
1362
FileDialogRef CreateOpenFileDialog (WindowRef parentWindow) {
1297
1363
Gtk::Window >kParent = std::static_pointer_cast<WindowImplGtk>(parentWindow)->gtkWindow ;
1298
- Gtk::FileChooserDialog gtkDialog (gtkParent, C_ (" title" , " Open File" ),
1299
- Gtk::FILE_CHOOSER_ACTION_OPEN);
1300
- gtkDialog.add_button (C_ (" button" , " _Cancel" ), Gtk::RESPONSE_CANCEL);
1301
- gtkDialog.add_button (C_ (" button" , " _Open" ), Gtk::RESPONSE_OK);
1302
- gtkDialog.set_default_response (Gtk::RESPONSE_OK);
1303
- return std::make_shared<FileDialogImplGtk>(std::move (gtkDialog));
1304
-
1364
+ return std::make_shared<FILE_DIALOG_IMPL>(gtkParent, /* isSave=*/ false );
1305
1365
}
1306
1366
1307
1367
FileDialogRef CreateSaveFileDialog (WindowRef parentWindow) {
1308
1368
Gtk::Window >kParent = std::static_pointer_cast<WindowImplGtk>(parentWindow)->gtkWindow ;
1309
- Gtk::FileChooserDialog gtkDialog (gtkParent, C_ (" title" , " Save File" ),
1310
- Gtk::FILE_CHOOSER_ACTION_SAVE);
1311
- gtkDialog.set_do_overwrite_confirmation (true );
1312
- gtkDialog.add_button (C_ (" button" , " _Cancel" ), Gtk::RESPONSE_CANCEL);
1313
- gtkDialog.add_button (C_ (" button" , " _Save" ), Gtk::RESPONSE_OK);
1314
- gtkDialog.set_default_response (Gtk::RESPONSE_OK);
1315
- return std::make_shared<FileDialogImplGtk>(std::move (gtkDialog));
1369
+ return std::make_shared<FILE_DIALOG_IMPL>(gtkParent, /* isSave=*/ true );
1316
1370
}
1317
1371
1318
1372
// -----------------------------------------------------------------------------
0 commit comments