/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Pix
*
* Copyright (C) 2008 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "callbacks.h"
#include "gth-transition.h"
#include "preferences.h"
#include "shortcuts.h"
#ifdef HAVE_CLUTTER
#define VALUE_AT_PROGRESS(v, t)((double) (v) * (double) (t))
static void
no_transition (GthSlideshow *self,
double progress)
{
if (self->first_frame) {
if (self->current_image != NULL)
clutter_actor_hide (self->current_image);
clutter_actor_show (self->next_image);
}
}
static void
push_from_right_transition (GthSlideshow *self,
double progress)
{
float stage_w, stage_h;
clutter_actor_get_size (self->stage, &stage_w, &stage_h);
clutter_actor_set_x (self->next_image, (float) VALUE_AT_PROGRESS (stage_w, 1.0 - progress) + self->next_geometry.x);
if (self->current_image != NULL)
clutter_actor_set_x (self->current_image, (float) VALUE_AT_PROGRESS (- stage_w, progress) + self->current_geometry.x);
if (self->first_frame) {
if (self->current_image != NULL)
clutter_actor_show (self->current_image);
clutter_actor_show (self->next_image);
}
}
static void
push_from_bottom_transition (GthSlideshow *self,
double progress)
{
float stage_w, stage_h;
clutter_actor_get_size (self->stage, &stage_w, &stage_h);
clutter_actor_set_y (self->next_image, (float) VALUE_AT_PROGRESS (stage_h, 1.0 - progress) + self->next_geometry.y);
if (self->current_image != NULL)
clutter_actor_set_y (self->current_image, (float) VALUE_AT_PROGRESS (- stage_h, progress) + self->current_geometry.y);
if (self->first_frame) {
if (self->current_image != NULL)
clutter_actor_show (self->current_image);
clutter_actor_show (self->next_image);
}
}
static void
slide_from_right_transition (GthSlideshow *self,
double progress)
{
float stage_w, stage_h;
clutter_actor_get_size (self->stage, &stage_w, &stage_h);
clutter_actor_set_x (self->next_image, (float) VALUE_AT_PROGRESS (stage_w, 1.0 - progress) + self->next_geometry.x);
if (self->current_image != NULL)
clutter_actor_set_opacity (self->current_image, (int) VALUE_AT_PROGRESS (255.0, 1.0 - progress));
clutter_actor_set_opacity (self->next_image, (int) VALUE_AT_PROGRESS (255.0, progress));
if (self->first_frame) {
if (self->current_image != NULL) {
clutter_actor_show (self->current_image);
clutter_actor_set_child_above_sibling (self->stage, self->next_image, self->current_image);
}
clutter_actor_show (self->next_image);
}
}
static void
slide_from_bottom_transition (GthSlideshow *self,
double progress)
{
float stage_w, stage_h;
clutter_actor_get_size (self->stage, &stage_w, &stage_h);
clutter_actor_set_y (self->next_image, (float) VALUE_AT_PROGRESS (stage_h, 1.0 - progress) + self->next_geometry.y);
if (self->current_image != NULL)
clutter_actor_set_opacity (self->current_image, (int) VALUE_AT_PROGRESS (255.0, 1.0 - progress));
clutter_actor_set_opacity (self->next_image, (int) VALUE_AT_PROGRESS (255.0, progress));
if (self->first_frame) {
if (self->current_image != NULL) {
clutter_actor_show (self->current_image);
clutter_actor_set_child_above_sibling (self->stage, self->next_image, self->current_image);
}
clutter_actor_show (self->next_image);
}
}
static void
fade_transition (GthSlideshow *self,
double progress)
{
if (self->current_image != NULL)
clutter_actor_set_opacity (self->current_image, (int) VALUE_AT_PROGRESS (255.0, 1.0 - progress));
clutter_actor_set_opacity (self->next_image, (int) VALUE_AT_PROGRESS (255.0, progress));
if (self->first_frame) {
if (self->current_image != NULL) {
clutter_actor_show (self->current_image);
clutter_actor_set_child_above_sibling (self->stage, self->next_image, self->current_image);
}
clutter_actor_show (self->next_image);
}
}
static void
_clutter_actor_set_rotation (ClutterActor *self,
ClutterRotateAxis axis,
gdouble angle,
gfloat x,
gfloat y,
gfloat z)
{
clutter_actor_set_pivot_point (self, x, y);
clutter_actor_set_pivot_point_z (self, z);
clutter_actor_set_rotation_angle (self, axis, angle);
}
static void
flip_transition (GthSlideshow *self,
double progress)
{
if (progress >= 0.5) {
clutter_actor_show (self->next_image);
if (self->current_image != NULL)
clutter_actor_hide (self->current_image);
}
else {
clutter_actor_hide (self->next_image);
if (self->current_image != NULL)
clutter_actor_show (self->current_image);
}
_clutter_actor_set_rotation (self->next_image,
CLUTTER_Y_AXIS,
VALUE_AT_PROGRESS (180.0, 1.0 - progress),
0.5,
0.5,
0.0);
if (self->current_image != NULL)
_clutter_actor_set_rotation (self->current_image,
CLUTTER_Y_AXIS,
VALUE_AT_PROGRESS (180.0, - progress),
0.5,
0.5,
0.0);
if (self->first_frame) {
if (self->current_image != NULL) {
clutter_actor_set_child_above_sibling (self->stage, self->next_image, self->current_image);
clutter_actor_set_pivot_point (self->current_image, 0.5, 0.5);
}
clutter_actor_set_pivot_point (self->next_image, 0.5, 0.5);
}
}
static void
cube_from_right_transition (GthSlideshow *self,
double progress)
{
float stage_w, stage_h;
clutter_actor_get_size (self->stage, &stage_w, &stage_h);
if (self->current_image != NULL) {
if (progress >= 0.5)
clutter_actor_set_child_above_sibling (self->stage, self->next_image, self->current_image);
else
clutter_actor_set_child_above_sibling (self->stage, self->current_image, self->next_image);
}
_clutter_actor_set_rotation (self->next_image,
CLUTTER_Y_AXIS,
VALUE_AT_PROGRESS (90.0, - progress) - 270.0,
0.5,
0.5,
- stage_w / 2.0);
if (self->current_image != NULL)
_clutter_actor_set_rotation (self->current_image,
CLUTTER_Y_AXIS,
VALUE_AT_PROGRESS (90.0, - progress),
0.5,
0.5,
- stage_w / 2.0);
if (self->first_frame) {
if (self->current_image != NULL)
clutter_actor_set_pivot_point (self->current_image, 0.5, 0.5);
clutter_actor_show (self->next_image);
clutter_actor_set_pivot_point (self->next_image, 0.5, 0.5);
}
}
static void
cube_from_bottom_transition (GthSlideshow *self,
double progress)
{
float stage_w, stage_h;
clutter_actor_get_size (self->stage, &stage_w, &stage_h);
if (self->current_image != NULL) {
if (progress >= 0.5)
clutter_actor_set_child_above_sibling (self->stage, self->next_image, self->current_image);
else
clutter_actor_set_child_above_sibling (self->stage, self->current_image, self->next_image);
}
_clutter_actor_set_rotation (self->next_image,
CLUTTER_X_AXIS,
VALUE_AT_PROGRESS (90.0, progress) + 270.0,
0.5,
0.5,
- stage_w / 2.0);
if (self->current_image != NULL)
_clutter_actor_set_rotation (self->current_image,
CLUTTER_X_AXIS,
VALUE_AT_PROGRESS (90.0, progress),
0.5,
0.5,
- stage_w / 2.0);
if (self->first_frame) {
if (self->current_image != NULL)
clutter_actor_set_pivot_point (self->current_image, 0.5, 0.5);
clutter_actor_show (self->next_image);
clutter_actor_set_pivot_point (self->next_image, 0.5, 0.5);
}
}
#endif /* HAVE_CLUTTER */
static GthShortcutCategory shortcut_categories[] = {
{ GTH_SHORTCUT_CATEGORY_SLIDESHOW, N_("Presentation"), 40 },
};
G_MODULE_EXPORT void
pix_extension_activate (void)
{
#ifdef HAVE_CLUTTER
gth_main_register_object (GTH_TYPE_TRANSITION,
"none",
GTH_TYPE_TRANSITION,
"display-name", _("None"),
"frame-func", no_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"push-from-right",
GTH_TYPE_TRANSITION,
"display-name", _("Push from right"),
"frame-func", push_from_right_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"push-from-bottom",
GTH_TYPE_TRANSITION,
"display-name", _("Push from bottom"),
"frame-func", push_from_bottom_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"slide-from-right",
GTH_TYPE_TRANSITION,
"display-name", _("Slide from right"),
"frame-func", slide_from_right_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"slide-from-bottom",
GTH_TYPE_TRANSITION,
"display-name", _("Slide from bottom"),
"frame-func", slide_from_bottom_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"fade",
GTH_TYPE_TRANSITION,
"display-name", _("Fade in"),
"frame-func", fade_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"flip",
GTH_TYPE_TRANSITION,
"display-name", _("Flip page"),
"frame-func", flip_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"cube-from-right",
GTH_TYPE_TRANSITION,
"display-name", _("Cube from right"),
"frame-func", cube_from_right_transition,
NULL);
gth_main_register_object (GTH_TYPE_TRANSITION,
"cube-from-bottom",
GTH_TYPE_TRANSITION,
"display-name", _("Cube from bottom"),
"frame-func", cube_from_bottom_transition,
NULL);
#endif /* HAVE_CLUTTER */
gth_main_register_shortcut_category (shortcut_categories, G_N_ELEMENTS (shortcut_categories));
gth_hook_add_callback ("slideshow", 10, G_CALLBACK (ss__slideshow_cb), NULL);
gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (ss__gth_browser_construct_cb), NULL);
gth_hook_add_callback ("gth-browser-update-sensitivity", 10, G_CALLBACK (ss__gth_browser_update_sensitivity_cb), NULL);
gth_hook_add_callback ("dlg-preferences-construct", 20, G_CALLBACK (ss__dlg_preferences_construct_cb), NULL);
gth_hook_add_callback ("gth-catalog-read-metadata", 10, G_CALLBACK (ss__gth_catalog_read_metadata), NULL);
gth_hook_add_callback ("gth-catalog-write-metadata", 10, G_CALLBACK (ss__gth_catalog_write_metadata), NULL);
gth_hook_add_callback ("gth-catalog-read-from-doc", 10, G_CALLBACK (ss__gth_catalog_read_from_doc), NULL);
gth_hook_add_callback ("gth-catalog-write-to-doc", 10, G_CALLBACK (ss__gth_catalog_write_to_doc), NULL);
gth_hook_add_callback ("dlg-catalog-properties", 10, G_CALLBACK (ss__dlg_catalog_properties), NULL);
gth_hook_add_callback ("dlg-catalog-properties-save", 10, G_CALLBACK (ss__dlg_catalog_properties_save), NULL);
}
G_MODULE_EXPORT void
pix_extension_deactivate (void)
{
}
G_MODULE_EXPORT gboolean
pix_extension_is_configurable (void)
{
return FALSE;
}
G_MODULE_EXPORT void
pix_extension_configure (GtkWindow *parent)
{
}