GCC Code Coverage Report


Directory: ./
File: panels/printers/pp-job-row.c
Date: 2024-05-04 07:58:27
Exec Total Coverage
Lines: 0 80 0.0%
Functions: 0 12 0.0%
Branches: 0 27 0.0%

Line Branch Exec Source
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright 2020 Canonical Ltd.
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: GPL-3.0-or-later
19 */
20
21 #include <config.h>
22 #include <glib/gi18n.h>
23
24 #include "pp-job-row.h"
25 #include "cc-printers-resources.h"
26
27 struct _PpJobRow
28 {
29 GtkListBoxRow parent;
30
31 GtkButton *pause_button;
32 GtkButton *priority_button;
33 GtkLabel *state_label;
34 GtkLabel *title_label;
35
36 PpJob *job;
37 };
38
39 G_DEFINE_TYPE (PpJobRow, pp_job_row, GTK_TYPE_LIST_BOX_ROW)
40
41 enum {
42 PRIORITY_CHANGED,
43 LAST_SIGNAL,
44 };
45
46 static guint signals[LAST_SIGNAL] = { 0 };
47
48 static void
49 update_pause_button (PpJobRow *self, gboolean paused)
50 {
51 gtk_button_set_icon_name (self->pause_button,
52 paused ? "media-playback-start-symbolic" : "media-playback-pause-symbolic");
53 gtk_accessible_update_property (GTK_ACCESSIBLE (self->pause_button),
54 GTK_ACCESSIBLE_PROPERTY_LABEL,
55 paused ? _("Resume") : _("Pause"),
56 -1);
57 }
58
59 static void
60 pause_cb (PpJobRow *self)
61 {
62 pp_job_set_hold_until_async (self->job, pp_job_get_state (self->job) == IPP_JOB_HELD ? "no-hold" : "indefinite");
63 update_pause_button (self,
64 pp_job_get_state (self->job) == IPP_JOB_HELD);
65 }
66
67 static void
68 stop_cb (PpJobRow *self)
69 {
70 pp_job_cancel_purge_async (self->job, FALSE);
71 }
72
73 static void
74 priority_cb (PpJobRow *self)
75 {
76 g_signal_emit_by_name (self, "priority-changed");
77 }
78
79 static void
80 pp_job_row_dispose (GObject *object)
81 {
82 PpJobRow *self = PP_JOB_ROW (object);
83
84 g_clear_object (&self->job);
85
86 G_OBJECT_CLASS (pp_job_row_parent_class)->dispose (object);
87 }
88
89 static void
90 pp_job_row_class_init (PpJobRowClass *klass)
91 {
92 GObjectClass *object_class = G_OBJECT_CLASS (klass);
93 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
94
95 object_class->dispose = pp_job_row_dispose;
96
97 gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/printers/pp-job-row.ui");
98
99 gtk_widget_class_bind_template_child (widget_class, PpJobRow, pause_button);
100 gtk_widget_class_bind_template_child (widget_class, PpJobRow, priority_button);
101 gtk_widget_class_bind_template_child (widget_class, PpJobRow, state_label);
102 gtk_widget_class_bind_template_child (widget_class, PpJobRow, title_label);
103
104 gtk_widget_class_bind_template_callback (widget_class, pause_cb);
105 gtk_widget_class_bind_template_callback (widget_class, stop_cb);
106 gtk_widget_class_bind_template_callback (widget_class, priority_cb);
107
108 signals[PRIORITY_CHANGED] =
109 g_signal_new ("priority-changed",
110 G_TYPE_FROM_CLASS (klass),
111 G_SIGNAL_RUN_LAST,
112 0,
113 NULL, NULL, NULL,
114 G_TYPE_NONE, 0);
115 }
116
117 static void
118 pp_job_row_init (PpJobRow *self)
119 {
120 gtk_widget_init_template (GTK_WIDGET (self));
121 }
122
123 PpJob *
124 pp_job_row_get_job (PpJobRow *self)
125 {
126 return self->job;
127 }
128
129 PpJobRow *
130 pp_job_row_new (PpJob *job)
131 {
132 PpJobRow *self;
133 gboolean status;
134 g_autofree gchar *state_string = NULL;
135
136 self = g_object_new (PP_TYPE_JOB_ROW, NULL);
137
138 self->job = g_object_ref (job);
139
140 switch (pp_job_get_state (job))
141 {
142 case IPP_JOB_PENDING:
143 /* Translators: Job's state (job is waiting to be printed) */
144 state_string = g_strdup (C_("print job", "Pending"));
145 break;
146 case IPP_JOB_HELD:
147 if (pp_job_get_auth_info_required (job) == NULL)
148 {
149 /* Translators: Job's state (job is held for printing) */
150 state_string = g_strdup (C_("print job", "Paused"));
151 }
152 else
153 {
154 /* Translators: Job's state (job needs authentication to proceed further) */
155 state_string = g_strdup_printf ("<span foreground=\"#ff0000\">%s</span>", C_("print job", "Authentication required"));
156 }
157 break;
158 case IPP_JOB_PROCESSING:
159 /* Translators: Job's state (job is currently printing) */
160 state_string = g_strdup (C_("print job", "Processing"));
161 break;
162 case IPP_JOB_STOPPED:
163 /* Translators: Job's state (job has been stopped) */
164 state_string = g_strdup (C_("print job", "Stopped"));
165 break;
166 case IPP_JOB_CANCELED:
167 /* Translators: Job's state (job has been canceled) */
168 state_string = g_strdup (C_("print job", "Canceled"));
169 break;
170 case IPP_JOB_ABORTED:
171 /* Translators: Job's state (job has aborted due to error) */
172 state_string = g_strdup (C_("print job", "Aborted"));
173 break;
174 case IPP_JOB_COMPLETED:
175 /* Translators: Job's state (job has completed successfully) */
176 state_string = g_strdup (C_("print job", "Completed"));
177 break;
178 }
179 gtk_label_set_text (self->title_label, pp_job_get_title (job));
180 gtk_label_set_markup (self->state_label, state_string);
181 gtk_widget_set_sensitive (GTK_WIDGET (self->pause_button), pp_job_get_auth_info_required (job) == NULL);
182 status = pp_job_priority_get_sensitive (job);
183 gtk_widget_set_sensitive (GTK_WIDGET (self->priority_button), status);
184 if (status)
185 /* Translators: Clicking this button prioritizes printing of this print job */
186 gtk_widget_set_tooltip_text (GTK_WIDGET (self->priority_button), _("Move this job to the top of the queue"));
187 update_pause_button (self,
188 pp_job_get_state (self->job) == IPP_JOB_HELD);
189 return self;
190 }
191