I have 2 concerns:
in a page when I click the list item another list with a button is added to grid, but when I press button, the 1st page comes back, but the back button is not removed from grid.
list store items are not shown in full, it is truncated.
How do I show the full list?
#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>
GtkWidget *scrolledwindow;
struct param
{
GtkWidget* grid;
GtkWidget* scrolledwindow;
GtkWidget*newChild;
GtkWidget*oldChild;
};
GtkWidget * init_tree();
GtkWidget * init_tree2();
static void destroy(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
static void Back (GtkButton *button, gpointer user_data)
{
struct param* parameters = (struct param*)user_data;
gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), parameters->oldChild);
gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->newChild);
gtk_grid_remove_row (GTK_GRID (parameters->grid),20);
gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
gtk_widget_show_all (GTK_WIDGET(parameters->grid));
}
static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
struct param* parameters = (struct param*)user_data;
//gtk_grid_insert_row ( GTK_GRID(grid),2);
gtk_container_remove(GTK_CONTAINER(parameters->scrolledwindow), GTK_WIDGET(tree_view));
gtk_container_add(GTK_CONTAINER(parameters->scrolledwindow), parameters->newChild);
GtkWidget *button = gtk_button_new_with_label ("Back");
gtk_grid_attach (GTK_GRID (parameters->grid), button, 0, 20, 2, 2);
parameters->oldChild = parameters->newChild;
parameters->newChild= init_tree();
g_signal_connect (button, "clicked", G_CALLBACK (Back), parameters);
gtk_widget_show_all (GTK_WIDGET(parameters->scrolledwindow));
gtk_widget_show_all (GTK_WIDGET(parameters->grid));
}
GtkWidget * init_tree()
{
GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
GtkTreeIter treeiter;
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Mandriva", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();
GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions",
cellrenderertext,
"text", 0,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);
return treeview;
}
GtkWidget * init_tree2()
{
GtkListStore *liststore = gtk_list_store_new(1, G_TYPE_STRING);
GtkTreeIter treeiter;
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "a", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "b", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "c", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "d", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "e", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "f", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Aptosid", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "OpenSuSE", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Linux Mint", -1);
gtk_list_store_append(liststore, &treeiter);
gtk_list_store_set(liststore, &treeiter, 0, "Arch Linux", -1);
GtkWidget *treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore));
GtkCellRenderer *cellrenderertext = gtk_cell_renderer_text_new();
GtkTreeViewColumn *treeviewcolumn = gtk_tree_view_column_new_with_attributes("Distributions",
cellrenderertext,
"text", 0,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), treeviewcolumn);
return treeview;
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);
GtkWidget *notebook = gtk_notebook_new();
gtk_container_add(GTK_CONTAINER(window), notebook);
int count;
gchar *text;
for (count = 1; count <= 5; count++)
{
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
text = g_strdup_printf("Page %d", count);
GtkWidget *label = gtk_label_new(text);
GtkWidget* grid = gtk_grid_new ();
GtkWidget *scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_set_size_request(scrolledwindow, -1, 200);
gtk_container_add(GTK_CONTAINER(vbox), grid/*scrolledwindow*/);
//gtk_container_add(GTK_CONTAINER(grid), scrolledwindow);
gtk_grid_attach (GTK_GRID (grid), scrolledwindow, 0, 0, 200, 10);
//GtkWidget *textview = gtk_text_view_new();
/* gtk_container_add(GTK_CONTAINER(scrolledwindow), textview); */
GtkWidget* treeview = init_tree();
GtkWidget* treeview2 = init_tree2();
struct param* parameters = malloc(sizeof(struct param));
parameters->scrolledwindow = scrolledwindow;
parameters->grid = grid;
parameters->newChild= treeview2;
g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer)parameters);
gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
}
gtk_widget_show_all(window);
gtk_main();
return 0;
}
First of all, the code is not good but that is not the question, so, to solve the specific problem of implementing a back button while showing a second
treeview
inside the same notebook page you can reuse thevbox
that contains thetreeview
and add a button below it. You must set theno-show-all
property to true and set the show/hide status by yourself. Basically, you want to show it only while showing the secondtreeview
.I've used
GtkBox
pack functions and within the callbacks, show and hide the back button.Try your code with these minor tweaks:
Your Widget packaging its not good. I would suggest you try Glade and use it as a playground to learn about widget placement.
Also learn about GtkStack which would fit this purpose much better and even add "cool" animated transitions.