[aseprite] 12/308: Add option to export sprite sheets in memory only (without a file, fix #865)

Tobias Hansen thansen at moszumanska.debian.org
Tue Mar 8 02:44:47 UTC 2016


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit 9c1a8762ab6bbb33b21b24037ab142f8d81f3637
Author: David Capello <davidcapello at gmail.com>
Date:   Fri Nov 20 14:49:40 2015 -0300

    Add option to export sprite sheets in memory only (without a file, fix #865)
    
    We have converted the label "Save As" into a checkbox in the Export
    Sprite Sheet dialog.
---
 data/widgets/export_sprite_sheet.xml         |  4 +-
 src/app/commands/cmd_export_sprite_sheet.cpp | 69 ++++++++++++++++++++++++----
 src/app/pref/option.h                        | 31 +++++++++----
 src/app/pref/preferences.cpp                 |  9 +++-
 4 files changed, 93 insertions(+), 20 deletions(-)

diff --git a/data/widgets/export_sprite_sheet.xml b/data/widgets/export_sprite_sheet.xml
index f512dbb..2b8aca9 100644
--- a/data/widgets/export_sprite_sheet.xml
+++ b/data/widgets/export_sprite_sheet.xml
@@ -37,10 +37,10 @@
     <label text="Frames:" />
     <combobox id="frames" text="" cell_hspan="3" />
 
-    <label text="Save As:" />
+    <check id="image_enabled" text="Output File" />
     <button id="image_filename" cell_hspan="3" />
 
-    <check id="data_enabled" text="JSON Data:" />
+    <check id="data_enabled" text="JSON Data" />
     <button id="data_filename" cell_hspan="3" />
 
     <check id="open_generated" text="Open generated sprite sheet" cell_hspan="4" />
diff --git a/src/app/commands/cmd_export_sprite_sheet.cpp b/src/app/commands/cmd_export_sprite_sheet.cpp
index 7206d4d..8711066 100644
--- a/src/app/commands/cmd_export_sprite_sheet.cpp
+++ b/src/app/commands/cmd_export_sprite_sheet.cpp
@@ -46,6 +46,10 @@ namespace {
   static const char* kSelectedLayers = "**selected-layers**";
   static const char* kSelectedFrames = "**selected-frames**";
 
+  // Special key value used in default preferences to know if by default
+  // the user wants to generate texture and/or files.
+  static const char* kSpecifiedFilename = "**filename**";
+
   struct Fit {
     int width;
     int height;
@@ -125,6 +129,7 @@ namespace {
   bool ask_overwrite(bool askFilename, std::string filename,
                      bool askDataname, std::string dataname) {
     if ((askFilename &&
+         !filename.empty() &&
          base::is_file(filename)) ||
         (askDataname &&
          !dataname.empty() &&
@@ -338,19 +343,26 @@ public:
     }
 
     m_filename = m_docPref.spriteSheet.textureFilename();
+    imageEnabled()->setSelected(!m_filename.empty());
+    imageFilename()->setVisible(imageEnabled()->isSelected());
+
     m_dataFilename = m_docPref.spriteSheet.dataFilename();
     dataEnabled()->setSelected(!m_dataFilename.empty());
     dataFilename()->setVisible(dataEnabled()->isSelected());
 
     std::string base = doc->filename();
     base = base::join_path(base::get_file_path(base), base::get_file_title(base));
-    if (m_filename.empty()) {
+
+    if (m_filename.empty() ||
+        m_filename == kSpecifiedFilename) {
       if (base::utf8_icmp(base::get_file_extension(doc->filename()), "png") == 0)
         m_filename = base + "-sheet.png";
       else
         m_filename = base + ".png";
     }
-    if (m_dataFilename.empty())
+
+    if (m_dataFilename.empty() ||
+        m_dataFilename == kSpecifiedFilename)
       m_dataFilename = base + ".json";
 
     exportButton()->Click.connect(Bind<void>(&ExportSpriteSheetWindow::onExport, this));
@@ -362,14 +374,17 @@ public:
     borderPadding()->Change.connect(Bind<void>(&ExportSpriteSheetWindow::onPaddingChange, this));
     shapePadding()->Change.connect(Bind<void>(&ExportSpriteSheetWindow::onPaddingChange, this));
     innerPadding()->Change.connect(Bind<void>(&ExportSpriteSheetWindow::onPaddingChange, this));
+    imageEnabled()->Click.connect(Bind<void>(&ExportSpriteSheetWindow::onImageEnabledChange, this));
     imageFilename()->Click.connect(Bind<void>(&ExportSpriteSheetWindow::onImageFilename, this));
     dataEnabled()->Click.connect(Bind<void>(&ExportSpriteSheetWindow::onDataEnabledChange, this));
     dataFilename()->Click.connect(Bind<void>(&ExportSpriteSheetWindow::onDataFilename, this));
     paddingEnabled()->Click.connect(Bind<void>(&ExportSpriteSheetWindow::onPaddingEnabledChange, this));
     frames()->Change.connect(Bind<void>(&ExportSpriteSheetWindow::onFramesChange, this));
+    openGenerated()->Click.connect(Bind<void>(&ExportSpriteSheetWindow::onOpenGeneratedChange, this));
 
     onSheetTypeChange();
     onFileNamesChange();
+    updateExportButton();
   }
 
   bool ok() const {
@@ -397,7 +412,10 @@ public:
   }
 
   std::string filenameValue() {
-    return m_filename;
+    if (imageEnabled()->isSelected())
+      return m_filename;
+    else
+      return std::string();
   }
 
   std::string dataFilenameValue() {
@@ -456,7 +474,7 @@ public:
       return kAllFrames;
   }
 
-protected:
+private:
 
   void onExport() {
     if (!ask_overwrite(m_filenameAskOverwrite, filenameValue(),
@@ -518,6 +536,14 @@ protected:
     onFileNamesChange();
   }
 
+  void onImageEnabledChange() {
+    m_filenameAskOverwrite = true;
+
+    imageFilename()->setVisible(imageEnabled()->isSelected());
+    updateExportButton();
+    resize();
+  }
+
   void onDataFilename() {
     // TODO hardcoded "json" extension
     std::string newFilename = app::show_file_selector(
@@ -534,6 +560,7 @@ protected:
     m_dataFilenameAskOverwrite = true;
 
     dataFilename()->setVisible(dataEnabled()->isSelected());
+    updateExportButton();
     resize();
   }
 
@@ -551,7 +578,9 @@ protected:
     updateSizeFields();
   }
 
-private:
+  void onOpenGeneratedChange() {
+    updateExportButton();
+  }
 
   void resize() {
     gfx::Size reqSize = getPreferredSize();
@@ -559,6 +588,13 @@ private:
     invalidate();
   }
 
+  void updateExportButton() {
+    exportButton()->setEnabled(
+      imageEnabled()->isSelected() ||
+      dataEnabled()->isSelected() ||
+      openGenerated()->isSelected());
+  }
+
   void updateSizeFields() {
     int nframes = m_sprite->totalFrames();
     std::string tagName = frameTagValue();
@@ -671,8 +707,11 @@ void ExportSpriteSheetCommand::onExecute(Context* context)
     // Default preferences for future sprites
     DocumentPreferences& defPref(Preferences::instance().document(nullptr));
     defPref.spriteSheet = docPref.spriteSheet;
-    defPref.spriteSheet.textureFilename("");
-    defPref.spriteSheet.dataFilename("");
+    if (!defPref.spriteSheet.textureFilename().empty())
+      defPref.spriteSheet.textureFilename.setValueAndDefault(kSpecifiedFilename);
+    if (!defPref.spriteSheet.dataFilename().empty())
+      defPref.spriteSheet.dataFilename.setValueAndDefault(kSpecifiedFilename);
+    defPref.save();
 
     askOverwrite = false; // Already asked in the ExportSpriteSheetWindow
   }
@@ -768,7 +807,8 @@ void ExportSpriteSheetCommand::onExecute(Context* context)
   if (sheet_h == 0) sheet_h = fit.height;
 
   DocumentExporter exporter;
-  exporter.setTextureFilename(filename);
+  if (!filename.empty())
+    exporter.setTextureFilename(filename);
   if (!dataFilename.empty())
     exporter.setDataFilename(dataFilename);
   exporter.setTextureWidth(sheet_w);
@@ -797,6 +837,19 @@ void ExportSpriteSheetCommand::onExecute(Context* context)
   }
 
   if (docPref.spriteSheet.openGenerated()) {
+    // Setup a filename for the new document in case that user didn't
+    // save the file/specified one output filename.
+    if (filename.empty()) {
+      std::string fn = document->filename();
+      std::string ext = base::get_file_extension(fn);
+      if (!ext.empty())
+        ext.insert(0, 1, '.');
+
+      newDocument->setFilename(
+        base::join_path(base::get_file_path(fn),
+                        base::get_file_title(fn) + "-Sheet") + ext);
+    }
+
     newDocument->setContext(context);
     newDocument.release();
   }
diff --git a/src/app/pref/option.h b/src/app/pref/option.h
index 2f4e1ff..9241240 100644
--- a/src/app/pref/option.h
+++ b/src/app/pref/option.h
@@ -37,11 +37,30 @@ namespace app {
       , m_dirty(false) {
     }
 
+    const T& operator()() const {
+      return m_value;
+    }
+
+    const T& operator()(const T& newValue) {
+      setValue(newValue);
+      return m_value;
+    }
+
+    // operator=() changes the value and the default value of the
+    // option.  E.g. it's used when we copy two complete Sections,
+    // from default settings to user settings, or viceversa (the
+    // default value is always involved).
     Option& operator=(const Option& opt) {
-      operator()(opt.m_value);
+      setValueAndDefault(opt.m_value);
       return *this;
     }
 
+    // Changes the default value and the current one.
+    void setValueAndDefault(const T& value) {
+      setDefaultValue(value);
+      setValue(value);
+    }
+
     const char* section() const { return m_section->name(); }
     const char* id() const { return m_id; }
     const T& defaultValue() const { return m_default; }
@@ -53,13 +72,9 @@ namespace app {
     void forceDirtyFlag() { m_dirty = true; }
     void cleanDirtyFlag() { m_dirty = false; }
 
-    const T& operator()() const {
-      return m_value;
-    }
-
-    const T& operator()(const T& newValue) {
+    void setValue(const T& newValue) {
       if (m_value == newValue)
-        return m_value;
+        return;
 
       BeforeChange(newValue);
       if (m_section)
@@ -71,8 +86,6 @@ namespace app {
       AfterChange(newValue);
       if (m_section)
         m_section->AfterChange();
-
-      return m_value;
     }
 
     Signal1<void, const T&> BeforeChange;
diff --git a/src/app/pref/preferences.cpp b/src/app/pref/preferences.cpp
index 2887973..45b39ba 100644
--- a/src/app/pref/preferences.cpp
+++ b/src/app/pref/preferences.cpp
@@ -103,7 +103,11 @@ DocumentPreferences& Preferences::document(const app::Document* doc)
     DocumentPreferences* docPref;
     if (doc) {
       docPref = new DocumentPreferences("");
-      *docPref = this->document(nullptr);
+
+      // The default preferences for this document are the current
+      // defaults for (document=nullptr).
+      DocumentPreferences& defPref = this->document(nullptr);
+      *docPref = defPref;
 
       // Default values for symmetry
       docPref->symmetry.xAxis.setDefaultValue(doc->sprite()->width()/2);
@@ -113,7 +117,10 @@ DocumentPreferences& Preferences::document(const app::Document* doc)
       docPref = new DocumentPreferences("");
 
     m_docs[doc] = docPref;
+
+    // Load document preferences
     serializeDocPref(doc, docPref, false);
+
     return *docPref;
   }
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list