[niepce] Metadata display: Add a Fraction as decimal type.



commit a3af44c0b42240a1bf8290dbae2612d4082ed7a4
Author: Hubert Figuière <hub figuiere net>
Date:   Thu Jun 27 00:29:23 2013 -0400

    Metadata display: Add a Fraction as decimal type.
    
    Better display fractions
    
    Better display decimal values

 src/fwk/toolkit/metadatawidget.cpp       |   75 ++++++++++++++++++++++++------
 src/fwk/toolkit/metadatawidget.hpp       |   14 ++++--
 src/niepce/ui/metadatapanecontroller.cpp |    8 ++--
 3 files changed, 74 insertions(+), 23 deletions(-)
---
diff --git a/src/fwk/toolkit/metadatawidget.cpp b/src/fwk/toolkit/metadatawidget.cpp
index ffe88db..ce8497f 100644
--- a/src/fwk/toolkit/metadatawidget.cpp
+++ b/src/fwk/toolkit/metadatawidget.cpp
@@ -22,6 +22,9 @@
 #include <functional>
 
 #include <boost/lexical_cast.hpp>
+#include <boost/format.hpp>
+#include <boost/rational.hpp>
+
 #include <glibmm/i18n.h>
 #include <gtkmm/label.h>
 #include <gtkmm/entry.h>
@@ -242,13 +245,42 @@ void MetaDataWidget::set_data_source(const fwk::PropertyBag & properties)
     }
 }
 
-bool MetaDataWidget::set_fraction_data(Gtk::Widget* w, const PropertyValue & value)
+bool MetaDataWidget::set_fraction_dec_data(Gtk::Widget* w,
+                                           const PropertyValue & value)
+{
+    if (!is_string(value)) {
+        ERR_OUT("Data not string(fraction)");
+        return false;
+    }
+    try {
+        const std::string& str_value = get_string(value);
+        DBG_OUT("set fraction dec %s", str_value.c_str());
+        std::string frac = str(boost::format("%.1f")
+                               % fwk::fraction_to_decimal(str_value));
+        AutoFlag flag(m_update);
+        static_cast<Gtk::Label*>(w)->set_text(frac);
+    }
+    catch(...) {
+        return false;
+    }
+    return true;
+}
+
+bool MetaDataWidget::set_fraction_data(Gtk::Widget* w,
+                                       const PropertyValue & value)
 {
+    if (!is_string(value)) {
+        ERR_OUT("Data not string(fraction)");
+        return false;
+    }
     try {
-        const std::string& str_value = boost::get<std::string>(value);
+        const std::string& str_value = get_string(value);
         DBG_OUT("set fraction %s", str_value.c_str());
-        double decimal = fwk::fraction_to_decimal(str_value);
-        std::string frac = boost::lexical_cast<std::string>(decimal);
+        boost::rational<int> r
+            = boost::lexical_cast<boost::rational<int> >(str_value);
+
+        std::string frac = str(boost::format("%1%/%2%")
+                               % r.numerator() % r.denominator());
         AutoFlag flag(m_update);
         static_cast<Gtk::Label*>(w)->set_text(frac);
     }
@@ -258,10 +290,15 @@ bool MetaDataWidget::set_fraction_data(Gtk::Widget* w, const PropertyValue & val
     return true;
 }
 
-bool MetaDataWidget::set_star_rating_data(Gtk::Widget* w, const PropertyValue & value)
+bool MetaDataWidget::set_star_rating_data(Gtk::Widget* w,
+                                          const PropertyValue & value)
 {
+    if (!is_integer(value)) {
+        ERR_OUT("Data not integer");
+        return false;
+    }
     try {
-        int rating = boost::get<int>(value);
+        int rating = get_integer(value);
         AutoFlag flag(m_update);
         static_cast<fwk::RatingLabel*>(w)->set_rating(rating);
     }
@@ -276,7 +313,7 @@ bool MetaDataWidget::set_string_array_data(Gtk::Widget* w, const PropertyValue &
     try {
         AutoFlag flag(m_update);
         fwk::StringArray tokens = boost::get<fwk::StringArray>(value);
-        
+
         static_cast<fwk::TokenTextView*>(w)->set_tokens(tokens);
     }
     catch(...) {
@@ -288,31 +325,39 @@ bool MetaDataWidget::set_string_array_data(Gtk::Widget* w, const PropertyValue &
 bool MetaDataWidget::set_text_data(Gtk::Widget* w, bool readonly,
                                    const PropertyValue & value)
 {
+    if (!is_string(value)) {
+        ERR_OUT("Data not string");
+        return false;
+    }
     try {
         AutoFlag flag(m_update);
         if(readonly) {
-            static_cast<Gtk::Label*>(w)->set_text(boost::get<std::string>(value));
+            static_cast<Gtk::Label*>(w)->set_text(get_string(value));
         }
         else {
-            static_cast<Gtk::TextView*>(w)->get_buffer()->set_text(boost::get<std::string>(value));
+            static_cast<Gtk::TextView*>(w)->get_buffer()->set_text(get_string(value));
         }
     }
     catch(...) {
         return false;
     }
-    return true;    
+    return true;
 }
 
 bool MetaDataWidget::set_string_data(Gtk::Widget* w, bool readonly,
                                      const PropertyValue & value)
 {
+    if (!is_string(value)) {
+        ERR_OUT("Data not string");
+        return false;
+    }
     try {
         AutoFlag flag(m_update);
         if(readonly) {
-            static_cast<Gtk::Label*>(w)->set_text(boost::get<std::string>(value));
+            static_cast<Gtk::Label*>(w)->set_text(get_string(value));
         }
         else {
-            static_cast<Gtk::Entry*>(w)->set_text(boost::get<std::string>(value));
+            static_cast<Gtk::Entry*>(w)->set_text(get_string(value));
         }
     }
     catch(...) {
@@ -340,8 +385,7 @@ void MetaDataWidget::add_data(const MetaDataFormat * current,
                               const PropertyValue & value)
 {
     Gtk::Widget *w = NULL;
-    std::map<PropertyIndex, Gtk::Widget *>::iterator iter 
-        = m_data_map.find(current->id);
+    auto iter = m_data_map.find(current->id);
     if(iter == m_data_map.end()) {
         ERR_OUT("no widget for property");
         return;
@@ -350,6 +394,9 @@ void MetaDataWidget::add_data(const MetaDataFormat * current,
     w = static_cast<Gtk::Label*>(iter->second);
 
     switch(current->type) {
+    case META_DT_FRAC_DEC:
+        set_fraction_dec_data(w, value);
+        break;
     case META_DT_FRAC:
         set_fraction_data(w, value);
         break;
diff --git a/src/fwk/toolkit/metadatawidget.hpp b/src/fwk/toolkit/metadatawidget.hpp
index 9792acb..1519517 100644
--- a/src/fwk/toolkit/metadatawidget.hpp
+++ b/src/fwk/toolkit/metadatawidget.hpp
@@ -42,7 +42,8 @@ enum MetaDataType {
     META_DT_STRING_ARRAY,
     META_DT_TEXT,
     META_DT_DATE,
-    META_DT_FRAC, 
+    META_DT_FRAC,
+    META_DT_FRAC_DEC, // Fraction as decimal
     META_DT_STAR_RATING
 };
 
@@ -52,7 +53,7 @@ struct MetaDataFormat {
     MetaDataType type;
     bool         readonly;
 };
-       
+
 struct MetaDataSectionFormat {
     const char * section;
     const MetaDataFormat * formats;
@@ -61,17 +62,17 @@ struct MetaDataSectionFormat {
 class XmpMeta;
 class TokenTextView;
 
-class MetaDataWidget 
+class MetaDataWidget
        : public fwk::ToolboxItemWidget
 {
 public:
     MetaDataWidget(const Glib::ustring & title);
-    
+
     void add_data(const MetaDataFormat * current,
                   const PropertyValue & value);
     void set_data_format(const MetaDataSectionFormat * fmt);
     void set_data_source(const fwk::PropertyBag & properties);
-    
+
     sigc::signal<void, const fwk::PropertyBag &, const fwk::PropertyBag &> signal_metadata_changed;
 protected:
     bool on_str_changed(GdkEventFocus*, Gtk::Entry *, fwk::PropertyIndex prop);
@@ -91,6 +92,9 @@ private:
     Gtk::Widget* create_date_widget(bool readonly, uint32_t id);
 
     // set data
+    // Fraction as a decimal
+    bool set_fraction_dec_data(Gtk::Widget* w, const PropertyValue & value);
+    // Fraction as fraction
     bool set_fraction_data(Gtk::Widget* w, const PropertyValue & value);
     bool set_star_rating_data(Gtk::Widget* w, const PropertyValue & value);
     bool set_string_array_data(Gtk::Widget* w, const PropertyValue & value);
diff --git a/src/niepce/ui/metadatapanecontroller.cpp b/src/niepce/ui/metadatapanecontroller.cpp
index df0d3a9..266d89e 100644
--- a/src/niepce/ui/metadatapanecontroller.cpp
+++ b/src/niepce/ui/metadatapanecontroller.cpp
@@ -42,13 +42,13 @@ MetaDataPaneController::get_format()
     };
     static const fwk::MetaDataFormat s_shootinginfo_format[] = {
         { _("Exposure Program:"), eng::NpExifExposureProgramProp, fwk::META_DT_STRING, true },
-        { _("Speed:"), eng::NpExifExposureTimeProp, fwk::META_DT_STRING, true },
-        { _("Aperture:"), eng::NpExifFNumberPropProp, fwk::META_DT_FRAC, true },
+        { _("Speed:"), eng::NpExifExposureTimeProp, fwk::META_DT_FRAC, true },
+        { _("Aperture:"), eng::NpExifFNumberPropProp, fwk::META_DT_FRAC_DEC, true },
         { _("ISO:"), eng::NpExifIsoSpeedRatingsProp, fwk::META_DT_STRING, true },
-        { _("Exposure Bias:"), eng::NpExifExposureBiasProp, fwk::META_DT_FRAC, true },
+        { _("Exposure Bias:"), eng::NpExifExposureBiasProp, fwk::META_DT_FRAC_DEC, true },
         { _("Flash:"), eng::NpExifFlashFiredProp, fwk::META_DT_STRING, true },
         { _("Flash compensation:"), eng::NpExifAuxFlashCompensationProp, fwk::META_DT_STRING, true },
-        { _("Focal length:"), eng::NpExifFocalLengthProp, fwk::META_DT_FRAC, true },
+        { _("Focal length:"), eng::NpExifFocalLengthProp, fwk::META_DT_FRAC_DEC, true },
         { _("White balance:"), eng::NpExifWbProp, fwk::META_DT_STRING, true },
         { _("Date:"), eng::NpExifDateTimeOriginalProp, fwk::META_DT_DATE, false },
         { NULL, 0, fwk::META_DT_NONE, true }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]