Remove trailing zeros from the output of Time::get_string().
[synfig.git] / synfig-core / trunk / src / synfig / time.cpp
index fa79940..255359b 100644 (file)
@@ -2,10 +2,11 @@
 /*!    \file time.cpp
 **     \brief Template File
 **
-**     $Id: time.cpp,v 1.1.1.1 2005/01/04 01:23:15 darco Exp $
+**     $Id$
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -35,6 +36,7 @@
 #include "general.h"
 #include <cmath>
 #include <cassert>
+#include <algorithm>
 #include <ctype.h>
 #include <math.h>
 
@@ -185,6 +187,7 @@ Time::get_string(float fps, Time::Format format)const
        hour=time/3600;time-=hour*3600;
        minute=time/60;time-=minute*60;
 
+       // <= is redefined, so this means "is the FORMAT_VIDEO bit set in the format?"
        if(format<=FORMAT_VIDEO)
        {
                int second;
@@ -202,12 +205,19 @@ Time::get_string(float fps, Time::Format format)const
        }
 
        String ret;
+       bool started = false;
 
        if(format<=FORMAT_FULL || hour)
+       {
                ret+=strprintf(format<=FORMAT_NOSPACES?"%dh":"%dh ",hour);
+               started = true;
+       }
 
-       if(format<=FORMAT_FULL || hour || minute)
+       if(format<=FORMAT_FULL || minute)
+       {
                ret+=strprintf(format<=FORMAT_NOSPACES?"%dm":"%dm ",minute);
+               started = true;
+       }
 
        if(fps)
        {
@@ -216,21 +226,42 @@ Time::get_string(float fps, Time::Format format)const
                second=time;time-=second;
                frame=time*fps;
                if(format<=FORMAT_FULL || second)
+               {
                        ret+=strprintf(format<=FORMAT_NOSPACES?"%ds":"%ds ",(int)second);
+                       started = true;
+               }
 
-               if(abs(frame-floor(frame)>=epsilon_()))
-                       ret+=strprintf("%0.3ff",frame);
-               else
-                       ret+=strprintf("%0.0ff",frame);
+               if(format<=FORMAT_FULL || frame || !started)
+               {
+                       if(abs(frame-floor(frame)>=epsilon_()))
+                               ret+=strprintf("%0.3ff",frame);
+                       else
+                               ret+=strprintf("%0.0ff",frame);
+               }
        }
        else
        {
                float second;
                second=time;
-               if(abs(second-floor(second))>=epsilon_())
-                       ret+=strprintf("%0.8fs",second);
-               else
-                       ret+=strprintf("%0.0fs",second);
+               if(format<=FORMAT_FULL || second || !started)
+               {
+                       if(abs(second-floor(second))>=epsilon_())
+                       {
+                               String seconds(strprintf("%0.8f",second));
+
+                               // skip trailing zeros
+                               int count = 0;
+                               for (String::reverse_iterator i = seconds.rbegin(); (*i) == '0'; i++)
+                                       count++;
+
+                               // if we removed too many, go back one place, leaving one zero
+                               if (*i < '0' || *i > '9') count--;
+
+                               ret += seconds.substr(0, seconds.size()-count) + "s";
+                       }
+                       else
+                               ret+=strprintf("%0.0fs",second);
+               }
        }
 
        return ret;
@@ -251,6 +282,14 @@ Time::round(float fps)const
                return ceil(time)/fps;
 }
 
+#ifdef _DEBUG
+const char *
+Time::c_str()const
+{
+       return get_string().c_str();
+}
+#endif
+
 //! \writeme
 bool
 Time::is_valid()const