/* * about:profiles * * Copyright (C) 2017 Patrick McDermott * * This file is part of Marquee. * * Marquee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Marquee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Marquee. If not, see . */ #include #include #include #include "../../application.h" #include "../../config/profiles.h" #include "../../utils/html.h" #include "../../utils/profile-icon.h" #include "../about.h" #include "paths.h" static gchar * generate_div(MqProfiles *profiles, gchar *id) { gchar *name; gchar *color; gchar *editing_str; gchar *name_str; gchar *default_str; gchar *delete_str; gchar *save_str; gchar *div; /* Freed by mq_html_container(). */ if (id) { name = mq_profiles_get_name(profiles, id); color = mq_profiles_get_color(profiles, id); } else { name = g_strdup("New Profile"); color = g_strdup("#00ff00"); } editing_str = g_strconcat("editing_", id, NULL); name_str = g_strconcat("name_", id, NULL); default_str = g_strconcat("default_", id, NULL); delete_str = g_strconcat("delete_", id, NULL); save_str = g_strconcat("save_", id, NULL); div = mq_html_container("div", "profile", mq_html_input_radio("editing", editing_str, id, NULL, id == NULL), mq_profile_icon_new(color), mq_html_container("span", NULL, name, NULL), mq_html_input_text(name_str, NULL, name), mq_html_submit(default_str, "Make Default", id && mq_profiles_is_default(profiles, id)), mq_html_submit(delete_str, "Delete", FALSE), mq_html_label(editing_str, "Edit", FALSE), mq_html_submit(save_str, "Save", FALSE), NULL); g_free(editing_str); g_free(name_str); g_free(default_str); g_free(delete_str); g_free(save_str); return div; } static gchar * generate_document(MqProfiles *profiles, gboolean adding) { gchar **ids; gsize length; gchar **divs; gsize i; ids = mq_profiles_get_profiles(profiles, &length); divs = g_new(gchar *, length + (adding ? 1 : 0)); for (i = 0; i < length; ++i) { divs[i] = generate_div(profiles, ids[i]); } if (adding) { divs[i++] = generate_div(profiles, NULL); } divs[i] = NULL; g_strfreev(ids); return mq_html_document("Profiles", mq_html_form_v("add", "Add Profile", NULL, NULL, divs), NULL); } static void edit_profiles(MqProfiles *profiles, GHashTable *query) { GList *keys; GList *key; gchar *id; gchar *input_key; keys = g_hash_table_get_keys(query); for (key = keys; key; key = key->next) { if (g_str_has_prefix(key->data, "save_")) { id = (gchar *) key->data + strlen("save_"); if (id[0]) { /* Edit existing profile. */ input_key = g_strconcat("name_", id, NULL); mq_profiles_set_name(profiles, id, g_hash_table_lookup(query, input_key)); g_free(input_key); } } else if (g_str_has_prefix(key->data, "delete_")) { id = (gchar *) key->data + strlen("delete_"); if (id[0]) { /* Don't remove new profile. */ mq_profiles_remove(profiles, id); } } else if (g_str_has_prefix(key->data, "default_")) { id = (gchar *) key->data + strlen("default_"); if (id[0]) { /* Don't set new profile as default. */ mq_profiles_set_default(profiles, id); } } } g_list_free(keys); mq_profiles_save(profiles); } void mq_about_profiles_response(MqApplication *application, GHashTable *query, WebKitURISchemeRequest *request) { MqProfiles *profiles; profiles = mq_application_get_profiles(application); if (!query) { mq_about_response(request, generate_document(profiles, FALSE)); } else if (g_hash_table_lookup(query, "add")) { mq_about_response(request, generate_document(profiles, TRUE)); } else { edit_profiles(profiles, query); mq_about_redirect(request, "mq-about:profiles"); } }