[niepce: 12/17] Populate the metadata widget once for all.
- From: Hubert FiguiÃre <hub src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [niepce: 12/17] Populate the metadata widget once for all.
- Date: Thu, 2 Feb 2012 04:16:07 +0000 (UTC)
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]