Codebase list gnome-twitch / debian/0.4.1-1 src / gt-settings-dlg.c
debian/0.4.1-1

Tree @debian/0.4.1-1 (Download .tar.gz)

gt-settings-dlg.c @debian/0.4.1-1raw · history · blame

/*
 *  This file is part of GNOME Twitch - 'Enjoy Twitch on your GNU/Linux desktop'
 *  Copyright © 2017 Vincent Szolnoky <vinszent@vinszent.com>
 *
 *  GNOME Twitch 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.
 *
 *  GNOME Twitch 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 GNOME Twitch. If not, see <http://www.gnu.org/licenses/>.
 */

#include "gt-settings-dlg.h"
#include "gt-enums.h"
#include <glib/gi18n.h>
#include <libpeas-gtk/peas-gtk.h>

typedef struct
{
    GtkWidget* prefer_dark_theme_button;
    GtkWidget* quality_combo;
    GtkWidget* language_filter_combo;
    GtkWidget* settings_switcher;
    GtkWidget* players_view;
    GtkWidget* settings_stack;
    GtkWidget* notifications_switch;
} GtSettingsDlgPrivate;

G_DEFINE_TYPE_WITH_PRIVATE(GtSettingsDlg, gt_settings_dlg, GTK_TYPE_DIALOG)

static void
gt_settings_dlg_class_init(GtSettingsDlgClass* klass)
{
    gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS(klass), "/com/vinszent/GnomeTwitch/ui/gt-settings-dlg.ui");
    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS(klass), GtSettingsDlg, prefer_dark_theme_button);
    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS(klass), GtSettingsDlg, quality_combo);
    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS(klass), GtSettingsDlg, language_filter_combo);
    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS(klass), GtSettingsDlg, settings_switcher);
    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS(klass), GtSettingsDlg, settings_stack);
    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS(klass), GtSettingsDlg, players_view);
    gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS(klass), GtSettingsDlg, notifications_switch);
}

static void
gt_settings_dlg_init(GtSettingsDlg* self)
{
    GtSettingsDlgPrivate* priv = gt_settings_dlg_get_instance_private(self);

    //So it's not optimised away
    volatile gpointer type = (gpointer) PEAS_GTK_TYPE_PLUGIN_MANAGER;

    gtk_widget_init_template(GTK_WIDGET(self));

    gtk_widget_show_all(priv->players_view);

    GtkWidget* header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(self));
    gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header_bar), priv->settings_switcher);

    /* NOTE: This is a hack to show a label at the bottom of the dialogue*/
    GList* children = gtk_container_get_children(GTK_CONTAINER(priv->players_view));
    GtkToolbar* toolbar = GTK_TOOLBAR(g_list_nth(children, 1)->data);
    GtkToolItem* item = gtk_tool_item_new();
    gtk_container_add(GTK_CONTAINER(item), gtk_link_button_new_with_label(
            "https://github.com/vinszent/gnome-twitch/wiki/How-to-install-player-backends",
            _("How to install player backends")));
    gtk_widget_show_all(GTK_WIDGET(item));
    gtk_toolbar_insert(toolbar, item, 0);
    g_list_free(children);

    g_settings_bind(main_app->settings, "prefer-dark-theme",
        priv->prefer_dark_theme_button, "active",
        G_SETTINGS_BIND_DEFAULT);
    g_settings_bind(main_app->settings, "default-quality",
        priv->quality_combo, "active-id",
        G_SETTINGS_BIND_DEFAULT);
    g_settings_bind(main_app->settings, "language-filter",
        priv->language_filter_combo, "active-id",
        G_SETTINGS_BIND_DEFAULT);
    g_settings_bind(main_app->settings, "show-notifications",
        priv->notifications_switch, "active",
        G_SETTINGS_BIND_DEFAULT);
}

GtSettingsDlg*
gt_settings_dlg_new(GtWin* win)
{
    return g_object_new(GT_TYPE_SETTINGS_DLG,
                        "transient-for", win,
                        "use-header-bar", TRUE,
                        NULL);
}

void
gt_settings_dlg_set_view(GtSettingsDlg* self, GtSettingsDlgView view)
{
    GtSettingsDlgPrivate* priv = gt_settings_dlg_get_instance_private(self);

    switch (view)
    {
        case GT_SETTINGS_DLG_VIEW_GENERAL:
            gtk_stack_set_visible_child_name(GTK_STACK(priv->settings_stack), "general");
            break;
        case GT_SETTINGS_DLG_VIEW_PLAYERS:
            gtk_stack_set_visible_child_name(GTK_STACK(priv->settings_stack), "players");
            break;
    }
}