2 * irreco - Ir Remote Control
3 * Copyright (C) 2008 Pekka Gehör (pegu6@msn.com)
4 * Joni Kokko (t5kojo01@students.oamk.fi),
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include "irreco_theme_manager_dlg.h"
22 #include <hildon/hildon-banner.h>
23 #include "irreco_webdb_register_dlg.h"
24 #include "irreco_select_instance_dlg.h"
25 #include "irreco_config.h"
28 * @addtogroup IrrecoThemeManagerDlg
31 * @todo PURPOCE OF CLASS.
38 * Source file of @ref IrrecoThemeManagerDlg.
42 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
44 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
45 #define IRRECO_BACKGROUND_PREVIEW_WIDHT (IRRECO_SCREEN_WIDTH / 6)
46 #define IRRECO_BACKGROUND_PREVIEW_HEIGHT (IRRECO_SCREEN_HEIGHT / 6)
49 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
51 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
53 static void irreco_theme_manager_dlg_hide_banner(IrrecoThemeManagerDlg
*self
);
54 static void irreco_theme_manager_dlg_loader_stop(IrrecoThemeManagerDlg
*self
);
56 static void irreco_theme_manager_dlg_clean_details(IrrecoThemeManagerDlg
*self
);
59 irreco_theme_manager_dlg_loader_deb(IrrecoThemeManagerDlg
*self
);
61 irreco_theme_manager_dlg_loader_user(IrrecoThemeManagerDlg
*self
);
63 irreco_theme_manager_dlg_loader_web(IrrecoThemeManagerDlg
*self
);
65 irreco_theme_manager_dlg_loader_db(IrrecoThemeManagerDlg
*self
);
67 irreco_theme_manager_dlg_theme_db_detail_loader(IrrecoThemeManagerDlg
*self
);
69 irreco_theme_manager_dlg_bg_loader(IrrecoThemeManagerDlg
*self
);
71 irreco_theme_manager_dlg_button_loader(IrrecoThemeManagerDlg
*self
);
75 irreco_theme_manager_dlg_display_theme_detail(IrrecoThemeManagerDlg
*self
,
78 static gboolean
irreco_show_theme_manager_dlg_map_event(IrrecoThemeManagerDlg
79 *self
, GdkEvent
*event
,
81 static void irreco_show_theme_manager_dlg_destroy_event(IrrecoThemeManagerDlg
86 irreco_show_theme_manager_dlg_row_activated_event(GtkTreeView
*tree_view
,
88 GtkTreeViewColumn
*column
,
89 IrrecoThemeManagerDlg
*self
);
92 irreco_show_theme_manager_dlg_row_expanded_event(GtkTreeView
*tree_view
,
95 IrrecoThemeManagerDlg
*self
);
97 irreco_show_theme_manager_dlg_row_collapsed_event(GtkTreeView
*tree_view
,
100 IrrecoThemeManagerDlg
*self
);
104 irreco_show_theme_manager_dlg_row_selected_event(GtkTreeSelection
*sel
,
105 IrrecoThemeManagerDlg
*self
);
107 gboolean
irreco_theme_manager_dlg_preview_dlg(GtkWidget
*widget
,
108 GdkEventButton
*event
,
109 IrrecoThemeManagerDlg
*self
);
112 static void irreco_theme_manager_dlg_upload_theme(GtkButton
*button
,
113 IrrecoThemeManagerDlg
*self
);
115 static void irreco_theme_manager_dlg_delete_theme(GtkButton
*button
,
116 IrrecoThemeManagerDlg
*self
);
118 irreco_theme_manager_dlg_download_theme(GtkButton
*button
,
119 IrrecoThemeManagerDlg
*self
);
122 irreco_theme_manager_dlg_selected_version_dlg(GtkComboBox
*widget
,
123 IrrecoThemeManagerDlg
*self
);
125 void irreco_theme_manager_update_theme_manager(IrrecoThemeManager
*self
);
127 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
129 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
131 /** Button responce codes. */
133 IRRECO_DEVICE_REFRESH
136 /** GtkTreeStore colums. */
145 /** Version colums. */
152 /** Loader states. */
164 ROW_CHILDREN_LOADED
= 1 << 1,
165 ROW_TYPE_CATEGORY
= 1 << 2,
166 ROW_TYPE_DEB
= 1 << 3,
167 ROW_TYPE_USER
= 1 << 4,
168 ROW_TYPE_WEB
= 1 << 5,
169 ROW_TYPE_DB
= 1 << 6,
170 ROW_TYPE_LOADING
= 1 << 7
173 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
174 /* Construction & Destruction */
175 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
178 * @name Construction & Destruction
182 G_DEFINE_TYPE(IrrecoThemeManagerDlg
, irreco_theme_manager_dlg
, IRRECO_TYPE_DLG
)
184 static void irreco_theme_manager_dlg_finalize(GObject
*object
)
186 if (G_OBJECT_CLASS(irreco_theme_manager_dlg_parent_class
)->finalize
)
187 G_OBJECT_CLASS(irreco_theme_manager_dlg_parent_class
)->finalize(
192 irreco_theme_manager_dlg_class_init(IrrecoThemeManagerDlgClass
*klass
)
194 GObjectClass
*object_class
= G_OBJECT_CLASS(klass
);
195 object_class
->finalize
= irreco_theme_manager_dlg_finalize
;
198 static void irreco_theme_manager_dlg_init(IrrecoThemeManagerDlg
*self
)
200 GtkTreeViewColumn
*column
;
201 GtkCellRenderer
*renderer
;
202 GtkTreeSelection
*select
;
203 GtkWidget
*label_name
;
204 GtkWidget
*label_description
;
205 /*GtkWidget *label_rate;*/
206 GtkWidget
*theme_info_frame
;
207 GtkWidget
*tree_view_frame
;
208 GtkWidget
*tree_view_hbox
;
209 GtkWidget
*preview_frame
;
210 PangoFontDescription
*initial_font
;
211 GtkWidget
*select_vbox
;
212 GtkWidget
*versions_hbox
;
213 GtkWidget
*comment_alignment
;
214 GtkWidget
*info_scrollbar
;
215 GtkWidget
*scrollbar
;
216 GtkWidget
*theme_info
;
218 GtkWidget
*info_vbox
;
219 GtkWidget
*done_button
;
220 GtkWidget
*theme_table
;
221 GtkWidget
*preview_event_box
;
225 self
->theme_folder
= NULL
;
227 /* Construct dialog. */
228 gtk_window_set_title(GTK_WINDOW(self
),
229 _("Theme Manager "));
230 /*gtk_window_set_decorated (GTK_WINDOW(self), FALSE);*/
231 gtk_window_set_modal(GTK_WINDOW(self
), TRUE
);
232 gtk_window_set_destroy_with_parent(GTK_WINDOW(self
), TRUE
);
233 gtk_dialog_set_has_separator(GTK_DIALOG(self
), FALSE
);
237 self
->refresh_button
= gtk_dialog_add_button (GTK_DIALOG(self
),
239 IRRECO_DEVICE_REFRESH
);
241 self
->upload_button
= gtk_dialog_add_button (GTK_DIALOG(self
),
242 _("Upload"), GTK_RESPONSE_NONE
);
245 self
->download_button
= gtk_dialog_add_button (GTK_DIALOG(self
),
248 self
->clear_button
= gtk_dialog_add_button (GTK_DIALOG(self
),
251 done_button
= gtk_dialog_add_button (GTK_DIALOG(self
),
253 GTK_RESPONSE_CANCEL
);
255 /* Create theme table */
257 table
= gtk_table_new(7,7,TRUE
);
258 gtk_table_set_col_spacings(GTK_TABLE (table
), 8);
259 gtk_table_set_row_spacings(GTK_TABLE (table
), 8);
260 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(self
)->vbox
),
261 irreco_gtk_align(GTK_WIDGET(table
),
262 0, 0, 1, 1, 8, 8, 8, 8));
263 /* Create tree_view_hbox */
264 tree_view_hbox
= gtk_hbox_new(FALSE
, 2);
266 /* Create Treeview */
267 self
->tree_store
= gtk_tree_store_new(
268 N_COLUMNS
, G_TYPE_STRING
, G_TYPE_INT
, G_TYPE_POINTER
);
269 self
->tree_view
= GTK_TREE_VIEW(gtk_tree_view_new_with_model(
270 GTK_TREE_MODEL(self
->tree_store
)));
272 renderer
= gtk_cell_renderer_text_new();
273 column
= gtk_tree_view_column_new_with_attributes(
274 NULL
, renderer
, "text", TEXT_COL
, NULL
);
275 gtk_tree_view_append_column(self
->tree_view
, column
);
277 gtk_box_pack_start(GTK_BOX(tree_view_hbox
), GTK_WIDGET(self
->tree_view
),
280 /* Create scrollbar for Treeview */
282 scrollbar
= gtk_scrolled_window_new(NULL
, NULL
);
283 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar
),
284 GTK_POLICY_AUTOMATIC
,
285 GTK_POLICY_AUTOMATIC
);
287 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(
288 scrollbar
), tree_view_hbox
);
290 /* Create Frame for Treeview */
291 tree_view_frame
= gtk_frame_new("");
292 gtk_frame_set_label_widget(GTK_FRAME(tree_view_frame
),
293 irreco_gtk_label_bold("Themes", 0, 0, 0, 0, 0, 0));
295 gtk_container_add(GTK_CONTAINER(tree_view_frame
),
296 GTK_WIDGET(scrollbar
));
298 /* Create theme_info */
300 theme_info
= gtk_table_new(7, 4, TRUE
);
301 gtk_table_set_col_spacings(GTK_TABLE(theme_info
), 8);
302 gtk_table_set_row_spacings(GTK_TABLE(theme_info
), 8);
304 /* Scrolled window for info */
305 info_scrollbar
= gtk_scrolled_window_new(NULL
, NULL
);
306 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(
309 GTK_POLICY_AUTOMATIC
);
312 self
->version_store
= gtk_tree_store_new(
313 2, G_TYPE_STRING
, G_TYPE_STRING
);
315 self
->combobox
= gtk_combo_box_new_text();
316 gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(self
->combobox
), 1);
317 gtk_combo_box_set_model(GTK_COMBO_BOX(self
->combobox
),
318 GTK_TREE_MODEL(self
->version_store
));
320 theme_table
= gtk_table_new(5, 7, TRUE
);
321 gtk_table_set_col_spacings(GTK_TABLE(theme_table
), 1);
322 gtk_table_set_row_spacings(GTK_TABLE(theme_table
), 1);
324 info_vbox
= gtk_vbox_new(FALSE
, 1);
327 preview_event_box
= gtk_event_box_new();
328 self
->select_label
= gtk_label_new(" Select \ncategory");
330 /* Create frame for theme_info */
331 select_vbox
= gtk_vbox_new(FALSE
, 2);
332 versions_hbox
= gtk_hbox_new(FALSE
, 2);
333 theme_info_frame
= gtk_frame_new("");
334 gtk_frame_set_label_widget(GTK_FRAME(theme_info_frame
),
335 irreco_gtk_label_bold("Info", 0, 0, 0, 0, 0, 0));
336 self
->theme_info_alignment
= gtk_alignment_new(0, 0, 0, 0);
337 gtk_alignment_set_padding(GTK_ALIGNMENT(self
->theme_info_alignment
),
341 preview_frame
= gtk_frame_new(NULL
);
342 gtk_frame_set_shadow_type(GTK_FRAME(preview_frame
), GTK_SHADOW_OUT
);
344 self
->theme_image
= gtk_image_new();
345 gtk_image_set_from_file(GTK_IMAGE(self
->theme_image
), NULL
);
349 /*label_rate = gtk_label_new(" Rating");*/
350 label_name
= gtk_label_new("Name: ");
351 self
->label_creator
= gtk_label_new("Author: ");
352 self
->label_download
= gtk_label_new("Downloads: ");
353 label_description
= gtk_label_new("Comment: ");
354 self
->label_combobox
= gtk_label_new("Version:");
356 self
->theme_name
= gtk_label_new("");
357 self
->theme_creator
= gtk_label_new("");
358 self
->theme_downloaded
= gtk_label_new("");
359 self
->theme_comment
= gtk_label_new("");
360 self
->theme_version
= gtk_label_new("");
362 comment_alignment
= gtk_alignment_new(0, 0, 0, 0);
363 gtk_widget_set_size_request(self
->theme_comment
,
365 gtk_alignment_set_padding(GTK_ALIGNMENT(comment_alignment
),
367 gtk_label_set_line_wrap(GTK_LABEL(self
->theme_comment
), TRUE
);
368 gtk_label_set_line_wrap_mode(GTK_LABEL(self
->theme_comment
),
371 /*gtk_misc_set_alignment(GTK_MISC(label_rate), 0, 0.5);*/
372 gtk_misc_set_alignment(GTK_MISC(label_name
), 0, 0.5);
373 gtk_misc_set_alignment(GTK_MISC(self
->label_creator
), 0, 0.5);
374 gtk_misc_set_alignment(GTK_MISC(self
->label_download
), 0, 0.5);
375 gtk_misc_set_alignment(GTK_MISC(label_description
), 0, 0.5);
376 gtk_misc_set_alignment(GTK_MISC(self
->label_combobox
), 0, 0.5);
377 gtk_misc_set_alignment(GTK_MISC(self
->theme_name
), 0, 0.5);
378 gtk_misc_set_alignment(GTK_MISC(self
->theme_creator
), 0, 0.5);
379 gtk_misc_set_alignment(GTK_MISC(self
->theme_downloaded
), 0, 0.5);
380 gtk_misc_set_alignment(GTK_MISC(self
->theme_comment
), 0, 0.5);
381 gtk_misc_set_alignment(GTK_MISC(self
->theme_version
), 0, 0.5);
384 /*Attach WidGets to tables*/
386 gtk_table_attach(GTK_TABLE(theme_info
), info_scrollbar
,
387 0, 4, 4, 7, GTK_FILL
, GTK_FILL
, 0, 0);
389 gtk_table_attach_defaults(GTK_TABLE(table
),
390 tree_view_frame
, 0, 3, 0, 7);
391 gtk_table_attach_defaults(GTK_TABLE(theme_info
),
392 preview_event_box
, 3, 4, 0, 3);
393 /* gtk_table_attach_defaults(GTK_TABLE(self->theme_info),
394 label_rate, 3, 4, 3, 4);*/
395 gtk_table_attach_defaults(GTK_TABLE(theme_info
),
396 theme_table
, 0, 3, 0, 4);
397 gtk_table_attach_defaults(GTK_TABLE(theme_table
),
398 label_name
, 0, 3, 0, 1);
399 gtk_table_attach_defaults(GTK_TABLE(theme_table
),
400 self
->label_creator
, 0, 3, 1, 2);
401 gtk_table_attach_defaults(GTK_TABLE(theme_table
),
402 self
->label_download
, 0, 3, 2, 3);
403 gtk_table_attach_defaults(GTK_TABLE(theme_table
),
404 label_description
, 0, 3, 4, 5);
405 gtk_table_attach_defaults(GTK_TABLE(theme_table
),
406 self
->label_combobox
, 0, 3, 3, 4);
407 gtk_table_attach_defaults(GTK_TABLE(theme_table
),
408 versions_hbox
, 3, 7, 3, 4);
409 gtk_table_attach_defaults(GTK_TABLE(table
),
410 theme_info_frame
, 3, 7, 0, 7);
411 gtk_table_attach(GTK_TABLE(theme_table
), self
->theme_name
,
412 3, 7, 0, 1, GTK_FILL
, GTK_FILL
, 0, 0);
413 gtk_table_attach(GTK_TABLE(theme_table
), self
->theme_creator
,
414 3, 7, 1, 2, GTK_FILL
, GTK_FILL
, 0, 0);
415 gtk_table_attach(GTK_TABLE(theme_table
), self
->theme_downloaded
,
416 3, 7, 2, 3, GTK_FILL
, GTK_FILL
, 0, 0);
420 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(
421 info_scrollbar
), info_vbox
);
422 gtk_container_add(GTK_CONTAINER(preview_frame
),
424 gtk_container_add(GTK_CONTAINER(preview_event_box
),
426 gtk_container_add(GTK_CONTAINER(info_vbox
), comment_alignment
);
427 gtk_container_add(GTK_CONTAINER(comment_alignment
),
428 self
->theme_comment
);
429 gtk_container_add(GTK_CONTAINER(theme_info_frame
),
430 GTK_WIDGET(select_vbox
));
431 gtk_container_add(GTK_CONTAINER(select_vbox
),
432 GTK_WIDGET(self
->theme_info_alignment
));
433 gtk_container_add(GTK_CONTAINER(select_vbox
),
434 GTK_WIDGET(self
->select_label
));
435 gtk_container_add(GTK_CONTAINER(self
->theme_info_alignment
),
436 GTK_WIDGET(theme_info
));
437 gtk_container_add(GTK_CONTAINER(versions_hbox
),
438 GTK_WIDGET(self
->theme_version
));
439 gtk_container_add(GTK_CONTAINER(versions_hbox
),
440 GTK_WIDGET(self
->combobox
));
442 /*Set font size and style*/
444 initial_font
= pango_font_description_from_string ("Sans Bold 16");
445 gtk_widget_modify_font (self
->select_label
, initial_font
);
447 initial_font
= pango_font_description_from_string ("Sans Bold 12");
448 /*gtk_widget_modify_font (label_rate, initial_font);*/
449 gtk_widget_modify_font (label_name
, initial_font
);
450 gtk_widget_modify_font (self
->label_creator
, initial_font
);
451 gtk_widget_modify_font (self
->label_download
, initial_font
);
452 gtk_widget_modify_font (label_description
, initial_font
);
453 gtk_widget_modify_font (self
->label_combobox
, initial_font
);
455 initial_font
= pango_font_description_from_string ("Sans 11");
456 gtk_widget_modify_font (self
->theme_name
, initial_font
);
457 gtk_widget_modify_font (self
->theme_creator
, initial_font
);
458 gtk_widget_modify_font (self
->theme_downloaded
, initial_font
);
459 gtk_widget_modify_font (self
->theme_comment
, initial_font
);
460 gtk_widget_modify_font (self
->theme_version
, initial_font
);
461 gtk_widget_modify_font (self
->combobox
, initial_font
);
463 /* Setup the selection handler for TREE */
464 select
= gtk_tree_view_get_selection(self
->tree_view
);
465 gtk_tree_selection_set_mode(select
, GTK_SELECTION_SINGLE
);
467 /* Signal handlers. */
468 g_signal_connect(G_OBJECT(self
), "map-event",
469 G_CALLBACK(irreco_show_theme_manager_dlg_map_event
), NULL
);
470 g_signal_connect(G_OBJECT(self
), "destroy",
471 G_CALLBACK(irreco_show_theme_manager_dlg_destroy_event
), NULL
);
472 g_signal_connect(G_OBJECT(self
->tree_view
), "row-activated",
473 G_CALLBACK(irreco_show_theme_manager_dlg_row_activated_event
),
475 g_signal_connect(G_OBJECT(self
->tree_view
), "row-expanded",
476 G_CALLBACK(irreco_show_theme_manager_dlg_row_expanded_event
),
478 g_signal_connect(G_OBJECT(self
->tree_view
), "row-collapsed",
479 G_CALLBACK(irreco_show_theme_manager_dlg_row_collapsed_event
),
481 g_signal_connect(G_OBJECT (select
), "changed",
482 G_CALLBACK (irreco_show_theme_manager_dlg_row_selected_event
),
484 g_signal_connect(G_OBJECT (self
->combobox
), "changed",
485 G_CALLBACK (irreco_theme_manager_dlg_selected_version_dlg
),
487 g_signal_connect(G_OBJECT(preview_event_box
),
488 "button-release-event",
489 G_CALLBACK(irreco_theme_manager_dlg_preview_dlg
),
491 g_signal_connect(G_OBJECT(self
->upload_button
),
493 G_CALLBACK(irreco_theme_manager_dlg_upload_theme
),
495 g_signal_connect(G_OBJECT(self
->clear_button
),
497 G_CALLBACK(irreco_theme_manager_dlg_delete_theme
),
499 g_signal_connect(G_OBJECT(self
->download_button
),
501 G_CALLBACK(irreco_theme_manager_dlg_download_theme
),
504 gtk_tree_view_set_enable_tree_lines(self
->tree_view
, TRUE
);
505 g_object_set (G_OBJECT (self
->tree_view
), "show-expanders", TRUE
, NULL
);
506 g_object_set (G_OBJECT (self
->tree_view
), "level-indentation", 0, NULL
);
507 gtk_tree_view_set_rubber_banding(self
->tree_view
, FALSE
);
509 gtk_widget_set_size_request(GTK_WIDGET(self
), 696, 396);
510 gtk_widget_show_all(GTK_WIDGET(self
));
515 GtkWidget
*irreco_theme_manager_dlg_new(IrrecoData
*irreco_data
,
518 IrrecoThemeManagerDlg
*self
;
522 self
= g_object_new(IRRECO_TYPE_THEME_MANAGER_DLG
, NULL
);
523 irreco_dlg_set_parent(IRRECO_DLG(self
), parent
);
524 irreco_theme_manager_dlg_set_irreco_data(self
, irreco_data
);
526 IRRECO_RETURN_PTR(self
);
530 * Show whole preview image
534 gboolean
irreco_theme_manager_dlg_preview_dlg(GtkWidget
*widget
,
535 GdkEventButton
*event
,
536 IrrecoThemeManagerDlg
*self
)
538 if(self
->preview_add
!=NULL
|| self
->webdb_theme
->preview_button
!=NULL
){
540 GtkWidget
*image
, *event_box
;
541 GtkWidget
*preview_dialog
;
545 preview_dialog
= irreco_dlg_new ();
546 gtk_window_set_title(GTK_WINDOW(preview_dialog
), _("Preview"));
547 gtk_window_set_modal(GTK_WINDOW(preview_dialog
), TRUE
);
548 gtk_window_set_destroy_with_parent(GTK_WINDOW(preview_dialog
), TRUE
);
549 gtk_dialog_set_has_separator(GTK_DIALOG(preview_dialog
), FALSE
);
551 gtk_widget_set_size_request(preview_dialog
, 185, -1);
553 event_box
= gtk_event_box_new();
554 image
= gtk_image_new();
555 if(self
->preview_add
!= NULL
){
556 gtk_image_set_from_file(GTK_IMAGE(image
), self
->preview_add
);
559 gtk_image_set_from_pixbuf(GTK_IMAGE(image
),
560 GDK_PIXBUF(self
->webdb_theme
->preview_button
));
563 gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(preview_dialog
)->vbox
),
565 gtk_container_add(GTK_CONTAINER(event_box
), image
);
567 g_signal_connect_swapped(G_OBJECT(event_box
),
568 "button-release-event",
569 G_CALLBACK(gtk_widget_destroy
),
572 gtk_widget_show_all(GTK_WIDGET(preview_dialog
));
574 IRRECO_RETURN_BOOL(TRUE
);
583 irreco_theme_manager_dlg_selected_version_dlg(GtkComboBox
*widget
,
584 IrrecoThemeManagerDlg
*self
)
591 if(!gtk_combo_box_get_active_iter(widget
, &iter
)) {
594 gtk_tree_model_get(GTK_TREE_MODEL(self
->version_store
), &iter
,
597 if (self
->webdb_theme
== NULL
|| self
->webdb_theme
->id
!= atoi(id
)) {
598 IRRECO_DEBUG("SELECTED ID: %d\n", atoi(id
));
599 self
->selected_theme_id
= atoi(id
);
600 self
->loader_func_id
= g_idle_add(G_SOURCEFUNC(
601 irreco_theme_manager_dlg_theme_db_detail_loader
),
612 static void irreco_theme_manager_dlg_delete_theme(GtkButton
*button
,
613 IrrecoThemeManagerDlg
*self
)
616 const gchar
*name
= gtk_label_get_label(GTK_LABEL(self
->theme_name
));
617 GString
*message
= g_string_new(NULL
);
620 g_string_append_printf(
621 message
, _("Are you sure you want to\n "
622 "delete %s theme?"),name
);
624 if (irreco_yes_no_dlg(GTK_WINDOW(self
), message
->str
)){
626 irreco_theme_manager_remove_theme(
627 self
->irreco_data
->theme_manager
, name
);
628 gtk_button_clicked(GTK_BUTTON(self
->refresh_button
));
631 g_string_free(message
, TRUE
);
636 * Download theme from DB
639 static void irreco_theme_manager_dlg_download_theme(GtkButton
*button
,
640 IrrecoThemeManagerDlg
*self
)
642 GtkWidget
*radio1
, *radio2
, *radio3
;
645 IrrecoWebdbCache
*webdb_cache
= NULL
;
646 gboolean theme_is_loaded
= FALSE
;
647 gint delete_mode
= 0;
648 IrrecoTheme
*same_theme
= NULL
;
649 gchar
*same_theme_folder
= NULL
;
650 IrrecoThemeManager
*theme_manager
= self
->irreco_data
->theme_manager
;
651 GString
*message
= g_string_new(NULL
);
652 GString
*path
= g_string_new(NULL
);
656 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
, FALSE
);
657 self
->download_dialog
= irreco_dlg_new();
659 gtk_widget_set_size_request(self
->download_dialog
, 340, 160);
661 gtk_window_set_title(GTK_WINDOW(self
->download_dialog
),
662 _("Download theme"));
663 gtk_window_set_modal(GTK_WINDOW(self
->download_dialog
), TRUE
);
664 gtk_window_set_destroy_with_parent(GTK_WINDOW(self
->download_dialog
),
666 gtk_dialog_set_has_separator(GTK_DIALOG(self
->download_dialog
), FALSE
);
667 gtk_dialog_add_buttons(GTK_DIALOG(self
->download_dialog
),
668 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
669 GTK_STOCK_OK
, GTK_RESPONSE_OK
,
672 label
= gtk_label_new("Select download location");
674 radio1
= gtk_radio_button_new_with_label (NULL
, "MMC1");
675 radio2
= gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(
677 radio3
= gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(
680 gtk_box_pack_start_defaults(GTK_BOX(
681 GTK_DIALOG(self
->download_dialog
)->vbox
),
684 if(irreco_is_dir("/media/mmc1")) {
685 gtk_box_pack_start_defaults(GTK_BOX(
686 GTK_DIALOG(self
->download_dialog
)->vbox
),
690 if(irreco_is_dir("/media/mmc2")) {
691 gtk_box_pack_start_defaults(GTK_BOX(
692 GTK_DIALOG(self
->download_dialog
)->vbox
),
696 gtk_box_pack_start_defaults(GTK_BOX(
697 GTK_DIALOG(self
->download_dialog
)->vbox
),
702 gtk_widget_show_all(GTK_WIDGET(self
->download_dialog
));
707 GTK_DIALOG(self
->download_dialog
)) == GTK_RESPONSE_CANCEL
){
711 if (self
->loader_func_id
!= 0) {
715 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio1
))) {
716 self
->theme_folder
= "/media/mmc1/irreco/";
717 } else if (gtk_toggle_button_get_active(
718 GTK_TOGGLE_BUTTON(radio2
))) {
719 self
->theme_folder
= "/media/mmc2/irreco/";
721 self
->theme_folder
= IRRECO_THEME_DIR
;
724 if(!irreco_is_dir(self
->theme_folder
)) {
725 g_mkdir(self
->theme_folder
, 0777);
729 g_string_printf(path
, "%s%s/", self
->theme_folder
,
730 self
->webdb_theme
->folder
->str
);
732 IRRECO_STRING_TABLE_FOREACH_DATA(theme_manager
->themes
,
733 IrrecoTheme
*, theme
)
735 if (g_str_equal(self
->webdb_theme
->name
->str
,
737 if (g_str_equal(theme
->source
->str
, "deb")) {
738 g_string_printf(message
,
739 _("The \"%s\" theme already exists.\n"
740 "Can't overwrite \"Built In themes\"\n"
741 "Please remove it first from the\n"
742 "Application Manager"),
745 irreco_error_dlg(GTK_WINDOW(
746 self
->download_dialog
),
753 /*Check theme folder path*/
754 else if (g_str_equal(path
->str
,
755 g_strconcat(theme
->path
->str
, "/", NULL
))){
756 if (g_str_equal(theme
->source
->str
, "deb")) {
757 g_string_printf(message
,
758 _("This theme replaces \"%s\" theme.\n"
759 "Can't overwrite \"Built In themes\"\n"
760 "Please remove it first from the\n"
761 "Application Manager"),
764 irreco_error_dlg(GTK_WINDOW(
765 self
->download_dialog
),
770 same_theme_folder
= g_strdup(theme
->name
->str
);
772 IRRECO_STRING_TABLE_FOREACH_END
774 if (delete_mode
== 1) {
775 g_string_printf(message
,
776 _("The \"%s\" theme already exists.\n"
777 "Do you want to replace this theme?"),
778 same_theme
->name
->str
);
779 } else if (delete_mode
== 2) {
780 g_string_printf(message
,
781 _("This theme replaces \"%s\" theme.\n"
782 "Do you want to continue?"),
784 } else if (delete_mode
== 3) {
785 g_string_printf(message
,
786 _("This theme replaces themes\n"
787 "\"%s\" and \"%s\"\n"
788 "Do you want to continue?"),
789 same_theme
->name
->str
,
793 /* Check whether a theme folder already exists */
794 if (delete_mode
!= 0) {
796 if (!irreco_yes_no_dlg(
797 GTK_WINDOW(self
->download_dialog
), message
->str
)) {
800 /* Remove theme folder and then make it again*/
801 if (delete_mode
== 1 || delete_mode
== 3) {
802 gchar
*rm_cmd
= g_strconcat("rm -r ",
803 same_theme
->path
->str
, NULL
);
807 if (delete_mode
== 2 || delete_mode
== 3) {
808 irreco_theme_manager_remove_theme(
809 self
->irreco_data
->theme_manager
,
811 g_free(same_theme_folder
);
817 g_mkdir(path
->str
, 0777);
820 if (delete_mode
== 0 || delete_mode
== 2) {
821 theme
= irreco_theme_new(self
->webdb_theme
->name
->str
,
823 self
->webdb_theme
->creator
->str
,
824 self
->webdb_theme
->comment
->str
,
825 self
->webdb_theme
->preview_button_name
->str
,
826 self
->webdb_theme
->uploaded
->str
);
828 irreco_theme_update_keyfile(theme
);
829 irreco_theme_free(theme
);
831 irreco_theme_set(same_theme
,
832 self
->webdb_theme
->name
->str
,
834 self
->webdb_theme
->creator
->str
,
835 self
->webdb_theme
->comment
->str
,
836 self
->webdb_theme
->preview_button_name
->str
,
837 self
->webdb_theme
->uploaded
->str
);
840 /* Get buttons and backgrounds */
841 self
->loader_func_id
= g_idle_add(G_SOURCEFUNC(
842 irreco_theme_manager_dlg_button_loader
), self
);
843 theme_is_loaded
= TRUE
;
847 g_string_free(message
, TRUE
);
848 g_string_free(path
, TRUE
);
849 irreco_theme_manager_dlg_hide_banner(self
);
850 irreco_theme_manager_dlg_loader_stop(self
);
851 if(self
->download_dialog
!= NULL
) {
852 gtk_widget_destroy(GTK_WIDGET(self
->download_dialog
));
853 self
->download_dialog
= NULL
;
854 if(theme_is_loaded
== TRUE
) {
855 gtk_button_clicked(GTK_BUTTON(self
->refresh_button
));
866 static void irreco_theme_manager_dlg_upload_theme(GtkButton
*button
,
867 IrrecoThemeManagerDlg
*self
)
871 if (irreco_theme_upload_dlg_run(GTK_WINDOW(self
),
872 self
->irreco_data
, self
->theme
) == TRUE
) {
873 gtk_button_clicked(GTK_BUTTON(self
->refresh_button
));
880 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
881 /* Private Functions */
882 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
885 * @name Private Functions
890 static void _smaller_text(gpointer cell, gpointer user_data)
892 g_object_set(cell, "scale", (gdouble)0.75,
893 "scale-set", TRUE, NULL);
894 IRRECO_PRINTF("_smaller_text\n");
898 static void scale_combobox(IrrecoThemeManagerDlg *self)
902 cells = gtk_tree_view_column_get_cell_renderers(GTK_TREE_VIEW_COLUMN(self->combobox));
903 cells = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(self->version_store));
904 g_list_foreach(cells, _smaller_text, NULL);
913 static void irreco_theme_manager_dlg_clean_details(IrrecoThemeManagerDlg
*self
)
918 gtk_widget_show_all(GTK_WIDGET(self
));
920 GTK_LABEL(self
->theme_name
), "-");
922 GTK_LABEL(self
->theme_creator
), "-");
924 GTK_LABEL(self
->theme_comment
), "-");
926 GTK_LABEL(self
->theme_downloaded
), "-");
927 gtk_image_clear(GTK_IMAGE(self
->theme_image
));
928 self
->preview_add
=NULL
;
930 gtk_widget_hide(self
->upload_button
);
931 gtk_widget_hide(self
->download_button
);
932 gtk_widget_hide(self
->clear_button
);
933 gtk_widget_hide(self
->theme_info_alignment
);
934 gtk_widget_show(self
->select_label
);
941 * Have the childern of this item been loaded.
943 * @return TRUE if children have been loade, FALSE otherwise.
947 irreco_theme_manager_dlg_row_is_loaded(IrrecoThemeManagerDlg
*self
,
954 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
955 iter
, FLAG_COL
, &i
, -1);
956 if (i
& ROW_CHILDREN_LOADED
) IRRECO_RETURN_BOOL(TRUE
);
958 IRRECO_RETURN_BOOL(FALSE
);
965 static gint
irreco_theme_manager_dlg_row_get_type(IrrecoThemeManagerDlg
*self
,
972 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
973 iter
, FLAG_COL
, &i
, -1);
974 if (i
& ROW_TYPE_CATEGORY
)
975 IRRECO_RETURN_ENUM(ROW_TYPE_CATEGORY
);
976 if (i
& ROW_TYPE_DEB
)
977 IRRECO_RETURN_ENUM(ROW_TYPE_DEB
);
978 if (i
& ROW_TYPE_USER
)
979 IRRECO_RETURN_ENUM(ROW_TYPE_USER
);
980 if (i
& ROW_TYPE_WEB
)
981 IRRECO_RETURN_ENUM(ROW_TYPE_WEB
);
983 IRRECO_RETURN_ENUM(ROW_TYPE_DB
);
984 if (i
& ROW_TYPE_LOADING
)
985 IRRECO_RETURN_ENUM(ROW_TYPE_LOADING
);
986 IRRECO_RETURN_INT(0);
990 * Show hildon progressbar banner.
992 * This function will create a new banner if one has not been created yet,
993 * if banner already exists, it's properties will be changed.
995 * @param text Text to show.
996 * @param fraction Value of progress.
999 static void irreco_theme_manager_dlg_set_banner(IrrecoThemeManagerDlg
*self
,
1005 if (self
->banner
== NULL
) {
1006 self
->banner
= hildon_banner_show_progress(
1007 GTK_WIDGET(self
), NULL
, "");
1010 hildon_banner_set_text(HILDON_BANNER(self
->banner
), text
);
1011 hildon_banner_set_fraction(HILDON_BANNER(self
->banner
), fraction
);
1017 * Destroy banner, if it exists.
1020 static void irreco_theme_manager_dlg_hide_banner(IrrecoThemeManagerDlg
*self
)
1025 gtk_widget_destroy(self
->banner
);
1026 self
->banner
= NULL
;
1033 * Start a loader state machine if one is not running already.
1037 gboolean
irreco_theme_manager_dlg_loader_start(IrrecoThemeManagerDlg
*self
,
1038 GSourceFunc function
,
1039 GtkTreeIter
*parent_iter
)
1043 if (self
->loader_func_id
== 0) {
1045 self
->loader_parent_iter
= gtk_tree_iter_copy(
1049 self
->loader_func_id
= g_idle_add(function
, self
);
1051 IRRECO_ERROR("Loader function pointer not given.\n");
1054 IRRECO_RETURN_BOOL(TRUE
);
1059 * Stop and cleanup loader if a loader is running.
1062 static void irreco_theme_manager_dlg_loader_stop(IrrecoThemeManagerDlg
*self
)
1066 if (self
->loader_func_id
!= 0) {
1067 g_source_remove(self
->loader_func_id
);
1068 self
->loader_func_id
= 0;
1069 self
->loader_state
= 0;
1070 if (self
->loader_parent_iter
) {
1071 gtk_tree_iter_free(self
->loader_parent_iter
);
1073 self
->loader_parent_iter
= NULL
;
1079 irreco_theme_manager_dlg_loader_user(IrrecoThemeManagerDlg
*self
)
1083 switch (self
->loader_state
) {
1084 case LOADER_STATE_INIT
: {
1086 irreco_theme_manager_dlg_set_banner(self
, _("Loading ..."),
1088 self
->loader_state
= LOADER_STATE_LOOP
;
1089 irreco_theme_manager_dlg_clean_details(self
);
1090 if (!irreco_theme_manager_does_user_exist(
1091 self
->irreco_data
->theme_manager
)) {
1092 self
->loader_state
= LOADER_STATE_END
;
1093 self
->loader_iter
= NULL
;
1097 gtk_tree_store_append(self
->tree_store
,
1099 gtk_tree_store_set(self
->tree_store
,
1101 TEXT_COL
, _("My Themes"),
1102 FLAG_COL
, ROW_TYPE_CATEGORY
,
1103 DATA_COL
, NULL
, -1);
1105 self
->loader_iter
= gtk_tree_iter_copy(&iter
);
1108 IRRECO_RETURN_BOOL(TRUE
);
1112 case LOADER_STATE_LOOP
: {
1114 IrrecoData
*irreco_data
= NULL
;
1115 IrrecoThemeManager
*theme_manager
= NULL
;
1117 IrrecoStringTable
*categories
= NULL
;
1120 irreco_data
= self
->irreco_data
;
1121 theme_manager
= irreco_data
->theme_manager
;
1122 categories
= irreco_theme_manager_get_themes(theme_manager
);
1124 IRRECO_STRING_TABLE_FOREACH_DATA(categories
,
1125 IrrecoTheme
*, theme
)
1127 if (g_utf8_collate(theme
->source
->str
, "user") == 0){
1129 /* Add loading item into category. */
1130 gtk_tree_store_append(self
->tree_store
,
1133 gtk_tree_store_set(self
->tree_store
,
1139 DATA_COL
, NULL
, -1);
1141 IRRECO_STRING_TABLE_FOREACH_END
1143 irreco_theme_manager_dlg_set_banner(self
, _("Loading ..."),
1145 self
->loader_state
= LOADER_STATE_END
;
1146 IRRECO_RETURN_BOOL(TRUE
);
1149 case LOADER_STATE_END
:
1150 if (self
->loader_iter
!= NULL
) {
1151 gtk_tree_iter_free(self
->loader_iter
);
1153 irreco_theme_manager_dlg_hide_banner(self
);
1154 irreco_theme_manager_dlg_loader_stop(self
);
1156 irreco_theme_manager_dlg_loader_start(self
,
1157 G_SOURCEFUNC(irreco_theme_manager_dlg_loader_deb
),NULL
);
1160 IRRECO_RETURN_BOOL(FALSE
);
1166 * This loader will request a list of categories from the theme and
1167 * update the TreeView accordingly. Every category row created by this loader
1168 * will have row type ROW_TYPE_DEB.
1172 static gboolean
irreco_theme_manager_dlg_loader_deb(IrrecoThemeManagerDlg
*self
)
1176 switch (self
->loader_state
) {
1177 case LOADER_STATE_INIT
: {
1179 irreco_theme_manager_dlg_set_banner(self
, _("Loading ..."),
1181 self
->loader_state
= LOADER_STATE_LOOP
;
1182 irreco_theme_manager_dlg_clean_details(self
);
1184 if (!irreco_theme_manager_does_deb_exist(
1185 self
->irreco_data
->theme_manager
)) {
1186 self
->loader_state
= LOADER_STATE_END
;
1187 self
->loader_iter
= NULL
;
1190 gtk_tree_store_append(self
->tree_store
,
1192 gtk_tree_store_set(self
->tree_store
,
1194 TEXT_COL
, _("Built In"),
1195 FLAG_COL
, ROW_TYPE_CATEGORY
,
1196 DATA_COL
, NULL
, -1);
1198 self
->loader_iter
= gtk_tree_iter_copy(&iter
);
1200 IRRECO_RETURN_BOOL(TRUE
);
1204 case LOADER_STATE_LOOP
: {
1206 IrrecoData
*irreco_data
= NULL
;
1207 IrrecoThemeManager
*theme_manager
= NULL
;
1209 IrrecoStringTable
*categories
= NULL
;
1211 irreco_data
= self
->irreco_data
;
1212 theme_manager
= irreco_data
->theme_manager
;
1213 categories
= irreco_theme_manager_get_themes(theme_manager
);
1215 IRRECO_STRING_TABLE_FOREACH_DATA(categories
,
1216 IrrecoTheme
*, theme
)
1217 if (g_utf8_collate(theme
->source
->str
, "deb") == 0){
1219 /* Add loading item into category. */
1220 gtk_tree_store_append(self
->tree_store
,
1221 &iter
, self
->loader_iter
);
1222 gtk_tree_store_set(self
->tree_store
,
1226 FLAG_COL
, ROW_TYPE_DEB
,
1227 DATA_COL
, NULL
, -1);
1229 IRRECO_STRING_TABLE_FOREACH_END
1231 irreco_theme_manager_dlg_set_banner(self
, _("Loading ..."),
1233 self
->loader_state
= LOADER_STATE_END
;
1234 IRRECO_RETURN_BOOL(TRUE
);
1237 case LOADER_STATE_END
: {
1238 GtkTreeIter iter
, iter_loading
;
1239 if (self
->loader_iter
!= NULL
) {
1240 gtk_tree_iter_free(self
->loader_iter
);
1242 irreco_theme_manager_dlg_hide_banner(self
);
1243 irreco_theme_manager_dlg_loader_stop(self
);
1245 /* Create database row */
1246 gtk_tree_store_append(self
->tree_store
, &iter
, NULL
);
1247 gtk_tree_store_set(self
->tree_store
, &iter
,
1248 TEXT_COL
, _("Database"),
1249 FLAG_COL
, ROW_TYPE_CATEGORY
,
1250 DATA_COL
, NULL
, -1);
1252 /* Add loading item into manufacturer. */
1253 gtk_tree_store_append(self
->tree_store
, &iter_loading
, &iter
);
1254 gtk_tree_store_set(self
->tree_store
, &iter_loading
,
1255 TEXT_COL
, _("Loading ..."),
1256 FLAG_COL
, ROW_TYPE_LOADING
,
1257 DATA_COL
, NULL
, -1);
1259 irreco_theme_manager_dlg_loader_start(self
,
1260 G_SOURCEFUNC(irreco_theme_manager_dlg_loader_web
), NULL
);
1264 IRRECO_RETURN_BOOL(FALSE
);
1267 static gboolean
irreco_theme_manager_dlg_loader_db(IrrecoThemeManagerDlg
*self
)
1271 switch (self
->loader_state
) {
1272 case LOADER_STATE_INIT
:{
1274 irreco_theme_manager_dlg_set_banner(self
, _("Loading themes"),
1276 self
->loader_state
= LOADER_STATE_LOOP
;
1277 self
->theme_loader_index
= 0;
1278 irreco_theme_manager_dlg_clean_details(self
);
1280 /* Check if loading item exist */
1281 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(self
->tree_store
),
1282 &iter
, self
->loader_iter
, 0);
1284 if(irreco_theme_manager_dlg_row_get_type(self
,
1285 &iter
) != ROW_TYPE_LOADING
) {
1286 self
->loader_state
= LOADER_STATE_END
;
1289 IRRECO_RETURN_BOOL(TRUE
);
1293 case LOADER_STATE_LOOP
: {
1295 GtkTreeIter iter_loading
;
1296 IrrecoStringTable
*themes
= NULL
;
1297 IrrecoWebdbTheme
*theme_by_id
;
1298 IrrecoWebdbCache
*webdb_cache
= NULL
;
1302 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
,
1305 if (!irreco_webdb_cache_get_themes(webdb_cache
, &themes
)) {
1306 irreco_error_dlg(GTK_WINDOW(self
),
1307 irreco_webdb_cache_get_error(
1309 self
->loader_state
= LOADER_STATE_END
;
1310 IRRECO_RETURN_BOOL(TRUE
);
1313 if (!irreco_string_table_index(themes
,
1314 (guint
)self
->theme_loader_index
, &id
, NULL
)) {
1315 irreco_error_dlg(GTK_WINDOW(self
), "Can't find theme");
1316 self
->loader_state
= LOADER_STATE_END
;
1317 IRRECO_RETURN_BOOL(TRUE
);
1320 if (!irreco_webdb_cache_get_theme_by_id(webdb_cache
,
1323 irreco_error_dlg(GTK_WINDOW(self
),
1324 irreco_webdb_cache_get_error(
1326 self
->loader_state
= LOADER_STATE_END
;
1327 IRRECO_RETURN_BOOL(TRUE
);
1330 gtk_tree_store_append(self
->tree_store
, &iter
,
1333 gtk_tree_store_set(self
->tree_store
, &iter
,
1334 TEXT_COL
, theme_by_id
->name
->str
,
1335 FLAG_COL
, ROW_TYPE_DB
,
1338 banner
= ++self
->theme_loader_index
;
1339 banner
/= (gfloat
) irreco_string_table_lenght (themes
);
1341 irreco_theme_manager_dlg_set_banner(self
, _("Loading themes"),
1343 if (banner
>= 1.0) {
1344 self
->loader_state
= LOADER_STATE_END
;
1347 /* Delete loading item */
1348 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(self
->tree_store
),
1349 &iter_loading
, self
->loader_iter
,
1351 if(irreco_theme_manager_dlg_row_get_type(self
,
1352 &iter_loading
) == ROW_TYPE_LOADING
) {
1353 gtk_tree_store_remove(self
->tree_store
, &iter_loading
);
1356 IRRECO_RETURN_BOOL(TRUE
);
1359 case LOADER_STATE_END
:
1360 if (self
->loader_iter
!= NULL
) {
1361 gtk_tree_iter_free(self
->loader_iter
);
1363 irreco_theme_manager_dlg_hide_banner(self
);
1364 irreco_theme_manager_dlg_loader_stop(self
);
1367 IRRECO_RETURN_BOOL(FALSE
);
1371 static gboolean
irreco_theme_manager_dlg_loader_web(IrrecoThemeManagerDlg
*self
)
1375 switch (self
->loader_state
) {
1376 case LOADER_STATE_INIT
: {
1378 irreco_theme_manager_dlg_set_banner(self
, _("Loading ..."),
1380 self
->loader_state
= LOADER_STATE_LOOP
;
1381 irreco_theme_manager_dlg_clean_details(self
);
1382 if (!irreco_theme_manager_does_web_exist(
1383 self
->irreco_data
->theme_manager
)) {
1384 self
->loader_state
= LOADER_STATE_END
;
1385 self
->loader_iter
= NULL
;
1388 gtk_tree_store_append(self
->tree_store
,
1390 gtk_tree_store_set(self
->tree_store
,
1392 TEXT_COL
, _("Downloaded"),
1393 FLAG_COL
, ROW_TYPE_CATEGORY
,
1394 DATA_COL
, NULL
, -1);
1396 self
->loader_iter
= gtk_tree_iter_copy(&iter
);
1398 IRRECO_RETURN_BOOL(TRUE
);
1400 case LOADER_STATE_LOOP
: {
1402 IrrecoData
*irreco_data
= NULL
;
1403 IrrecoThemeManager
*theme_manager
= NULL
;
1405 IrrecoStringTable
*categories
= NULL
;
1407 irreco_data
= self
->irreco_data
;
1408 theme_manager
= irreco_data
->theme_manager
;
1409 categories
= irreco_theme_manager_get_themes(theme_manager
);
1411 IRRECO_STRING_TABLE_FOREACH_DATA(categories
,
1412 IrrecoTheme
*, theme
)
1414 if (g_utf8_collate(theme
->source
->str
, "web") == 0){
1416 /* Add loading item into category. */
1417 gtk_tree_store_append(self
->tree_store
,
1420 gtk_tree_store_set(self
->tree_store
,
1426 DATA_COL
, NULL
, -1);
1428 IRRECO_STRING_TABLE_FOREACH_END
1430 irreco_theme_manager_dlg_set_banner(self
, _("Loading ..."),
1432 self
->loader_state
= LOADER_STATE_END
;
1433 IRRECO_RETURN_BOOL(TRUE
);
1436 case LOADER_STATE_END
:
1437 if (self
->loader_iter
!= NULL
) {
1438 gtk_tree_iter_free(self
->loader_iter
);
1440 irreco_theme_manager_dlg_hide_banner(self
);
1441 irreco_theme_manager_dlg_loader_stop(self
);
1444 IRRECO_RETURN_BOOL(FALSE
);
1448 * Show theme details
1454 irreco_theme_manager_dlg_display_theme_detail(IrrecoThemeManagerDlg
*self
,
1457 IrrecoThemeManager
*theme_manager
= self
->irreco_data
->theme_manager
;
1458 IrrecoThemeButton
*button
;
1459 const gchar
*theme_name
;
1463 gtk_image_clear(GTK_IMAGE(self
->theme_image
));
1465 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
1466 iter
, TEXT_COL
, &theme_name
, -1);
1467 irreco_string_table_get(theme_manager
->themes
, theme_name
,
1468 (gpointer
*) &self
->theme
);
1470 gtk_label_set_text(GTK_LABEL(self
->theme_name
),
1471 self
->theme
->name
->str
);
1472 gtk_label_set_text(GTK_LABEL(self
->theme_creator
),
1473 self
->theme
->author
->str
);
1474 gtk_label_set_text(GTK_LABEL(self
->theme_comment
),
1475 self
->theme
->comment
->str
);
1476 gtk_label_set_text(GTK_LABEL(self
->theme_version
),
1477 self
->theme
->version
->str
);
1479 if (self
->theme
->preview_button_name
->len
> 0) {
1480 button
=irreco_theme_get_button(self
->theme
,
1481 self
->theme
->preview_button_name
->str
);
1484 irreco_string_table_index(self
->theme
->buttons
,
1485 0, &key
, (gpointer
*) &button
);
1487 IRRECO_DEBUG("Preview-button: %s\n", button
->image_up
->str
);
1489 gtk_image_set_from_file(GTK_IMAGE(self
->theme_image
),
1490 button
->image_up
->str
);
1492 self
->preview_add
= button
->image_up
->str
;
1494 IRRECO_RETURN_BOOL(TRUE
);
1498 irreco_theme_manager_dlg_theme_db_detail_loader(IrrecoThemeManagerDlg
*self
)
1502 switch (self
->loader_state
) {
1503 case LOADER_STATE_INIT
:{
1504 irreco_theme_manager_dlg_set_banner(self
,
1505 _("Loading ..."), 0.5);
1506 self
->loader_state
= LOADER_STATE_LOOP
;
1507 IRRECO_RETURN_BOOL(TRUE
);
1510 case LOADER_STATE_LOOP
: {
1511 gchar
*download_count
;
1513 IrrecoWebdbCache
*webdb_cache
= irreco_data_get_webdb_cache(
1517 gtk_image_clear(GTK_IMAGE(self
->theme_image
));
1520 /* gtk_tree_model_get(GTK_TREE_MODEL(self->tree_store),
1521 iter, DATA_COL, &theme_id, -1);*/
1523 /* Get WebdbTheme with preview-button */
1524 irreco_webdb_cache_get_preview_button(webdb_cache
,
1525 self
->selected_theme_id
,
1526 &self
->webdb_theme
);
1528 gtk_label_set_text(GTK_LABEL(self
->theme_name
),
1529 self
->webdb_theme
->name
->str
);
1530 gtk_label_set_text(GTK_LABEL(self
->theme_creator
),
1531 self
->webdb_theme
->creator
->str
);
1532 gtk_label_set_text(GTK_LABEL(self
->theme_comment
),
1533 self
->webdb_theme
->comment
->str
);
1535 /* Clear combobox */
1536 gtk_tree_store_clear(self
->version_store
);
1538 IRRECO_STRING_TABLE_FOREACH(self
->webdb_theme
->versions
,
1543 gtk_tree_store_append(self
->version_store
,
1547 gtk_tree_store_set(self
->version_store
, &iter
,
1551 if (g_utf8_collate (date
,
1552 self
->webdb_theme
->uploaded
->str
) == 0) {
1553 gtk_combo_box_set_active(GTK_COMBO_BOX(
1558 IRRECO_STRING_TABLE_FOREACH_END
1560 /*scale_combobox(self);*/
1562 download_count
= g_strdup_printf("%d",
1563 self
->webdb_theme
->download_count
);
1565 gtk_label_set_text(GTK_LABEL(self
->theme_downloaded
),
1567 g_free(download_count
);
1569 if (self
->webdb_theme
->preview_button
!= NULL
) {
1570 gtk_image_set_from_pixbuf(GTK_IMAGE(self
->theme_image
),
1571 self
->webdb_theme
->preview_button
);
1572 self
->preview_add
= NULL
;
1574 IRRECO_DEBUG("preview_button is NULL\n");
1576 self
->preview_add
= NULL
;
1578 self
->loader_state
= LOADER_STATE_END
;
1579 IRRECO_RETURN_BOOL(TRUE
);
1582 case LOADER_STATE_END
:
1583 irreco_theme_manager_dlg_hide_banner(self
);
1584 irreco_theme_manager_dlg_loader_stop(self
);
1586 IRRECO_RETURN_BOOL(FALSE
);
1589 static gboolean
irreco_theme_manager_dlg_bg_loader(IrrecoThemeManagerDlg
*self
)
1593 switch (self
->loader_state
) {
1594 case LOADER_STATE_INIT
:{
1595 GString
*path
= g_string_new("");
1596 irreco_theme_manager_dlg_set_banner(self
,
1597 _("Loading backgrounds..."),
1599 self
->loader_state
= LOADER_STATE_LOOP
;
1600 self
->theme_loader_index
= 0;
1602 g_string_printf(path
, "%s%s/bg/", self
->theme_folder
,
1603 self
->webdb_theme
->folder
->str
);
1605 IRRECO_DEBUG("mkdir %s\n", path
->str
);
1606 g_mkdir(path
->str
, 0777);
1607 g_string_free(path
, TRUE
);
1609 IRRECO_RETURN_BOOL(TRUE
);
1612 case LOADER_STATE_LOOP
: {
1613 IrrecoStringTable
*bg_list
= NULL
;
1614 GString
*path
= g_string_new("");
1617 IrrecoWebdbCache
*webdb_cache
= irreco_data_get_webdb_cache(
1620 /* Get backrounds */
1621 irreco_webdb_cache_get_backgrounds(webdb_cache
,
1622 self
->webdb_theme
->id
,
1625 g_string_printf(path
, "%s%s/bg/", self
->theme_folder
,
1626 self
->webdb_theme
->folder
->str
);
1628 if (irreco_string_table_index(bg_list
,
1629 (guint
)self
->theme_loader_index
, &id
, NULL
)) {
1630 irreco_webdb_cache_get_bg_by_id(webdb_cache
, atoi(id
),
1634 banner
= ++self
->theme_loader_index
;
1635 banner
/= (gfloat
) irreco_string_table_lenght (bg_list
);
1637 irreco_theme_manager_dlg_set_banner(self
,
1638 _("Loading backgrounds..."),
1640 if (banner
>= 1.0) {
1641 self
->loader_state
= LOADER_STATE_END
;
1643 g_string_free(path
, TRUE
);
1644 IRRECO_RETURN_BOOL(TRUE
);
1646 case LOADER_STATE_END
:
1647 irreco_theme_manager_dlg_hide_banner(self
);
1648 irreco_theme_manager_dlg_loader_stop(self
);
1649 gtk_dialog_response(GTK_DIALOG(self
->download_dialog
),
1650 GTK_RESPONSE_CANCEL
);
1652 IRRECO_RETURN_BOOL(FALSE
);
1656 irreco_theme_manager_dlg_button_loader(IrrecoThemeManagerDlg
*self
)
1660 switch (self
->loader_state
) {
1661 case LOADER_STATE_INIT
:{
1662 GString
*path
= g_string_new("");
1663 irreco_theme_manager_dlg_set_banner(self
,
1664 _("Loading buttons.."),
1666 self
->loader_state
= LOADER_STATE_LOOP
;
1667 self
->theme_loader_index
= 0;
1669 g_string_printf(path
, "%s%s/buttons/", self
->theme_folder
,
1670 self
->webdb_theme
->folder
->str
);
1672 IRRECO_DEBUG("mkdir %s\n", path
->str
);
1673 g_mkdir(path
->str
, 0777);
1674 g_string_free(path
, TRUE
);
1676 IRRECO_RETURN_BOOL(TRUE
);
1679 case LOADER_STATE_LOOP
: {
1680 IrrecoStringTable
*button_list
= NULL
;
1681 GString
*path
= g_string_new("");
1684 IrrecoWebdbCache
*webdb_cache
= irreco_data_get_webdb_cache(
1688 irreco_webdb_cache_get_buttons(webdb_cache
,
1689 self
->webdb_theme
->id
,
1692 g_string_printf(path
, "%s%s/buttons/", self
->theme_folder
,
1693 self
->webdb_theme
->folder
->str
);
1695 if (irreco_string_table_index(button_list
,
1696 (guint
)self
->theme_loader_index
, &id
, NULL
)) {
1697 irreco_webdb_cache_get_button_by_id(webdb_cache
,
1702 banner
= ++self
->theme_loader_index
;
1703 banner
/= (gfloat
) irreco_string_table_lenght (button_list
);
1705 irreco_theme_manager_dlg_set_banner(self
,
1706 _("Loading buttons.."),
1708 if (banner
>= 1.0) {
1709 self
->loader_state
= LOADER_STATE_END
;
1711 g_string_free(path
, TRUE
);
1712 IRRECO_RETURN_BOOL(TRUE
);
1714 case LOADER_STATE_END
:
1715 irreco_theme_manager_dlg_hide_banner(self
);
1716 irreco_theme_manager_dlg_loader_stop(self
);
1718 /* Get backgrounds */
1719 self
->loader_func_id
= g_idle_add(G_SOURCEFUNC(
1720 irreco_theme_manager_dlg_bg_loader
), self
);
1722 IRRECO_RETURN_BOOL(FALSE
);
1729 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1731 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1734 * @name Public Functions
1738 void irreco_theme_manager_dlg_set_irreco_data(IrrecoThemeManagerDlg
*self
,
1739 IrrecoData
*irreco_data
)
1743 self
->irreco_data
= irreco_data
;
1748 void irreco_show_theme_manager_dlg(IrrecoData
*irreco_data
, GtkWindow
*parent
)
1750 IrrecoThemeManagerDlg
*self
;
1752 gboolean loop
= TRUE
;
1753 IrrecoWebdbCache
*webdb_cache
= NULL
;
1757 self
= IRRECO_THEME_MANAGER_DLG(irreco_theme_manager_dlg_new(
1758 irreco_data
, parent
));
1760 webdb_cache
= irreco_data_get_webdb_cache(self
->irreco_data
, FALSE
);
1763 response
= gtk_dialog_run(GTK_DIALOG(self
));
1765 case IRRECO_DEVICE_REFRESH
:
1766 if (self
->loader_func_id
!= 0) {
1769 IRRECO_DEBUG("IRRECO_DEVICE_REFRESH\n");
1770 gtk_tree_store_clear(self
->tree_store
);
1771 irreco_theme_manager_update_theme_manager
1772 (self
->irreco_data
->theme_manager
);
1774 if (webdb_cache
->theme_id_hash
!= NULL
) {
1775 g_hash_table_remove_all(
1776 webdb_cache
->theme_id_hash
);
1777 self
->webdb_theme
= NULL
;
1780 IRRECO_STRING_TABLE_FOREACH_DATA(
1781 irreco_data
->theme_manager
->themes
,
1782 IrrecoTheme
*, theme
)
1783 irreco_theme_check(theme
);
1784 IRRECO_STRING_TABLE_FOREACH_END
1786 irreco_theme_manager_dlg_loader_start(self
,
1788 irreco_theme_manager_dlg_loader_user
),
1790 gtk_label_set_text(GTK_LABEL(self
->select_label
),
1791 " Select \ncategory");
1794 case GTK_RESPONSE_CANCEL
:
1795 IRRECO_DEBUG("GTK_RESPONSE_CANCEL\n");
1801 gtk_widget_destroy(GTK_WIDGET(self
));
1810 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1811 /* Events and Callbacks */
1812 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
1815 * @name Events and Callbacks
1820 irreco_show_theme_manager_dlg_map_event(IrrecoThemeManagerDlg
*self
,
1827 irreco_theme_manager_dlg_loader_start(
1828 self
, G_SOURCEFUNC(irreco_theme_manager_dlg_loader_user
),
1831 IRRECO_RETURN_BOOL(FALSE
);
1835 irreco_show_theme_manager_dlg_destroy_event(IrrecoThemeManagerDlg
*self
,
1839 irreco_theme_manager_dlg_loader_stop(self
);
1844 irreco_show_theme_manager_dlg_row_activated_event(GtkTreeView
*tree_view
,
1846 GtkTreeViewColumn
*column
,
1847 IrrecoThemeManagerDlg
*self
)
1851 if (gtk_tree_view_row_expanded(tree_view
, path
)) {
1852 gtk_tree_view_expand_row(tree_view
, path
, FALSE
);
1854 gtk_tree_view_collapse_row(tree_view
, path
);
1860 irreco_show_theme_manager_dlg_row_expanded_event(GtkTreeView
*tree_view
,
1863 IrrecoThemeManagerDlg
*self
)
1865 gchar
*row_name
= NULL
;
1868 irreco_theme_manager_dlg_clean_details(self
);
1869 gtk_label_set_text(GTK_LABEL(self
->select_label
), "Select \ntheme");
1871 if (self
->loader_func_id
!= 0) {
1872 gtk_tree_view_collapse_row(tree_view
, path
);
1875 if (!irreco_theme_manager_dlg_row_is_loaded(self
, iter
)){
1876 switch (irreco_theme_manager_dlg_row_get_type(self
, iter
)){
1877 case ROW_TYPE_CATEGORY
:
1878 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
1879 iter
, TEXT_COL
, &row_name
, -1);
1881 if(g_utf8_collate(row_name
, "Database") != 0) {
1885 self
->loader_iter
= gtk_tree_iter_copy(iter
);
1886 irreco_theme_manager_dlg_loader_start(self
,
1887 G_SOURCEFUNC(irreco_theme_manager_dlg_loader_db
), NULL
);
1892 if (row_name
!= NULL
) g_free(row_name
);
1897 irreco_show_theme_manager_dlg_row_collapsed_event(GtkTreeView
*tree_view
,
1900 IrrecoThemeManagerDlg
*self
)
1905 gtk_label_set_text(GTK_LABEL(self
->select_label
), " Select\ncategory");
1907 irreco_theme_manager_dlg_clean_details(self
);
1913 irreco_show_theme_manager_dlg_row_selected_event(GtkTreeSelection
*sel
,
1914 IrrecoThemeManagerDlg
*self
)
1917 GtkTreeModel
*model
;
1922 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
))
1924 switch (irreco_theme_manager_dlg_row_get_type(self
, &iter
)) {
1927 IRRECO_DEBUG("ROW_TYPE_DEB\n");
1929 gtk_widget_hide(self
->select_label
);
1930 gtk_widget_show(self
->theme_info_alignment
);
1931 gtk_widget_hide(self
->label_download
);
1932 gtk_widget_hide(self
->theme_downloaded
);
1933 gtk_widget_hide(self
->label_combobox
);
1934 gtk_widget_hide(self
->combobox
);
1935 gtk_widget_hide(self
->theme_version
);
1936 gtk_widget_hide(self
->theme_creator
);
1937 gtk_widget_hide(self
->label_creator
);
1939 gtk_widget_hide(self
->upload_button
);
1940 gtk_widget_hide(self
->download_button
);
1941 gtk_widget_hide(self
->clear_button
);
1943 irreco_theme_manager_dlg_display_theme_detail(self
,
1948 IRRECO_DEBUG("ROW_TYPE_USER\n");
1950 gtk_widget_hide(self
->select_label
);
1951 gtk_widget_show(self
->theme_info_alignment
);
1952 gtk_widget_hide(self
->label_download
);
1953 gtk_widget_hide(self
->theme_downloaded
);
1954 gtk_widget_show(self
->theme_creator
);
1955 gtk_widget_show(self
->label_creator
);
1957 gtk_widget_show(self
->label_combobox
);
1958 gtk_widget_hide(self
->combobox
);
1959 gtk_widget_show(self
->theme_version
);
1961 gtk_widget_show(self
->upload_button
);
1962 gtk_widget_show(self
->clear_button
);
1963 gtk_widget_hide(self
->download_button
);
1965 irreco_theme_manager_dlg_display_theme_detail(self
,
1970 IRRECO_DEBUG("ROW_TYPE_WEB\n");
1972 gtk_widget_show(self
->clear_button
);
1973 gtk_widget_hide(self
->upload_button
);
1974 gtk_widget_hide(self
->download_button
);
1976 gtk_widget_hide(self
->select_label
);
1977 gtk_widget_show(self
->theme_creator
);
1978 gtk_widget_show(self
->label_creator
);
1979 gtk_widget_hide(self
->label_download
);
1980 gtk_widget_hide(self
->theme_downloaded
);
1982 gtk_widget_hide(self
->combobox
);
1983 gtk_widget_show(self
->label_combobox
);
1984 gtk_widget_show(self
->theme_version
);
1986 gtk_widget_show(self
->theme_info_alignment
);
1988 irreco_theme_manager_dlg_display_theme_detail(self
,
1993 IRRECO_DEBUG("ROW_TYPE_DB\n");
1995 if (self
->loader_func_id
!= 0) {
1999 gtk_tree_model_get(GTK_TREE_MODEL(self
->tree_store
),
2000 &iter
, DATA_COL
, &id
, -1);
2002 gtk_widget_hide(self
->clear_button
);
2003 gtk_widget_hide(self
->upload_button
);
2004 gtk_widget_show(self
->download_button
);
2006 gtk_widget_show(self
->combobox
);
2007 gtk_widget_show(self
->label_combobox
);
2008 gtk_widget_hide(self
->theme_version
);
2010 gtk_widget_hide(self
->select_label
);
2011 gtk_widget_show(self
->theme_creator
);
2012 gtk_widget_show(self
->label_creator
);
2013 gtk_widget_show(self
->label_download
);
2014 gtk_widget_show(self
->theme_downloaded
);
2016 gtk_widget_show(self
->theme_info_alignment
);
2018 IRRECO_DEBUG("SELECTED ID: %d\n", atoi(id
));
2020 self
->selected_theme_id
= atoi(id
);
2021 self
->loader_func_id
= g_idle_add(G_SOURCEFUNC(
2022 irreco_theme_manager_dlg_theme_db_detail_loader
),
2027 irreco_theme_manager_dlg_clean_details(self
);