diff options
author | Thomas White <taw@bitwiz.me.uk> | 2019-03-15 23:37:27 +0100 |
---|---|---|
committer | Thomas White <taw@bitwiz.me.uk> | 2019-03-15 23:37:27 +0100 |
commit | 0e1f2f49f4d3b02901c8ba291a8ffb2605418db4 (patch) | |
tree | dedb4e864a02cb8181f2b44d13891bafc91a12d4 /src/slide_window.c | |
parent | 44f874ed89b364bc0b60b35572f64fae44154733 (diff) |
Initial GtkSlideView
Diffstat (limited to 'src/slide_window.c')
-rw-r--r-- | src/slide_window.c | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/src/slide_window.c b/src/slide_window.c new file mode 100644 index 0000000..b6c60da --- /dev/null +++ b/src/slide_window.c @@ -0,0 +1,244 @@ +/* + * slide_window.c + * + * Copyright © 2013-2018 Thomas White <taw@bitwiz.org.uk> + * + * 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 <http://www.gnu.org/licenses/>. + * + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdlib.h> +#include <string.h> +#include <gtk/gtk.h> +#include <assert.h> +#include <gdk/gdkkeysyms.h> +#include <gdk-pixbuf/gdk-pixbuf.h> +#include <math.h> + +#include <presentation.h> +#include <slide.h> +#include <gtkslideview.h> + +#include "colloquium.h" +#include "slide_window.h" + + +struct _slidewindow +{ + GtkWidget *window; + Presentation *p; + Slide *slide; + GtkWidget *sv; +}; + + +static void insert_slidetitle_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + SlideWindow *sw = vp; + char **text = malloc(sizeof(char *)); + *text = strdup("Slide title"); + slide_add_slidetitle(sw->slide, text, 1); +} + + +static void paste_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + //SlideWindow *sw = vp; + //sc_editor_paste(sw->sceditor); +} + + +static void copy_frame_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + //SlideWindow *sw = vp; + //sc_editor_copy_selected_frame(sw->sceditor); +} + + +static void delete_frame_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + //SlideWindow *sw = vp; + //sc_editor_delete_selected_frame(sw->sceditor); +} + + +/* Change the editor's slide to "np" */ +static void change_edit_slide(SlideWindow *sw, Slide *np) +{ + gtk_slide_view_set_slide(sw->sv, np); + sw->slide = np; +} + + +static void change_slide_first(SlideWindow *sw) +{ + Slide *s = presentation_get_slide_by_number(sw->p, 0); + if ( s != NULL ) change_edit_slide(sw, s); +} + + +static void change_slide_backwards(SlideWindow *sw) +{ + int slide_n = presentation_get_slide_number(sw->p, sw->slide); + if ( slide_n > 0 ) { + Slide *s = presentation_get_slide_by_number(sw->p, slide_n-1); + change_edit_slide(sw, s); + } +} + + +static void change_slide_forwards(SlideWindow *sw) +{ + int slide_n = presentation_get_slide_number(sw->p, sw->slide); + Slide *s = presentation_get_slide_by_number(sw->p, slide_n+1); + if ( s != NULL ) change_edit_slide(sw, s); +} + + +static void change_slide_last(SlideWindow *sw) +{ + int slide_n = presentation_get_num_slides(sw->p); + Slide *s = presentation_get_slide_by_number(sw->p, slide_n); + if ( s != NULL ) change_edit_slide(sw, s); +} + + +static void first_slide_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + SlideWindow *sw = vp; + change_slide_first(sw); +} + + +static void prev_slide_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + SlideWindow *sw = vp; + change_slide_backwards(sw); +} + + +static void next_slide_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + SlideWindow *sw = vp; + change_slide_forwards(sw); +} + + +static void last_slide_sig(GSimpleAction *action, GVariant *parameter, + gpointer vp) +{ + SlideWindow *sw = vp; + change_slide_last(sw); +} + + +static gboolean sw_close_sig(GtkWidget *w, SlideWindow *sw) +{ + //narrative_window_sw_closed(sw->p->narrative_window, sw); + return FALSE; +} + + +static gboolean sw_key_press_sig(GtkWidget *da, GdkEventKey *event, + SlideWindow *sw) +{ + switch ( event->keyval ) { + + case GDK_KEY_Page_Up : + change_slide_backwards(sw); + break; + + case GDK_KEY_Page_Down : + change_slide_forwards(sw); + break; + + } + + return FALSE; +} + + +static void about_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) +{ + SlideWindow *sw = vp; + open_about_dialog(sw->window); +} + + +GActionEntry sw_entries[] = { + + { "about", about_sig, NULL, NULL, NULL }, + { "paste", paste_sig, NULL, NULL, NULL }, + { "copyframe", copy_frame_sig, NULL, NULL, NULL }, + { "deleteframe", delete_frame_sig, NULL, NULL, NULL }, + { "first", first_slide_sig, NULL, NULL, NULL }, + { "prev", prev_slide_sig, NULL, NULL, NULL }, + { "next", next_slide_sig, NULL, NULL, NULL }, + { "last", last_slide_sig, NULL, NULL, NULL }, + { "slidetitle", insert_slidetitle_sig, NULL, NULL, NULL }, +}; + + +extern SlideWindow *slide_window_open(Presentation *p, Slide *slide, + GApplication *papp) +{ + GtkWidget *window; + SlideWindow *sw; + double w, h; + Colloquium *app = COLLOQUIUM(papp); + + sw = calloc(1, sizeof(SlideWindow)); + if ( sw == NULL ) return NULL; + + window = gtk_application_window_new(GTK_APPLICATION(app)); + gtk_window_set_role(GTK_WINDOW(window), "slide"); + sw->window = window; + sw->p = p; + + g_action_map_add_action_entries(G_ACTION_MAP(window), sw_entries, + G_N_ELEMENTS(sw_entries), sw); + + g_signal_connect(G_OBJECT(window), "destroy", + G_CALLBACK(sw_close_sig), sw); + + sw->sv = gtk_slide_view_new(p, slide); + + g_signal_connect(G_OBJECT(sw->sv), "key-press-event", + G_CALLBACK(sw_key_press_sig), sw); + + slide_get_logical_size(slide, presentation_get_stylesheet(p), &w, &h); + gtk_window_set_default_size(GTK_WINDOW(window), w, h); + + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(sw->sv)); + + gtk_window_set_resizable(GTK_WINDOW(sw->window), TRUE); + + gtk_widget_show_all(window); + + return sw; +} |