[gtranslator/dl-integration: 9/18] dl-integration: New API, domains & branches, save selected values
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtranslator/dl-integration: 9/18] dl-integration: New API, domains & branches, save selected values
- Date: Sat, 23 Mar 2019 09:28:04 +0000 (UTC)
commit ba4b58433acd19fd3fb22ac4f2038b98672fedc3
Author: Teja Cetinski <teja cetinski eu>
Date: Fri Jan 18 17:16:24 2019 +0100
dl-integration: New API, domains & branches, save selected values
Update API endpoints and JSON parsing code. Add combo boxes for domains
and branches, load values on module select. Add changed signal on all
combo boxes, add function to save selected values. Refactor/restyle code,
update comments and todos.
src/gtr-dl-teams.c | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 176 insertions(+), 8 deletions(-)
---
diff --git a/src/gtr-dl-teams.c b/src/gtr-dl-teams.c
index ef7f9d42..fbbec8d3 100644
--- a/src/gtr-dl-teams.c
+++ b/src/gtr-dl-teams.c
@@ -35,11 +35,21 @@ typedef struct
GtkWidget *main_box;
GtkWidget *open_button;
GtkWidget *dl_button;
+
GtkWidget *teams_combobox;
GtkWidget *modules_combobox;
+ GtkWidget *domains_combobox;
+ GtkWidget *branches_combobox;
GtkListStore *teams_store;
GtkListStore *modules_store;
+ GtkListStore *domains_store;
+ GtkListStore *branches_store;
+
+ gchar *selected_team;
+ gchar *selected_module;
+ gchar *selected_branch;
+ gchar *selected_domain;
GtrWindow *main_window;
} GtrDlTeamsPrivate;
@@ -52,6 +62,7 @@ struct _GtrDlTeams
G_DEFINE_TYPE_WITH_PRIVATE (GtrDlTeams, gtr_dl_teams, GTK_TYPE_BIN)
static void team_add_cb (GtkButton *btn, GtrDlTeams *self);
+static void gtr_dl_teams_save_combo_selected (GtkComboBox *combo, GtrDlTeams *self);
static void
gtr_dl_teams_list_add (JsonArray *array,
@@ -65,7 +76,7 @@ gtr_dl_teams_list_add (JsonArray *array,
0, json_object_get_string_member (object, "description"),
-1);
/*printf ("%s: %s\n",
- json_object_get_string_member (object, "id"),
+ json_object_get_string_member (object, "name"),
json_object_get_string_member (object, "description")
);*/
}
@@ -77,9 +88,9 @@ gtr_dl_modules_list_add (JsonArray *array,
gpointer data)
{
JsonObject *object = json_node_get_object (element);
- JsonObject *fieldsNode = json_object_get_object_member (object, "fields");
- gtk_list_store_insert_with_values(data, NULL, -1,0, json_object_get_string_member (fieldsNode, "name"),
+ gtk_list_store_insert_with_values(data, NULL, -1,
+ 0, json_object_get_string_member (object, "name"),
-1);
}
@@ -116,9 +127,89 @@ gtr_dl_teams_parse_teams_json (GObject *object,
json_array_foreach_element (array, gtr_dl_teams_list_add, GTK_TREE_MODEL (priv->teams_store));
gtk_combo_box_set_model (GTK_COMBO_BOX (priv->teams_combobox), GTK_TREE_MODEL (priv->teams_store));
+
+ /* Enable selection */
+ gtk_widget_set_sensitive (priv->teams_combobox, TRUE);
}
}
+static void
+gtr_dl_teams_load_module_details_json (GtkComboBox *combo,
+ GtrDlTeams *self)
+{
+ GtrDlTeamsPrivate *priv = gtr_dl_teams_get_instance_private (self);
+ SoupMessage *msg;
+ SoupSession *session;
+ gchar *module_endpoint;
+ guint status;
+ gint i;
+ GError *error = NULL;
+ JsonNode *node = NULL;
+
+ /* Get module details JSON from DL API */
+ module_endpoint = g_strconcat ((const gchar *)"https://l10n.gnome.org/api/v1/modules/",
priv->selected_module, NULL);
+ msg = soup_message_new ("GET", module_endpoint);
+ session = soup_session_new ();
+ status = soup_session_send_message (session, msg);
+
+ g_autoptr(JsonParser) parser = json_parser_new ();
+
+ /* Load response body and fill branches and domains */
+ /* TODO: empty/remove existing combo boxes to avoid duplicating widgets */
+ json_parser_load_from_data (parser, msg->response_body->data, msg->response_body->length, &error);
+ node = json_parser_get_root (parser);
+
+ JsonObject *object = json_node_get_object(node);
+
+ /* branches */
+ JsonNode *branchesNode = json_object_get_member (object, "branches");
+ JsonArray *branchesArray = json_node_get_array (branchesNode);
+
+ priv->branches_combobox = gtk_combo_box_text_new ();
+ gtk_widget_set_name (priv->branches_combobox, "combo_branches");
+
+ for (i=0; i < json_array_get_length (branchesArray); i++) {
+ JsonNode *branch_element = json_array_get_element (branchesArray, i);
+ JsonObject *branch_object = json_node_get_object (branch_element);
+ gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (priv->branches_combobox),
+ json_object_get_string_member (branch_object, "name"),
+ json_object_get_string_member (branch_object, "name")
+ );
+ }
+ gtk_container_add (GTK_CONTAINER (priv->main_box), priv->branches_combobox);
+
+ g_signal_connect (priv->branches_combobox,
+ "changed",
+ G_CALLBACK (gtr_dl_teams_save_combo_selected),
+ self);
+
+ gtk_widget_show (priv->branches_combobox);
+
+ /* domains */
+ JsonNode *domainsNode = json_object_get_member (object, "domains");
+ JsonArray *domains_array = json_node_get_array (domainsNode);
+
+ priv->domains_combobox = gtk_combo_box_text_new ();
+ gtk_widget_set_name (priv->domains_combobox, "combo_domains");
+
+ for (i=0; i < json_array_get_length (domains_array); i++) {
+ JsonNode *domain_element = json_array_get_element (domains_array, i);
+ JsonObject *domain_object = json_node_get_object (domain_element);
+ gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (priv->domains_combobox),
+ json_object_get_string_member (domain_object, "name"),
+ json_object_get_string_member (domain_object, "description")
+ );
+ }
+ gtk_container_add (GTK_CONTAINER (priv->main_box), priv->domains_combobox);
+
+ g_signal_connect (priv->domains_combobox,
+ "changed",
+ G_CALLBACK (gtr_dl_teams_save_combo_selected),
+ self);
+
+ gtk_widget_show (priv->domains_combobox);
+}
+
static void
gtr_dl_teams_parse_modules_json (GObject *object,
GAsyncResult *result,
@@ -154,6 +245,12 @@ gtr_dl_teams_parse_modules_json (GObject *object,
gtk_combo_box_set_model (GTK_COMBO_BOX (priv->modules_combobox), GTK_TREE_MODEL (priv->modules_store));
gtk_widget_set_sensitive (priv->modules_combobox, TRUE);
+
+ /* Load module details when module is selected */
+ g_signal_connect (priv->modules_combobox,
+ "changed",
+ G_CALLBACK (gtr_dl_teams_load_module_details_json),
+ user_data);
}
}
@@ -163,15 +260,74 @@ gtr_dl_teams_load_json (GtkButton *btn,
{
/* Get team list JSON from DL */
g_autoptr(SoupSession) session = soup_session_new ();
- g_autoptr(SoupMessage) message = soup_message_new ("GET", "https://l10n.gnome.org/teams/json");
+ g_autoptr(SoupMessage) message = soup_message_new ("GET", "https://l10n.gnome.org/api/v1/teams");
soup_session_send_async (session, message, NULL, gtr_dl_teams_parse_teams_json, self);
/* Get module list JSON from DL */
g_autoptr(SoupSession) session_modules = soup_session_new ();
- g_autoptr(SoupMessage) message_modules = soup_message_new ("GET", "https://l10n.gnome.org/module/json");
+ g_autoptr(SoupMessage) message_modules = soup_message_new ("GET", "https://l10n.gnome.org/api/v1/modules");
soup_session_send_async (session_modules, message_modules, NULL, gtr_dl_teams_parse_modules_json, self);
}
+void gtr_dl_teams_verify_and_load (GtrDlTeams *self)
+{
+ GtrDlTeamsPrivate *priv = gtr_dl_teams_get_instance_private (self);
+ /*printf("%s, %s, %s, %s\n",
+ priv->selected_team,
+ priv->selected_module,
+ priv->selected_branch,
+ priv->selected_domain
+ );*/
+ if (priv->selected_team != NULL &&
+ priv->selected_module != NULL &&
+ priv->selected_branch != NULL &&
+ priv->selected_domain != NULL)
+ {
+ // TODO: load PO file, get path from DL API first
+ //printf("all good, PO can be loaded now\n");
+ }
+ else
+ {
+ //printf("not yet!\n");
+ }
+}
+
+static void
+gtr_dl_teams_save_combo_selected (GtkComboBox *combo,
+ GtrDlTeams *self)
+{
+ GtrDlTeamsPrivate *priv = gtr_dl_teams_get_instance_private (self);
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ path = gtk_tree_path_new_from_indices (gtk_combo_box_get_active (combo), -1);
+
+ /* Save selected combo option */
+ const gchar *name = gtk_widget_get_name (GTK_WIDGET (combo));
+ printf("%s\n", name);
+ if (strcmp(name, "combo_modules") == 0)
+ {
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->modules_store), &iter, path);
+ gtk_tree_model_get (GTK_TREE_MODEL (priv->modules_store), &iter, 0, &priv->selected_module, -1);
+ }
+ else if (strcmp(name, "combo_teams") == 0)
+ {
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->teams_store), &iter, path);
+ gtk_tree_model_get (GTK_TREE_MODEL (priv->teams_store), &iter, 0, &priv->selected_team, -1);
+ }
+ else if (strcmp(name, "combo_branches") == 0)
+ {
+ priv->selected_branch = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (combo));
+ }
+ else if (strcmp(name, "combo_domains") == 0)
+ {
+ priv->selected_domain = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (combo));
+ }
+
+ /* Check if all four required values have been selected to proceed with loading PO file */
+ gtr_dl_teams_verify_and_load (self);
+}
+
static void
gtr_dl_teams_dispose (GObject *object)
{
@@ -219,25 +375,26 @@ gtr_dl_teams_init (GtrDlTeams *self)
/* Add combo boxes for DL teams and modules */
priv->teams_combobox = gtk_combo_box_new ();
+ gtk_widget_set_name (priv->teams_combobox, "combo_teams");
column = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(priv->teams_combobox), column, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(priv->teams_combobox), column,
"text", 0,
- //"text", 1,
NULL);
gtk_container_add (GTK_CONTAINER (priv->main_box), priv->teams_combobox);
+ gtk_widget_set_sensitive (priv->teams_combobox, FALSE);
priv->modules_combobox = gtk_combo_box_new ();
+ gtk_widget_set_name (priv->modules_combobox, "combo_modules");
column = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(priv->modules_combobox), column, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(priv->modules_combobox), column,
"text", 0,
- //"text", 1,
NULL);
gtk_container_add (GTK_CONTAINER (priv->main_box), priv->modules_combobox);
@@ -247,11 +404,22 @@ gtr_dl_teams_init (GtrDlTeams *self)
"clicked",
G_CALLBACK (team_add_cb),
self);
- /* Load JSON on click */
+
+ /* Load teams and modules on click */
g_signal_connect (priv->dl_button,
"clicked",
G_CALLBACK (gtr_dl_teams_load_json),
self);
+
+ /* Connect "changed" to teams and modules combo boxes */
+ g_signal_connect (priv->teams_combobox,
+ "changed",
+ G_CALLBACK (gtr_dl_teams_save_combo_selected),
+ self);
+ g_signal_connect (priv->modules_combobox,
+ "changed",
+ G_CALLBACK (gtr_dl_teams_save_combo_selected),
+ self);
}
GtrDlTeams*
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]