[gnome-builder/wip/gtk4-port] libide/projects: move licenses to IdeTemplateInput



commit 1bb774056d8472b652aeb2f2acf7cd9bf5925fd8
Author: Christian Hergert <chergert redhat com>
Date:   Thu May 26 19:25:47 2022 -0700

    libide/projects: move licenses to IdeTemplateInput

 src/libide/projects/ide-template-input.c           | 46 ++++++++++++++-
 src/libide/projects/ide-template-input.h           |  2 +
 src/libide/projects/libide-projects.gresource.xml  | 19 ++++++
 .../projects/licenses}/agpl_3_full                 |  0
 .../projects/licenses}/agpl_3_short                |  0
 .../projects/licenses}/apache_2_full               |  0
 .../projects/licenses}/apache_2_short              |  0
 .../projects/licenses}/gpl_2_full                  |  0
 .../projects/licenses}/gpl_2_short                 |  0
 .../projects/licenses}/gpl_3_full                  |  0
 .../projects/licenses}/gpl_3_short                 |  0
 .../projects/licenses}/lgpl_2_1_full               |  0
 .../projects/licenses}/lgpl_2_1_short              |  0
 .../projects/licenses}/lgpl_3_full                 |  0
 .../projects/licenses}/lgpl_3_short                |  0
 .../projects/licenses}/mit_x11_full                |  0
 .../projects/licenses}/mit_x11_short               |  0
 .../create-project/create-project.gresource.xml    | 20 -------
 .../create-project/gbp-create-project-widget.c     | 23 ++++++++
 .../create-project/gbp-create-project-widget.ui    | 68 +++++++++++++++++++++-
 20 files changed, 155 insertions(+), 23 deletions(-)
---
diff --git a/src/libide/projects/ide-template-input.c b/src/libide/projects/ide-template-input.c
index 4ebf96b3c..d7af3c35c 100644
--- a/src/libide/projects/ide-template-input.c
+++ b/src/libide/projects/ide-template-input.c
@@ -23,6 +23,7 @@
 #include "config.h"
 
 #include <libpeas/peas.h>
+#include <glib/gi18n.h>
 
 #include "ide-projects-global.h"
 #include "ide-template-input.h"
@@ -31,7 +32,7 @@
 #define DEFAULT_USE_VERSION_CONTROL TRUE
 #define DEFAULT_PROJECT_VERSION "0.1.0"
 #define DEFAULT_LANGUAGE "C"
-#define DEFAULT_LICECNSE_NAME "gpl_3"
+#define DEFAULT_LICECNSE_NAME "GPL-3.0-or-later"
 
 struct _IdeTemplateInput
 {
@@ -39,6 +40,7 @@ struct _IdeTemplateInput
 
   GListStore *templates;
   GtkStringList *languages;
+  GtkStringList *licenses;
 
   GFile *directory;
 
@@ -61,6 +63,7 @@ enum {
   PROP_LANGUAGE,
   PROP_LANGUAGES_MODEL,
   PROP_LICENSE_NAME,
+  PROP_LICENSES_MODEL,
   PROP_NAME,
   PROP_PROJECT_VERSION,
   PROP_TEMPLATE,
@@ -73,6 +76,20 @@ enum {
 G_DEFINE_FINAL_TYPE (IdeTemplateInput, ide_template_input, G_TYPE_OBJECT)
 
 static GParamSpec *properties [N_PROPS];
+static const struct {
+  const char *spdx;
+  const char *short_path;
+  const char *full_path;
+} licenses[] = {
+  { N_("AGPL-3.0-or-later"), "agpl_3_short", "agpl_3_full" },
+  { N_("Apache-2.0"), "apache_2_short", "apache_2_full" },
+  { N_("GPL-2.0-or-later"), "gpl_2_short", "gpl_2_full" },
+  { N_("GPL-3.0-or-later"), "gpl_3_short", "gpl_3_full" },
+  { N_("LGPL-2.1-or-later"), "lgpl_2_1_short", "lgpl_2_1_full" },
+  { N_("LGPL-3.0-or-later"), "lgpl_3_full", "lgpl_3_short" },
+  { N_("MIT"), "mit_x11_short", "mit_x11_full" },
+  { N_("No License"), NULL, NULL },
+};
 
 static char *
 get_template_name (IdeTemplateInput *self)
@@ -210,6 +227,7 @@ ide_template_input_dispose (GObject *object)
   g_clear_object (&self->directory);
   g_clear_object (&self->templates);
   g_clear_object (&self->languages);
+  g_clear_object (&self->licenses);
 
   g_clear_pointer (&self->author, g_free);
   g_clear_pointer (&self->language, g_free);
@@ -275,6 +293,10 @@ ide_template_input_get_property (GObject    *object,
       g_value_set_object (value, self->languages);
       break;
 
+    case PROP_LICENSES_MODEL:
+      g_value_set_object (value, self->licenses);
+      break;
+
     case PROP_USE_VERSION_CONTROL:
       g_value_set_boolean (value, self->use_version_control);
       break;
@@ -390,6 +412,10 @@ ide_template_input_class_init (IdeTemplateInputClass *klass)
     g_param_spec_object ("languages-model", NULL, NULL, G_TYPE_LIST_MODEL,
                          (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_LICENSES_MODEL] =
+    g_param_spec_object ("licenses-model", NULL, NULL, G_TYPE_LIST_MODEL,
+                         (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
   properties [PROP_USE_VERSION_CONTROL] =
     g_param_spec_boolean ("use-version-control", NULL, NULL, DEFAULT_USE_VERSION_CONTROL,
                           (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
@@ -410,6 +436,10 @@ ide_template_input_init (IdeTemplateInput *self)
   self->use_version_control = DEFAULT_USE_VERSION_CONTROL;
   self->templates = g_list_store_new (IDE_TYPE_PROJECT_TEMPLATE);
   self->languages = gtk_string_list_new (NULL);
+  self->licenses = gtk_string_list_new (NULL);
+
+  for (guint i = 0; i < G_N_ELEMENTS (licenses); i++)
+    gtk_string_list_append (self->licenses, g_dgettext (GETTEXT_PACKAGE, licenses[i].spdx));
 }
 
 const char *
@@ -826,3 +856,17 @@ ide_template_input_get_languages_model (IdeTemplateInput *self)
 
   return G_LIST_MODEL (self->languages);
 }
+
+/**
+ * ide_template_input_get_licenses_model:
+ * @self: a #IdeTemplateInput
+ *
+ * Returns: (transfer none): A #GListModel
+ */
+GListModel *
+ide_template_input_get_licenses_model (IdeTemplateInput *self)
+{
+  g_return_val_if_fail (IDE_IS_TEMPLATE_INPUT (self), NULL);
+
+  return G_LIST_MODEL (self->licenses);
+}
diff --git a/src/libide/projects/ide-template-input.h b/src/libide/projects/ide-template-input.h
index 352c6ad28..b4d150497 100644
--- a/src/libide/projects/ide-template-input.h
+++ b/src/libide/projects/ide-template-input.h
@@ -87,6 +87,8 @@ GListModel       *ide_template_input_get_templates_model     (IdeTemplateInput *
 IDE_AVAILABLE_IN_ALL
 GListModel       *ide_template_input_get_languages_model     (IdeTemplateInput *self);
 IDE_AVAILABLE_IN_ALL
+GListModel       *ide_template_input_get_licenses_model      (IdeTemplateInput *self);
+IDE_AVAILABLE_IN_ALL
 TmplScope        *ide_template_input_to_scope                (IdeTemplateInput *self);
 
 G_END_DECLS
diff --git a/src/libide/projects/libide-projects.gresource.xml 
b/src/libide/projects/libide-projects.gresource.xml
new file mode 100644
index 000000000..95815521a
--- /dev/null
+++ b/src/libide/projects/libide-projects.gresource.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/libide-projects">
+    <file>licenses/agpl_3_full</file>
+    <file>licenses/agpl_3_short</file>
+    <file>licenses/apache_2_full</file>
+    <file>licenses/apache_2_short</file>
+    <file>licenses/gpl_2_full</file>
+    <file>licenses/gpl_2_short</file>
+    <file>licenses/gpl_3_full</file>
+    <file>licenses/gpl_3_short</file>
+    <file>licenses/lgpl_2_1_full</file>
+    <file>licenses/lgpl_2_1_short</file>
+    <file>licenses/lgpl_3_full</file>
+    <file>licenses/lgpl_3_short</file>
+    <file>licenses/mit_x11_full</file>
+    <file>licenses/mit_x11_short</file>
+  </gresource>
+</gresources>
diff --git a/src/plugins/create-project/resources/agpl_3_full b/src/libide/projects/licenses/agpl_3_full
similarity index 100%
rename from src/plugins/create-project/resources/agpl_3_full
rename to src/libide/projects/licenses/agpl_3_full
diff --git a/src/plugins/create-project/resources/agpl_3_short b/src/libide/projects/licenses/agpl_3_short
similarity index 100%
rename from src/plugins/create-project/resources/agpl_3_short
rename to src/libide/projects/licenses/agpl_3_short
diff --git a/src/plugins/create-project/resources/apache_2_full b/src/libide/projects/licenses/apache_2_full
similarity index 100%
rename from src/plugins/create-project/resources/apache_2_full
rename to src/libide/projects/licenses/apache_2_full
diff --git a/src/plugins/create-project/resources/apache_2_short b/src/libide/projects/licenses/apache_2_short
similarity index 100%
rename from src/plugins/create-project/resources/apache_2_short
rename to src/libide/projects/licenses/apache_2_short
diff --git a/src/plugins/create-project/resources/gpl_2_full b/src/libide/projects/licenses/gpl_2_full
similarity index 100%
rename from src/plugins/create-project/resources/gpl_2_full
rename to src/libide/projects/licenses/gpl_2_full
diff --git a/src/plugins/create-project/resources/gpl_2_short b/src/libide/projects/licenses/gpl_2_short
similarity index 100%
rename from src/plugins/create-project/resources/gpl_2_short
rename to src/libide/projects/licenses/gpl_2_short
diff --git a/src/plugins/create-project/resources/gpl_3_full b/src/libide/projects/licenses/gpl_3_full
similarity index 100%
rename from src/plugins/create-project/resources/gpl_3_full
rename to src/libide/projects/licenses/gpl_3_full
diff --git a/src/plugins/create-project/resources/gpl_3_short b/src/libide/projects/licenses/gpl_3_short
similarity index 100%
rename from src/plugins/create-project/resources/gpl_3_short
rename to src/libide/projects/licenses/gpl_3_short
diff --git a/src/plugins/create-project/resources/lgpl_2_1_full b/src/libide/projects/licenses/lgpl_2_1_full
similarity index 100%
rename from src/plugins/create-project/resources/lgpl_2_1_full
rename to src/libide/projects/licenses/lgpl_2_1_full
diff --git a/src/plugins/create-project/resources/lgpl_2_1_short b/src/libide/projects/licenses/lgpl_2_1_short
similarity index 100%
rename from src/plugins/create-project/resources/lgpl_2_1_short
rename to src/libide/projects/licenses/lgpl_2_1_short
diff --git a/src/plugins/create-project/resources/lgpl_3_full b/src/libide/projects/licenses/lgpl_3_full
similarity index 100%
rename from src/plugins/create-project/resources/lgpl_3_full
rename to src/libide/projects/licenses/lgpl_3_full
diff --git a/src/plugins/create-project/resources/lgpl_3_short b/src/libide/projects/licenses/lgpl_3_short
similarity index 100%
rename from src/plugins/create-project/resources/lgpl_3_short
rename to src/libide/projects/licenses/lgpl_3_short
diff --git a/src/plugins/create-project/resources/mit_x11_full b/src/libide/projects/licenses/mit_x11_full
similarity index 100%
rename from src/plugins/create-project/resources/mit_x11_full
rename to src/libide/projects/licenses/mit_x11_full
diff --git a/src/plugins/create-project/resources/mit_x11_short b/src/libide/projects/licenses/mit_x11_short
similarity index 100%
rename from src/plugins/create-project/resources/mit_x11_short
rename to src/libide/projects/licenses/mit_x11_short
diff --git a/src/plugins/create-project/create-project.gresource.xml 
b/src/plugins/create-project/create-project.gresource.xml
index 65f7c7f82..a886a1cf6 100644
--- a/src/plugins/create-project/create-project.gresource.xml
+++ b/src/plugins/create-project/create-project.gresource.xml
@@ -7,24 +7,4 @@
     <file>create-project.plugin</file>
     <file>themes/shared.css</file>
   </gresource>
-
-  <gresource prefix="/plugins/create-project/license/full">
-    <file compressed="true" alias="agpl_3">resources/agpl_3_full</file>
-    <file compressed="true" alias="apache_2">resources/apache_2_full</file>
-    <file compressed="true" alias="gpl_2">resources/gpl_2_full</file>
-    <file compressed="true" alias="gpl_3">resources/gpl_3_full</file>
-    <file compressed="true" alias="lgpl_2_1">resources/lgpl_2_1_full</file>
-    <file compressed="true" alias="lgpl_3">resources/lgpl_3_full</file>
-    <file compressed="true" alias="mit_x11">resources/mit_x11_full</file>
-  </gresource>
-
-  <gresource prefix="/plugins/create-project/license/short">
-    <file compressed="true" alias="agpl_3">resources/agpl_3_short</file>
-    <file compressed="true" alias="apache_2">resources/apache_2_short</file>
-    <file compressed="true" alias="gpl_2">resources/gpl_2_short</file>
-    <file compressed="true" alias="gpl_3">resources/gpl_3_short</file>
-    <file compressed="true" alias="lgpl_2_1">resources/lgpl_2_1_short</file>
-    <file compressed="true" alias="lgpl_3">resources/lgpl_3_short</file>
-    <file compressed="true" alias="mit_x11">resources/mit_x11_short</file>
-  </gresource>
 </gresources>
diff --git a/src/plugins/create-project/gbp-create-project-widget.c 
b/src/plugins/create-project/gbp-create-project-widget.c
index 15e9b18d5..ade18f44c 100644
--- a/src/plugins/create-project/gbp-create-project-widget.c
+++ b/src/plugins/create-project/gbp-create-project-widget.c
@@ -41,6 +41,7 @@ struct _GbpCreateProjectWidget
   AdwEntryRow      *location;
   GtkMenuButton    *template_button;
   GtkMenuButton    *language_button;
+  GtkMenuButton    *licenses_button;
 };
 
 enum {
@@ -102,6 +103,26 @@ language_activated_cb (GbpCreateProjectWidget *self,
                                    gtk_string_object_get_string (string));
 }
 
+static void
+license_activated_cb (GbpCreateProjectWidget *self,
+                      guint                   position,
+                      GtkListView            *list_view)
+{
+  g_autoptr(GtkStringObject) string = NULL;
+  GListModel *model;
+
+  g_assert (GBP_IS_CREATE_PROJECT_WIDGET (self));
+  g_assert (GTK_IS_LIST_VIEW (list_view));
+
+  model = G_LIST_MODEL (gtk_list_view_get_model (list_view));
+  string = g_list_model_get_item (model, position);
+
+  gtk_menu_button_popdown (self->licenses_button);
+
+  ide_template_input_set_license_name (self->input,
+                                       gtk_string_object_get_string (string));
+}
+
 static void
 on_location_changed_cb (GbpCreateProjectWidget *self,
                         GtkEditable            *editable)
@@ -217,10 +238,12 @@ gbp_create_project_widget_class_init (GbpCreateProjectWidgetClass *klass)
   gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, location);
   gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, main);
   gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, language_button);
+  gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, licenses_button);
   gtk_widget_class_bind_template_child (widget_class, GbpCreateProjectWidget, template_button);
 
   gtk_widget_class_bind_template_callback (widget_class, template_activated_cb);
   gtk_widget_class_bind_template_callback (widget_class, language_activated_cb);
+  gtk_widget_class_bind_template_callback (widget_class, license_activated_cb);
 
   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
 
diff --git a/src/plugins/create-project/gbp-create-project-widget.ui 
b/src/plugins/create-project/gbp-create-project-widget.ui
index 35761723d..98d82782d 100644
--- a/src/plugins/create-project/gbp-create-project-widget.ui
+++ b/src/plugins/create-project/gbp-create-project-widget.ui
@@ -171,12 +171,76 @@
                   <object class="AdwActionRow">
                     <property name="title" translatable="yes">License</property>
                     <child type="suffix">
-                      <object class="GtkMenuButton">
+                      <object class="GtkMenuButton" id="licenses_button">
                         <property name="valign">center</property>
-                        <property name="label">GPLv3+</property>
+                        <property name="label" bind-source="input" bind-property="license-name" 
bind-flags="sync-create"/>
                         <style>
                           <class name="flat"/>
                         </style>
+                        <property name="popover">
+                          <object class="GtkPopover">
+                            <child>
+                              <object class="GtkFrame">
+                                <property name="margin-bottom">6</property>
+                                <property name="margin-end">6</property>
+                                <property name="margin-start">6</property>
+                                <property name="margin-top">6</property>
+                                <child>
+                                  <object class="GtkScrolledWindow">
+                                    <property name="propagate-natural-height">true</property>
+                                    <property name="propagate-natural-width">true</property>
+                                    <property name="min-content-width">200</property>
+                                    <property name="min-content-height">200</property>
+                                    <child>
+                                      <object class="GtkListView">
+                                        <signal name="activate" handler="license_activated_cb" 
swapped="true" object="GbpCreateProjectWidget"/>
+                                        <property name="model">
+                                          <object class="GtkSingleSelection">
+                                            <property name="model" bind-source="input" 
bind-property="licenses-model" bind-flags="sync-create"/>
+                                          </object>
+                                        </property>
+                                        <property name="orientation">vertical</property>
+                                        <property name="single-click-activate">true</property>
+                                        <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="spacing">6</property>
+        <property name="margin-top">6</property>
+        <property name="margin-bottom">6</property>
+        <property name="margin-start">6</property>
+        <property name="margin-end">6</property>
+        <child>
+          <object class="GtkLabel">
+            <property name="xalign">0</property>
+            <property name="hexpand">true</property>
+            <binding name="label">
+              <lookup name="string" type="GtkStringObject">
+                <lookup name="item">GtkListItem</lookup>
+              </lookup>
+            </binding>
+          </object>
+        </child>
+      </object>
+    </property>
+  </template>
+</interface>
+]]>
+                                            </property>
+                                          </object>
+                                        </property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                        </property>
                       </object>
                     </child>
                   </object>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]