The dropdown menu may contain an Entry
that allows
to search for items in the list. Call set_enable_search()
and set_expression()
. For instance:
m_DropDown.set_enable_search(true);
auto expression = Gtk::ClosureExpression<Glib::ustring>::create(
sigc::mem_fun(*this, &ExampleWindow::get_col_name));
m_DropDown.set_expression(expression);
//-------
Glib::ustring ExampleWindow::get_col_name(const Glib::RefPtr<Glib::ObjectBase>& item)
{
const auto col = std::dynamic_pointer_cast<ModelColumns>(item);
return col ? col->m_col_name : "";
}
File: examplewindow.h
(For use with gtkmm 4)
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm/window.h>
#include <gtkmm/dropdown.h>
#include <gtkmm/stringlist.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
~ExampleWindow() override;
protected:
// Signal handler:
void on_dropdown_changed();
// Child widget:
Gtk::DropDown m_DropDown;
Glib::RefPtr<Gtk::StringList> m_StringList;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
(For use with gtkmm 4)
#include "examplewindow.h"
#include <gtkmm/expression.h>
#include <gtkmm/stringobject.h>
#include <iostream>
ExampleWindow::ExampleWindow()
{
set_title("Searchable DropDown example");
set_child(m_DropDown);
// Fill the dropdown:
const std::vector<Glib::ustring> many_times{
"1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes",
"25 minutes", "30 minutes", "35 minutes", "40 minutes", "45 minutes", "50 minutes",
"55 minutes", "1 hour", "2 hours", "3 hours", "5 hours", "6 hours", "7 hours",
"8 hours", "9 hours", "10 hours", "11 hours", "12 hours"
};
m_StringList = Gtk::StringList::create(many_times);
m_DropDown.set_model(m_StringList);
m_DropDown.set_selected(0);
// Show a search entry.
m_DropDown.set_enable_search(true);
auto expression = Gtk::ClosureExpression<Glib::ustring>::create(
[](const Glib::RefPtr<Glib::ObjectBase>& item)->Glib::ustring
{
// An item in a StringList is a StringObject.
const auto string_object = std::dynamic_pointer_cast<Gtk::StringObject>(item);
return string_object ? string_object->get_string() : "";
});
m_DropDown.set_expression(expression);
// Connect signal handler:
m_DropDown.property_selected().signal_changed().connect(
sigc::mem_fun(*this, &ExampleWindow::on_dropdown_changed));
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_dropdown_changed()
{
const auto selected = m_DropDown.get_selected();
std::cout << "DropDown changed: Row=" << selected
<< ", String=" << m_StringList->get_string(selected) << std::endl;
}
File: main.cc
(For use with gtkmm 4)
#include "examplewindow.h"
#include <gtkmm/application.h>
int main(int argc, char* argv[])
{
auto app = Gtk::Application::create("org.gtkmm.example");
// Shows the window and returns when it is closed.
return app->make_window_and_run<ExampleWindow>(argc, argv);
}
This example uses a Pango::FontMap
as its model.
This is possible because Pango::FontMap
implements
the Gio::ListModel
interface. Of course you can use a
FontDialogButton
instead.
File: examplewindow.h
(For use with gtkmm 4)
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H
#include <gtkmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow();
~ExampleWindow() override;
protected:
// Signal handler:
void on_dropdown_changed();
Glib::ustring get_family_name(const Glib::RefPtr<Glib::ObjectBase>& item);
// Child widget:
Gtk::DropDown m_DropDown;
};
#endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc
(For use with gtkmm 4)
#include "examplewindow.h"
#include <pangomm/cairofontmap.h>
#include <iostream>
//#include <typeinfo>
ExampleWindow::ExampleWindow()
{
set_title("Searchable DropDown example");
// Add the DropDown to the window.
set_child(m_DropDown);
// Show a search entry.
m_DropDown.set_enable_search(true);
auto expression = Gtk::ClosureExpression<Glib::ustring>::create(
sigc::mem_fun(*this, &ExampleWindow::get_family_name));
m_DropDown.set_expression(expression);
// Pango::FontMap is a Gio::ListModel.
auto model = Pango::CairoFontMap::get_default();
m_DropDown.set_model(model);
m_DropDown.set_selected(0);
// Connect signal handler.
m_DropDown.property_selected().signal_changed().connect(
sigc::mem_fun(*this, &ExampleWindow::on_dropdown_changed));
}
ExampleWindow::~ExampleWindow()
{
}
void ExampleWindow::on_dropdown_changed()
{
const auto selected = m_DropDown.get_selected();
const auto item = m_DropDown.get_selected_item();
std::cout << "DropDown changed: Row=" << selected
<< ", Font=" << get_family_name(item) << std::endl;
// Pango::FontMap is often a list of items of type Pango::FontFamily.
// From the description of Pango::CairoFontMap: "The actual type of the font map
// will depend on the particular font technology Cairo was compiled to use."
// If get_family_name() does not return a family name, you can add
// #include <typeinfo> and query the type of the items with:
// std::cout << typeid(*item.get()).name() << std::endl;
}
Glib::ustring ExampleWindow::get_family_name(const Glib::RefPtr<Glib::ObjectBase>& item)
{
auto family = std::dynamic_pointer_cast<Pango::FontFamily>(item);
return family ? family->get_name() : "";
}
File: main.cc
(For use with gtkmm 4)
#include "examplewindow.h"
#include <gtkmm/application.h>
int main(int argc, char* argv[])
{
auto app = Gtk::Application::create("org.gtkmm.example");
// Shows the window and returns when it is closed.
return app->make_window_and_run<ExampleWindow>(argc, argv);
}