]> git.sur5r.net Git - glabels/blob - src/template-history-model.c
Imported Upstream version 3.0.0
[glabels] / src / template-history-model.c
1 /*
2  *  template-history-model.c
3  *  Copyright (C) 2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "template-history-model.h"
24
25 #include <gio/gio.h>
26
27 #include <libglabels.h>
28 #include "marshal.h"
29
30
31 /*========================================================*/
32 /* Private types.                                         */
33 /*========================================================*/
34
35 struct _glTemplateHistoryModelPrivate {
36
37         GSettings   *history;
38
39         guint        max_n;
40 };
41
42 enum {
43         CHANGED,
44         LAST_SIGNAL
45 };
46
47
48 /*========================================================*/
49 /* Private globals.                                       */
50 /*========================================================*/
51
52 static guint signals[LAST_SIGNAL] = {0};
53
54
55 /*========================================================*/
56 /* Private function prototypes.                           */
57 /*========================================================*/
58
59 static void gl_template_history_model_finalize (GObject                 *object);
60
61 static void history_changed_cb                 (glTemplateHistoryModel  *this);
62
63
64 /*****************************************************************************/
65 /* Object infrastructure.                                                    */
66 /*****************************************************************************/
67 G_DEFINE_TYPE (glTemplateHistoryModel, gl_template_history_model, G_TYPE_OBJECT)
68
69
70 /*****************************************************************************/
71 /* Class Init Function.                                                      */
72 /*****************************************************************************/
73 static void
74 gl_template_history_model_class_init (glTemplateHistoryModelClass *class)
75 {
76         GObjectClass  *gobject_class = (GObjectClass *) class;
77
78         gl_template_history_model_parent_class = g_type_class_peek_parent (class);
79
80         gobject_class->finalize = gl_template_history_model_finalize;
81
82         signals[CHANGED] =
83                 g_signal_new ("changed",
84                               G_OBJECT_CLASS_TYPE (gobject_class),
85                               G_SIGNAL_RUN_LAST,
86                               G_STRUCT_OFFSET (glTemplateHistoryModelClass, changed),
87                               NULL, NULL,
88                               gl_marshal_VOID__VOID,
89                               G_TYPE_NONE,
90                               0);
91 }
92
93
94 /*****************************************************************************/
95 /* Object Instance Init Function.                                            */
96 /*****************************************************************************/
97 static void
98 gl_template_history_model_init (glTemplateHistoryModel *this)
99 {
100         this->priv = g_new0 (glTemplateHistoryModelPrivate, 1);
101
102         this->priv->history = g_settings_new ("org.gnome.glabels-3.history");
103
104         g_return_if_fail (this->priv->history != NULL);
105
106         g_signal_connect_swapped (G_OBJECT (this->priv->history),
107                                   "changed::recent-templates",
108                                   G_CALLBACK (history_changed_cb), this);
109 }
110
111
112 /*****************************************************************************/
113 /* Finalize Method.                                                          */
114 /*****************************************************************************/
115 static void
116 gl_template_history_model_finalize (GObject *object)
117 {
118         glTemplateHistoryModel    *this;
119
120         g_return_if_fail (object && IS_GL_TEMPLATE_HISTORY_MODEL (object));
121         this = GL_TEMPLATE_HISTORY_MODEL (object);
122
123         g_object_unref (G_OBJECT(this->priv->history));
124         g_free (this->priv);
125
126         G_OBJECT_CLASS (gl_template_history_model_parent_class)->finalize (object);
127 }
128
129
130 /*****************************************************************************/
131 /** New Object Generator.                                                    */
132 /*****************************************************************************/
133 glTemplateHistoryModel *
134 gl_template_history_model_new (guint n)
135 {
136         glTemplateHistoryModel *this;
137
138         this = g_object_new (TYPE_GL_TEMPLATE_HISTORY_MODEL, NULL);
139
140         this->priv->max_n = n;
141
142         return this;
143 }
144
145
146 /*****************************************************************************/
147 /* Add template to history.                                                  */
148 /*****************************************************************************/
149 void
150 gl_template_history_model_add_name (glTemplateHistoryModel *this,
151                                     const gchar            *name)
152 {
153         gchar **old;
154         gchar **new;
155         gint    i, j;
156
157         old = g_settings_get_strv (this->priv->history, "recent-templates");
158                                    
159         new = g_new0 (gchar *, this->priv->max_n+1);
160
161         /* Put in first slot. */
162         new[0] = g_strdup (name);
163
164         /* Push everthing else down, pruning any duplicate found. */
165         for ( i = 0, j = 1; (j < (this->priv->max_n-1)) && old[i]; i++ )
166         {
167                 if ( lgl_str_utf8_casecmp (name, old[i]) != 0 )
168                 {
169                         new[j++] = g_strdup (old[i]);
170                 }
171         }
172
173         g_settings_set_strv (this->priv->history, "recent-templates",
174                              (const gchar * const *)new);
175
176         g_strfreev (old);
177         g_strfreev (new);
178 }
179
180
181 /*****************************************************************************/
182 /* History changed callback.                                                 */
183 /*****************************************************************************/
184 static void
185 history_changed_cb (glTemplateHistoryModel  *this)
186 {
187         g_signal_emit (G_OBJECT(this), signals[CHANGED], 0);
188 }
189
190
191 /*****************************************************************************/
192 /* Get list of template families.                                            */
193 /*****************************************************************************/
194 GList *
195 gl_template_history_model_get_name_list (glTemplateHistoryModel *this)
196 {
197         gchar **strv;
198         GList  *list = NULL;
199         gint    i;
200
201         strv = g_settings_get_strv (this->priv->history, "recent-templates");
202
203         /*
204          * Proof read name list; transfer storage to new list.
205          */
206         for ( i = 0; strv[i]; i++ )
207         {
208                 if ( lgl_db_does_template_name_exist (strv[i]) )
209                 {
210                         list = g_list_append (list, g_strdup (strv[i]));
211                 }
212         }
213         g_strfreev (strv);
214
215         return list;
216 }
217
218
219 /*****************************************************************************/
220 /* Free template name list.                                                  */
221 /*****************************************************************************/
222 void
223 gl_template_history_model_free_name_list (GList *list)
224 {
225         GList *p;
226
227         for ( p = list; p; p=p->next )
228         {
229                 g_free (p->data);
230         }
231         g_list_free (list);
232 }
233
234
235
236 /*
237  * Local Variables:       -- emacs
238  * mode: C                -- emacs
239  * c-basic-offset: 8      -- emacs
240  * tab-width: 8           -- emacs
241  * indent-tabs-mode: nil  -- emacs
242  * End:                   -- emacs
243  */