nautilus-progress-info-widget.c 7.25 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * nautilus-progress-info-widget.h: file operation progress user interface.
 *
 * Copyright (C) 2007, 2011 Red Hat, Inc.
 *
 * This program 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 2 of the
 * License, or (at your option) any later version.
 *
 * This program 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
17
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18 19 20 21 22 23 24 25 26
 *
 * Authors: Alexander Larsson <alexl@redhat.com>
 *          Cosimo Cecchi <cosimoc@redhat.com>
 *
 */

#include <config.h>

#include "nautilus-progress-info-widget.h"
27 28 29 30 31 32 33 34 35
struct _NautilusProgressInfoWidgetPrivate
{
    NautilusProgressInfo *info;

    GtkWidget *status;     /* GtkLabel */
    GtkWidget *details;     /* GtkLabel */
    GtkWidget *progress_bar;
    GtkWidget *button;
    GtkWidget *done_image;
36 37
};

38 39 40 41
enum
{
    PROP_INFO = 1,
    NUM_PROPERTIES
42 43 44 45
};

static GParamSpec *properties[NUM_PROPERTIES] = { NULL };

46
G_DEFINE_TYPE_WITH_PRIVATE (NautilusProgressInfoWidget, nautilus_progress_info_widget,
47
                            GTK_TYPE_GRID);
48 49 50 51

static void
info_finished (NautilusProgressInfoWidget *self)
{
52 53
    gtk_button_set_image (GTK_BUTTON (self->priv->button), self->priv->done_image);
    gtk_widget_set_sensitive (self->priv->button, FALSE);
54 55 56 57 58
}

static void
info_cancelled (NautilusProgressInfoWidget *self)
{
59
    gtk_widget_set_sensitive (self->priv->button, FALSE);
60 61 62 63 64
}

static void
update_data (NautilusProgressInfoWidget *self)
{
65 66 67 68 69 70 71 72 73 74 75 76
    char *status, *details;
    char *markup;

    status = nautilus_progress_info_get_status (self->priv->info);
    gtk_label_set_text (GTK_LABEL (self->priv->status), status);
    g_free (status);

    details = nautilus_progress_info_get_details (self->priv->info);
    markup = g_markup_printf_escaped ("<span size='small'>%s</span>", details);
    gtk_label_set_markup (GTK_LABEL (self->priv->details), markup);
    g_free (details);
    g_free (markup);
77 78 79 80 81
}

static void
update_progress (NautilusProgressInfoWidget *self)
{
82 83 84 85 86 87 88 89 90 91 92
    double progress;

    progress = nautilus_progress_info_get_progress (self->priv->info);
    if (progress < 0)
    {
        gtk_progress_bar_pulse (GTK_PROGRESS_BAR (self->priv->progress_bar));
    }
    else
    {
        gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->priv->progress_bar), progress);
    }
93 94 95
}

static void
96 97
button_clicked (GtkWidget                  *button,
                NautilusProgressInfoWidget *self)
98
{
99 100 101 102
    if (!nautilus_progress_info_get_is_finished (self->priv->info))
    {
        nautilus_progress_info_cancel (self->priv->info);
    }
103 104 105
}

static void
106
nautilus_progress_info_widget_dispose (GObject *obj)
107
{
108
    NautilusProgressInfoWidget *self = NAUTILUS_PROGRESS_INFO_WIDGET (obj);
109

110 111 112 113 114
    if (self->priv->info != NULL)
    {
        g_signal_handlers_disconnect_by_data (self->priv->info, self);
    }
    g_clear_object (&self->priv->info);
115

116
    G_OBJECT_CLASS (nautilus_progress_info_widget_parent_class)->dispose (obj);
117
}
118

119 120 121
static void
nautilus_progress_info_widget_constructed (GObject *obj)
{
122 123 124 125
    NautilusProgressInfoWidget *self = NAUTILUS_PROGRESS_INFO_WIDGET (obj);

    G_OBJECT_CLASS (nautilus_progress_info_widget_parent_class)->constructed (obj);

126 127 128 129 130 131 132 133 134
    if (nautilus_progress_info_get_is_finished (self->priv->info))
    {
        gtk_button_set_image (GTK_BUTTON (self->priv->button), self->priv->done_image);
    }

    gtk_widget_set_sensitive (self->priv->button,
                              !nautilus_progress_info_get_is_finished (self->priv->info) &&
                              !nautilus_progress_info_get_is_cancelled (self->priv->info));

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
    g_signal_connect_swapped (self->priv->info,
                              "changed",
                              G_CALLBACK (update_data), self);
    g_signal_connect_swapped (self->priv->info,
                              "progress-changed",
                              G_CALLBACK (update_progress), self);
    g_signal_connect_swapped (self->priv->info,
                              "finished",
                              G_CALLBACK (info_finished), self);
    g_signal_connect_swapped (self->priv->info,
                              "cancelled",
                              G_CALLBACK (info_cancelled), self);

    update_data (self);
    update_progress (self);
150 151 152
}

static void
153 154 155 156
nautilus_progress_info_widget_set_property (GObject      *object,
                                            guint         property_id,
                                            const GValue *value,
                                            GParamSpec   *pspec)
157
{
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
    NautilusProgressInfoWidget *self = NAUTILUS_PROGRESS_INFO_WIDGET (object);

    switch (property_id)
    {
        case PROP_INFO:
        {
            self->priv->info = g_value_dup_object (value);
        }
        break;

        default:
        {
            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
        }
        break;
    }
174 175 176 177 178
}

static void
nautilus_progress_info_widget_init (NautilusProgressInfoWidget *self)
{
179
    self->priv = nautilus_progress_info_widget_get_instance_private (self);
180

181
    gtk_widget_init_template (GTK_WIDGET (self));
182

183 184
    g_signal_connect (self->priv->button, "clicked",
                      G_CALLBACK (button_clicked), self);
185 186 187 188 189
}

static void
nautilus_progress_info_widget_class_init (NautilusProgressInfoWidgetClass *klass)
{
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
    GObjectClass *oclass;
    GtkWidgetClass *widget_class;

    widget_class = GTK_WIDGET_CLASS (klass);
    oclass = G_OBJECT_CLASS (klass);
    oclass->set_property = nautilus_progress_info_widget_set_property;
    oclass->constructed = nautilus_progress_info_widget_constructed;
    oclass->dispose = nautilus_progress_info_widget_dispose;

    properties[PROP_INFO] =
        g_param_spec_object ("info",
                             "NautilusProgressInfo",
                             "The NautilusProgressInfo associated with this widget",
                             NAUTILUS_TYPE_PROGRESS_INFO,
                             G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
                             G_PARAM_STATIC_STRINGS);

    g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);

    gtk_widget_class_set_template_from_resource (widget_class,
                                                 "/org/gnome/nautilus/ui/nautilus-progress-info-widget.ui");

    gtk_widget_class_bind_template_child_private (widget_class, NautilusProgressInfoWidget, status);
    gtk_widget_class_bind_template_child_private (widget_class, NautilusProgressInfoWidget, details);
    gtk_widget_class_bind_template_child_private (widget_class, NautilusProgressInfoWidget, progress_bar);
    gtk_widget_class_bind_template_child_private (widget_class, NautilusProgressInfoWidget, button);
    gtk_widget_class_bind_template_child_private (widget_class, NautilusProgressInfoWidget, done_image);
217 218 219 220 221
}

GtkWidget *
nautilus_progress_info_widget_new (NautilusProgressInfo *info)
{
222
    return g_object_new (NAUTILUS_TYPE_PROGRESS_INFO_WIDGET,
223 224
                         "info", info,
                         NULL);
225
}