diff --git a/Gtk4/gtk148_listview/src/MainWin.cpp b/Gtk4/gtk148_listview/src/MainWin.cpp index 1bb7bad..4c6f4f7 100644 --- a/Gtk4/gtk148_listview/src/MainWin.cpp +++ b/Gtk4/gtk148_listview/src/MainWin.cpp @@ -1,30 +1,37 @@ #include "MainWin.h" #include "MyItem.h" -struct _MainWin{ +struct _MainWin +{ GtkApplicationWindow parent_instance; GListModel *model; GtkWidget *view; GtkListItemFactory *factory; GtkSingleSelection *selection; + GtkWidget *main_box; + GtkWidget *scrolled_window; + GtkWidget *btn_add, *btn_remove, *btn_remove_all; + GtkWidget *entry_add; }; G_DEFINE_TYPE(MainWin, main_win, GTK_TYPE_APPLICATION_WINDOW) -static void setup_list_item(GtkListItemFactory *factory, GtkListItem *item){ +static void setup_list_item(GtkListItemFactory *factory, GtkListItem *item) +{ // Create label to show list item GtkWidget *label; label = gtk_label_new(" "); gtk_list_item_set_child(item, label); } -static void bind_list_item(GtkListItemFactory *factory, GtkListItem *item){ +static void bind_list_item(GtkListItemFactory *factory, GtkListItem *item) +{ // Get child for list item GtkWidget *label; label = gtk_list_item_get_child(item); // Get string - MyItem *item1 = (MyItem*)gtk_list_item_get_item(item); + MyItem *item1 = (MyItem *)gtk_list_item_get_item(item); GString *string = my_item_get_string(item1); gtk_label_set_label(GTK_LABEL(label), string->str); // g_string_free(string, TRUE); @@ -45,12 +52,44 @@ static GListModel *create_list_model() return G_LIST_MODEL(store); } -static void main_win_dispose(GObject *object){ +static void btnadd_clicked(GtkWidget *widget, MainWin *win) +{ + // Add a item to the store + GListModel *model = win->model; + GtkWidget *entry = win->entry_add; + + // Get text to add + const gchar *str = gtk_editable_get_text(GTK_EDITABLE(entry)); + + // Add item to store + g_list_store_append(G_LIST_STORE(model), my_item_new(str)); +} + +static void btnremove_clicked(GtkWidget *widget, MainWin *win){ + // Get the position of selected item + GtkSingleSelection *selection = win->selection; + guint position = gtk_single_selection_get_selected(selection); + + // Remove selected item + GListStore *store = G_LIST_STORE(win->model); + g_list_store_remove(store, position); +} + +static void btnremove_all_clicked(GtkWidget *widget, MainWin *win){ + // Remove all data from store + GListModel *model = win->model; + g_list_store_remove_all(G_LIST_STORE(model)); +} + +static void main_win_dispose(GObject *object) +{ // Clear List Model + g_list_store_remove_all(G_LIST_STORE(MAIN_WIN(object)->model)); G_OBJECT_CLASS(main_win_parent_class)->dispose(object); } -static void main_win_init(MainWin *self){ +static void main_win_init(MainWin *self) +{ // Initalize window gtk_window_set_icon_name(GTK_WINDOW(self), "org.gtk.daleclack"); gtk_window_set_default_size(GTK_WINDOW(self), 640, 360); @@ -66,13 +105,40 @@ static void main_win_init(MainWin *self){ // Create view self->selection = gtk_single_selection_new(self->model); self->view = gtk_list_view_new(GTK_SELECTION_MODEL(self->selection), self->factory); - gtk_window_set_child(GTK_WINDOW(self), self->view); + + // Create widgets for layout + self->main_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); + self->entry_add = gtk_entry_new(); + self->btn_add = gtk_button_new_with_label("Add Item"); + self->btn_remove = gtk_button_new_with_label("Remove Item"); + self->btn_remove_all = gtk_button_new_with_label("Remove All Item"); + self->scrolled_window = gtk_scrolled_window_new(); + + // Link signals + g_signal_connect(self->btn_add, "clicked", G_CALLBACK(btnadd_clicked), self); + g_signal_connect(self->btn_remove, "clicked", G_CALLBACK(btnremove_clicked), self); + g_signal_connect(self->btn_remove_all, "clicked", G_CALLBACK(btnremove_all_clicked), self); + + // Add widgets to the layout + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(self->scrolled_window), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_widget_set_hexpand(self->scrolled_window, TRUE); + gtk_widget_set_vexpand(self->scrolled_window, TRUE); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(self->scrolled_window), self->view); + gtk_box_append(GTK_BOX(self->main_box), self->scrolled_window); + gtk_box_append(GTK_BOX(self->main_box), self->entry_add); + gtk_box_append(GTK_BOX(self->main_box), self->btn_add); + gtk_box_append(GTK_BOX(self->main_box), self->btn_remove); + gtk_box_append(GTK_BOX(self->main_box), self->btn_remove_all); + gtk_window_set_child(GTK_WINDOW(self), self->main_box); } -static void main_win_class_init(MainWinClass *klass){ +static void main_win_class_init(MainWinClass *klass) +{ G_OBJECT_CLASS(klass)->dispose = main_win_dispose; } -MainWin *main_win_new(GtkApplication *app){ +MainWin *main_win_new(GtkApplication *app) +{ return MAIN_WIN(g_object_new(main_win_get_type(), "application", app, NULL)); }