|
|
|
#include "ephoto.h"
|
|
|
|
|
|
|
|
/*Ewl Callbacks*/
|
|
|
|
static void combo_changed(Ewl_Widget *w, void *event, void *data);
|
|
|
|
static void destroy(Ewl_Widget *w, void *event, void *data);
|
|
|
|
static void populate(Ewl_Widget *w, void *event, void *data);
|
|
|
|
static void window_fullscreen(Ewl_Widget *w, void *event, void *data);
|
|
|
|
|
|
|
|
/*Ephoto Create Callbacks*/
|
|
|
|
static Ewl_Widget *add_atree(Ewl_Widget *c);
|
|
|
|
static Ewl_Widget *add_vcombo(Ewl_Widget *c);
|
|
|
|
|
|
|
|
/*Ephoto MVC Callbacks*/
|
|
|
|
static Ewl_Widget *album_view_new(void);
|
|
|
|
static void album_view_assign(Ewl_Widget *w, void *data);
|
|
|
|
static Ewl_Widget *album_header_fetch(void *data, int column);
|
|
|
|
static void *album_data_fetch(void *data, unsigned int row, unsigned int column);
|
|
|
|
static int album_data_count(void *data);
|
|
|
|
static Ewl_Widget *views_header_fetch(void *data, int column);
|
|
|
|
static void *views_data_fetch(void *data, unsigned int row, unsigned int column);
|
|
|
|
static int views_data_count(void *data);
|
|
|
|
|
|
|
|
/*Ephoto Global Variables*/
|
|
|
|
Ephoto_Main *em;
|
|
|
|
|
|
|
|
/*Destroy the Main Window*/
|
|
|
|
static void destroy(Ewl_Widget *w, void *event, void *data)
|
|
|
|
{
|
|
|
|
ephoto_db_close(em->db);
|
|
|
|
ewl_widget_destroy(em->win);
|
|
|
|
ecore_list_destroy(em->albums);
|
|
|
|
ecore_list_destroy(em->images);
|
|
|
|
free(em->views);
|
|
|
|
free(em);
|
|
|
|
ewl_main_quit();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void window_fullscreen(Ewl_Widget *w, void *event, void *data)
|
|
|
|
{
|
|
|
|
int fullscreen;
|
|
|
|
|
|
|
|
fullscreen = ewl_window_fullscreen_get(EWL_WINDOW(em->win));
|
|
|
|
if(!fullscreen)
|
|
|
|
{
|
|
|
|
ewl_window_fullscreen_set(EWL_WINDOW(em->win), 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ewl_window_fullscreen_set(EWL_WINDOW(em->win), 0);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Create the Main Ephoto Window*/
|
|
|
|
void create_main_gui(void)
|
|
|
|
{
|
|
|
|
Ewl_Widget *vbox, *spacer, *text, *entry, *hbox;
|
|
|
|
Ewl_Widget *rvbox, *sp, *hsep, *vsep, *image;
|
|
|
|
|
|
|
|
em = NULL;
|
|
|
|
em = calloc(1, sizeof(Ephoto_Main));
|
|
|
|
|
|
|
|
em->win = ewl_window_new();
|
|
|
|
ewl_window_title_set(EWL_WINDOW(em->win), "Ephoto!");
|
|
|
|
ewl_window_name_set(EWL_WINDOW(em->win), "Ephoto!");
|
|
|
|
ewl_object_size_request(EWL_OBJECT(em->win), 777, 542);
|
|
|
|
ewl_callback_append(em->win, EWL_CALLBACK_DELETE_WINDOW, destroy, NULL);
|
|
|
|
ewl_widget_show(em->win);
|
|
|
|
|
|
|
|
vbox = ewl_vbox_new();
|
|
|
|
ewl_box_spacing_set(EWL_BOX(vbox), 5);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(vbox), EWL_FLAG_FILL_ALL);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->win), vbox);
|
|
|
|
ewl_widget_show(vbox);
|
|
|
|
|
|
|
|
em->tbar = ewl_hbox_new();
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(em->tbar), EWL_FLAG_FILL_SHRINK);
|
|
|
|
ewl_object_alignment_set(EWL_OBJECT(em->tbar), EWL_FLAG_ALIGN_RIGHT);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(vbox), em->tbar);
|
|
|
|
ewl_widget_show(em->tbar);
|
|
|
|
|
|
|
|
em->vcombo = add_vcombo(em->tbar);
|
|
|
|
|
|
|
|
spacer = ewl_spacer_new();
|
|
|
|
ewl_object_minimum_w_set(EWL_OBJECT(spacer), 100);
|
|
|
|
ewl_object_maximum_w_set(EWL_OBJECT(spacer), 100);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->tbar), spacer);
|
|
|
|
ewl_widget_show(spacer);
|
|
|
|
|
|
|
|
entry = ewl_entry_new();
|
|
|
|
ewl_object_minimum_size_set(EWL_OBJECT(entry), 157, 22);
|
|
|
|
ewl_object_maximum_size_set(EWL_OBJECT(entry), 157, 22);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->tbar), entry);
|
|
|
|
ewl_widget_show(entry);
|
|
|
|
|
|
|
|
add_button(em->tbar, "Find", NULL, NULL, NULL);
|
|
|
|
|
|
|
|
hbox = ewl_hbox_new();
|
|
|
|
ewl_box_spacing_set(EWL_BOX(hbox), 2);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(hbox), EWL_FLAG_FILL_ALL);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(vbox), hbox);
|
|
|
|
ewl_widget_show(hbox);
|
|
|
|
|
|
|
|
em->atree = add_atree(hbox);
|
|
|
|
ewl_object_maximum_w_set(EWL_OBJECT(em->atree), 172);
|
|
|
|
|
|
|
|
rvbox = ewl_vbox_new();
|
|
|
|
ewl_box_spacing_set(EWL_BOX(rvbox), 1);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(rvbox), EWL_FLAG_FILL_ALL);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(hbox), rvbox);
|
|
|
|
ewl_widget_show(rvbox);
|
|
|
|
|
|
|
|
em->view_box = ewl_notebook_new();
|
|
|
|
ewl_notebook_tabbar_visible_set(EWL_NOTEBOOK(em->view_box), 0);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(em->view_box), EWL_FLAG_FILL_ALL);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(rvbox), em->view_box);
|
|
|
|
ewl_widget_show(em->view_box);
|
|
|
|
|
|
|
|
add_normal_view(em->view_box);
|
|
|
|
|
|
|
|
add_edit_view(em->view_box);
|
|
|
|
|
|
|
|
add_list_view(em->view_box);
|
|
|
|
|
|
|
|
hsep = ewl_hseparator_new();
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(vbox), hsep);
|
|
|
|
ewl_widget_show(hsep);
|
|
|
|
|
|
|
|
em->toolbar = ewl_toolbar_new();
|
|
|
|
ewl_box_spacing_set(EWL_BOX(em->toolbar), 5);
|
|
|
|
ewl_object_minimum_h_set(EWL_OBJECT(em->toolbar), 30);
|
|
|
|
ewl_object_alignment_set(EWL_OBJECT(em->toolbar), EWL_FLAG_ALIGN_CENTER);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(em->toolbar), EWL_FLAG_FILL_SHRINK);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(vbox), em->toolbar);
|
|
|
|
ewl_widget_show(em->toolbar);
|
|
|
|
|
|
|
|
image = add_image(em->toolbar, PACKAGE_DATA_DIR "/images/normal_view.png", 0, show_normal_view, NULL);
|
|
|
|
ewl_image_constrain_set(EWL_IMAGE(image), 30);
|
|
|
|
ewl_attach_tooltip_text_set(image, "Normal View");
|
|
|
|
|
|
|
|
vsep = ewl_vseparator_new();
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->toolbar), vsep);
|
|
|
|
ewl_widget_show(vsep);
|
|
|
|
|
|
|
|
image = add_image(em->toolbar, PACKAGE_DATA_DIR "/images/list_view.png", 0, show_list_view, NULL);
|
|
|
|
ewl_image_constrain_set(EWL_IMAGE(image), 30);
|
|
|
|
ewl_attach_tooltip_text_set(image, "List View");
|
|
|
|
|
|
|
|
vsep = ewl_vseparator_new();
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->toolbar), vsep);
|
|
|
|
ewl_widget_show(vsep);
|
|
|
|
|
|
|
|
image = add_image(em->toolbar, PACKAGE_DATA_DIR "/images/edit_view.png", 0, show_edit_view, NULL);
|
|
|
|
ewl_image_constrain_set(EWL_IMAGE(image), 30);
|
|
|
|
ewl_attach_tooltip_text_set(image, "Edit View");
|
|
|
|
|
|
|
|
vsep = ewl_vseparator_new();
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->toolbar), vsep);
|
|
|
|
ewl_widget_show(vsep);
|
|
|
|
|
|
|
|
image = add_image(em->toolbar, PACKAGE_DATA_DIR "/images/get_exif.png", 0, display_exif_dialog, NULL);
|
|
|
|
ewl_image_constrain_set(EWL_IMAGE(image), 30);
|
|
|
|
ewl_attach_tooltip_text_set(image, "View Exif");
|
|
|
|
|
|
|
|
vsep = ewl_vseparator_new();
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->toolbar), vsep);
|
|
|
|
ewl_widget_show(vsep);
|
|
|
|
|
|
|
|
image = add_image(em->toolbar, PACKAGE_DATA_DIR "/images/stock_fullscreen.png", 0, window_fullscreen, NULL);
|
|
|
|
ewl_image_constrain_set(EWL_IMAGE(image), 30);
|
|
|
|
ewl_attach_tooltip_text_set(image, "Fullscreen");
|
|
|
|
|
|
|
|
vsep = ewl_vseparator_new();
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->toolbar), vsep);
|
|
|
|
ewl_widget_show(vsep);
|
|
|
|
|
|
|
|
image = add_image(em->toolbar, PACKAGE_DATA_DIR "/images/x-office-presentation.png", 0, NULL, NULL);
|
|
|
|
ewl_image_constrain_set(EWL_IMAGE(image), 30);
|
|
|
|
ewl_attach_tooltip_text_set(image, "Slideshow");
|
|
|
|
|
|
|
|
vsep = ewl_vseparator_new();
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->toolbar), vsep);
|
|
|
|
ewl_widget_show(vsep);
|
|
|
|
|
|
|
|
em->edit_tools = ewl_hbox_new();
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(em->edit_tools), EWL_FLAG_FILL_HFILL);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(em->toolbar), em->edit_tools);
|
|
|
|
ewl_widget_show(em->edit_tools);
|
|
|
|
|
|
|
|
add_edit_tools(em->edit_tools);
|
|
|
|
ewl_widget_disable(em->edit_tools);
|
|
|
|
|
|
|
|
em->albums = ecore_list_new();
|
|
|
|
em->db = ephoto_db_init();
|
|
|
|
em->albums = ephoto_db_list_albums(em->db);
|
|
|
|
|
|
|
|
ewl_mvc_data_set(EWL_MVC(em->atree), em->albums);
|
|
|
|
|
|
|
|
populate(NULL, NULL, "Complete Library");
|
|
|
|
|
|
|
|
ewl_main();
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Update the Image List*/
|
|
|
|
static void populate(Ewl_Widget *w, void *event, void *data)
|
|
|
|
{
|
|
|
|
char *album, *imagef;
|
|
|
|
Ewl_Widget *shadow, *thumb;
|
|
|
|
|
|
|
|
if (w)
|
|
|
|
{
|
|
|
|
album = (char *)ewl_widget_name_get(w);
|
|
|
|
if (em->currenta)
|
|
|
|
{
|
|
|
|
ewl_widget_state_set(em->currenta, "unselected", EWL_STATE_PERSISTENT);
|
|
|
|
ewl_widget_state_set(EWL_ICON(em->currenta)->label, "default", EWL_STATE_PERSISTENT);
|
|
|
|
}
|
|
|
|
em->currenta = w;
|
|
|
|
ewl_widget_state_set(em->currenta, "selected", EWL_STATE_PERSISTENT);
|
|
|
|
ewl_widget_state_set(EWL_ICON(em->currenta)->label, "blue", EWL_STATE_PERSISTENT);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
album = data;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (em->images)
|
|
|
|
{
|
|
|
|
ecore_dlist_destroy(em->images);
|
|
|
|
}
|
|
|
|
|
|
|
|
em->images = ecore_dlist_new();
|
|
|
|
em->images = ephoto_db_list_images(em->db, album);
|
|
|
|
|
|
|
|
ecore_dlist_goto_first(em->images);
|
|
|
|
ewl_container_reset(EWL_CONTAINER(em->fbox));
|
|
|
|
while (ecore_dlist_current(em->images))
|
|
|
|
{
|
|
|
|
imagef = ecore_dlist_current(em->images);
|
|
|
|
|
|
|
|
thumb = add_image(em->fbox, imagef, 1, set_info, NULL);
|
|
|
|
ewl_object_alignment_set(EWL_OBJECT(thumb), EWL_FLAG_ALIGN_CENTER);
|
|
|
|
ewl_widget_name_set(thumb, imagef);
|
|
|
|
|
|
|
|
ecore_dlist_next(em->images);
|
|
|
|
}
|
|
|
|
|
|
|
|
ecore_dlist_goto_first(em->images);
|
|
|
|
|
|
|
|
ewl_mvc_data_set(EWL_MVC(em->ltree), em->images);
|
|
|
|
ewl_mvc_dirty_set(EWL_MVC(em->ltree), 1);
|
|
|
|
|
|
|
|
ewl_image_file_set(EWL_IMAGE(em->eimage), ecore_dlist_current(em->images), NULL);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Create the view combo*/
|
|
|
|
static Ewl_Widget *add_vcombo(Ewl_Widget *c)
|
|
|
|
{
|
|
|
|
Ewl_Widget *combo;
|
|
|
|
Ewl_Model *model;
|
|
|
|
Ewl_View *view;
|
|
|
|
|
|
|
|
em->views = calloc(3, sizeof(char *));
|
|
|
|
em->views[0] = strdup("Normal");
|
|
|
|
em->views[1] = strdup("List");
|
|
|
|
em->views[2] = strdup("Edit");
|
|
|
|
|
|
|
|
model = ewl_model_new();
|
|
|
|
ewl_model_fetch_set(model, views_data_fetch);
|
|
|
|
ewl_model_count_set(model, views_data_count);
|
|
|
|
|
|
|
|
view = ewl_view_new();
|
|
|
|
ewl_view_constructor_set(view, ewl_label_new);
|
|
|
|
ewl_view_assign_set(view, EWL_VIEW_ASSIGN(ewl_label_text_set));
|
|
|
|
ewl_view_header_fetch_set(view, views_header_fetch);
|
|
|
|
|
|
|
|
combo = ewl_combo_new();
|
|
|
|
ewl_mvc_model_set(EWL_MVC(combo), model);
|
|
|
|
ewl_mvc_view_set(EWL_MVC(combo), view);
|
|
|
|
ewl_mvc_data_set(EWL_MVC(combo), em->views);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(combo), EWL_FLAG_FILL_SHRINK);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(c), combo);
|
|
|
|
ewl_callback_append(combo, EWL_CALLBACK_VALUE_CHANGED, combo_changed, NULL);
|
|
|
|
ewl_widget_show(combo);
|
|
|
|
|
|
|
|
return combo;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Create a header for the view combo*/
|
|
|
|
static Ewl_Widget *views_header_fetch(void *data, int col)
|
|
|
|
{
|
|
|
|
Ewl_Widget *header;
|
|
|
|
|
|
|
|
header = ewl_label_new();
|
|
|
|
ewl_label_text_set(EWL_LABEL(header), "Select a View");
|
|
|
|
ewl_widget_show(header);
|
|
|
|
|
|
|
|
return header;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Get the data for the view combo*/
|
|
|
|
static void *views_data_fetch(void *data, unsigned int row, unsigned int col)
|
|
|
|
{
|
|
|
|
if (row < 3) return em->views[row];
|
|
|
|
else return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Show the number of items in the view*/
|
|
|
|
static int views_data_count(void *data)
|
|
|
|
{
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Switch between views when the combo changes*/
|
|
|
|
static void combo_changed(Ewl_Widget *w, void *event, void *data)
|
|
|
|
{
|
|
|
|
Ewl_Selection_Idx *idx;
|
|
|
|
|
|
|
|
idx = ewl_mvc_selected_get(EWL_MVC(w));
|
|
|
|
|
|
|
|
if (!strcmp(em->views[idx->row], "Normal"))
|
|
|
|
{
|
|
|
|
show_normal_view(NULL, NULL, NULL);
|
|
|
|
}
|
|
|
|
else if (!strcmp(em->views[idx->row], "Edit"))
|
|
|
|
{
|
|
|
|
show_edit_view(NULL, NULL, NULL);
|
|
|
|
}
|
|
|
|
else if (!strcmp(em->views[idx->row], "List"))
|
|
|
|
{
|
|
|
|
show_list_view(NULL, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*Create and Add a Tree to the Container c*/
|
|
|
|
static Ewl_Widget *add_atree(Ewl_Widget *c)
|
|
|
|
{
|
|
|
|
Ewl_Widget *tree;
|
|
|
|
Ewl_Model *model;
|
|
|
|
Ewl_View *view;
|
|
|
|
|
|
|
|
model = ewl_model_new();
|
|
|
|
ewl_model_fetch_set(model, album_data_fetch);
|
|
|
|
ewl_model_count_set(model, album_data_count);
|
|
|
|
|
|
|
|
tree = ewl_tree2_new();
|
|
|
|
ewl_tree2_headers_visible_set(EWL_TREE2(tree), 0);
|
|
|
|
ewl_tree2_fixed_rows_set(EWL_TREE2(tree), 1);
|
|
|
|
ewl_mvc_model_set(EWL_MVC(tree), model);
|
|
|
|
ewl_mvc_selection_mode_set(EWL_MVC(tree), EWL_SELECTION_MODE_SINGLE);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(tree), EWL_FLAG_FILL_ALL);
|
|
|
|
ewl_container_child_append(EWL_CONTAINER(c), tree);
|
|
|
|
ewl_widget_show(tree);
|
|
|
|
|
|
|
|
view = ewl_view_new();
|
|
|
|
ewl_view_constructor_set(view, album_view_new);
|
|
|
|
ewl_view_assign_set(view, album_view_assign);
|
|
|
|
ewl_view_header_fetch_set(view, album_header_fetch);
|
|
|
|
ewl_tree2_column_append(EWL_TREE2(tree), view, FALSE);
|
|
|
|
|
|
|
|
return tree;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* The view of the users albums */
|
|
|
|
static Ewl_Widget *album_view_new(void)
|
|
|
|
{
|
|
|
|
Ewl_Widget *icon;
|
|
|
|
|
|
|
|
icon = ewl_icon_new();
|
|
|
|
ewl_icon_thumbnailing_set(EWL_ICON(icon), FALSE);
|
|
|
|
ewl_box_orientation_set(EWL_BOX(icon), EWL_ORIENTATION_HORIZONTAL);
|
|
|
|
ewl_object_alignment_set(EWL_OBJECT(icon), EWL_FLAG_ALIGN_LEFT);
|
|
|
|
ewl_object_fill_policy_set(EWL_OBJECT(icon), EWL_FLAG_FILL_ALL);
|
|
|
|
ewl_widget_show(icon);
|
|
|
|
|
|
|
|
return icon;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*The row that is added to the tree*/
|
|
|
|
static void album_view_assign(Ewl_Widget *w, void *data)
|
|
|
|
{
|
|
|
|
char *album;
|
|
|
|
|
|
|
|
album = data;
|
|
|
|
ewl_icon_image_set(EWL_ICON(w), PACKAGE_DATA_DIR "/images/image.png", NULL);
|
|
|
|
ewl_icon_label_set(EWL_ICON(w), album);
|
|
|
|
ewl_icon_constrain_set(EWL_ICON(w), 25);
|
|
|
|
ewl_widget_name_set(w, album);
|
|
|
|
ewl_callback_append(w, EWL_CALLBACK_CLICKED, populate, NULL);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The header for the tree */
|
|
|
|
static Ewl_Widget *album_header_fetch(void *data, int column)
|
|
|
|
{
|
|
|
|
Ewl_Widget *label;
|
|
|
|
|
|
|
|
label = ewl_label_new();
|
|
|
|
ewl_label_text_set(EWL_LABEL(label), "Browser");
|
|
|
|
ewl_widget_show(label);
|
|
|
|
|
|
|
|
return label;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The albums that will be displayed*/
|
|
|
|
static void *album_data_fetch(void *data, unsigned int row, unsigned int column)
|
|
|
|
{
|
|
|
|
char *album;
|
|
|
|
void *val = NULL;
|
|
|
|
|
|
|
|
album = ecore_list_goto_index(em->albums, row);
|
|
|
|
if (album)
|
|
|
|
{
|
|
|
|
val = album;
|
|
|
|
}
|
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The number of albums the view is displaying */
|
|
|
|
static int album_data_count(void *data)
|
|
|
|
{
|
|
|
|
int val;
|
|
|
|
|
|
|
|
val = ecore_list_nodes(em->albums);
|
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|