Fix using default preferences on new documents (fix #2198)

Fixed regression introduced in 002abc92452d89dabe601af0bfedf81e3e2ab0fd.
Bug reports:
* https://github.com/aseprite/aseprite/issues/2198
* https://steamcommunity.com/app/431730/discussions/2/1657817111845334892/
* https://community.aseprite.org/t/grid-size-for-new-documents-not-applied/4305

Added new ASEPRITE_USER_FOLDER environment variable to test
preferences from a clean folder.
This commit is contained in:
David Capello 2019-12-02 19:13:27 -03:00
parent f53ecab282
commit 6cab7b208c
6 changed files with 67 additions and 19 deletions

View File

@ -86,8 +86,13 @@ namespace app {
// Changes the default value and the current one. // Changes the default value and the current one.
void setValueAndDefault(const T& value) { void setValueAndDefault(const T& value) {
bool wasDirty = isDirty();
setDefaultValue(value); setDefaultValue(value);
setValue(value); setValue(value);
if (!wasDirty)
cleanDirtyFlag();
} }
const T& defaultValue() const { return m_default; } const T& defaultValue() const { return m_default; }

View File

@ -50,6 +50,16 @@ Preferences::Preferences()
load(); load();
// Create a connection with the default document preferences grid
// bounds to sync the default grid bounds for new sprites in the
// "doc" layer.
auto& defPref = document(nullptr);
defPref.grid.bounds.AfterChange.connect(
[](const gfx::Rect& newValue){
doc::Sprite::SetDefaultGridBounds(newValue);
});
doc::Sprite::SetDefaultGridBounds(defPref.grid.bounds());
// Hide the menu bar depending on: // Hide the menu bar depending on:
// 1. this is the first run of the program // 1. this is the first run of the program
// 2. the native menu bar is available // 2. the native menu bar is available
@ -135,21 +145,21 @@ DocumentPreferences& Preferences::document(const Doc* doc)
DocumentPreferences* docPref = new DocumentPreferences(""); DocumentPreferences* docPref = new DocumentPreferences("");
m_docs[doc] = docPref; m_docs[doc] = docPref;
// If there is not a .ini file with the "doc" preferences to be // Setup the preferences of this document with the default ones
// loaded, we will setup the default preferences for this file. // (these preferences will be overwritten in the next statement
// (This must be done just one time, when the .ini file with the // loading the preferences from the .ini file of this doc)
// specific settings for "doc" doesn't exist.) if (doc) {
if (doc && !base::is_file(docConfigFileName(doc))) {
// The default preferences for this document are the current // The default preferences for this document are the current
// defaults for (document=nullptr). // defaults for (document=nullptr).
DocumentPreferences& defPref = this->document(nullptr); DocumentPreferences& defPref = this->document(nullptr);
*docPref = defPref; *docPref = defPref;
// Default values for symmetry // Default values for symmetry
docPref->symmetry.xAxis.setDefaultValue(doc->sprite()->width()/2); docPref->symmetry.xAxis.setValueAndDefault(doc->sprite()->width()/2);
docPref->symmetry.yAxis.setDefaultValue(doc->sprite()->height()/2); docPref->symmetry.yAxis.setValueAndDefault(doc->sprite()->height()/2);
} }
// Load specific settings of this document
serializeDocPref(doc, docPref, false); serializeDocPref(doc, docPref, false);
return *docPref; return *docPref;

View File

@ -1,4 +1,5 @@
// Aseprite // Aseprite
// Copyright (C) 2019 Igara Studio S.A.
// Copyright (C) 2001-2016 David Capello // Copyright (C) 2001-2016 David Capello
// //
// This program is distributed under the terms of // This program is distributed under the terms of
@ -152,7 +153,11 @@ void ResourceFinder::includeUserDir(const char* filename)
{ {
#ifdef _WIN32 #ifdef _WIN32
if (App::instance()->isPortable()) { // $ASEPRITE_USER_FOLDER/filename
if (const wchar_t* env = _wgetenv(L"ASEPRITE_USER_FOLDER")) {
addPath(base::join_path(base::to_utf8(env), filename));
}
else if (App::instance()->isPortable()) {
// $BINDIR/filename // $BINDIR/filename
includeBinDir(filename); includeBinDir(filename);
} }
@ -161,20 +166,30 @@ void ResourceFinder::includeUserDir(const char* filename)
includeHomeDir(filename); includeHomeDir(filename);
} }
#elif __APPLE__ #else // Unix-like
// $HOME/Library/Application Support/Aseprite/filename // $ASEPRITE_USER_FOLDER/filename
addPath( if (const char* env = std::getenv("ASEPRITE_USER_FOLDER")) {
base::join_path( addPath(base::join_path(env, filename));
base::join_path(base::get_lib_app_support_path(), PACKAGE), }
filename).c_str()); else {
#ifdef __APPLE__
#else // $HOME/Library/Application Support/Aseprite/filename
addPath(
base::join_path(
base::join_path(base::get_lib_app_support_path(), PACKAGE),
filename).c_str());
// $HOME/.config/aseprite/filename #else // !__APPLE__
includeHomeDir((std::string(".config/aseprite/") + filename).c_str());
#endif // $HOME/.config/aseprite/filename
includeHomeDir((std::string(".config/aseprite/") + filename).c_str());
#endif
}
#endif // end Unix-like
} }
void ResourceFinder::includeDesktopDir(const char* filename) void ResourceFinder::includeDesktopDir(const char* filename)

View File

@ -1,4 +1,5 @@
// Aseprite // Aseprite
// Copyright (C) 2019 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello // Copyright (C) 2001-2018 David Capello
// //
// This program is distributed under the terms of // This program is distributed under the terms of
@ -42,6 +43,10 @@ namespace app {
// Tries to add the given filename in these locations: // Tries to add the given filename in these locations:
// For Windows: // For Windows:
// - If ASEPRITE_USER_FOLDER environment variable is defined, it
// should point the folder where the "user dir" is (it's useful
// for testing purposes to test with an empty preferences
// folder)
// - If the app is running in portable mode, the filename // - If the app is running in portable mode, the filename
// will be in the same location as the .exe file. // will be in the same location as the .exe file.
// - If the app is installed, the filename will be inside // - If the app is installed, the filename will be inside

View File

@ -34,8 +34,19 @@ namespace doc {
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Constructors/Destructor // Constructors/Destructor
static gfx::Rect g_defaultGridBounds(0, 0, 16, 16);
// static // static
gfx::Rect Sprite::DefaultGridBounds() { return gfx::Rect(0, 0, 16, 16); } gfx::Rect Sprite::DefaultGridBounds()
{
return g_defaultGridBounds;
}
// static
void Sprite::SetDefaultGridBounds(const gfx::Rect& defGridBounds)
{
g_defaultGridBounds = defGridBounds;
}
Sprite::Sprite(const ImageSpec& spec, Sprite::Sprite(const ImageSpec& spec,
int ncolors) int ncolors)

View File

@ -101,6 +101,8 @@ namespace doc {
void setTransparentColor(color_t color); void setTransparentColor(color_t color);
static gfx::Rect DefaultGridBounds(); static gfx::Rect DefaultGridBounds();
static void SetDefaultGridBounds(const gfx::Rect& defGridBounds);
const gfx::Rect& gridBounds() const { return m_gridBounds; } const gfx::Rect& gridBounds() const { return m_gridBounds; }
void setGridBounds(const gfx::Rect& rc) { m_gridBounds = rc; } void setGridBounds(const gfx::Rect& rc) { m_gridBounds = rc; }