mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-25 12:02:44 +00:00
Move "do you want to overwrite this file?" question inside the FileSelector
Native file dialogs ask this same question too (also they check for read-only attribute).
This commit is contained in:
parent
71efdfdf76
commit
2a5c93e333
@ -388,21 +388,13 @@ private:
|
||||
}
|
||||
|
||||
void onExport() {
|
||||
again:
|
||||
std::string filename = app::show_file_selector("Export Keyboard Shortcuts", "",
|
||||
std::string filename = app::show_file_selector(
|
||||
"Export Keyboard Shortcuts", "",
|
||||
KEYBOARD_FILENAME_EXTENSION, FileSelectorType::Save);
|
||||
if (!filename.empty()) {
|
||||
if (base::is_file(filename)) {
|
||||
int ret = Alert::show("Warning<<File exists, overwrite it?<<%s||&Yes||&No||&Cancel",
|
||||
base::get_file_name(filename).c_str());
|
||||
if (ret == 2)
|
||||
goto again;
|
||||
else if (ret != 1)
|
||||
return;
|
||||
}
|
||||
if (filename.empty())
|
||||
return;
|
||||
|
||||
app::KeyboardShortcuts::instance()->exportFile(filename.c_str());
|
||||
}
|
||||
app::KeyboardShortcuts::instance()->exportFile(filename.c_str());
|
||||
}
|
||||
|
||||
void onReset() {
|
||||
|
@ -134,45 +134,15 @@ void SaveFileBaseCommand::saveAsDialog(const ContextReader& reader, const char*
|
||||
filename = m_filename;
|
||||
}
|
||||
else {
|
||||
std::string exts = get_writable_extensions();
|
||||
filename = document->filename();
|
||||
|
||||
std::string exts = get_writable_extensions();
|
||||
std::string newfilename = app::show_file_selector(
|
||||
dlgTitle, filename, exts, FileSelectorType::Save);
|
||||
if (newfilename.empty())
|
||||
return;
|
||||
|
||||
for (;;) {
|
||||
std::string newfilename = app::show_file_selector(
|
||||
dlgTitle, filename, exts, FileSelectorType::Save);
|
||||
if (newfilename.empty())
|
||||
return;
|
||||
|
||||
filename = newfilename;
|
||||
|
||||
// Ask if the user wants overwrite the existent file.
|
||||
int ret = 0;
|
||||
if (base::is_file(filename)) {
|
||||
ret = ui::Alert::show("Warning<<The file already exists, overwrite it?<<%s||&Yes||&No||&Cancel",
|
||||
base::get_file_name(filename).c_str());
|
||||
|
||||
// Check for read-only attribute.
|
||||
if (ret == 1) {
|
||||
if (!confirmReadonly(filename))
|
||||
ret = 2; // Select file again.
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
// "yes": we must continue with the operation...
|
||||
if (ret == 1) {
|
||||
break;
|
||||
}
|
||||
// "cancel" or <esc> per example: we back doing nothing
|
||||
else if (ret != 2)
|
||||
return;
|
||||
|
||||
// "no": we must back to select other file-name
|
||||
}
|
||||
filename = newfilename;
|
||||
}
|
||||
|
||||
std::string oldFilename;
|
||||
@ -202,23 +172,6 @@ void SaveFileBaseCommand::saveAsDialog(const ContextReader& reader, const char*
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
bool SaveFileBaseCommand::confirmReadonly(const std::string& filename)
|
||||
{
|
||||
if (!base::has_readonly_attr(filename))
|
||||
return true;
|
||||
|
||||
int ret = ui::Alert::show("Warning<<The file is read-only, do you really want to overwrite it?<<%s||&Yes||&No",
|
||||
base::get_file_name(filename).c_str());
|
||||
|
||||
if (ret == 1) {
|
||||
base::remove_readonly_attr(filename);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
class SaveFileCommand : public SaveFileBaseCommand {
|
||||
@ -248,9 +201,6 @@ void SaveFileCommand::onExecute(Context* context)
|
||||
ContextWriter writer(reader);
|
||||
Document* documentWriter = writer.document();
|
||||
|
||||
if (!confirmReadonly(documentWriter->filename()))
|
||||
return;
|
||||
|
||||
save_document_in_background(context, documentWriter, true,
|
||||
m_filenameFormat.c_str());
|
||||
}
|
||||
|
@ -30,8 +30,6 @@ namespace app {
|
||||
|
||||
void saveAsDialog(const ContextReader& reader, const char* dlgTitle, bool markAsSaved);
|
||||
|
||||
static bool confirmReadonly(const std::string& filename);
|
||||
|
||||
std::string m_filename;
|
||||
std::string m_filenameFormat;
|
||||
std::string m_selectedFilename;
|
||||
|
@ -48,32 +48,11 @@ void SaveMaskCommand::onExecute(Context* context)
|
||||
const ContextReader reader(context);
|
||||
const Document* document(reader.document());
|
||||
std::string filename = "default.msk";
|
||||
int ret;
|
||||
|
||||
for (;;) {
|
||||
filename = app::show_file_selector(
|
||||
"Save .msk File", filename, "msk", FileSelectorType::Save);
|
||||
if (filename.empty())
|
||||
return;
|
||||
|
||||
// Does the file exist?
|
||||
if (base::is_file(filename.c_str())) {
|
||||
/* ask if the user wants overwrite the file? */
|
||||
ret = ui::Alert::show("Warning<<File exists, overwrite it?<<%s||&Yes||&No||&Cancel",
|
||||
base::get_file_name(filename).c_str());
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
/* "yes": we must continue with the operation... */
|
||||
if (ret == 1)
|
||||
break;
|
||||
/* "cancel" or <esc> per example: we back doing nothing */
|
||||
else if (ret != 2)
|
||||
return;
|
||||
|
||||
/* "no": we must back to select other file-name */
|
||||
}
|
||||
filename = app::show_file_selector(
|
||||
"Save .msk File", filename, "msk", FileSelectorType::Save);
|
||||
if (filename.empty())
|
||||
return;
|
||||
|
||||
if (save_msk_file(document->mask(), filename.c_str()) != 0)
|
||||
ui::Alert::show("Error<<Error saving .msk file<<%s||&Close", filename.c_str());
|
||||
|
@ -60,23 +60,10 @@ void SavePaletteCommand::onExecute(Context* context)
|
||||
}
|
||||
else {
|
||||
std::string exts = get_writable_palette_extensions();
|
||||
int ret;
|
||||
|
||||
again:
|
||||
filename = app::show_file_selector("Save Palette", "", exts,
|
||||
FileSelectorType::Save);
|
||||
if (filename.empty())
|
||||
return;
|
||||
|
||||
if (base::is_file(filename)) {
|
||||
ret = Alert::show("Warning<<File exists, overwrite it?<<%s||&Yes||&No||&Cancel",
|
||||
base::get_file_name(filename).c_str());
|
||||
|
||||
if (ret == 2)
|
||||
goto again;
|
||||
else if (ret != 1)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!save_palette(filename.c_str(), palette))
|
||||
|
@ -64,7 +64,10 @@ std::string show_file_selector(const std::string& title,
|
||||
}
|
||||
|
||||
FileSelector fileSelector;
|
||||
return fileSelector.show(title, initialPath, showExtensions);
|
||||
return fileSelector.show(
|
||||
title, initialPath, showExtensions,
|
||||
(type == FileSelectorType::Open ? FileSelector::Open:
|
||||
FileSelector::Save));
|
||||
}
|
||||
|
||||
} // namespace app
|
||||
|
@ -328,9 +328,11 @@ void FileSelector::goInsideFolder()
|
||||
}
|
||||
}
|
||||
|
||||
std::string FileSelector::show(const std::string& title,
|
||||
std::string FileSelector::show(
|
||||
const std::string& title,
|
||||
const std::string& initialPath,
|
||||
const std::string& showExtensions)
|
||||
const std::string& showExtensions,
|
||||
Type type)
|
||||
{
|
||||
std::string result;
|
||||
|
||||
@ -515,6 +517,29 @@ again:
|
||||
buf += m_fileType->getItemText(m_fileType->getSelectedItemIndex());
|
||||
}
|
||||
|
||||
if (type == Save && base::is_file(buf)) {
|
||||
int ret = Alert::show("Warning<<File exists, overwrite it?<<%s||&Yes||&No||&Cancel",
|
||||
base::get_file_name(buf).c_str());
|
||||
if (ret == 2) {
|
||||
setVisible(true);
|
||||
goto again;
|
||||
}
|
||||
else if (ret == 1) {
|
||||
// Check for read-only attribute
|
||||
if (base::has_readonly_attr(buf)) {
|
||||
ui::Alert::show(
|
||||
"Problem<<The selected file is read-only. Try with other file.||&Go back");
|
||||
|
||||
setVisible(true);
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
// Cancel
|
||||
else if (ret != 1) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// duplicate the buffer to return a new string
|
||||
result = buf;
|
||||
|
||||
|
@ -27,6 +27,8 @@ namespace app {
|
||||
|
||||
class FileSelector : public ui::Window {
|
||||
public:
|
||||
enum Type { Open, Save };
|
||||
|
||||
FileSelector();
|
||||
|
||||
void goBack();
|
||||
@ -36,8 +38,9 @@ namespace app {
|
||||
|
||||
// Shows the dialog to select a file in the program.
|
||||
std::string show(const std::string& title,
|
||||
const std::string& initialPath,
|
||||
const std::string& showExtensions);
|
||||
const std::string& initialPath,
|
||||
const std::string& showExtensions,
|
||||
Type type);
|
||||
|
||||
private:
|
||||
void updateLocation();
|
||||
|
@ -93,10 +93,8 @@ public:
|
||||
|
||||
if (!m_save)
|
||||
ofn.Flags |= OFN_FILEMUSTEXIST;
|
||||
#if 0 // This is asked in custom UI
|
||||
else
|
||||
ofn.Flags |= OFN_OVERWRITEPROMPT;
|
||||
#endif
|
||||
|
||||
BOOL res;
|
||||
if (m_save)
|
||||
|
Loading…
x
Reference in New Issue
Block a user