//------------------------------------------------------------------------------ std::string mforms::gtk::ToolBarImpl::get_item_text(mforms::ToolBarItem *item) { std::string text; switch (item->get_type()) { case mforms::FlatSelectorItem: case mforms::SelectorItem: { Gtk::ComboBoxText *ct = cast<Gtk::ComboBoxText *>(item->get_data_ptr()); if (ct) text = ct->get_active_text(); break; } case mforms::ColorSelectorItem: { const Gtk::ComboBox *combo = cast<Gtk::ComboBox *>(item->get_data_ptr()); if (combo) { const Gtk::TreeIter iter = combo->get_active(); const Gtk::TreeRow row = *iter; text = row.get_value(color_combo_columns->color); } break; } case mforms::SearchFieldItem: { Gtk::Entry *e = cast<Gtk::Entry *>(item->get_data_ptr()); if (e) text = e->get_text(); break; } default: { Gtk::Widget *btn = cast<Gtk::Widget *>(item->get_data_ptr()); if (btn) text = btn->get_name(); } } return text; }
void PrefPage::appendCombo(const std::string& name, const std::string& registryKey, const ComboBoxValueList& valueList, bool storeValueNotIndex) { Gtk::Alignment* alignment = Gtk::manage(new Gtk::Alignment(0.0, 0.5, 0.0, 0.0)); // Create a new combo box of the correct type using boost::shared_ptr; using namespace gtkutil; Gtk::ComboBoxText* combo = Gtk::manage(new Gtk::ComboBoxText); // Add all the string values to the combo box for (ComboBoxValueList::const_iterator i = valueList.begin(); i != valueList.end(); ++i) { combo->append_text(*i); } if (storeValueNotIndex) { // There is no property_active_text() apparently, so we have to connect // manually combo->set_active_text(_registryBuffer.get(registryKey)); combo->property_active().signal_changed().connect( sigc::bind( sigc::ptr_fun(setRegBufferValueFromActiveText), combo, registryKey, sigc::ref(_registryBuffer) ) ); _resetValuesSignal.connect( sigc::bind(sigc::ptr_fun(setActiveTextFromRegValue), combo, registryKey) ); } else { registry::bindPropertyToBufferedKey(combo->property_active(), registryKey, _registryBuffer, _resetValuesSignal); } // Add it to the container alignment->add(*combo); // Add the widget to the dialog row appendNamedWidget(name, *alignment); }
inline virtual void updateGui() { _singleValueLabel.set_visible(false); for (size_t i(0); i < 4; ++i) _scalarvalues[i].hide(); bool singlevalmode = singleValueMode(); if (_components && singlevalmode) { _singleValueLabel.set_visible(true); for (size_t i(0); i < _components; ++i) _scalarvalues[i].show(); } _componentSelect.clear_items(); if (singlevalmode || !_enableDataFiltering) _componentSelect.set_visible(false); else { _componentSelect.set_visible(true); Gtk::TreeModel::iterator iter = _comboBox.get_active(); std::tr1::shared_ptr<Attribute> ptr = (*iter)[_modelColumns.m_ptr]; _componentSelect.append_text("Raw Data"); _componentSelect.append_text("Magnitude"); _componentSelect.append_text("X"); if (ptr->components() > 1) _componentSelect.append_text("Y"); if (ptr->components() > 2) _componentSelect.append_text("Z"); if (ptr->components() > 3) _componentSelect.append_text("W"); //Default to coloring using the magnitude _componentSelect.set_active(1); } for (size_t i(0); i < _components; ++i) _scalarvalues[i].set_sensitive(singlevalmode); }
void Example_markers::on_marker_style_changed(Papyrus::MarkerPosition which) { int style; style = m_start_combobox.get_active_row_number(); if ( style < 0 ) return; m_line->marker(which)->set_style((Papyrus::Marker::Style)style); }
//------------------------------------------------------------------------------ void mforms::gtk::ToolBarImpl::set_selector_items(ToolBarItem *item, const std::vector<std::string> &values) { if (item->get_type() == mforms::SelectorItem || item->get_type() == mforms::FlatSelectorItem) { Gtk::ComboBoxText *w = cast<Gtk::ComboBoxText *>(item->get_data_ptr()); if (w) { w->set_data("ignore_signal", (void *)1); #if ((GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION >= 24) || GTKMM_MAJOR_VERSION > 2) w->remove_all(); #else w->clear_items(); #endif const int size = values.size(); for (int i = 0; i < size; ++i) w->append(values[i]); if (w->get_active_row_number() < 0 && !values.empty()) w->set_active_text(values[0]); w->set_data("ignore_signal", 0); } } else if (item->get_type() == mforms::ColorSelectorItem) { Gtk::ComboBox *w = cast<Gtk::ComboBox *>(item->get_data_ptr()); if (w) { w->set_data("ignore_signal", (void *)1); Glib::RefPtr<Gtk::ListStore> model = Gtk::ListStore::create(*color_combo_columns); const int size = values.size(); for (int i = 0; i < size; ++i) { Gtk::TreeRow row = *model->append(); Gdk::Color color(values[i]); Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, false, 8, 16, 14); pixbuf->fill((guint32)color.get_red() << 24 | (guint32)color.get_green() << 16 | (guint32)color.get_blue() << 8); row[color_combo_columns->color] = values[i]; row[color_combo_columns->image] = pixbuf; } w->set_model(model); if (w->get_active_row_number() < 0) w->set_active(0); w->set_data("ignore_signal", 0); } } }
int main(int argc, char* argv[]) { Gtk::Main kit(argc, argv); Gtk::ComboBoxText combo; combo.append_text("asdfhbb"); combo.append_text("45ggdfdfs"); combo.append_text("avbbhrr"); combo.append_text("khjgh2"); combo.append_text("cxzeee"); combo.append_text("quieroaprobartaller"); BotonOrdenar boton(&combo); Gtk::VBox vbox; vbox.add(combo); vbox.add(boton); Gtk::Window v; v.add(vbox); v.show_all(); Gtk::Main::run(v); return 0; }
/*! Constructor * \param[in] el the configuration element to display * \param[in] differ shall the changes be applied later using apply_changes()? */ ConfigElement::ConfigElement(crn::ConfigElement &el, bool differ): value(el.GetValue()), tmpvalue(el.GetValue()) { if (!value) throw crn::ExceptionUninitialized(_("The element was not initialized.")); if (differ) tmpvalue = crn::Clone(*value); if (std::dynamic_pointer_cast<crn::Int>(tmpvalue)) typ = U"Int"; else if (std::dynamic_pointer_cast<crn::Real>(tmpvalue)) typ = U"Real"; else if (std::dynamic_pointer_cast<crn::Prop3>(tmpvalue)) typ = U"Prop3"; else if (std::dynamic_pointer_cast<crn::String>(tmpvalue)) typ = U"String"; else if (std::dynamic_pointer_cast<crn::StringUTF8>(tmpvalue)) typ = U"StringUTF8"; else if (std::dynamic_pointer_cast<crn::Path>(tmpvalue)) typ = U"Path"; Gtk::Label *lab = Gtk::manage(new Gtk::Label(el.GetName().CStr())); lab->show(); pack_start(*lab, false, true, 2); if (typ == U"Prop3") { Prop3 *p = Gtk::manage(new Prop3(Gtk::ICON_SIZE_BUTTON, el.GetValue<crn::Prop3>())); p->signal_value_changed().connect(sigc::mem_fun(this, &ConfigElement::on_p3_changed)); p->show(); pack_start(*p, true, true, 2); } else if (!el.GetAllowedValues().IsEmpty()) { // any Int, Real, String, StringUTF8 or Path Gtk::ComboBoxText *cb = Gtk::manage(new Gtk::ComboBoxText); const std::vector<crn::StringUTF8> values(el.GetAllowedValues<crn::StringUTF8>()); for (const crn::StringUTF8 &val : values) #ifdef CRN_USING_GTKMM3 cb->append(val.CStr()); #else /* CRN_USING_GTKMM3 */ cb->append_text(val.CStr()); #endif /* CRN_USING_GTKMM3 */ cb->set_active_text(el.GetValue<crn::StringUTF8>().CStr()); cb->signal_changed().connect(sigc::bind(sigc::mem_fun(this, &ConfigElement::on_combo_changed), cb)); cb->show(); pack_start(*cb, true, true, 2); } else if (typ == U"Int") { if (el.HasMinValue() && el.HasMaxValue()) { // has finite range, use a slider #ifdef CRN_USING_GTKMM3 auto *s = Gtk::manage(new Gtk::Scale(Gtk::ORIENTATION_HORIZONTAL)); s->set_range(el.GetMinValue<int>(), el.GetMaxValue<int>() + 1); s->set_increments(1, 1); #else Gtk::HScale *s = Gtk::manage(new Gtk::HScale(el.GetMinValue<int>(), el.GetMaxValue<int>() + 1, 1)); #endif s->set_value(el.GetValue<int>()); s->signal_value_changed().connect(sigc::bind(sigc::mem_fun(this, &ConfigElement::on_range_changed), s)); s->show(); pack_start(*s, true, true, 2); } else { // has at least one infinite (maxed) bound, use a spin button Gtk::SpinButton *s = Gtk::manage(new Gtk::SpinButton); int m = std::numeric_limits<int>::min(), M = std::numeric_limits<int>::max(); if (el.HasMinValue()) m = el.GetMinValue<int>(); if (el.HasMaxValue()) M = el.GetMaxValue<int>(); s->set_range(m, M); s->set_increments(1, 10); s->set_value(el.GetValue<int>()); s->signal_value_changed().connect(sigc::bind(sigc::mem_fun(this, &ConfigElement::on_spin_changed), s)); s->show(); pack_start(*s, true, true, 2); } } else if (typ == U"Real") { if (el.HasMinValue() && el.HasMaxValue()) { // has finite range, use a slider #ifdef CRN_USING_GTKMM3 auto *s = Gtk::manage(new Gtk::Scale(Gtk::ORIENTATION_HORIZONTAL)); s->set_range(el.GetMinValue<double>(), el.GetMaxValue<double>() + 0.01); s->set_increments(0.01, 0.01); #else Gtk::HScale *s = Gtk::manage(new Gtk::HScale(el.GetMinValue<double>(), el.GetMaxValue<double>() + 0.01, 0.01)); #endif s->set_digits(2); s->set_value(el.GetValue<double>()); s->signal_value_changed().connect(sigc::bind(sigc::mem_fun(this, &ConfigElement::on_range_changed), s)); s->show(); pack_start(*s, true, true, 2); } else { // has at least one infinite (maxed) bound, use a spin button Gtk::SpinButton *s = Gtk::manage(new Gtk::SpinButton(0, 2)); double m = -std::numeric_limits<double>::max(), M = std::numeric_limits<double>::max(); if (el.HasMinValue()) m = el.GetMinValue<double>(); if (el.HasMaxValue()) M = el.GetMaxValue<double>(); s->set_range(m, M); s->set_increments(0.01, 1); s->set_value(el.GetValue<double>()); s->signal_value_changed().connect(sigc::bind(sigc::mem_fun(this, &ConfigElement::on_spin_changed), s)); s->show(); pack_start(*s, true, true, 2); } } else // string types { Gtk::Entry *e = Gtk::manage(new Gtk::Entry); e->set_text(el.GetValue<crn::StringUTF8>().CStr()); e->signal_changed().connect(sigc::bind(sigc::mem_fun(this, &ConfigElement::on_entry_changed), e)); e->show(); pack_start(*e, true, true, 2); } lab = Gtk::manage(new Gtk::Label("?")); lab->show(); lab->set_tooltip_text(el.GetDescription().CStr()); pack_start(*lab, false, true, 2); }
void DimensionManager::addDimension() { Gtk::Dialog dialog(_("New Dimension"), true /*modal*/); // add dimension type combo box to the dialog Glib::RefPtr<Gtk::ListStore> refComboModel = Gtk::ListStore::create(comboModel); for (int i = 0x01; i < 0xff; i++) { Glib::ustring sType = dimTypeAsString(static_cast<gig::dimension_t>(i)); if (sType.find("Unknown") != 0) { Gtk::TreeModel::Row row = *(refComboModel->append()); row[comboModel.m_type_id] = i; row[comboModel.m_type_name] = sType; } } Gtk::Table table(2, 2); Gtk::Label labelDimType(_("Dimension:"), Gtk::ALIGN_START); Gtk::ComboBox comboDimType; comboDimType.set_model(refComboModel); comboDimType.pack_start(comboModel.m_type_id); comboDimType.pack_start(comboModel.m_type_name); Gtk::Label labelZones(_("Zones:"), Gtk::ALIGN_START); table.attach(labelDimType, 0, 1, 0, 1); table.attach(comboDimType, 1, 2, 0, 1); table.attach(labelZones, 0, 1, 1, 2); dialog.get_vbox()->pack_start(table); // number of zones: use a combo box with fix values for gig // v2 and a spin button for v3 Gtk::ComboBoxText comboZones; Gtk::SpinButton spinZones; bool version2 = false; if (region) { gig::File* file = (gig::File*)region->GetParent()->GetParent(); version2 = file->pVersion && file->pVersion->major == 2; } if (version2) { for (int i = 1; i <= 5; i++) { char buf[3]; sprintf(buf, "%d", 1 << i); #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 24) || GTKMM_MAJOR_VERSION < 2 comboZones.append_text(buf); #else comboZones.append(buf); #endif } table.attach(comboZones, 1, 2, 1, 2); } else { spinZones.set_increments(1, 8); spinZones.set_numeric(true); spinZones.set_range(2, 128); spinZones.set_value(2); table.attach(spinZones, 1, 2, 1, 2); } dialog.add_button(_("_OK"), 0); dialog.add_button(_("_Cancel"), 1); dialog.show_all_children(); if (!dialog.run()) { // OK selected ... Gtk::TreeModel::iterator iterType = comboDimType.get_active(); if (!iterType) return; Gtk::TreeModel::Row rowType = *iterType; if (!rowType) return; int iTypeID = rowType[comboModel.m_type_id]; gig::dimension_t type = static_cast<gig::dimension_t>(iTypeID); gig::dimension_def_t dim; dim.dimension = type; if (version2) { if (comboZones.get_active_row_number() < 0) return; dim.bits = comboZones.get_active_row_number() + 1; dim.zones = 1 << dim.bits; } else { dim.zones = spinZones.get_value_as_int(); dim.bits = zoneCountToBits(dim.zones); } // assemble the list of regions where the selected dimension shall be // added to std::vector<gig::Region*> vRegions; if (allRegions()) { gig::Instrument* instr = (gig::Instrument*)region->GetParent(); for (gig::Region* rgn = instr->GetFirstRegion(); rgn; rgn = instr->GetNextRegion()) { if (!rgn->GetDimensionDefinition(type)) vRegions.push_back(rgn); } } else vRegions.push_back(region); std::set<Glib::ustring> errors; for (uint iRgn = 0; iRgn < vRegions.size(); ++iRgn) { gig::Region* region = vRegions[iRgn]; try { printf( "Adding dimension (type=0x%x, bits=%d, zones=%d)\n", dim.dimension, dim.bits, dim.zones ); // notify everybody that we're going to update the region region_to_be_changed_signal.emit(region); // add the new dimension to the region // (implicitly creates new dimension regions) region->AddDimension(&dim); // let everybody know there was a change region_changed_signal.emit(region); } catch (RIFF::Exception e) { // notify that the changes are over (i.e. to avoid dead locks) region_changed_signal.emit(region); Glib::ustring txt = _("Could not add dimension: ") + e.Message; if (vRegions.size() == 1) { // show error message directly Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR); msg.run(); } else { // remember error, they are shown after all regions have been processed errors.insert(txt); } } } // update all GUI elements refreshManager(); if (!errors.empty()) { Glib::ustring txt = _( "The following errors occurred while trying to create the dimension on all regions:" ); txt += "\n\n"; for (std::set<Glib::ustring>::const_iterator it = errors.begin(); it != errors.end(); ++it) { txt += "-> " + *it + "\n"; } txt += "\n"; txt += _( "You might also want to check the console for further warnings and " "error messages." ); Gtk::MessageDialog msg(*this, txt, false, Gtk::MESSAGE_ERROR); msg.run(); } } }
//------------------------------------------------------------------------------ void mforms::gtk::ToolBarImpl::set_item_text(mforms::ToolBarItem *item, const std::string &label) { const mforms::ToolBarItemType type = item->get_type(); switch (type) { case mforms::TextActionItem: case mforms::ActionItem: case mforms::SegmentedToggleItem: case mforms::ToggleItem: case mforms::SwitcherItem: { Gtk::Button *btn = cast<Gtk::Button *>(item->get_data_ptr()); if (type == mforms::SwitcherItem) { btn->set_label(label); btn->get_style_context()->add_class("SwitcherItem"); } else btn->add_label(label); btn->set_name(label); break; } case mforms::TitleItem: case mforms::LabelItem: { Gtk::Label *lbl = cast<Gtk::Label *>(item->get_data_ptr()); if (lbl) { lbl->set_markup("<small>" + label + "</small>"); lbl->set_name(label); } break; } case mforms::FlatSelectorItem: case mforms::SelectorItem: { Gtk::ComboBoxText *ct = cast<Gtk::ComboBoxText *>(item->get_data_ptr()); if (ct) ct->set_active_text(label); break; } case mforms::ColorSelectorItem: { Gtk::ComboBox *combo = cast<Gtk::ComboBox *>(item->get_data_ptr()); if (combo) { Glib::RefPtr<Gtk::TreeModel> model = combo->get_model(); if (model) { const Gtk::TreeModel::Children children = model->children(); const Gtk::TreeIter last = children.end(); Gtk::TreeRow row; for (Gtk::TreeIter it = children.begin(); it != last; ++it) { row = *it; if (row.get_value(color_combo_columns->color) == label) { combo->set_active(it); break; } } } } break; } case mforms::SearchFieldItem: case mforms::TextEntryItem: { Gtk::Entry *e = cast<Gtk::Entry *>(item->get_data_ptr()); if (e) e->set_text(label); break; } case mforms::SeparatorItem: case mforms::ExpanderItem: case mforms::ImageBoxItem: break; } }
//------------------------------------------------------------------------------ bool mforms::gtk::ToolBarImpl::create_tool_item(mforms::ToolBarItem *item, ToolBarItemType type) { Gtk::Widget *w = 0; switch (type) { case mforms::TextActionItem: case mforms::ActionItem: case mforms::SwitcherItem: { Gtk::Button *btn = Gtk::manage(new Gtk::Button()); btn->set_focus_on_click(false); btn->set_border_width(0); btn->set_relief(Gtk::RELIEF_NONE); btn->signal_clicked().connect(sigc::bind(sigc::ptr_fun(process_ctrl_action), btn, item)); if (type == mforms::SwitcherItem) btn->set_always_show_image(true); w = btn; break; } case mforms::SegmentedToggleItem: case mforms::ToggleItem: { Gtk::ToggleButton *btn = Gtk::manage(new Gtk::ToggleButton()); btn->set_focus_on_click(false); btn->set_relief(Gtk::RELIEF_NONE); btn->signal_toggled().connect(sigc::bind(sigc::ptr_fun(process_ctrl_action), btn, item)); btn->set_inconsistent(false); w = btn; break; } case mforms::SeparatorItem: { Gtk::Separator *sep = new Gtk::Separator(Gtk::ORIENTATION_VERTICAL); w = sep; break; } case mforms::SearchFieldItem: { #if GTK_VERSION_GE(2, 16) Gtk::Entry *entry = Gtk::manage(new Gtk::Entry()); w = entry; entry->set_icon_from_stock(Gtk::Stock::FIND); #else Gtk::Box *hbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 0)); w = hbox; Gtk::Image *image = Gtk::manage(new Gtk::Image(Gtk::Stock::FIND, Gtk::ICON_SIZE_MENU)); Gtk::Entry *entry = Gtk::manage(new Gtk::Entry()); hbox->pack_start(*image, false, true); hbox->pack_start(*entry, true, true); hbox->set_data("entry", entry); hbox->show_all(); #endif entry->signal_activate().connect(sigc::bind(sigc::ptr_fun(process_ctrl_action), entry, item)); break; } case mforms::TextEntryItem: { Gtk::Box *hbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 0)); w = hbox; Gtk::Entry *entry = Gtk::manage(new Gtk::Entry()); hbox->pack_start(*entry, true, true); hbox->set_data("entry", entry); hbox->show_all(); entry->signal_activate().connect(sigc::bind(sigc::ptr_fun(process_ctrl_action), entry, item)); break; } case mforms::FlatSelectorItem: case mforms::SelectorItem: { Gtk::ComboBoxText *ct = Gtk::manage(new Gtk::ComboBoxText()); ct->signal_changed().connect(sigc::bind(sigc::ptr_fun(process_ctrl_action), ct, item)); w = ct; break; } case mforms::ColorSelectorItem: { if (!color_combo_columns) { color_combo_columns = new ColorComboColumns(); } Gtk::ComboBox *ct = Gtk::manage(new Gtk::ComboBox()); ct->pack_start(color_combo_columns->image); ct->signal_changed().connect(sigc::bind(sigc::ptr_fun(process_ctrl_action), ct, item)); w = ct; break; } case mforms::ExpanderItem: case mforms::LabelItem: { Gtk::Label *label = Gtk::manage(new Gtk::Label("", 0.0, 0.5)); w = label; break; } case mforms::ImageBoxItem: { Gtk::Image *image = Gtk::manage(new Gtk::Image()); w = image; break; } case mforms::TitleItem: { Gtk::Label *label = Gtk::manage(new Gtk::Label("", 0.0, 0.5)); w = label; auto provider = Gtk::CssProvider::create(); provider->load_from_data("* { color: #333; font-weight: bold; }"); w->get_style_context()->add_provider(provider, GTK_STYLE_PROVIDER_PRIORITY_USER); break; } } if (w) { w->show(); } else logError("create_tool_item, widget is 0 for passed type %i\n", type); item->set_data(w); return w != 0; }
/** \brief Creates a combobox widget for an enumeration parameter */ Gtk::Widget * ParamRadioButton::get_widget (SPDocument * doc, Inkscape::XML::Node * node, sigc::signal<void> * changeSignal) { if (_gui_hidden) return NULL; Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4)); Gtk::VBox * vbox = Gtk::manage(new Gtk::VBox(false, 0)); Gtk::Label * label = Gtk::manage(new Gtk::Label(_(_text), Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP)); label->show(); hbox->pack_start(*label, false, false); Gtk::ComboBoxText* cbt = 0; bool comboSet = false; if (_mode == MINIMAL) { cbt = Gtk::manage(new ComboWdg(this, doc, node)); cbt->show(); vbox->pack_start(*cbt, false, false); } // add choice strings as radiobuttons // and select last selected option (_value) Gtk::RadioButtonGroup group; for (GSList * list = choices; list != NULL; list = g_slist_next(list)) { optionentry * entr = reinterpret_cast<optionentry *>(list->data); Glib::ustring * text = entr->guitext; switch ( _mode ) { case MINIMAL: { cbt->append_text(*text); if (!entr->value->compare(_value)) { cbt->set_active_text(*text); comboSet = true; } } break; case COMPACT: case FULL: { ParamRadioButtonWdg * radio = Gtk::manage(new ParamRadioButtonWdg(group, *text, this, doc, node, changeSignal)); radio->show(); vbox->pack_start(*radio, true, true); if (!entr->value->compare(_value)) { radio->set_active(); } } break; } } if ( (_mode == MINIMAL) && !comboSet) { cbt->set_active(0); } vbox->show(); hbox->pack_end(*vbox, false, false); hbox->show(); return dynamic_cast<Gtk::Widget *>(hbox); }
static void OnChangeFCWFilter(Gtk::ComboBoxText& combo, Gtk::FileChooserWidget& fcw) { FCWFilterType typ = (FCWFilterType)combo.get_active_row_number(); SetFilter(fcw, typ); }
Window() : show_edges_label("Show edges"), show_labels_label("Show contour labels"), edge_color_label("Contour edge color"), edge_color(Gdk::RGBA("Red")), edge_width_label("Contour edge width"), edge_width_adj(Gtk::Adjustment::create(1.0, 0.1, 10.0, 0.1, 1.0, 0.0)), edge_width_spin(edge_width_adj, 0.1, 1), nlevels_label("Number of contour edges"), nlevels_adj(Gtk::Adjustment::create(7, 3, 20, 1, 5)), nlevels_spin(nlevels_adj, 1, 0), colormap_palette_label("Colormap palette"), area_fill_pattern_label("Fill pattern"), area_lines_width_label("Fill pattern width"), area_lines_width_adj(Gtk::Adjustment::create(1.0, 0.1, 10.0, 0.1, 1.0, 0.0)), area_lines_width_spin(area_lines_width_adj, 0.1, 1), colorbar_label("Show colorbar"), paned(Gtk::ORIENTATION_VERTICAL), aspect_frame(Glib::ustring(), Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER, 1.5, false) { Glib::ustring x_title = "X-axis"; Glib::ustring y_title = "Y-axis"; Glib::ustring plot_title = "Intensity vs detector position"; // general window and canvas settings set_default_size(720, 720); Gdk::Geometry geometry; geometry.min_aspect = geometry.max_aspect = double(720)/double(720); set_geometry_hints(*this, geometry, Gdk::HINT_ASPECT); set_title("Gtkmm-PLplot test8"); canvas.set_hexpand(true); canvas.set_vexpand(true); //read in our dataset std::ifstream fs; fs.exceptions(std::ifstream::failbit | std::ifstream::badbit | std::ifstream::eofbit); // 11 x 11 dataset (I know the file layout and the data dimensions already) const int nx = 11; const int ny = 11; std::vector<double> x(nx); std::vector<double> y(ny); #ifdef GTKMM_PLPLOT_BOOST_ENABLED boost::multi_array<double, 2> z(boost::extents[nx][ny]); std::cout << "Using Boost multi_array!" << std::endl; #else double **z = Gtk::PLplot::calloc_array2d(nx, ny); #endif fs.open(TEST_CSV); std::string line; std::getline(fs, line); gchar **splitted = g_strsplit(line.c_str(), ",", 0); //first line contains the x values for (int i = 1 ; i < nx + 1 ; i++) { x[i-1] = g_ascii_strtod(splitted[i], NULL); } g_strfreev(splitted); for (int i = 0 ; i < ny ; i++) { line.clear(); std::getline(fs, line); splitted = g_strsplit(line.c_str(), ",", 0); y[i] = g_ascii_strtod(splitted[0], NULL); for (int j = 1 ; j < nx + 1 ; j++) { z[j-1][i] = g_ascii_strtod(splitted[j], NULL); } g_strfreev(splitted); } //construct the plot auto plot = Gtk::manage(new Gtk::PLplot::PlotContourShades( *Gtk::manage(new Gtk::PLplot::PlotDataSurface( x, y, z )), x_title, y_title, plot_title, 7, Gtk::PLplot::ColormapPalette::BLUE_RED, edge_color.get_rgba(), 1.0 )); canvas.add_plot(*plot); plot->set_background_color(Gdk::RGBA("Yellow Green")); //now let's set up the grid grid.set_column_homogeneous(true); grid.set_column_spacing(5); grid.set_row_homogeneous(false); grid.set_row_spacing(5); int row_counter = 0; show_edges_label.set_hexpand(true); show_edges_label.set_vexpand(false); show_edges_label.set_valign(Gtk::ALIGN_CENTER); show_edges_label.set_halign(Gtk::ALIGN_END); show_edges_switch.set_hexpand(true); show_edges_switch.set_vexpand(false); show_edges_switch.set_halign(Gtk::ALIGN_START); show_edges_switch.set_valign(Gtk::ALIGN_CENTER); show_edges_switch.set_active(plot->is_showing_edges()); show_edges_switch.property_active().signal_changed().connect([this, plot](){ if (show_edges_switch.get_active()) { edge_color.set_sensitive(); edge_width_spin.set_sensitive(); show_labels_switch.set_sensitive(); plot->show_edges(); } else { edge_color.set_sensitive(false); edge_width_spin.set_sensitive(false); show_labels_switch.set_sensitive(false); plot->hide_edges(); } }); grid.attach(show_edges_label, 0, row_counter, 1, 1); grid.attach(show_edges_switch, 1, row_counter++, 1, 1); // show contour labels show_labels_label.set_hexpand(true); show_labels_label.set_vexpand(false); show_labels_label.set_valign(Gtk::ALIGN_CENTER); show_labels_label.set_halign(Gtk::ALIGN_END); show_labels_switch.set_hexpand(true); show_labels_switch.set_vexpand(false); show_labels_switch.set_halign(Gtk::ALIGN_START); show_labels_switch.set_valign(Gtk::ALIGN_CENTER); show_labels_switch.set_active(plot->is_showing_labels()); show_labels_switch.property_active().signal_changed().connect([this, plot](){ if (show_labels_switch.get_active()) { plot->show_labels(); } else { plot->hide_labels(); } }); grid.attach(show_labels_label, 0, row_counter, 1, 1); grid.attach(show_labels_switch, 1, row_counter++, 1, 1); //color button edge_color_label.set_hexpand(true); edge_color_label.set_vexpand(false); edge_color_label.set_valign(Gtk::ALIGN_CENTER); edge_color_label.set_halign(Gtk::ALIGN_END); edge_color.set_rgba(plot->get_edge_color()); edge_color.set_use_alpha(true); edge_color.set_hexpand(true); edge_color.set_vexpand(false); edge_color.set_halign(Gtk::ALIGN_START); edge_color.set_valign(Gtk::ALIGN_CENTER); edge_color.signal_color_set().connect([this, plot](){plot->set_edge_color(edge_color.get_rgba());}); grid.attach(edge_color_label, 0, row_counter, 1, 1); grid.attach(edge_color, 1, row_counter++, 1, 1); //the edge width spinbutton edge_width_label.set_hexpand(true); edge_width_label.set_vexpand(false); edge_width_label.set_valign(Gtk::ALIGN_CENTER); edge_width_label.set_halign(Gtk::ALIGN_END); edge_width_spin.set_hexpand(true); edge_width_spin.set_vexpand(false); edge_width_spin.set_halign(Gtk::ALIGN_START); edge_width_spin.set_valign(Gtk::ALIGN_CENTER); edge_width_spin.set_wrap(true); edge_width_spin.set_snap_to_ticks(true); edge_width_spin.set_numeric(true); edge_width_spin.set_value(plot->get_edge_width()); edge_width_spin.signal_value_changed().connect([this, plot](){ plot->set_edge_width(edge_width_spin.get_value()); }); grid.attach(edge_width_label, 0, row_counter, 1, 1); grid.attach(edge_width_spin, 1, row_counter++, 1, 1); //nlevels nlevels_label.set_hexpand(true); nlevels_label.set_vexpand(false); nlevels_label.set_valign(Gtk::ALIGN_CENTER); nlevels_label.set_halign(Gtk::ALIGN_END); nlevels_spin.set_hexpand(true); nlevels_spin.set_vexpand(false); nlevels_spin.set_halign(Gtk::ALIGN_START); nlevels_spin.set_valign(Gtk::ALIGN_CENTER); nlevels_spin.set_wrap(true); nlevels_spin.set_snap_to_ticks(true); nlevels_spin.set_numeric(true); nlevels_spin.set_value(plot->get_nlevels()); nlevels_spin.signal_value_changed().connect([this, plot](){ plot->set_nlevels(nlevels_spin.get_value()); }); grid.attach(nlevels_label, 0, row_counter, 1, 1); grid.attach(nlevels_spin, 1, row_counter++, 1, 1); // colormap palette colormap_palette_label.set_hexpand(true); colormap_palette_label.set_vexpand(false); colormap_palette_label.set_valign(Gtk::ALIGN_CENTER); colormap_palette_label.set_halign(Gtk::ALIGN_END); colormap_palette_combo.set_hexpand(true); colormap_palette_combo.set_vexpand(false); colormap_palette_combo.set_halign(Gtk::ALIGN_START); colormap_palette_combo.set_valign(Gtk::ALIGN_CENTER); colormap_palette_combo.append("Default"); colormap_palette_combo.append("Blue → Red"); colormap_palette_combo.append("Blue → Yellow"); colormap_palette_combo.append("Gray"); colormap_palette_combo.append("High frequencies"); colormap_palette_combo.append("Low frequencies"); colormap_palette_combo.append("Radar"); colormap_palette_combo.set_active(plot->get_colormap_palette()); colormap_palette_combo.signal_changed().connect([this, plot](){ plot->set_colormap_palette(static_cast<Gtk::PLplot::ColormapPalette>(colormap_palette_combo.get_active_row_number())); }); grid.attach(colormap_palette_label, 0, row_counter, 1, 1); grid.attach(colormap_palette_combo, 1, row_counter++, 1, 1); //area fill pattern area_fill_pattern_label.set_hexpand(true); area_fill_pattern_label.set_vexpand(false); area_fill_pattern_label.set_valign(Gtk::ALIGN_CENTER); area_fill_pattern_label.set_halign(Gtk::ALIGN_END); area_fill_pattern_combo.set_hexpand(true); area_fill_pattern_combo.set_vexpand(false); area_fill_pattern_combo.set_halign(Gtk::ALIGN_START); area_fill_pattern_combo.set_valign(Gtk::ALIGN_CENTER); area_fill_pattern_combo.append("Solid"); area_fill_pattern_combo.append("Horizontal lines"); area_fill_pattern_combo.append("Vertical lines"); area_fill_pattern_combo.append("Upward lines at 45 degrees"); area_fill_pattern_combo.append("Downward lines at 45 degrees"); area_fill_pattern_combo.append("Upward lines at 30 degrees"); area_fill_pattern_combo.append("Downward lines at 30 degrees"); area_fill_pattern_combo.append("Horizontal and vertical lines"); area_fill_pattern_combo.append("Upward and downward lines at 45 degrees"); area_fill_pattern_combo.set_active(plot->get_area_fill_pattern()); area_fill_pattern_combo.signal_changed().connect([this, plot](){ plot->set_area_fill_pattern(static_cast<Gtk::PLplot::AreaFillPattern>(area_fill_pattern_combo.get_active_row_number())); if (area_fill_pattern_combo.get_active_row_number() == 0 /* SOLID */) { area_lines_width_spin.set_sensitive(false); } else { area_lines_width_spin.set_sensitive(); } }); grid.attach(area_fill_pattern_label, 0, row_counter, 1, 1); grid.attach(area_fill_pattern_combo, 1, row_counter++, 1, 1); //the area lines width spinbutton area_lines_width_label.set_hexpand(true); area_lines_width_label.set_vexpand(false); area_lines_width_label.set_valign(Gtk::ALIGN_CENTER); area_lines_width_label.set_halign(Gtk::ALIGN_END); area_lines_width_spin.set_hexpand(true); area_lines_width_spin.set_vexpand(false); area_lines_width_spin.set_halign(Gtk::ALIGN_START); area_lines_width_spin.set_valign(Gtk::ALIGN_CENTER); area_lines_width_spin.set_wrap(true); area_lines_width_spin.set_snap_to_ticks(true); area_lines_width_spin.set_numeric(true); area_lines_width_spin.set_value(plot->get_area_lines_width()); area_lines_width_spin.signal_value_changed().connect([this, plot](){ plot->set_area_lines_width(area_lines_width_spin.get_value()); }); area_lines_width_spin.set_sensitive(false); grid.attach(area_lines_width_label, 0, row_counter, 1, 1); grid.attach(area_lines_width_spin, 1, row_counter++, 1, 1); //colorbar colorbar_label.set_hexpand(true); colorbar_label.set_vexpand(false); colorbar_label.set_valign(Gtk::ALIGN_CENTER); colorbar_label.set_halign(Gtk::ALIGN_END); colorbar_switch.set_hexpand(true); colorbar_switch.set_vexpand(false); colorbar_switch.set_halign(Gtk::ALIGN_START); colorbar_switch.set_valign(Gtk::ALIGN_CENTER); colorbar_switch.set_active(plot->is_showing_colorbar()); colorbar_switch.property_active().signal_changed().connect([this, plot](){ if (colorbar_switch.get_active()) { plot->show_colorbar(); } else { plot->hide_colorbar(); } }); grid.attach(colorbar_label, 0, row_counter, 1, 1); grid.attach(colorbar_switch, 1, row_counter++, 1, 1); paned.add1(grid); //add canvas to grid aspect_frame.add(canvas); paned.add2(aspect_frame); //finishing up add(paned); set_border_width(10); #if GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION >= 18 paned.set_wide_handle(true); #endif paned.show_all(); }
Argument::Argument (const MR::Argument& argument) : arg (argument), description_label (arg.lname) { set_border_width (GUI_SPACING); set_spacing (GUI_SPACING); pack_start (description_label, Gtk::PACK_SHRINK); switch (arg.type) { case Integer: { Gtk::SpinButton* sb = manage (new Gtk::SpinButton); sb->set_value (arg.extra_info.i.def); sb->set_range (arg.extra_info.i.min, arg.extra_info.i.max); sb->set_increments (1, 10); pack_start (*sb); widget = (void*) sb; } break; case Float: { Gtk::SpinButton* sb = manage (new Gtk::SpinButton); sb->set_range (arg.extra_info.f.min, arg.extra_info.f.max); sb->set_increments ( 1e-4 *(arg.extra_info.f.max-arg.extra_info.f.min), 1e-2 *(arg.extra_info.f.max-arg.extra_info.f.min)); sb->set_digits (4); sb->set_value (arg.extra_info.f.def); pack_start (*sb); widget = (void*) sb; } break; case Text: case IntSeq: case FloatSeq: { Gtk::Entry* entry = manage (new Gtk::Entry); pack_start (*entry); widget = (void*) entry; } break; case ArgFile: case ImageIn: case ImageOut: { Gtk::Entry* entry = manage (new Gtk::Entry); Gtk::Button* browse = manage (new Gtk::Button (Gtk::Stock::OPEN)); browse->signal_clicked().connect (sigc::mem_fun (*this, &Argument::on_browse)); pack_start (*entry); pack_start (*browse, Gtk::PACK_SHRINK); widget = (void*) entry; } break; case Choice: { Gtk::ComboBoxText* choice = manage (new Gtk::ComboBoxText); for (const gchar** p = arg.extra_info.choice; *p; p++) choice->append_text (*p); choice->set_active (0); pack_start (*choice); widget = (void*) choice; } break; default: break; } set_tooltip_text (arg.desc); }