unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
* G-Golf - Help with ListView needed
@ 2023-03-04  9:09 Michele Lindroos
  2023-03-05  2:35 ` David Pirotte
  2023-03-06  4:07 ` David Pirotte
  0 siblings, 2 replies; 7+ messages in thread
From: Michele Lindroos @ 2023-03-04  9:09 UTC (permalink / raw)
  To: guile-user

Hello Guilers!

I'm trying to learn g-golf. It has been a blast, great technology!
However, the last few days I've tried to get ListView working and now
I'm stuck.

There are plenty of code samples online written in C. I've added at
the bottom of the e-mail a code sample I tried and it works on my
machine as expected. I tried to rewrite the code sample in guile
scheme using g-golf. However, I don't get any elements drawn. Also, I
get no error messages. I don't know where to look for solutions. Have
I failed in translating the C code to scheme? Or is there some other
problem?

Any help is appreciated!

BR,
Michele

$ cat list1.c
#include <gtk/gtk.h>

static void
setup_cb (GtkSignalListItemFactory *self, GtkListItem *listitem,
gpointer user_data) {
  GtkWidget *lb = gtk_label_new (NULL);
  gtk_list_item_set_child (listitem, lb);
  /* Because gtk_list_item_set_child sunk the floating reference of
lb, releasing (unref) isn't necessary for lb. */
}

static void
bind_cb (GtkSignalListItemFactory *self, GtkListItem *listitem,
gpointer user_data) {
  GtkWidget *lb = gtk_list_item_get_child (listitem);
  /* Strobj is owned by the instance. Caller mustn't change or destroy it. */
  GtkStringObject *strobj = gtk_list_item_get_item (listitem);
  /* The string returned by gtk_string_object_get_string is owned by
the instance. */
  gtk_label_set_text (GTK_LABEL (lb), gtk_string_object_get_string (strobj));
}

static void
unbind_cb (GtkSignalListItemFactory *self, GtkListItem *listitem,
gpointer user_data) {
  /* There's nothing to do here. */
}

static void
teardown_cb (GtkSignalListItemFactory *self, GtkListItem *listitem,
gpointer user_data) {
  /* There's nothing to do here. */
  /* GtkListItem instance will be destroyed soon. You don't need to
set the child to NULL. */
}

static void
app_activate (GApplication *application) {
  GtkApplication *app = GTK_APPLICATION (application);
  GtkWidget *win = gtk_application_window_new (app);
  gtk_window_set_default_size (GTK_WINDOW (win), 600, 400);
  GtkWidget *scr = gtk_scrolled_window_new ();
  gtk_window_set_child (GTK_WINDOW (win), scr);

  char *array[] = {
    "one", "two", "three", "four", NULL
  };
  /* sl is owned by ns */
  /* ns and factory are owned by lv. */
  /* Therefore, you don't need to care about their destruction. */
  GtkStringList *sl =  gtk_string_list_new ((const char * const *) array);
  GtkNoSelection *ns =  gtk_no_selection_new (G_LIST_MODEL (sl));

  GtkListItemFactory *factory = gtk_signal_list_item_factory_new ();
  g_signal_connect (factory, "setup", G_CALLBACK (setup_cb), NULL);
  g_signal_connect (factory, "bind", G_CALLBACK (bind_cb), NULL);
  /* The following two lines can be left out. The handlers do nothing. */
  g_signal_connect (factory, "unbind", G_CALLBACK (unbind_cb), NULL);
  g_signal_connect (factory, "teardown", G_CALLBACK (teardown_cb), NULL);

  GtkWidget *lv = gtk_list_view_new (GTK_SELECTION_MODEL (ns), factory);
  gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scr), lv);
  gtk_window_present (GTK_WINDOW (win));
}

/* ----- main ----- */
#define APPLICATION_ID "com.github.ToshioCP.list1"

int
main (int argc, char **argv) {
  GtkApplication *app;
  int stat;

  app = gtk_application_new (APPLICATION_ID, G_APPLICATION_FLAGS_NONE);

  g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);

  stat =g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
  return stat;
}

$ cat gtk-signal-list-item-factory.scm
#! /bin/sh
# -*- mode: scheme; coding: utf-8 -*-
exec guile -e main -s "$0" "$@"
!#

(eval-when (expand load eval)
    (use-modules (oop goops))

    (default-duplicate-binding-handler
        '(merge-generics replace warn-override-core warn last))

    (use-modules (g-golf))

    (g-irepository-require "Gtk" #:version "4.0")

    (for-each (lambda (name)
              (gi-import-by-name "Gdk" name))
        '("Display"))

    (for-each (lambda (name)
              (gi-import-by-name "Gtk" name))
        '("Application"
          "ApplicationWindow"
          "Label"
          "ListView"
          "NoSelection"
          "ScrolledWindow"
          "SignalListItemFactory"
          "StringList"
          "StringObject"))

    (for-each (lambda (name)
              (gi-import-by-name "Gio" name))
        '("ListStore")))

(define (activate app)
  (let* ((display (gdk-display-get-default))
         (window (make <gtk-application-window>
                   #:default-width 600
                   #:default-height 400
                   #:application app))
         (scr (make <gtk-scrolled-window>))

         (array '("one" "two" "three" "four"))

         (sl (make <gtk-string-list>
                #:strings array))
         (ns (make <gtk-no-selection>
                #:model sl))

         (signal-list-item-factory (make <gtk-signal-list-item-factory>))

         (lv (make <gtk-list-view>
                #:model ns
                #:factory signal-list-item-factory)))

    (connect signal-list-item-factory
        'setup
        (lambda (factory item)
            (let* ((lb (make <gtk-label>)))
                (set-child item lb))))
    (connect signal-list-item-factory
        'bind
        (lambda (factory item)
            (let* ((lb (get-child (item)))
                   (obj (get-item (item))))
                (set-label lb (get-string obj)))))

    (set-child window scr)
    (set-child scr lv)
    (show window)))

(define (main args)
  (let ((app (make <gtk-application>
               #:application-id "keele.g-golf.gtk-signal-list-item-factory")))
    (connect app 'activate activate)
    (let ((status (g-application-run app args)))
      (exit status))))



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-03-09 22:08 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-04  9:09 G-Golf - Help with ListView needed Michele Lindroos
2023-03-05  2:35 ` David Pirotte
2023-03-06  4:07 ` David Pirotte
2023-03-06 15:50   ` Michele Lindroos
2023-03-06 22:09     ` David Pirotte
2023-03-07 18:55       ` Michele Lindroos
2023-03-09 22:08         ` David Pirotte

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).