[niepce: 12/17] Populate the metadata widget once for all.



commit 08367f7f03f29d8ef586e024e83237d56c73e612
Author: Hub Figuiere <hub figuiere net>
Date:   Sun Jan 8 18:32:56 2012 -0800

    Populate the metadata widget once for all.

 src/fwk/toolkit/metadatawidget.cpp |  160 ++++++++++++++++++------------------
 src/fwk/toolkit/metadatawidget.hpp |    3 +-
 2 files changed, 83 insertions(+), 80 deletions(-)
---
diff --git a/src/fwk/toolkit/metadatawidget.cpp b/src/fwk/toolkit/metadatawidget.cpp
index 5bbfed8..ed1f436 100644
--- a/src/fwk/toolkit/metadatawidget.cpp
+++ b/src/fwk/toolkit/metadatawidget.cpp
@@ -1,7 +1,7 @@
 /*
  * niepce - fwk/toolkit/metadatawidget.cpp
  *
- * Copyright (C) 2008-2011 Hubert Figuiere
+ * Copyright (C) 2008-2012 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -56,84 +56,22 @@ MetaDataWidget::MetaDataWidget(const Glib::ustring & title)
 void MetaDataWidget::set_data_format(const MetaDataSectionFormat * fmt)
 {
     m_fmt = fmt;
+    create_widgets_for_format(fmt);
 }
 
-void MetaDataWidget::clear_widget(std::pair<const PropertyIndex, Gtk::Widget *> & p)
+void MetaDataWidget::create_widgets_for_format(const MetaDataSectionFormat * fmt)
 {
-    AutoFlag flag(m_update);
-    Gtk::Label * l = dynamic_cast<Gtk::Label*>(p.second);
-    if(l) {
-        l->set_text("");
-        return;
-    }
-    Gtk::Entry * e = dynamic_cast<Gtk::Entry*>(p.second);
-    if(e) {
-        e->set_text("");
-        return;
-    }
-    Gtk::TextView * tv = dynamic_cast<Gtk::TextView*>(p.second);
-    if(tv) {
-        tv->get_buffer()->set_text("");
-    }
-    fwk::RatingLabel * rl = dynamic_cast<fwk::RatingLabel*>(p.second);
-    if(rl) {
-        rl->set_rating(0);
-        return;
-    }
-}
-
-void MetaDataWidget::set_data_source(const fwk::PropertyBag & properties)
-{
-    DBG_OUT("set data source");
-    m_current_data = properties;
-    if(!m_data_map.empty()) {
-        std::for_each(m_data_map.begin(), m_data_map.end(),
-                      boost::bind(&MetaDataWidget::clear_widget, this, _1));
-    }
-    if(properties.empty()) {
-        return;
-    }
-    if(!m_fmt) {
-        DBG_OUT("empty format");
-        return;
-    }
-
+    Gtk::Widget *w = NULL;
     const MetaDataFormat * current = m_fmt->formats;
-    while(current && current->label) {
-        PropertyValue v;
-        if(properties.get_value_for_property(current->id, v) || !current->readonly) {
-            add_data(current, v);
-        }
-        else {
-            DBG_OUT("get_property failed id = %d, label = %s",
-                    current->id, current->label);
-        }
-        current++;
-    }
-}
+    int n_row = 0;
 
-
-void MetaDataWidget::add_data(const MetaDataFormat * current,
-                              const PropertyValue & value)
-{
-    Gtk::Widget *w = NULL;
-    int n_row;
-    std::map<PropertyIndex, Gtk::Widget *>::iterator iter 
-        = m_data_map.end();
-    if(m_data_map.empty()) {
-        n_row = 0;
-    }
-    else {
-        iter = m_data_map.find(current->id);
-        n_row = m_table.property_n_rows();
-    }
-    if(iter == m_data_map.end()) {
+    while(current && current->label) {
         Gtk::Label *labelw = Gtk::manage(new Gtk::Label(
                                              Glib::ustring("<b>") 
                                              + current->label + "</b>"));
         labelw->set_alignment(0.0f, 0.5f);
         labelw->set_use_markup(true);
-
+    
         switch(current->type)
         {
         case META_DT_STAR_RATING:
@@ -187,20 +125,90 @@ void MetaDataWidget::add_data(const MetaDataFormat * current,
             }
             break;
         }
-
+    
         m_table.resize(n_row + 1, 2);
         m_table.attach(*labelw, 0, 1, n_row, n_row+1, 
                        Gtk::FILL, Gtk::SHRINK, 4, 0);
         m_table.attach(*w, 1, 2, n_row, n_row+1, 
                        Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK, 4, 0);
         m_data_map.insert(std::make_pair(current->id, w));
+
+        current++;
+        n_row++;
     }
-    else {
-        w = static_cast<Gtk::Label*>(iter->second);
+    m_table.show_all();
+}
+
+void MetaDataWidget::clear_widget(std::pair<const PropertyIndex, Gtk::Widget *> & p)
+{
+    AutoFlag flag(m_update);
+    Gtk::Label * l = dynamic_cast<Gtk::Label*>(p.second);
+    if(l) {
+        l->set_text("");
+        return;
+    }
+    Gtk::Entry * e = dynamic_cast<Gtk::Entry*>(p.second);
+    if(e) {
+        e->set_text("");
+        return;
+    }
+    Gtk::TextView * tv = dynamic_cast<Gtk::TextView*>(p.second);
+    if(tv) {
+        tv->get_buffer()->set_text("");
+    }
+    fwk::RatingLabel * rl = dynamic_cast<fwk::RatingLabel*>(p.second);
+    if(rl) {
+        rl->set_rating(0);
+        return;
+    }
+}
+
+void MetaDataWidget::set_data_source(const fwk::PropertyBag & properties)
+{
+    DBG_OUT("set data source");
+    m_current_data = properties;
+    if(!m_data_map.empty()) {
+        std::for_each(m_data_map.begin(), m_data_map.end(),
+                      boost::bind(&MetaDataWidget::clear_widget, this, _1));
+    }
+    if(properties.empty()) {
+        return;
     }
+    if(!m_fmt) {
+        DBG_OUT("empty format");
+        return;
+    }
+
+    const MetaDataFormat * current = m_fmt->formats;
+    while(current && current->label) {
+        PropertyValue v;
+        if(properties.get_value_for_property(current->id, v) || !current->readonly) {
+            add_data(current, v);
+        }
+        else {
+            DBG_OUT("get_property failed id = %d, label = %s",
+                    current->id, current->label);
+        }
+        current++;
+    }
+}
+
+
+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);
+    if(iter == m_data_map.end()) {
+        ERR_OUT("no widget for property");
+        return;
+    }
+
+    w = static_cast<Gtk::Label*>(iter->second);
+
     switch(current->type) {
     case META_DT_FRAC:
-    {
         try {
             double decimal = fwk::fraction_to_decimal(boost::get<std::string>(value));
             std::string frac = boost::lexical_cast<std::string>(decimal);
@@ -211,9 +219,7 @@ void MetaDataWidget::add_data(const MetaDataFormat * current,
             DBG_OUT("conversion of '%u' to frac failed", current->id);
         }
         break;
-    }
     case META_DT_STAR_RATING:
-    {
         try {
             int rating = boost::get<int>(value);
             AutoFlag flag(m_update);
@@ -223,9 +229,7 @@ void MetaDataWidget::add_data(const MetaDataFormat * current,
             DBG_OUT("conversion of '%u' to int failed", current->id);
         }
         break;
-    }
     case META_DT_TEXT:
-    {
         try {
             AutoFlag flag(m_update);
             if(current->readonly) {
@@ -239,7 +243,6 @@ void MetaDataWidget::add_data(const MetaDataFormat * current,
             DBG_OUT("conversion of '%u' to int failed", current->id);
         }
         break;
-    }
     default:
         try {
             AutoFlag flag(m_update);
@@ -255,7 +258,6 @@ void MetaDataWidget::add_data(const MetaDataFormat * current,
         }
         break;
     }
-    m_table.show_all();
 }
 
 bool MetaDataWidget::on_str_changed(GdkEventFocus*, Gtk::Entry *e, 
diff --git a/src/fwk/toolkit/metadatawidget.hpp b/src/fwk/toolkit/metadatawidget.hpp
index 56c74b9..1594562 100644
--- a/src/fwk/toolkit/metadatawidget.hpp
+++ b/src/fwk/toolkit/metadatawidget.hpp
@@ -1,7 +1,7 @@
 /*
  * niepce - fwk/toolkit/metadatawidget.h
  *
- * Copyright (C) 2008 Hubert Figuiere
+ * Copyright (C) 2008-2012 Hubert Figuiere
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -80,6 +80,7 @@ protected:
     void on_int_changed(int, fwk::PropertyIndex prop);
 private:
     void clear_widget(std::pair<const PropertyIndex, Gtk::Widget *> & p);
+    void create_widgets_for_format(const MetaDataSectionFormat * fmt);
     void emit_metadata_changed(fwk::PropertyIndex prop, const fwk::PropertyValue & value);
 
     Gtk::Table    m_table;



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