[gtkmm] demos: Show data files in extra tabs in the Gtk::Notebook
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm] demos: Show data files in extra tabs in the Gtk::Notebook
- Date: Mon, 18 May 2015 07:02:29 +0000 (UTC)
commit c021076bddd435ff5d60cff812426888323c96ac
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date: Mon May 18 08:57:57 2015 +0200
demos: Show data files in extra tabs in the Gtk::Notebook
* demos/gtk-demo/demowindow.[h|cc]: Add add_data_tabs() and remove_data_tabs().
This change brings gtkmm's demos more in sync with gtk+.
demos/gtk-demo/demowindow.cc | 77 ++++++++++++++++++++++++++++++++++++++++++
demos/gtk-demo/demowindow.h | 2 +
2 files changed, 79 insertions(+), 0 deletions(-)
---
diff --git a/demos/gtk-demo/demowindow.cc b/demos/gtk-demo/demowindow.cc
index da635d8..c5b8ab8 100644
--- a/demos/gtk-demo/demowindow.cc
+++ b/demos/gtk-demo/demowindow.cc
@@ -86,6 +86,8 @@ DemoWindow::DemoWindow()
m_HBox.pack_start(m_SideBar, Gtk::PACK_SHRINK);
//Notebook:
+ m_Notebook.popup_enable();
+ m_Notebook.set_scrollable();
m_Notebook.append_page(m_TextWidget_Info, "_Info", true); //true = use mnemonic.
m_Notebook.append_page(m_TextWidget_Source, "_Source", true); //true = use mnemonic.
m_Notebook.child_property_tab_expand(m_TextWidget_Info) = true;
@@ -224,6 +226,10 @@ void DemoWindow::load_file(const std::string& filename)
}
else
{
+ // Show extra data files for this demo, if any.
+ remove_data_tabs();
+ add_data_tabs(filename);
+
m_current_filename = filename;
m_TextWidget_Info.wipe();
@@ -362,6 +368,77 @@ void DemoWindow::load_file(const std::string& filename)
}
}
+void DemoWindow::add_data_tabs(const std::string& filename)
+{
+ // We can get the resource_dir from the filename by removing "example_" and ".cc".
+ const std::string resource_dir = "/" + filename.substr(8, filename.size()-11);
+ std::vector<std::string> resources;
+ try
+ {
+ resources = Gio::Resource::enumerate_children_global(resource_dir);
+ }
+ catch (const Gio::ResourceError& ex)
+ {
+ // Ignore this exception. It's no error, if resource_dir does not exist.
+ }
+ for (unsigned int i = 0; i < resources.size(); ++i)
+ {
+ const std::string resource_name = resource_dir + "/" + resources[i];
+ Gtk::Widget* widget = 0;
+ Gtk::Image* image = new Gtk::Image();
+ image->set_from_resource(resource_name);
+ if (image->get_pixbuf() || image->get_animation())
+ {
+ widget = image;
+ }
+ else
+ {
+ // So we've used the best API available to figure out it's
+ // not an image. Let's try something else then.
+ delete image;
+ image = 0;
+
+ Glib::RefPtr<const Glib::Bytes> bytes;
+ try
+ {
+ bytes = Gio::Resource::lookup_data_global(resource_name);
+ }
+ catch (const Gio::ResourceError& ex)
+ {
+ g_warning("Can't get data from resource '%s': %s\n",
+ resource_name.c_str(), ex.what().c_str());
+ continue;
+ }
+ gsize data_size = 0;
+ const char* data = static_cast<const char*>(bytes->get_data(data_size));
+ if (g_utf8_validate(data, data_size, 0))
+ {
+ // Looks like it parses as text. Dump it into a TextWidget then!
+ TextWidget* textwidget = new TextWidget(false);
+ Glib::RefPtr<Gtk::TextBuffer> refBuffer = textwidget->get_buffer();
+ refBuffer->set_text(data, data + data_size);
+ widget = textwidget;
+ }
+ else
+ {
+ g_warning ("Don't know how to display resource '%s'\n", resource_name.c_str());
+ continue;
+ }
+ }
+ widget->show_all();
+ m_Notebook.append_page(*Gtk::manage(widget), resources[i]);
+ m_Notebook.child_property_tab_expand(*widget) = true;
+ }
+}
+
+void DemoWindow::remove_data_tabs()
+{
+ // Remove all tabs except Info and Source.
+ for (int i = m_Notebook.get_n_pages(); i > 1; --i)
+ {
+ m_Notebook.remove_page(i);
+ }
+}
void DemoWindow::on_example_window_hide()
{
diff --git a/demos/gtk-demo/demowindow.h b/demos/gtk-demo/demowindow.h
index 437901b..10ed70a 100644
--- a/demos/gtk-demo/demowindow.h
+++ b/demos/gtk-demo/demowindow.h
@@ -43,6 +43,8 @@ protected:
void fill_tree();
void load_file(const std::string& filename);
+ void add_data_tabs(const std::string& filename);
+ void remove_data_tabs();
//Signal handlers:
static bool select_function(const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path,
bool currently_selected);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]