2 * irreco - Ir Remote Control
3 * Copyright (C) 2007 Arto Karppinen (arto.karppinen@iki.fi)
4 * 2008 Joni Kokko (t5kojo01@students.oamk.fi)
5 * 2008 Harri Vattulainen (t5vaha01@students.oamk.fi)
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program 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.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include "irreco_theme_upload_dlg.h"
23 #include "irreco_button_browser_dlg.h"
24 #include <hildon/hildon-banner.h>
28 * @addtogroup IrrecoThemeUploadDlg
31 * Allow user to set theme settings and upload it.
38 * Source file of @ref IrrecoThemeUploadDlg.
43 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
47 #define IRRECO_THEME_UPLOAD_PREVIEW_WIDHT (IRRECO_SCREEN_WIDTH / 6)
48 #define IRRECO_THEME_UPLOAD_PREVIEW_HEIGHT (IRRECO_SCREEN_HEIGHT / 6)
56 LOADER_STATE_BACKGROUNDS
,
60 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
62 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
63 static gboolean
_texts_ok(IrrecoThemeUploadDlg
*self
);
64 static gboolean
_send_theme(IrrecoThemeUploadDlg
*self
);
65 static void _update_preview(IrrecoThemeUploadDlg
*self
);
66 static void _run_button_browser_dlg(GtkWidget
*widget
,
67 GdkEventButton
*event
,
68 IrrecoThemeUploadDlg
*self
);
69 static gboolean
_get_image_data_and_hash(gchar
* img_path
,
75 static void _hide_banner(IrrecoThemeUploadDlg
*self
);
76 static void _set_banner(IrrecoThemeUploadDlg
*self
,
79 static void _loader_start(IrrecoThemeUploadDlg
*self
);
80 static void _loader_stop(IrrecoThemeUploadDlg
*self
);
82 static gboolean
_upload_button(IrrecoThemeUploadDlg
* self
,
84 IrrecoWebdbClient
*client
,
86 static gboolean
_upload_background(IrrecoThemeUploadDlg
* self
,
88 IrrecoWebdbClient
*client
,
92 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
93 /* Construction & Destruction */
94 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
97 * @name Construction & Destruction
101 G_DEFINE_TYPE(IrrecoThemeUploadDlg
, irreco_theme_upload_dlg
,
102 IRRECO_TYPE_INTERNAL_DLG
)
104 static void irreco_theme_upload_dlg_constructed(GObject
*object
)
106 IrrecoThemeUploadDlg
*self
;
109 GtkWidget
*vbox_preview
;
110 GtkWidget
*label_name
;
111 GtkWidget
*label_comments
;
112 GtkWidget
*label_preview
;
113 GtkWidget
*scrolled_comments
;
115 GtkWidget
*frame_comments
;
116 GtkWidget
*frame_preview
;
120 G_OBJECT_CLASS(irreco_theme_upload_dlg_parent_class
)->constructed(object
);
121 self
= IRRECO_THEME_UPLOAD_DLG(object
);
123 self
->comments
= NULL
;
125 /* Construct dialog. */
126 gtk_window_set_title(GTK_WINDOW(self
), _("Upload theme"));
127 gtk_window_set_modal(GTK_WINDOW(self
), TRUE
);
128 gtk_window_set_destroy_with_parent(GTK_WINDOW(self
), TRUE
);
129 gtk_dialog_set_has_separator(GTK_DIALOG(self
), FALSE
);
130 gtk_dialog_add_buttons(GTK_DIALOG(self
),
131 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
132 GTK_STOCK_OK
, GTK_RESPONSE_OK
,
135 /* Create widgets. */
136 hbox_lr
= gtk_hbox_new(FALSE
, 10);
137 vbox_preview
= gtk_vbox_new(FALSE
, 0);
138 label_name
= gtk_label_new("Theme name:");
139 label_comments
= gtk_label_new("Comments:");
140 label_preview
= gtk_label_new("Select\npreview image:");
141 self
->entry_name
= gtk_entry_new();
142 self
->textview_comments
= gtk_text_view_new();
143 frame_comments
= gtk_frame_new(NULL
);
146 self
->preview_image
= gtk_image_new();
147 gtk_image_set_from_file(GTK_IMAGE(self
->preview_image
), NULL
);
148 frame_preview
= gtk_frame_new(NULL
);
149 self
->preview_event_box
= gtk_event_box_new();
150 gtk_container_add(GTK_CONTAINER(frame_preview
), self
->preview_image
);
151 gtk_container_add(GTK_CONTAINER(self
->preview_event_box
), frame_preview
);
152 gtk_widget_set_size_request(frame_preview
, 200,200);
155 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(self
->textview_comments
),
157 gtk_widget_set_size_request(self
->textview_comments
, 400, 150);
158 scrolled_comments
= gtk_scrolled_window_new(NULL
, NULL
);
159 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_comments
),
161 GTK_POLICY_AUTOMATIC
);
162 table
= gtk_table_new(4, 2, FALSE
);
165 gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(self
)->vbox
),
167 gtk_box_pack_start_defaults(GTK_BOX(hbox_lr
), table
);
168 gtk_box_pack_end_defaults(GTK_BOX(hbox_lr
), vbox_preview
);
169 gtk_box_pack_start_defaults(GTK_BOX(vbox_preview
), label_preview
);
170 gtk_box_pack_end_defaults(GTK_BOX(vbox_preview
),
171 self
->preview_event_box
);
172 gtk_container_add(GTK_CONTAINER(scrolled_comments
),
173 self
->textview_comments
);
174 gtk_container_add(GTK_CONTAINER (frame_comments
),
176 gtk_table_attach_defaults(GTK_TABLE(table
),
177 label_name
, 0, 1, 0, 1);
178 gtk_table_attach_defaults(GTK_TABLE(table
),
179 self
->entry_name
, 1, 2, 0, 1);
180 gtk_table_attach_defaults(GTK_TABLE(table
),
181 label_comments
, 0, 1, 1, 2);
182 gtk_table_attach_defaults(GTK_TABLE(table
),
183 frame_comments
, 0, 2, 2, 3);
185 /* Connect preview eventbox and start dialog from there */
186 g_signal_connect(G_OBJECT(self
->preview_event_box
),
187 "button-release-event",
188 G_CALLBACK(_run_button_browser_dlg
),
189 IRRECO_THEME_UPLOAD_DLG(self
));
191 gtk_widget_show_all(GTK_WIDGET(self
));
195 static void irreco_theme_upload_dlg_init(IrrecoThemeUploadDlg
*self
)
198 /*self->theme_name = g_string_new(NULL);
199 self->author = g_string_new(NULL);
200 self->comments = g_string_new(NULL);*/
204 static void irreco_theme_upload_dlg_finalize(GObject
*object
)
206 IrrecoThemeUploadDlg
*self
;
209 self
= IRRECO_THEME_UPLOAD_DLG(object
);
210 /*g_string_free(self->theme_name, TRUE);
211 self->theme_name = NULL;
212 g_string_free(self->author, TRUE);
214 g_string_free(self->comments, TRUE);
215 self->comments = NULL;*/
217 G_OBJECT_CLASS(irreco_theme_upload_dlg_parent_class
)->finalize(object
);
221 static void irreco_theme_upload_dlg_class_init(IrrecoThemeUploadDlgClass
*klass
)
223 GObjectClass
* object_class
= G_OBJECT_CLASS (klass
);
224 /* IrrecoDlgClass* parent_class = IRRECO_DLG_CLASS (klass); */
226 object_class
->finalize
= irreco_theme_upload_dlg_finalize
;
227 object_class
->constructed
= irreco_theme_upload_dlg_constructed
;
230 GtkWidget
*irreco_theme_upload_dlg_new(IrrecoData
*irreco_data
,
231 GtkWindow
*parent_window
)
233 IrrecoThemeUploadDlg
*self
;
236 self
= g_object_new(IRRECO_TYPE_THEME_UPLOAD_DLG
,
237 "irreco-data", irreco_data
,
239 irreco_dlg_set_parent(IRRECO_DLG(self
), parent_window
);
240 IRRECO_RETURN_PTR(self
);
245 * @todo Replace calls to irreco_theme_upload_dlg_create() with
246 * irreco_theme_upload_dlg_new().
248 IrrecoThemeUploadDlg
*irreco_theme_upload_dlg_create(IrrecoData
*irreco_data
,
249 GtkWindow
*parent_window
)
252 IRRECO_RETURN_PTR(irreco_theme_upload_dlg_new(
253 irreco_data
, parent_window
));
258 * @todo Replace calls to irreco_theme_upload_dlg_destroy() with
259 * gtk_widget_destroy().
261 void irreco_theme_upload_dlg_destroy(IrrecoThemeUploadDlg
* self
)
264 gtk_widget_destroy(GTK_WIDGET(self
));
265 if(self
->comments
!= NULL
) {
266 g_free(self
->comments
);
267 self
->comments
= NULL
;
276 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
277 /* Private Functions */
278 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
280 * @name Private Functions
285 * Show hildon progressbar banner.
287 * This function will create a new banner if one has not been created yet,
288 * if banner already exists, it's properties will be changed.
290 * @param text Text to show.
291 * @param fraction Value of progress.
293 static void _set_banner(IrrecoThemeUploadDlg
*self
,
299 if (self
->banner
== NULL
) {
300 self
->banner
= hildon_banner_show_progress(
301 GTK_WIDGET(self
), NULL
, "");
304 hildon_banner_set_text(HILDON_BANNER(self
->banner
), text
);
305 hildon_banner_set_fraction(HILDON_BANNER(self
->banner
), fraction
);
311 * Destroy banner, if it exists.
313 static void _hide_banner(IrrecoThemeUploadDlg
*self
)
318 gtk_widget_destroy(self
->banner
);
326 * Start a loader state machine if one is not running already.
328 static void _loader_start(IrrecoThemeUploadDlg
*self
)
332 if (self
->loader_func_id
== 0) {
333 self
->loader_func_id
= g_idle_add((GSourceFunc
)_send_theme
, self
);
340 * Stop and cleanup loader if a loader is running.
342 static void _loader_stop(IrrecoThemeUploadDlg
*self
)
346 if (self
->loader_func_id
!= 0) {
347 g_source_remove(self
->loader_func_id
);
348 self
->loader_func_id
= 0;
349 self
->loader_state
= 0;
354 /* Check textfields, return TRUE if everythings fine */
355 static gboolean
_texts_ok(IrrecoThemeUploadDlg
*self
)
357 gboolean rvalue
= TRUE
;
358 GtkTextIter startiter
;
360 /*GtkTextBuffer *buffer_comments;*/
364 if (self
->comments
!= NULL
) g_free(self
->comments
);
366 self
->theme_name
= gtk_entry_get_text(GTK_ENTRY(self
->entry_name
));
367 IRRECO_DEBUG("Theme name len:%d\n",
368 (gint
)g_utf8_strlen(self
->theme_name
, -1));
369 if((gint
)g_utf8_strlen(self
->theme_name
, -1) == 0) {
371 irreco_error_dlg(GTK_WINDOW(self
),
372 "Too short theme name.\n"
373 "Name must be at least 1 character.");
376 gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(self
->buffer_comments
),
378 gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(self
->buffer_comments
),
380 self
->comments
= gtk_text_buffer_get_text(
381 GTK_TEXT_BUFFER(self
->buffer_comments
),
385 IRRECO_DEBUG("theme comments: %s\n", self
->comments
);
386 IRRECO_DEBUG("theme name: %s\n", self
->theme_name
);
388 IRRECO_RETURN_BOOL(rvalue
);
391 /* Upload theme confs and images, return TRUE if everything went fine */
392 static gboolean
_send_theme(IrrecoThemeUploadDlg
*self
)
396 switch (self
->loader_state
) {
398 case LOADER_STATE_INIT
:
400 IRRECO_DEBUG("Loader state init\n");
402 self
->uploading_errors
= FALSE
;
403 self
->client
= irreco_webdb_client_new();
405 irreco_webdb_client_get_max_image_size(self
->client
);
406 self
->banner_max
= irreco_string_table_lenght(
407 self
->theme
->buttons
);
408 self
->banner_max
+= irreco_string_table_lenght(
409 self
->theme
->backgrounds
);
410 self
->strtablesize
= irreco_string_table_lenght(
411 self
->theme
->buttons
);
412 self
->strtableindex
= 0;
413 _set_banner(self
, _("Uploading theme..."), 0);
414 self
->loader_state
= LOADER_STATE_THEME
;
416 IRRECO_RETURN_BOOL(TRUE
);
418 case LOADER_STATE_THEME
: {
422 IRRECO_DEBUG("Loader state theme\n");
424 /* Parse folder out from theme path */
425 parsedpath
= g_utf8_strrchr(self
->theme
->path
->str
,
428 parsedpath
= g_utf8_find_next_char(parsedpath
, NULL
);
429 /* Create new theme */
430 self
->themeindex
= irreco_webdb_client_create_theme(
434 self
->theme
->preview_button_name
->str
,
439 /* Abort if theme creation fails */
440 if(self
->themeindex
== 0) {
441 irreco_error_dlg(GTK_WINDOW(self
),
442 "Failed to create theme");
443 self
->uploading_errors
= TRUE
;
445 IRRECO_RETURN_BOOL(FALSE
);
448 self
->loader_state
= LOADER_STATE_BUTTONS
;
450 IRRECO_RETURN_BOOL(TRUE
);
453 case LOADER_STATE_BUTTONS
: {
455 guchar
*img_up_data
= g_malloc0(self
->buffer_size
);
456 guchar
*img_down_data
= g_malloc0(self
->buffer_size
);
457 gchar
*img_up_sha
; /* SHAs */
459 gchar
*img_up_name
; /* filenames */
460 gchar
*img_down_name
;
461 gint img_up_len
; /* img data lengths */
463 GString
*img_folder
= g_string_new(NULL
); /* folder of button */
465 gchar
*error_msg
= NULL
;
467 IrrecoThemeButton
*button
;
470 IRRECO_DEBUG("Loader state buttons\n");
472 irreco_string_table_index(self
->theme
->buttons
,
473 self
->strtableindex
, &key
,
474 (gpointer
*) &button
);
476 banner
= (gfloat
) self
->strtableindex
/(gfloat
) self
->banner_max
;
478 self
->strtableindex
++;
481 "Uploading buttons...",
484 IRRECO_DEBUG("Current button: %s\n", button
->name
->str
);
486 /* button up sizecheck */
487 if(irreco_file_length(button
->image_up
->str
) >=
492 irreco_error_dlg(GTK_WINDOW(self
),
494 "Button %s image too large\n"
495 "Max allowed size: %d KiB",
497 self
->buffer_size
/1024));
498 self
->uploading_errors
= TRUE
;
503 if(_get_image_data_and_hash(button
->image_up
->str
,
510 /* Parse folder out from theme img */
511 img_up_name
= g_utf8_strrchr(button
->image_up
->str
,
514 img_up_name
= g_utf8_find_next_char(img_up_name
, NULL
);
519 irreco_error_dlg(GTK_WINDOW(self
), error_msg
);
520 self
->uploading_errors
= TRUE
;
524 /* button down sizecheck */
525 if(irreco_file_length(button
->image_down
->str
) >=
527 img_down_data
= NULL
;
529 img_down_name
= NULL
;
530 irreco_error_dlg(GTK_WINDOW(self
),
532 "Button %s image too large\n"
533 "Max allowed size: %d KiB",
535 self
->buffer_size
/1024));
536 self
->uploading_errors
= TRUE
;
541 if(_get_image_data_and_hash(button
->image_down
->str
,
547 /* Parse folder out from theme img */
548 img_down_name
= g_utf8_strrchr(button
->image_down
->str
,
551 img_down_name
= g_utf8_find_next_char(img_down_name
,
554 img_down_data
= NULL
;
556 img_down_name
= NULL
;
557 IRRECO_DEBUG("No optional down button\n");
560 /* Copy whole path+button name */
561 g_string_printf(img_folder
, "%s", button
->image_down
->str
);
562 /* Remove everything past and including rightmost folder char */
563 img_folder
= g_string_erase(img_folder
,
564 strlen(button
->image_down
->str
) -
565 strlen(g_utf8_strrchr(
566 button
->image_down
->str
,
570 /* Remove everything prior rightmost folder character */
571 g_string_printf(img_folder
, "%s", g_utf8_strrchr(img_folder
->str
,
574 /* Remove starting folder character */
575 img_folder
= g_string_erase(img_folder
, 0, 1);
578 button_index
= irreco_webdb_client_add_button_to_theme(
582 button
->text_format_up
->str
,
583 button
->text_format_down
->str
,
584 button
->text_padding
,
598 if(button_index
== 0) {
599 irreco_error_dlg(GTK_WINDOW(self
),
601 "Button %s uploading failed",
603 self
->uploading_errors
= TRUE
;
610 g_free(img_down_data
);
611 img_down_data
= NULL
;
612 g_string_free(img_folder
, TRUE
);
615 if(self
->strtablesize
== self
->strtableindex
) {
616 self
->strtablesize
= irreco_string_table_lenght(self
->theme
->backgrounds
);
617 self
->strtableindex
= 0;
618 self
->loader_state
= LOADER_STATE_BACKGROUNDS
;
619 IRRECO_DEBUG("Next loader state backgrounds\n");
622 IRRECO_RETURN_BOOL(TRUE
);
627 case LOADER_STATE_BACKGROUNDS
: {
628 GString
*img_folder
= g_string_new(NULL
);
629 guchar
*img_data
= g_malloc0(self
->buffer_size
);
639 irreco_string_table_index(self
->theme
->backgrounds
,
640 self
->strtableindex
, &key
,
643 banner
= (gfloat
) (self
->banner_max
-
644 self
->strtablesize
+ self
->strtableindex
) /
645 (gfloat
) self
->banner_max
;
647 self
->strtableindex
++;
649 _set_banner(self
, "Uploading backgrounds...", banner
);
651 IRRECO_DEBUG("Current bg: %s\n", bg
->image_name
->str
);
653 /* backgrounds image sizecheck */
654 if(irreco_file_length(bg
->image_path
->str
) >=
659 irreco_error_dlg(GTK_WINDOW(self
),
661 "Background %s image too large\n"
662 "Max allowed size: %d KiB",
664 self
->buffer_size
/1024));
665 self
->uploading_errors
= TRUE
;
668 if(_get_image_data_and_hash(bg
->image_path
->str
,
675 /* Parse folder out from bg img path */
676 img_name
= g_utf8_strrchr(bg
->image_path
->str
,
679 img_name
= g_utf8_find_next_char(img_name
, NULL
);
684 irreco_error_dlg(GTK_WINDOW(self
), error_msg
);
685 self
->uploading_errors
= TRUE
;
689 /* Copy whole path+bg name */
690 g_string_printf(img_folder
, "%s", bg
->image_path
->str
);
691 /* Remove everything past and including rightmost folder char */
692 img_folder
= g_string_erase(img_folder
,
693 strlen(bg
->image_path
->str
) -
694 strlen(g_utf8_strrchr(
699 /* Remove everything prior rightmost folder character */
700 g_string_printf(img_folder
, "%s", g_utf8_strrchr(img_folder
->str
,
703 /* Remove starting folder character */
704 img_folder
= g_string_erase(img_folder
, 0, 1);
706 if(img_len
>= self
->buffer_size
) {
707 irreco_error_dlg(GTK_WINDOW(self
),
709 "Bg %s image too large",
710 bg
->image_name
->str
));
711 self
->uploading_errors
= TRUE
;
715 bg_index
= irreco_webdb_client_add_bg_to_theme(
727 irreco_error_dlg(GTK_WINDOW(self
),
729 "Bg %s uploading failed",
730 bg
->image_name
->str
));
731 self
->uploading_errors
= TRUE
;
737 g_string_free(img_folder
, TRUE
);
740 if(self
->strtablesize
== self
->strtableindex
) {
741 /*self->strtablesize = irreco_string_table_lenght(self->theme->backgrounds);
742 self->strtableindex = 0;*/
743 self
->loader_state
= LOADER_STATE_END
;
744 IRRECO_DEBUG("Next loader state end\n");
747 IRRECO_RETURN_BOOL(TRUE
);
750 case LOADER_STATE_END
:
753 if(!self
->uploading_errors
) {
754 irreco_info_dlg(GTK_WINDOW(self
),
755 "Theme uploaded successfully");
757 irreco_info_dlg(GTK_WINDOW(self
),
758 "Theme uploaded done,"
759 "some errors occured");
761 self
->uploading_started
= FALSE
;
762 gtk_dialog_response(GTK_DIALOG(self
), GTK_RESPONSE_CLOSE
);
764 /*irreco_theme_upload_dlg_destroy(self);*/
765 /*irreco_theme_upload_dlg_destroy(self);*/
767 IRRECO_RETURN_BOOL(FALSE
);
770 IRRECO_RETURN_BOOL(FALSE
);
773 static gboolean
_get_image_data_and_hash(gchar
*img_path
,
780 gboolean rvalue
= TRUE
;
784 if(irreco_file_exists(img_path
)) {
785 if(irreco_read_binary_file(img_path
,
789 *img_sha
= sha_compute_checksum_for_data(
794 IRRECO_DEBUG("File read failed\n");
795 *error_msg
= "File read failed\n";
799 IRRECO_DEBUG("No such file\n");
800 *error_msg
= "No such file\n";
804 IRRECO_RETURN_BOOL(rvalue
)
808 static void _update_preview(IrrecoThemeUploadDlg
*self
)
812 /* if theme contains preview image, use it, else get some button */
813 if(!self
->preview_name
) {
816 IRRECO_DEBUG("No preview set, get first button\n");
817 irreco_string_table_index(self
->theme
->buttons
,
819 (gpointer
*) &self
->preview_button
);
820 if(self
->preview_button
) {
821 self
->preview_name
= self
->preview_button
->image_up
->str
;
824 IRRECO_DEBUG("preview path: %s\n", self
->preview_name
);
826 gtk_image_set_from_file(GTK_IMAGE(self
->preview_image
),
829 gtk_widget_show_all(GTK_WIDGET(self
));
839 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
840 /* Public Functions */
841 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
844 * Show dialog, and ask user for input.
847 gboolean
irreco_theme_upload_dlg_run(GtkWindow
*parent_window
,
848 IrrecoData
*irreco_data
,
849 IrrecoTheme
* irreco_theme
)
851 IrrecoThemeUploadDlg
*self
;
853 gboolean loop
= TRUE
;
857 if(irreco_theme
== NULL
) { IRRECO_RETURN_BOOL(FALSE
); }
859 self
= irreco_theme_upload_dlg_create(irreco_data
, parent_window
);
861 self
->parent_window
= GTK_WINDOW(self
);
862 self
->irreco_data
= irreco_data
;
863 self
->theme
= irreco_theme
;
864 self
->preview_name
= NULL
;
865 self
->uploading_started
= FALSE
;
866 self
->loader_func_id
= 0;
868 /* set things to dialog, cause theme & data wasn't set @ _constructed */
869 gtk_entry_set_text(GTK_ENTRY(self
->entry_name
), self
->theme
->name
->str
);
870 self
->buffer_comments
= gtk_text_view_get_buffer(
871 GTK_TEXT_VIEW(self
->textview_comments
));
872 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(self
->buffer_comments
),
873 self
->theme
->comment
->str
,
875 _update_preview(self
);
878 response
= gtk_dialog_run(GTK_DIALOG(self
));
880 case GTK_RESPONSE_OK
:
881 IRRECO_DEBUG("GTK_RESPONSE_OK\n");
883 if(self
->uploading_started
) {
884 IRRECO_DEBUG("Already uploading theme\n");
888 /* Check themename length and get texts */
889 if(!_texts_ok(self
)) {
890 IRRECO_DEBUG("Input failure\n");
894 /* Show login/reg dialog */
895 if(!irreco_show_login_dlg(irreco_data
,
899 IRRECO_DEBUG("Failed login\n\n");
903 /* set new info to theme */
904 irreco_theme_set_author(self
->theme
, self
->user
);
905 /* TODO add functionality to set new name for theme */
906 irreco_theme_set_comment(self
->theme
, self
->comments
);
907 irreco_theme_set_preview_button(self
->theme
,
908 self
->preview_button
->name
->str
);
910 self
->uploading_started
= TRUE
;
911 self
->loader_state
= LOADER_STATE_INIT
;
912 IRRECO_DEBUG("Start loader\n");
917 case GTK_RESPONSE_CANCEL
:
918 IRRECO_DEBUG("GTK_RESPONSE_CANCEL\n");
920 if(self
->uploading_started
) {
921 irreco_info_dlg(GTK_WINDOW(self
),
922 "Theme uploading aborted");
927 case GTK_RESPONSE_CLOSE
:
928 IRRECO_DEBUG("GTK_RESPONSE_CLOSE\n");
934 IRRECO_DEBUG("Something went horribly wrong\n");
941 irreco_theme_upload_dlg_destroy(self
);
943 IRRECO_RETURN_BOOL(FALSE
);
950 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
951 /* Events and Callbacks */
952 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
955 * @name Events and Callbacks
959 static void _run_button_browser_dlg(GtkWidget
*widget
,
960 GdkEventButton
*event
,
961 IrrecoThemeUploadDlg
*self
)
963 IrrecoThemeButton
*preview_theme_button
= NULL
;
967 preview_theme_button
= irreco_button_browser_dlg_run(
968 GTK_WINDOW(IRRECO_THEME_UPLOAD_DLG(self
)->parent_window
),
972 if(preview_theme_button
) {
973 IRRECO_DEBUG("Set preview button to theme and self->\n");
974 self
->preview_name
= preview_theme_button
->image_up
->str
;
975 self
->preview_button
= preview_theme_button
;
976 _update_preview(self
);