/* * presentation.c * * Copyright © 2019 Thomas White * * This file is part of Colloquium. * * Colloquium 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 3 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 . * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #ifdef HAVE_PANGO #include #endif #include "presentation.h" #include "stylesheet.h" #include "slide.h" #include "narrative.h" #include "imagestore.h" #include "storycode.h" struct _presentation { Stylesheet *stylesheet; Narrative *narrative; ImageStore *imagestore; int n_slides; Slide **slides; int max_slides; const char *language; }; Presentation *presentation_new() { Presentation *p; p = malloc(sizeof(*p)); if ( p == NULL ) return NULL; p->stylesheet = NULL; p->narrative = NULL; p->slides = NULL; p->n_slides = 0; p->max_slides = 0; p->imagestore = NULL; #ifdef HAVE_PANGO p->language = pango_language_to_string(pango_language_get_default()); #else p->language = NULL; #endif return p; } Presentation *presentation_load(GFile *file) { GBytes *bytes; const char *text; size_t len; Presentation *p; bytes = g_file_load_bytes(file, NULL, NULL, NULL); if ( bytes == NULL ) return NULL; text = g_bytes_get_data(bytes, &len); p = storycode_parse_presentation(text); g_bytes_unref(bytes); if ( p == NULL ) return NULL; p->imagestore = imagestore_new("."); /* FIXME: From app config */ imagestore_set_parent(p->imagestore, g_file_get_parent(file)); return p; } int presentation_save(Presentation *p, GFile *file) { /* FIXME: Implementation */ return 1; } void presentation_free(Presentation *p) { /* FIXME: Free narrative, slides, imagestore */ free(p); } void presentation_add_stylesheet(Presentation *p, Stylesheet *ss) { assert(p->stylesheet == NULL); p->stylesheet = ss; } void presentation_add_narrative(Presentation *p, Narrative *n) { assert(p->narrative == NULL); p->narrative = n; } void presentation_add_slide(Presentation *p, Slide *s) { assert(p->n_slides <= p->max_slides); if ( p->n_slides == p->max_slides ) { Slide **nslides = realloc(p->slides, (p->max_slides+8)*sizeof(Slide *)); if ( nslides == NULL ) { fprintf(stderr, "Failed to allocate memory for slide\n"); return; } p->slides = nslides; p->max_slides += 8; } p->slides[p->n_slides++] = s; } int presentation_get_num_slides(Presentation *p) { return p->n_slides; } Slide *presentation_get_slide_by_number(Presentation *p, int i) { if ( i >= p->n_slides ) return NULL; if ( i < 0 ) return NULL; return p->slides[i]; } signed int presentation_get_slide_number(Presentation *p, Slide *s) { int i; if ( p == NULL ) return -1; for ( i=0; in_slides; i++ ) { if ( s == p->slides[i] ) return i; } return -1; } Stylesheet *presentation_get_stylesheet(Presentation *p) { if ( p == NULL ) return NULL; return p->stylesheet; } Narrative *presentation_get_narrative(Presentation *p) { if ( p == NULL ) return NULL; return p->narrative; } const char *presentation_get_language(Presentation *p) { if ( p == NULL ) return NULL; return p->language; } ImageStore *presentation_get_imagestore(Presentation *p) { if ( p == NULL ) return NULL; return p->imagestore; }