--Bug fixes:

-Fix path bugs when creating dialogs on Mac.
 -Add new setting for path when creating palette from image.
This commit is contained in:
Person 2017-04-04 16:21:58 -07:00
parent 2f54215e65
commit 2773ef27f7
9 changed files with 99 additions and 30 deletions

View File

@ -417,9 +417,6 @@
<CustomBuild Include="..\..\..\Source\Fractorium\GLWidget.h"> <CustomBuild Include="..\..\..\Source\Fractorium\GLWidget.h">
<Filter>MainWindows</Filter> <Filter>MainWindows</Filter>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\Fractorium.h">
<Filter>MainWindows</Filter>
</CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\EmberTreeWidgetItem.h"> <CustomBuild Include="..\..\..\Source\Fractorium\EmberTreeWidgetItem.h">
<Filter>Widgets</Filter> <Filter>Widgets</Filter>
</CustomBuild> </CustomBuild>
@ -477,6 +474,9 @@
<CustomBuild Include="..\..\..\Source\Fractorium\paletteeditor.ui"> <CustomBuild Include="..\..\..\Source\Fractorium\paletteeditor.ui">
<Filter>Form Files</Filter> <Filter>Form Files</Filter>
</CustomBuild> </CustomBuild>
<CustomBuild Include="..\..\..\Source\Fractorium\Fractorium.h">
<Filter>Header Files</Filter>
</CustomBuild>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico" /> <None Include="..\..\..\Source\Fractorium\Icons\Fractorium.ico" />

View File

@ -51,8 +51,6 @@ Fractorium::Fractorium(QWidget* p)
#endif #endif
m_Settings = FractoriumSettings::Instance(); m_Settings = FractoriumSettings::Instance();
m_QssDialog = new QssDialog(this); m_QssDialog = new QssDialog(this);
m_FileDialog = nullptr;//Use lazy instantiation upon first use.
m_FolderDialog = nullptr;
m_FinalRenderDialog = new FractoriumFinalRenderDialog(this); m_FinalRenderDialog = new FractoriumFinalRenderDialog(this);
m_OptionsDialog = new FractoriumOptionsDialog(this); m_OptionsDialog = new FractoriumOptionsDialog(this);
m_VarDialog = new FractoriumVariationsDialog(this); m_VarDialog = new FractoriumVariationsDialog(this);
@ -509,6 +507,8 @@ void Fractorium::SetFixedTableHeader(QHeaderView* header, QHeaderView::ResizeMod
/// <returns>The filename selected</returns> /// <returns>The filename selected</returns>
QStringList Fractorium::SetupOpenXmlDialog() QStringList Fractorium::SetupOpenXmlDialog()
{ {
#ifndef __APPLE__
//Lazy instantiate since it takes a long time. //Lazy instantiate since it takes a long time.
if (!m_FileDialog) if (!m_FileDialog)
{ {
@ -534,6 +534,15 @@ QStringList Fractorium::SetupOpenXmlDialog()
m_Settings->OpenFolder(QFileInfo(filenames[0]).canonicalPath()); m_Settings->OpenFolder(QFileInfo(filenames[0]).canonicalPath());
} }
#else
auto defaultFilter(m_Settings->OpenXmlExt());
auto filenames = QFileDialog::getOpenFileNames(this, tr("Open Flame"), m_Settings->OpenFolder(), tr("Flame Files (*.flam3 *.flame *.xml)"), &defaultFilter);
m_Settings->OpenXmlExt(defaultFilter);
if (!filenames.empty())
m_Settings->OpenFolder(QFileInfo(filenames[0]).canonicalPath());
#endif
return filenames; return filenames;
} }
@ -545,6 +554,8 @@ QStringList Fractorium::SetupOpenXmlDialog()
/// <returns>The filename selected</returns> /// <returns>The filename selected</returns>
QString Fractorium::SetupSaveXmlDialog(const QString& defaultFilename) QString Fractorium::SetupSaveXmlDialog(const QString& defaultFilename)
{ {
#ifndef __APPLE__
//Lazy instantiate since it takes a long time. //Lazy instantiate since it takes a long time.
//QS //QS
if (!m_FileDialog) if (!m_FileDialog)
@ -553,9 +564,6 @@ QString Fractorium::SetupSaveXmlDialog(const QString& defaultFilename)
m_FileDialog->setViewMode(QFileDialog::List); m_FileDialog->setViewMode(QFileDialog::List);
} }
if (!m_FileDialog)
return "";
QString filename; QString filename;
m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&)));
connect(m_FileDialog, &QFileDialog::filterSelected, [&](const QString & filter) { m_Settings->SaveXmlExt(filter); }); connect(m_FileDialog, &QFileDialog::filterSelected, [&](const QString & filter) { m_Settings->SaveXmlExt(filter); });
@ -583,6 +591,11 @@ QString Fractorium::SetupSaveXmlDialog(const QString& defaultFilename)
} }
} }
#else
auto defaultFilter(m_Settings->SaveXmlExt());
auto filename = QFileDialog::getSaveFileName(this, tr("Save flame as xml"), m_Settings->SaveFolder() + "/" + defaultFilename, tr("Flam3 (*.flam3);;Flame (*.flame);;Xml (*.xml)"), &defaultFilter);
m_Settings->SaveXmlExt(defaultFilter);
#endif
return filename; return filename;
} }
@ -594,6 +607,8 @@ QString Fractorium::SetupSaveXmlDialog(const QString& defaultFilename)
/// <returns>The filename selected</returns> /// <returns>The filename selected</returns>
QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename) QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename)
{ {
#ifndef __APPLE__
//Lazy instantiate since it takes a long time. //Lazy instantiate since it takes a long time.
if (!m_FileDialog) if (!m_FileDialog)
{ {
@ -601,9 +616,6 @@ QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename)
m_FileDialog->setViewMode(QFileDialog::List); m_FileDialog->setViewMode(QFileDialog::List);
} }
if (!m_FileDialog)
return "";
QString filename; QString filename;
m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&))); m_FileDialog->disconnect(SIGNAL(filterSelected(const QString&)));
connect(m_FileDialog, &QFileDialog::filterSelected, [&](const QString & filter) { m_Settings->SaveImageExt(filter); }); connect(m_FileDialog, &QFileDialog::filterSelected, [&](const QString & filter) { m_Settings->SaveImageExt(filter); });
@ -622,6 +634,11 @@ QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename)
if (m_FileDialog->exec() == QDialog::Accepted) if (m_FileDialog->exec() == QDialog::Accepted)
filename = m_FileDialog->selectedFiles().value(0); filename = m_FileDialog->selectedFiles().value(0);
#else
auto defaultFilter(m_Settings->SaveImageExt());
auto filename = QFileDialog::getSaveFileName(this, tr("Save image"), m_Settings->SaveFolder() + "/" + defaultFilename, tr("Jpeg (*.jpg);;Png (*.png);;Bmp (*.bmp)"));
m_Settings->SaveImageExt(defaultFilter);
#endif
return filename; return filename;
} }
@ -632,6 +649,8 @@ QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename)
/// <returns>The folder selected, with '/' appended to the end</returns> /// <returns>The folder selected, with '/' appended to the end</returns>
QString Fractorium::SetupSaveFolderDialog() QString Fractorium::SetupSaveFolderDialog()
{ {
#ifndef __APPLE__
//Lazy instantiate since it takes a long time. //Lazy instantiate since it takes a long time.
if (!m_FolderDialog) if (!m_FolderDialog)
{ {
@ -639,9 +658,6 @@ QString Fractorium::SetupSaveFolderDialog()
m_FolderDialog->setViewMode(QFileDialog::List); m_FolderDialog->setViewMode(QFileDialog::List);
} }
if (!m_FolderDialog)
return "";
QString filename; QString filename;
//This must come first because it clears various internal states which allow the file text to be properly set. //This must come first because it clears various internal states which allow the file text to be properly set.
//This is most likely a bug in QFileDialog. //This is most likely a bug in QFileDialog.
@ -658,6 +674,15 @@ QString Fractorium::SetupSaveFolderDialog()
filename = MakeEnd(m_FolderDialog->selectedFiles().value(0), '/'); filename = MakeEnd(m_FolderDialog->selectedFiles().value(0), '/');
} }
#else
auto filename = QFileDialog::getExistingDirectory(this, tr("Save to folder"),
m_Settings->SaveFolder(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (filename.size() > 0)
filename = MakeEnd(filename, '/');
#endif
return filename; return filename;
} }

View File

@ -530,8 +530,10 @@ private:
QTableWidgetItem* m_InfoFinalXformItem; QTableWidgetItem* m_InfoFinalXformItem;
//Files. //Files.
#ifndef __APPLE__
QFileDialog* m_FileDialog = nullptr; QFileDialog* m_FileDialog = nullptr;
QFileDialog* m_FolderDialog = nullptr; QFileDialog* m_FolderDialog = nullptr;
#endif
QssDialog* m_QssDialog = nullptr; QssDialog* m_QssDialog = nullptr;
QString m_LastSaveAll; QString m_LastSaveAll;
QString m_LastSaveCurrent; QString m_LastSaveCurrent;

View File

@ -75,7 +75,7 @@ void FractoriumSettings::EnsureDefaults()
if (FinalExt() != "jpg" && FinalExt() != "png") if (FinalExt() != "jpg" && FinalExt() != "png")
FinalExt("png"); FinalExt("png");
QString s = SaveFolder(); auto s = SaveFolder();
QDir dir(s); QDir dir(s);
if (s.isEmpty() || !dir.exists()) if (s.isEmpty() || !dir.exists())
@ -85,6 +85,9 @@ void FractoriumSettings::EnsureDefaults()
if (!paths.empty()) if (!paths.empty())
SaveFolder(paths[0]); SaveFolder(paths[0]);
} }
if (OpenPaletteImageFolder() == "")
OpenPaletteImageFolder(QCoreApplication::applicationDirPath());
} }
/// <summary> /// <summary>
@ -285,6 +288,9 @@ void FractoriumSettings::Nick(const QString& s) { setValue(IDENTITYNICK, s);
QString FractoriumSettings::OpenFolder() { return value(OPENFOLDER).toString(); } QString FractoriumSettings::OpenFolder() { return value(OPENFOLDER).toString(); }
void FractoriumSettings::OpenFolder(const QString& s) { setValue(OPENFOLDER, s); } void FractoriumSettings::OpenFolder(const QString& s) { setValue(OPENFOLDER, s); }
QString FractoriumSettings::OpenPaletteImageFolder() { return value(OPENPALETTEIMAGEFOLDER).toString(); }
void FractoriumSettings::OpenPaletteImageFolder(const QString& s) { setValue(OPENPALETTEIMAGEFOLDER, s); }
QString FractoriumSettings::SaveFolder() { return value(SAVEFOLDER).toString(); } QString FractoriumSettings::SaveFolder() { return value(SAVEFOLDER).toString(); }
void FractoriumSettings::SaveFolder(const QString& s) { setValue(SAVEFOLDER, s); } void FractoriumSettings::SaveFolder(const QString& s) { setValue(SAVEFOLDER, s); }

View File

@ -67,8 +67,9 @@
#define XMLQUALITY "xml/quality" #define XMLQUALITY "xml/quality"
#define XMLSUPERSAMPLE "xml/supersample" #define XMLSUPERSAMPLE "xml/supersample"
#define OPENFOLDER "path/open" #define OPENFOLDER "path/open"
#define SAVEFOLDER "path/save" #define OPENPALETTEIMAGEFOLDER "path/openpaletteimage"
#define SAVEFOLDER "path/save"
#define OPENXMLEXT "file/openxmlext" #define OPENXMLEXT "file/openxmlext"
#define SAVEXMLEXT "file/savexmlext" #define SAVEXMLEXT "file/savexmlext"
@ -261,6 +262,9 @@ public:
QString OpenFolder(); QString OpenFolder();
void OpenFolder(const QString& s); void OpenFolder(const QString& s);
QString OpenPaletteImageFolder();
void OpenPaletteImageFolder(const QString& s);
QString SaveFolder(); QString SaveFolder();
void SaveFolder(const QString& s); void SaveFolder(const QString& s);

View File

@ -425,6 +425,10 @@ void PaletteEditor::EmitPaletteChanged()
/// </summary> /// </summary>
QStringList PaletteEditor::SetupOpenImagesDialog() QStringList PaletteEditor::SetupOpenImagesDialog()
{ {
QStringList filenames;
auto settings = FractoriumSettings::Instance();
#ifndef __APPLE__
if (!m_FileDialog) if (!m_FileDialog)
{ {
m_FileDialog = new QFileDialog(this); m_FileDialog = new QFileDialog(this);
@ -433,20 +437,33 @@ QStringList PaletteEditor::SetupOpenImagesDialog()
m_FileDialog->setAcceptMode(QFileDialog::AcceptOpen); m_FileDialog->setAcceptMode(QFileDialog::AcceptOpen);
m_FileDialog->setNameFilter("Image Files (*.png *.jpg *.bmp)"); m_FileDialog->setNameFilter("Image Files (*.png *.jpg *.bmp)");
m_FileDialog->setWindowTitle("Open Image"); m_FileDialog->setWindowTitle("Open Image");
m_FileDialog->setDirectory(QCoreApplication::applicationDirPath()); m_FileDialog->setDirectory(settings->OpenPaletteImageFolder());
m_FileDialog->selectNameFilter("*.jpg"); m_FileDialog->selectNameFilter("*.jpg");
} }
QStringList filenames;
if (m_FileDialog->exec() == QDialog::Accepted) if (m_FileDialog->exec() == QDialog::Accepted)
{ {
filenames = m_FileDialog->selectedFiles(); filenames = m_FileDialog->selectedFiles();
if (!filenames.empty()) if (!filenames.empty())
m_FileDialog->setDirectory(QFileInfo(filenames[0]).canonicalPath()); {
auto path = QFileInfo(filenames[0]).canonicalPath();
m_FileDialog->setDirectory(path);
settings->OpenPaletteImageFolder(path);
}
} }
#else
auto filename = QFileDialog::getOpenFileName(this, tr("Open Image"), settings->OpenPaletteImageFolder(), tr("Image Files (*.png *.jpg *.bmp)"));
if (filename.size() > 0)
{
filenames.append(filename);
auto path = QFileInfo(filenames[0]).canonicalPath();
settings->OpenPaletteImageFolder(path);
}
#endif
return filenames; return filenames;
} }

View File

@ -72,7 +72,9 @@ private:
string m_CurrentPaletteFilePath; string m_CurrentPaletteFilePath;
ColorPickerWidget* m_ColorPicker = nullptr; ColorPickerWidget* m_ColorPicker = nullptr;
GradientColorsView* m_GradientColorView = nullptr; GradientColorsView* m_GradientColorView = nullptr;
#ifndef __APPLE__
QFileDialog* m_FileDialog = nullptr; QFileDialog* m_FileDialog = nullptr;
#endif
shared_ptr<PaletteList<float>> m_PaletteList; shared_ptr<PaletteList<float>> m_PaletteList;
std::unique_ptr<Ui::PaletteEditor> ui; std::unique_ptr<Ui::PaletteEditor> ui;
}; };

View File

@ -44,9 +44,7 @@ bool CaseInsensitiveLessThanQ(const QString& s1, const QString& s2)
QssDialog::QssDialog(Fractorium* parent) : QssDialog::QssDialog(Fractorium* parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::QssDialog), ui(new Ui::QssDialog),
m_FileDialog(nullptr),
m_Parent(parent), m_Parent(parent),
m_Theme(nullptr),
m_AddColorAction(new QAction(tr("Add Color"), this)), m_AddColorAction(new QAction(tr("Add Color"), this)),
m_AddGeomAction(new QAction(tr("Add Geometry"), this)), m_AddGeomAction(new QAction(tr("Add Geometry"), this)),
m_AddBorderAction(new QAction(tr("Add Border"), this)), m_AddBorderAction(new QAction(tr("Add Border"), this)),
@ -631,13 +629,16 @@ void QssDialog::InsertCssProperty(const QString& name, const QString& value)
/// </summary> /// </summary>
void QssDialog::SetupFileDialog() void QssDialog::SetupFileDialog()
{ {
#ifndef __APPLE__
if (!m_FileDialog) if (!m_FileDialog)
{ {
auto path = m_Parent->m_SettingsPath;
m_FileDialog = new QFileDialog(this); m_FileDialog = new QFileDialog(this);
m_FileDialog->setDirectory(path); m_FileDialog->setDirectory(m_Parent->m_SettingsPath);
m_FileDialog->setViewMode(QFileDialog::List); m_FileDialog->setViewMode(QFileDialog::List);
} }
#endif
} }
/// <summary> /// <summary>
@ -646,6 +647,7 @@ void QssDialog::SetupFileDialog()
/// <returns>The file selected if any, else empty string.</returns> /// <returns>The file selected if any, else empty string.</returns>
QString QssDialog::OpenFile() QString QssDialog::OpenFile()
{ {
#ifndef __APPLE__
QStringList filenames; QStringList filenames;
SetupFileDialog(); SetupFileDialog();
m_FileDialog->setFileMode(QFileDialog::ExistingFile); m_FileDialog->setFileMode(QFileDialog::ExistingFile);
@ -658,6 +660,10 @@ QString QssDialog::OpenFile()
filenames = m_FileDialog->selectedFiles(); filenames = m_FileDialog->selectedFiles();
return !filenames.empty() ? filenames[0] : ""; return !filenames.empty() ? filenames[0] : "";
#else
auto filename = QFileDialog::getOpenFileName(this, tr("Open Stylesheet"), m_Parent->m_SettingsPath, tr("Qss (*.qss)"));
return filename.size() > 0 ? filename : "";
#endif
} }
/// <summary> /// <summary>
@ -666,6 +672,7 @@ QString QssDialog::OpenFile()
/// <returns>The file selected for saving if any, else empty string.</returns> /// <returns>The file selected for saving if any, else empty string.</returns>
QString QssDialog::SaveFile() QString QssDialog::SaveFile()
{ {
#ifndef __APPLE__
QStringList filenames; QStringList filenames;
SetupFileDialog(); SetupFileDialog();
m_FileDialog->setFileMode(QFileDialog::AnyFile); m_FileDialog->setFileMode(QFileDialog::AnyFile);
@ -678,4 +685,8 @@ QString QssDialog::SaveFile()
filenames = m_FileDialog->selectedFiles(); filenames = m_FileDialog->selectedFiles();
return !filenames.empty() ? filenames[0] : ""; return !filenames.empty() ? filenames[0] : "";
#else
auto filename = QFileDialog::getSaveFileName(this, tr("Save Stylesheet"), m_Parent->m_SettingsPath, tr("Qss (*.qss)"));
return filename.size() > 0 ? filename : "";
#endif
} }

View File

@ -53,7 +53,7 @@
namespace Ui namespace Ui
{ {
class QssDialog; class QssDialog;
} }
/// <summary> /// <summary>
@ -113,12 +113,12 @@ private slots:
private: private:
void SaveAsDefault(); void SaveAsDefault();
void InsertCssProperty(const QString &name, const QString &value); void InsertCssProperty(const QString& name, const QString& value);
void SetupFileDialog(); void SetupFileDialog();
QString OpenFile(); QString OpenFile();
QString SaveFile(); QString SaveFile();
QStyle* m_Theme; QStyle* m_Theme = nullptr;
QStyle* m_LastTheme; QStyle* m_LastTheme;
QString m_LastStyle; QString m_LastStyle;
QAction* m_AddColorAction; QAction* m_AddColorAction;
@ -136,6 +136,8 @@ private:
QHash<QString, QString> m_StyleMap; QHash<QString, QString> m_StyleMap;
QTimer* m_ApplyTimer; QTimer* m_ApplyTimer;
Fractorium* m_Parent; Fractorium* m_Parent;
QFileDialog* m_FileDialog; #ifndef __APPLE__
Ui::QssDialog *ui; QFileDialog* m_FileDialog = nullptr;
#endif
Ui::QssDialog* ui;
}; };