Merge branch '201202_guiaddsuffix' of https://github.com/laanwj/bitcoin
authorGavin Andresen <gavinandresen@gmail.com>
Wed, 22 Feb 2012 15:41:11 +0000 (10:41 -0500)
committerGavin Andresen <gavinandresen@gmail.com>
Wed, 22 Feb 2012 15:41:11 +0000 (10:41 -0500)
1  2 
src/qt/guiutil.cpp
src/qt/guiutil.h

diff --combined src/qt/guiutil.cpp
@@@ -15,6 -15,8 +15,8 @@@
  #include <QAbstractItemView>
  #include <QApplication>
  #include <QClipboard>
+ #include <QFileDialog>
+ #include <QDesktopServices>
  
  QString GUIUtil::dateTimeStr(qint64 nTime)
  {
@@@ -49,15 -51,15 +51,15 @@@ void GUIUtil::setupAmountWidget(QLineEd
      widget->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
  }
  
 -bool GUIUtil::parseBitcoinURL(const QUrl *url, SendCoinsRecipient *out)
 +bool GUIUtil::parseBitcoinURL(const QUrl &url, SendCoinsRecipient *out)
  {
 -    if(url->scheme() != QString("bitcoin"))
 +    if(url.scheme() != QString("bitcoin"))
          return false;
  
      SendCoinsRecipient rv;
 -    rv.address = url->path();
 +    rv.address = url.path();
      rv.amount = 0;
 -    QList<QPair<QString, QString> > items = url->queryItems();
 +    QList<QPair<QString, QString> > items = url.queryItems();
      for (QList<QPair<QString, QString> >::iterator i = items.begin(); i != items.end(); i++)
      {
          bool fShouldReturnFalse = false;
      return true;
  }
  
 +bool GUIUtil::parseBitcoinURL(QString url, SendCoinsRecipient *out)
 +{
 +    // Convert bitcoin:// to bitcoin:
 +    //
 +    //    Cannot handle this later, because bitcoin:// will cause Qt to see the part after // as host,
 +    //    which will lowercase it (and thus invalidate the address).
 +    if(url.startsWith("bitcoin://"))
 +    {
 +        url.replace(0, 10, "bitcoin:");
 +    }
 +    QUrl urlInstance(url);
 +    return parseBitcoinURL(urlInstance, out);
 +}
 +
  QString GUIUtil::HtmlEscape(const QString& str, bool fMultiLine)
  {
      QString escaped = Qt::escape(str);
@@@ -135,3 -123,50 +137,50 @@@ void GUIUtil::copyEntryData(QAbstractIt
          QApplication::clipboard()->setText(selection.at(0).data(role).toString());
      }
  }
+ QString GUIUtil::getSaveFileName(QWidget *parent, const QString &caption,
+                                  const QString &dir,
+                                  const QString &filter,
+                                  QString *selectedSuffixOut)
+ {
+     QString selectedFilter;
+     QString myDir;
+     if(dir.isEmpty()) // Default to user documents location
+     {
+         myDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+     }
+     else
+     {
+         myDir = dir;
+     }
+     QString result = QFileDialog::getSaveFileName(parent, caption, myDir, filter, &selectedFilter);
+     /* Extract first suffix from filter pattern "Description (*.foo)" or "Description (*.foo *.bar ...) */
+     QRegExp filter_re(".* \\(\\*\\.(.*)[ \\)]");
+     QString selectedSuffix;
+     if(filter_re.exactMatch(selectedFilter))
+     {
+         selectedSuffix = filter_re.cap(1);
+     }
+     /* Add suffix if needed */
+     QFileInfo info(result);
+     if(!result.isEmpty())
+     {
+         if(info.suffix().isEmpty() && !selectedSuffix.isEmpty())
+         {
+             /* No suffix specified, add selected suffix */
+             if(!result.endsWith("."))
+                 result.append(".");
+             result.append(selectedSuffix);
+         }
+     }
+     /* Return selected suffix if asked to */
+     if(selectedSuffixOut)
+     {
+         *selectedSuffixOut = selectedSuffix;
+     }
+     return result;
+ }
diff --combined src/qt/guiutil.h
@@@ -31,8 -31,7 +31,8 @@@ public
  
      // Parse "bitcoin:" URL into recipient object, return true on succesful parsing
      // See Bitcoin URL definition discussion here: https://bitcointalk.org/index.php?topic=33490.0
 -    static bool parseBitcoinURL(const QUrl *url, SendCoinsRecipient *out);
 +    static bool parseBitcoinURL(const QUrl &url, SendCoinsRecipient *out);
 +    static bool parseBitcoinURL(QString url, SendCoinsRecipient *out);
  
      // HTML escaping for rich text controls
      static QString HtmlEscape(const QString& str, bool fMultiLine=false);
       */
      static void copyEntryData(QAbstractItemView *view, int column, int role=Qt::EditRole);
  
+     /** Get save file name, mimics QFileDialog::getSaveFileName, except that it appends a default suffix
+         when no suffix is provided by the user.
+       @param[in] parent  Parent window (or 0)
+       @param[in] caption Window caption (or empty, for default)
+       @param[in] dir     Starting directory (or empty, to default to documents directory)
+       @param[in] filter  Filter specification such as "Comma Separated Files (*.csv)"
+       @param[out] selectedSuffixOut  Pointer to return the suffix (file type) that was selected (or 0).
+                   Can be useful when choosing the save file format based on suffix.
+      */
+     static QString getSaveFileName(QWidget *parent=0, const QString &caption=QString(),
+                                    const QString &dir=QString(), const QString &filter=QString(),
+                                    QString *selectedSuffixOut=0);
  };
  
  #endif // GUIUTIL_H