[glabels] Added ability to edit user-defined templates
- From: Jim Evins <jimevins src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glabels] Added ability to edit user-defined templates
- Date: Sun, 18 Apr 2010 19:12:37 +0000 (UTC)
commit 58982c93787c62d55e343f6b316643fe5d4f05d6
Author: Jim Evins <evins snaught com>
Date: Sun Apr 18 15:10:38 2010 -0400
Added ability to edit user-defined templates
libglabels/db.c | 17 ++++
libglabels/db.h | 3 +
src/media-select.c | 32 +++++++
src/mini-preview-pixbuf-cache.c | 21 ++++-
src/mini-preview-pixbuf-cache.h | 6 +-
src/template-designer.c | 190 +++++++++++++++++++++++++++++++++------
src/template-designer.h | 5 +-
7 files changed, 243 insertions(+), 31 deletions(-)
---
diff --git a/libglabels/db.c b/libglabels/db.c
index 37f9247..3370b03 100644
--- a/libglabels/db.c
+++ b/libglabels/db.c
@@ -1558,6 +1558,23 @@ lgl_db_delete_template_by_name (const gchar *name)
}
+lglDbDeleteStatus
+lgl_db_delete_template_by_brand_part (const gchar *brand,
+ const gchar *part)
+{
+ gchar *name;
+ lglDbDeleteStatus status;
+
+ name = g_strdup_printf ("%s %s", brand, part);
+
+ status = lgl_db_delete_template_by_name (name);
+
+ g_free (name);
+
+ return status;
+}
+
+
/**
* lgl_db_does_template_exist:
* @brand: Brand name.
diff --git a/libglabels/db.h b/libglabels/db.h
index ddd162a..c80d6b0 100644
--- a/libglabels/db.h
+++ b/libglabels/db.h
@@ -144,6 +144,9 @@ lglDbRegStatus lgl_db_register_template (const lglTemplate *templ
lglDbDeleteStatus lgl_db_delete_template_by_name (const gchar *name);
+lglDbDeleteStatus lgl_db_delete_template_by_brand_part (const gchar *brand,
+ const gchar *part);
+
gboolean lgl_db_does_template_exist (const gchar *brand,
const gchar *part);
diff --git a/src/media-select.c b/src/media-select.c
index 612c252..cb8712f 100644
--- a/src/media-select.c
+++ b/src/media-select.c
@@ -583,6 +583,31 @@ static void
custom_edit_clicked_cb (GtkButton *button,
gpointer user_data)
{
+ glMediaSelect *this = GL_MEDIA_SELECT (user_data);
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ gchar *name;
+ GtkWidget *window;
+ GtkWidget *dialog;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->custom_treeview));
+
+ if (!gtk_tree_selection_get_mode (selection) == GTK_SELECTION_NONE)
+ {
+ gtk_tree_selection_get_selected (selection, &model, &iter);
+ gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
+
+ window = gtk_widget_get_toplevel (GTK_WIDGET (this));
+
+ dialog = gl_template_designer_new (GTK_WINDOW (window));
+ gl_template_designer_set_from_name (GL_TEMPLATE_DESIGNER (dialog), name);
+
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+ gtk_widget_show (dialog);
+
+ g_free (name);
+ }
}
@@ -609,6 +634,7 @@ custom_delete_clicked_cb (GtkButton *button,
gtk_tree_model_get (model, &iter, NAME_COLUMN, &name, -1);
lgl_db_delete_template_by_name (name);
+ gl_mini_preview_pixbuf_cache_delete_by_name (name);
g_free (name);
}
@@ -658,6 +684,12 @@ db_changed_cb (glMediaSelect *this)
this->priv->stop_signals = TRUE;
+ /* Update recent page. */
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (this->priv->recent_treeview));
+ list = gl_template_history_model_get_name_list (gl_template_history);
+ load_recent_list (this, this->priv->recent_store, selection, list);
+ lgl_db_free_template_name_list (list);
+
/* Update search all page. */
brand = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->brand_combo));
page_size_name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (this->priv->page_size_combo));
diff --git a/src/mini-preview-pixbuf-cache.c b/src/mini-preview-pixbuf-cache.c
index 347115d..11f2cd2 100644
--- a/src/mini-preview-pixbuf-cache.c
+++ b/src/mini-preview-pixbuf-cache.c
@@ -43,7 +43,7 @@ static GHashTable *mini_preview_pixbuf_cache = NULL;
/* Private function prototypes. */
/*========================================================*/
-
+
/*****************************************************************************/
/* Create a new hash table to keep track of cached mini preview pixbufs. */
/*****************************************************************************/
@@ -56,7 +56,7 @@ gl_mini_preview_pixbuf_cache_init (void)
gl_debug (DEBUG_PIXBUF_CACHE, "START");
- mini_preview_pixbuf_cache = g_hash_table_new (g_str_hash, g_str_equal);
+ mini_preview_pixbuf_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
names = lgl_db_get_template_name_list_unique (NULL, NULL, NULL);
for ( p=names; p != NULL; p=p->next )
@@ -72,6 +72,7 @@ gl_mini_preview_pixbuf_cache_init (void)
gl_debug (DEBUG_PIXBUF_CACHE, "END pixbuf_cache=%p", mini_preview_pixbuf_cache);
}
+
/*****************************************************************************/
/* Add pixbuf to cache by template. */
/*****************************************************************************/
@@ -100,6 +101,7 @@ gl_mini_preview_pixbuf_cache_add_by_template (lglTemplate *template)
gl_debug (DEBUG_PIXBUF_CACHE, "END");
}
+
/*****************************************************************************/
/* Add pixbuf to cache by name. */
/*****************************************************************************/
@@ -120,6 +122,21 @@ gl_mini_preview_pixbuf_cache_add_by_name (gchar *name)
gl_debug (DEBUG_PIXBUF_CACHE, "END");
}
+
+/*****************************************************************************/
+/* Delete pixbuf from cache by name. */
+/*****************************************************************************/
+void
+gl_mini_preview_pixbuf_cache_delete_by_name (gchar *name)
+{
+ gl_debug (DEBUG_PIXBUF_CACHE, "START");
+
+ g_hash_table_remove (mini_preview_pixbuf_cache, name);
+
+ gl_debug (DEBUG_PIXBUF_CACHE, "END");
+}
+
+
/*****************************************************************************/
/* Get pixbuf. */
/*****************************************************************************/
diff --git a/src/mini-preview-pixbuf-cache.h b/src/mini-preview-pixbuf-cache.h
index 218eadd..c345d67 100644
--- a/src/mini-preview-pixbuf-cache.h
+++ b/src/mini-preview-pixbuf-cache.h
@@ -28,10 +28,12 @@ G_BEGIN_DECLS
void gl_mini_preview_pixbuf_cache_init (void);
-void gl_mini_preview_pixbuf_cache_add_by_name (gchar *name);
+void gl_mini_preview_pixbuf_cache_add_by_name (gchar *name);
void gl_mini_preview_pixbuf_cache_add_by_template (lglTemplate *template);
-GdkPixbuf *gl_mini_preview_pixbuf_cache_get_pixbuf (gchar *name);
+void gl_mini_preview_pixbuf_cache_delete_by_name (gchar *name);
+
+GdkPixbuf *gl_mini_preview_pixbuf_cache_get_pixbuf (gchar *name);
G_END_DECLS
diff --git a/src/template-designer.c b/src/template-designer.c
index 4f2498c..fc38b4b 100644
--- a/src/template-designer.c
+++ b/src/template-designer.c
@@ -66,6 +66,10 @@
struct _glTemplateDesignerPrivate
{
+ gboolean edit_flag;
+ gchar *edit_brand;
+ gchar *edit_part;
+
GtkBuilder *builder;
/* Assistant pages */
@@ -336,6 +340,9 @@ gl_template_designer_finalize (GObject *object)
g_return_if_fail (GL_IS_TEMPLATE_DESIGNER (dialog));
g_return_if_fail (dialog->priv != NULL);
+ g_free (dialog->priv->edit_brand);
+ g_free (dialog->priv->edit_part);
+
if (dialog->priv->builder)
{
g_object_unref (dialog->priv->builder);
@@ -394,13 +401,13 @@ gl_template_designer_construct (glTemplateDesigner *dialog)
dialog->priv->climb_rate = gl_units_util_get_step_size (units);
dialog->priv->digits = gl_units_util_get_precision (units);
- gtk_window_set_title (GTK_WINDOW(dialog), _("gLabels Template Designer"));
+ gtk_window_set_title (GTK_WINDOW(dialog), _("New gLabels Template"));
logo_filename = g_build_filename (GLABELS_ICON_DIR, GLABELS_ICON, NULL);
logo = gdk_pixbuf_new_from_file (logo_filename, NULL);
g_free (logo_filename);
- /* Costruct and append pages (must be same order as PAGE_NUM enums. */
+ /* Construct and append pages (must be same order as PAGE_NUM enums. */
construct_start_page (dialog, logo);
construct_name_page (dialog, logo);
construct_pg_size_page (dialog, logo);
@@ -1110,6 +1117,123 @@ construct_finish_page (glTemplateDesigner *dialog,
}
+/*****************************************************************************/
+/* Initialize dialog from existing template. */
+/*****************************************************************************/
+void
+gl_template_designer_set_from_name (glTemplateDesigner *dialog,
+ const gchar *name)
+{
+ lglTemplate *template;
+ gdouble upp;
+ lglTemplateFrame *frame;
+ gchar *paper_name;
+ GList *p, *p_layout1, *p_layout2;
+
+ gtk_window_set_title (GTK_WINDOW(dialog), _("Edit gLabels Template"));
+
+ template = lgl_db_lookup_template_from_name (name);
+ if ( lgl_template_does_category_match (template, "user-defined") )
+ {
+
+ dialog->priv->stop_signals = TRUE;
+
+ dialog->priv->edit_flag = TRUE;
+ dialog->priv->edit_brand = g_strdup (template->brand);
+ dialog->priv->edit_part = g_strdup (template->part);
+
+ upp = dialog->priv->units_per_point;
+
+ gtk_entry_set_text (GTK_ENTRY (dialog->priv->brand_entry), template->brand);
+ gtk_entry_set_text (GTK_ENTRY (dialog->priv->part_num_entry), template->part);
+ gtk_entry_set_text (GTK_ENTRY (dialog->priv->description_entry), template->description);
+
+
+ paper_name = lgl_db_lookup_paper_name_from_id (template->paper_id);
+ gl_combo_util_set_active_text (GTK_COMBO_BOX (dialog->priv->pg_size_combo), paper_name);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_w_spin), template->page_width*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->pg_h_spin), template->page_height*upp);
+ g_free (paper_name);
+
+
+ frame = (lglTemplateFrame *)template->frames->data;
+ switch (frame->shape)
+ {
+ case LGL_TEMPLATE_FRAME_SHAPE_RECT:
+ default:
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_rect_radio), TRUE);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_w_spin), frame->rect.w*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_h_spin), frame->rect.h*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_r_spin), frame->rect.r*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_x_waste_spin), frame->rect.x_waste*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_y_waste_spin), frame->rect.y_waste*upp);
+ break;
+
+ case LGL_TEMPLATE_FRAME_SHAPE_ELLIPSE:
+ break;
+
+ case LGL_TEMPLATE_FRAME_SHAPE_ROUND:
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_round_radio), TRUE);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_r_spin), frame->round.r*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), frame->round.waste*upp);
+ break;
+
+ case LGL_TEMPLATE_FRAME_SHAPE_CD:
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->shape_cd_radio), TRUE);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_radius_spin), frame->cd.r1*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_hole_spin), frame->cd.r2*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_w_spin), frame->cd.w*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_h_spin), frame->cd.h*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_waste_spin), frame->round.waste*upp);
+ break;
+
+ }
+ for ( p = frame->all.markups; p != NULL; p=p->next )
+ {
+ lglTemplateMarkup *markup = (lglTemplateMarkup *)p->data;
+
+ if ( markup->type == LGL_TEMPLATE_MARKUP_MARGIN )
+ {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->rect_margin_spin), markup->margin.size*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->round_margin_spin), markup->margin.size*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->cd_margin_spin), markup->margin.size*upp);
+ }
+ }
+
+
+ p_layout1 = g_list_nth (frame->all.layouts, 0);
+ p_layout2 = g_list_nth (frame->all.layouts, 1);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->nlayouts_spin), p_layout2 ? 2 : 1 );
+ if ( p_layout1 )
+ {
+ lglTemplateLayout *layout1 = (lglTemplateLayout *)p_layout1->data;
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_nx_spin), layout1->nx);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_ny_spin), layout1->ny);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_x0_spin), layout1->x0*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_y0_spin), layout1->y0*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dx_spin), layout1->dx*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout1_dy_spin), layout1->dy*upp);
+ }
+ if ( p_layout2 )
+ {
+ lglTemplateLayout *layout2 = (lglTemplateLayout *)p_layout2->data;
+
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_nx_spin), layout2->nx);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_ny_spin), layout2->ny);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_x0_spin), layout2->x0*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_y0_spin), layout2->y0*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dx_spin), layout2->dx*upp);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON(dialog->priv->layout2_dy_spin), layout2->dy*upp);
+ }
+
+
+ dialog->priv->stop_signals = FALSE;
+
+ }
+}
+
+
/*--------------------------------------------------------------------------*/
/* PRIVATE. cancel callback. */
/*--------------------------------------------------------------------------*/
@@ -1134,6 +1258,15 @@ apply_cb (glTemplateDesigner *dialog)
units = gl_prefs_model_get_units (gl_prefs);
lgl_xml_set_default_units (units);
+
+ if (dialog->priv->edit_flag)
+ {
+ lgl_db_delete_template_by_brand_part (dialog->priv->edit_brand, dialog->priv->edit_part);
+
+ name = g_strdup_printf ("%s %s", dialog->priv->edit_brand, dialog->priv->edit_part);
+ gl_mini_preview_pixbuf_cache_delete_by_name (name);
+ g_free (name);
+ }
template = build_template (dialog);
lgl_db_register_template (template);
@@ -1265,36 +1398,41 @@ name_page_changed_cb (glTemplateDesigner *dialog)
part_num = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->part_num_entry), 0, -1));
desc = gtk_editable_get_chars (GTK_EDITABLE(dialog->priv->description_entry), 0, -1);
+ gtk_image_clear (GTK_IMAGE (dialog->priv->name_warning_image));
+ gtk_label_set_text (GTK_LABEL (dialog->priv->name_warning_label), "");
- if (brand && brand[0] && part_num && part_num[0] &&
- lgl_db_does_template_exist (brand, part_num))
- {
- gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->name_warning_image),
- GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON);
- gtk_label_set_markup (GTK_LABEL (dialog->priv->name_warning_label),
- _("<span foreground='red' weight='bold'>Brand and part# match an existing template!</span>"));
- }
- else
+ if (brand && brand[0] && part_num && part_num[0])
{
- gtk_image_clear (GTK_IMAGE (dialog->priv->name_warning_image));
- gtk_label_set_text (GTK_LABEL (dialog->priv->name_warning_label), "");
- }
- if (brand && brand[0] && part_num && part_num[0] && desc && desc[0] &&
- !lgl_db_does_template_exist (brand, part_num))
- {
+ if (lgl_db_does_template_exist (brand, part_num))
+ {
+ /* Make exception for currently edited template. */
+ if ( dialog->priv->edit_brand && !lgl_str_utf8_casecmp (brand, dialog->priv->edit_brand) &&
+ dialog->priv->edit_part && !lgl_str_utf8_casecmp (part_num, dialog->priv->edit_part) )
+ {
+ gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, TRUE);
+ }
+ else
+ {
+ gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, FALSE);
+
+ gtk_image_set_from_stock (GTK_IMAGE (dialog->priv->name_warning_image),
+ GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON);
+ gtk_label_set_markup (GTK_LABEL (dialog->priv->name_warning_label),
+ _("<span foreground='red' weight='bold'>Brand and part# match an existing template!</span>"));
+
+ }
+ }
+ else
+ {
+ gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, TRUE);
+ }
- gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
- dialog->priv->name_page,
- TRUE);
- }
+ }
else
{
-
- gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog),
- dialog->priv->name_page,
- FALSE);
- }
+ gtk_assistant_set_page_complete (GTK_ASSISTANT (dialog), dialog->priv->name_page, FALSE);
+ }
g_free (brand);
g_free (part_num);
diff --git a/src/template-designer.h b/src/template-designer.h
index a86034c..39b605e 100644
--- a/src/template-designer.h
+++ b/src/template-designer.h
@@ -58,7 +58,10 @@ struct _glTemplateDesignerClass
GType gl_template_designer_get_type (void) G_GNUC_CONST;
-GtkWidget *gl_template_designer_new (GtkWindow *parent);
+GtkWidget *gl_template_designer_new (GtkWindow *parent);
+
+void gl_template_designer_set_from_name (glTemplateDesigner *dialog,
+ const gchar *name);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]