Entry box in ColumnView table column header?

is it possible add
Entry box into ColumnView table column header?

Hi,
You can use Gtk.ColumnView.set_header_factory to generate the headers widget. Probably a Gtk.Entry in your case.

Thanks for reply, but I am not able make working sample for this method, can you help me?

What is wrong on this code:

#include <gtkmm.h>
#include

// Custom Gtk::ListItemFactory for the header
class HeaderFactory : public Gtk::SignalListItemFactory {
public:
    HeaderFactory() {
        signal_setup().connect([ ](const Glib::RefPtr<Gtk::ListItem>& list_item) {
            // Use Gtk::make_managed for the box and its children.
            // set_child() internally knows how to work with a Glib::RefPtr-managed object.
            auto box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
            box->append(*Gtk::make_managed<Gtk::Label>());
            box->append(*Gtk::make_managed<Gtk::Image>());

            list_item->set_child(*box);
        });

        signal_bind().connect([](const Glib::RefPtr<Gtk::ListItem>& list_item) {
            auto header_widget = dynamic_cast<Gtk::Box*>(list_item->get_child());
            if (!header_widget) return;

            auto item = list_item->get_item();
            auto column_view_column = dynamic_cast<Gtk::ColumnViewColumn*>(item.get());
            if (!column_view_column) return;

            auto children = header_widget->get_children();
            if (children.empty()) return;

            auto label = dynamic_cast<Gtk::Label*>(children[0]);
            auto image = dynamic_cast<Gtk::Image*>(children[1]);

            if (label && image) {
                label->set_text(column_view_column->get_title());
                if (column_view_column->get_title() == "Primary Key") {
                    image->set_from_icon_name("object-select-symbolic");
                } else {
                    image->set_from_icon_name("");
                }
           }
        });
    }
};

class ExampleWindow : public Gtk::ApplicationWindow {
public:
    ExampleWindow(BaseObjectType* cobj, const Glib::RefPtr<Gtk::Builder>& refBuilder);

private:
    Gtk::ColumnView\* m_column_view;
};

ExampleWindow::ExampleWindow(BaseObjectType* cobj, const Glib::RefPtr<Gtk::Builder>& refBuilder)
    : Gtk::ApplicationWindow(cobj)
{
    m_column_view = refBuilder->get_widget<Gtk::ColumnView>(“column_view”);

    auto list_model = Gtk::StringList::create();
    list_model->append("0");
    list_model->append("1");
    list_model->append("2");

    auto selection_model = Gtk::NoSelection::create(list_model);
    m_column_view->set_model(selection_model);

    auto primary_key_factory = Gtk::SignalListItemFactory::create();
    auto apple_factory = Gtk::SignalListItemFactory::create();
    auto banana_factory = Gtk::SignalListItemFactory::create();

    auto setup_func = [](const Glib::RefPtr<Gtk::ListItem>& list_item) {
        list_item->set_child(*Gtk::make_managed<Gtk::Label>());
    };

    primary_key_factory->signal_setup().connect(setup_func);
    apple_factory->signal_setup().connect(setup_func);
    banana_factory->signal_setup().connect(setup_func);
 
    primary_key_factory->signal_bind().connect([](const Glib::RefPtr<Gtk::ListItem>& list_item) {
        auto label = dynamic_cast<Gtk::Label*>(list_item->get_child());
        if (!label) return;
        auto string_object = dynamic_cast<Gtk::StringObject*>(list_item->get_item().get());
        if (!string_object) return;
        label->set_label(string_object->get_string());
    });

    // ... (Remaining bind functions)

    auto header_factory = Glib::make_refptr_for_instance<HeaderFactory>(new HeaderFactory());
    m_column_view->set_header_factory(header_factory);

    m_column_view->append_column(Gtk::ColumnViewColumn::create("Primary Key", primary_key_factory));
    m_column_view->append_column(Gtk::ColumnViewColumn::create("Apple", apple_factory));
    m_column_view->append_column(Gtk::ColumnViewColumn::create("Banana", banana_factory));
}
int main(int argc, char** argv) {
    auto application = Gtk::Application::create(“org.gtkmm.example”);

    application->signal_activate().connect([&application]() {
         auto builder = Gtk::Builder::create_from_file("columnview.ui");
         auto window = Gtk::Builder::get_widget_derived<ExampleWindow>(builder, "example_window");
 
         if (window) {
             application->add_window(*window);
            window->show();
         }
    });
 
    return application->run(argc, argv);
}

this work for me:

#include <gtkmm.h>
#include

class MyWindow : public Gtk::Window
{
public:
MyWindow();

protected:
void on_button_click();

private:
Gtk::Box m_main_box;
Gtk::Button m_button;
Gtk::ScrolledWindow m_scrolled_window;
Gtk::TreeView m_tree_view;

// Model dat
class ModelColumns : public Gtk::TreeModel::ColumnRecord
{
public:
    ModelColumns()
    {
        add(m_col_number);
        add(m_col_description);
    }

    Gtk::TreeModelColumn<Glib::ustring> m_col_number;
    Gtk::TreeModelColumn<Glib::ustring> m_col_description;
};

ModelColumns m_columns;

};

MyWindow::MyWindow() :
m_main_box(Gtk::Orientation::VERTICAL, 5),
m_button(“Zavřít”)
{
set_title(“Příklad Gtk::TreeView”);
set_default_size(400, 300);
set_child(m_main_box);

// Vytvoření a nastavení modelu
auto ref_list_store = Gtk::ListStore::create(m_columns);
m_tree_view.set_model(ref_list_store);

// Přidání dat do modelu
Gtk::TreeIter iter = ref_list_store->append();
iter->set_value(m_columns.m_col_number, Glib::ustring("101"));
iter->set_value(m_columns.m_col_description, Glib::ustring("PrvnĂ­ poloĹľka"));

iter = ref_list_store->append();
iter->set_value(m_columns.m_col_number, Glib::ustring("102"));
iter->set_value(m_columns.m_col_description, Glib::ustring("Druhá položka"));

iter = ref_list_store->append();
iter->set_value(m_columns.m_col_number, Glib::ustring("103"));
iter->set_value(m_columns.m_col_description, Glib::ustring("Třetí položka"));

// Vytvoření vlastního widgetu pro záhlaví sloupce
auto header_box = Gtk::manage(new Gtk::Box(Gtk::Orientation::VERTICAL, 5));
auto header_entry = Gtk::manage(new Gtk::Entry());
auto header_label = Gtk::manage(new Gtk::Label("ID PoloĹľky"));
header_box->append(*header_label);
header_box->append(*header_entry);

// Vytvoření sloupce TreeView
auto column = Gtk::manage(new Gtk::TreeViewColumn());

// Nastavení vlastního widgetu jako záhlaví sloupce
column->set_widget(*header_box);

// Přidání rendereru pro text
auto renderer_text = Gtk::manage(new Gtk::CellRendererText());
column->pack_start(*renderer_text, true);
column->add_attribute(*renderer_text, "text", m_columns.m_col_number);

m_tree_view.append_column(*column);

// Vytvoření druhého sloupce pro popis
auto renderer_description = Gtk::manage(new Gtk::CellRendererText());
auto column_description = Gtk::manage(new Gtk::TreeViewColumn("Popis", *renderer_description));
column_description->add_attribute(*renderer_description, "text", m_columns.m_col_description);
m_tree_view.append_column(*column_description);

m_scrolled_window.set_child(m_tree_view);
m_scrolled_window.set_vexpand(true);

m_main_box.append(m_scrolled_window);
m_main_box.append(m_button);

m_button.signal_clicked().connect(sigc::mem_fun(*this, &MyWindow::on_button_click));

}

void MyWindow::on_button_click()
{
close();
}

int main(int argc, char* argv)
{
auto app = Gtk::Application::create(“org.gtkmm.example”);
return app->make_window_and_run(argc, argv);
}

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.