Prechádzať zdrojové kódy

Ajout d'un listview fonctionnel avec un GtkDirectoryList transitoire

vetetix 2 mesiacov pred
rodič
commit
de2716b973
2 zmenil súbory, kde vykonal 99 pridanie a 17 odobranie
  1. 43 12
      src/oupis-window.c
  2. 56 5
      src/oupis-window.ui

+ 43 - 12
src/oupis-window.c

@@ -28,7 +28,10 @@ struct _OupisWindow
 
   /* Template widgets */
   GtkSearchEntry      *searchentry;
-  GtkLabel            *label;
+  GtkScrolledWindow   *scrolledwindow;
+  GtkListView         *listview;
+  GtkSingleSelection  *singleselection;
+  GtkDirectoryList    *directorylist;
 };
 
 G_DEFINE_FINAL_TYPE (OupisWindow, oupis_window, ADW_TYPE_APPLICATION_WINDOW)
@@ -42,6 +45,28 @@ oupis_window__search_request (GtkSearchEntry *self,
   g_print ("%s\n", request);
 }
 
+static void
+listview_activate (GtkListView *listview, int position, gpointer user_data) {
+  GFileInfo *info = G_FILE_INFO (g_list_model_get_item (G_LIST_MODEL (gtk_list_view_get_model (listview)), position));
+  //TODO do something with info
+  g_object_unref (info);
+}
+
+
+static GIcon *
+get_icon (GtkListItem *item, GFileInfo *info) {
+  GIcon *icon;
+   /* g_file_info_get_icon can return NULL */
+  icon = G_IS_FILE_INFO (info) ? g_file_info_get_icon (info) : NULL;
+  return icon ? g_object_ref (icon) : NULL;
+}
+
+
+static char *
+get_file_name (GtkListItem *item, GFileInfo *info) {
+  return G_IS_FILE_INFO (info) ? g_strdup (g_file_info_get_name (info)) : NULL;
+}
+
 static void
 oupis_window_class_init (OupisWindowClass *klass)
 {
@@ -49,20 +74,26 @@ oupis_window_class_init (OupisWindowClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, "/lu/arnoux/Oupis/oupis-window.ui");
   gtk_widget_class_bind_template_child (widget_class, OupisWindow, searchentry);
-  gtk_widget_class_bind_template_child (widget_class, OupisWindow, label);
+  gtk_widget_class_bind_template_child (widget_class, OupisWindow, scrolledwindow);
+  gtk_widget_class_bind_template_child (widget_class, OupisWindow, listview);
+  gtk_widget_class_bind_template_child (widget_class, OupisWindow, singleselection);
+  gtk_widget_class_bind_template_child (widget_class, OupisWindow, directorylist);
 
   gtk_widget_class_bind_template_callback (widget_class, oupis_window__search_request);
+  gtk_widget_class_bind_template_callback (widget_class, listview_activate);
+  gtk_widget_class_bind_template_callback (widget_class, get_icon);
+  gtk_widget_class_bind_template_callback (widget_class, get_file_name);
+
 }
 
-static void
-oupis_window_init (OupisWindow *self)
-{
-  gtk_widget_init_template (GTK_WIDGET (self) );
+  static void
+  oupis_window_init (OupisWindow *self)
+  {
+    GFile *file;
 
-  //GtkSearchEntry *searchentry = GTK_SEARCH_ENTRY (self->searchentry);
-  //g_signal_connect (searchentry,
-  //                 "activate",
-  //                  G_CALLBACK (oupis_window__search_request),
-  //                  self);
+    gtk_widget_init_template (GTK_WIDGET (self) );
 
-}
+    file = g_file_new_for_path (".");
+    gtk_directory_list_set_file (GTK_DIRECTORY_LIST (self->directorylist), file);
+    g_object_unref (file);
+  }

+ 56 - 5
src/oupis-window.ui

@@ -28,11 +28,62 @@
           </object>
         </child>
         <property name="content">
-          <object class="GtkLabel" id="label">
-            <property name="label" translatable="yes">Hello, World!</property>
-            <style>
-              <class name="title-1"/>
-            </style>
+          <object class="GtkScrolledWindow" id="scrolledwindow">
+            <property name="hexpand" >TRUE</property>
+            <property name="vexpand" >TRUE</property>
+            <child>
+              <object class="GtkListView" id="listview">
+                <property name="model">
+                  <object class="GtkSingleSelection" id="singleselection">
+                    <property name="model">
+                      <object class="GtkDirectoryList" id="directorylist">
+                        <property name="attributes">standard::name,standard::icon,standard::content-type</property>
+                      </object>
+                    </property>
+                  </object>
+                </property>
+                <signal name="activate" handler="listview_activate"/>
+                <property name="factory">
+                  <object class="GtkBuilderListItemFactory">
+                    <property name="bytes">
+<![CDATA[
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="GtkListItem">
+    <property name="child">
+      <object class="GtkBox">
+        <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
+        <property name="spacing">20</property>
+        <child>
+          <object class="GtkImage">
+            <binding name="gicon">
+              <closure type="GIcon" function="get_icon">
+                <lookup name="item">GtkListItem</lookup>
+              </closure>
+            </binding>
+          </object>
+        </child>
+        <child>
+          <object class="GtkLabel">
+            <property name="hexpand">TRUE</property>
+            <property name="xalign">0</property>
+            <binding name="label">
+              <closure type="gchararray" function="get_file_name">
+                <lookup name="item">GtkListItem</lookup>
+              </closure>
+            </binding>
+          </object>
+        </child>
+      </object>
+    </property>
+  </template>
+</interface>
+]]>
+                    </property>
+                  </object>
+                </property>
+              </object>
+            </child>
           </object>
         </property>
       </object>