[niepce] Metadata display: Add a Fraction as decimal type.
- From: Hubert Figuière <hub src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [niepce] Metadata display: Add a Fraction as decimal type.
- Date: Fri, 28 Jun 2013 03:09:33 +0000 (UTC)
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]