Rebased ref, commits from common ancestor: commit a0ae063311509168c39d9f6a773e63a80ce59cde Author: Andrzej Hunt <andrzej.h...@collabora.com> Date: Mon Jun 23 15:13:40 2014 +0100
Add zoom controls to gtktiledviewer. Change-Id: I33ae83a97be254a3d3716bd9ae05f089845fd536 diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index cfa836c..bd06b04 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -21,6 +21,52 @@ static int help() return 1; } +static GtkWidget* pDocView; + +const float fZooms[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, 5.0 }; + +void changeZoom( GtkWidget* pButton, gpointer /* pItem */ ) +{ + const char *sName = gtk_tool_button_get_stock_id( GTK_TOOL_BUTTON(pButton) ); + + float fZoom = 0; + const float fCurrentZoom = lok_docview_get_zoom( LOK_DOCVIEW(pDocView) ); + if ( strcmp(sName, "gtk-zoom-in") == 0) + { + for ( unsigned int i = 0; i < sizeof( fZooms ) / sizeof( fZooms[0] ); i++ ) + { + if ( fCurrentZoom < fZooms[i] ) + { + fZoom = fZooms[i]; + break; + } + } + } + else if ( strcmp(sName, "gtk-zoom-100") == 0) + { + fZoom = 1; + } + else if ( strcmp(sName, "gtk-zoom-fit") == 0) + { + // TODO -- will need access to lokdocview internals? + } + else if ( strcmp(sName, "gtk-zoom-out") == 0) + { + for ( unsigned int i = 0; i < sizeof( fZooms ) / sizeof( fZooms[0] ); i++ ) + { + if ( fCurrentZoom > fZooms[i] ) + { + fZoom = fZooms[i]; + } + } + } + + if ( fZoom != 0 ) + { + lok_docview_set_zoom( LOK_DOCVIEW(pDocView), fZoom ); + } +} + int main( int argc, char* argv[] ) { if( argc < 2 || @@ -54,14 +100,38 @@ int main( int argc, char* argv[] ) gtk_window_set_default_size(GTK_WINDOW(pWindow), 800, 600); g_signal_connect( pWindow, "destroy", G_CALLBACK(gtk_main_quit), NULL ); + GtkWidget* pVBox = gtk_vbox_new( FALSE, 0 ); + gtk_container_add( GTK_CONTAINER(pWindow), pVBox ); - GtkWidget* pDocView = lok_docview_new( pOffice ); - gtk_container_add( GTK_CONTAINER(pWindow), pDocView ); + // Toolbar + GtkWidget* pToolbar = gtk_toolbar_new(); + gtk_toolbar_set_style( GTK_TOOLBAR(pToolbar), GTK_TOOLBAR_ICONS ); - lok_docview_open_document( LOK_DOCVIEW(pDocView), argv[2] ); + GtkToolItem* pZoomIn = gtk_tool_button_new_from_stock( GTK_STOCK_ZOOM_IN ); + gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pZoomIn, 0); + g_signal_connect( G_OBJECT(pZoomIn), "clicked", G_CALLBACK(changeZoom), NULL ); + + GtkToolItem* pZoom1 = gtk_tool_button_new_from_stock( GTK_STOCK_ZOOM_100 ); + gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pZoom1, -1); + g_signal_connect( G_OBJECT(pZoom1), "clicked", G_CALLBACK(changeZoom), NULL ); - gtk_widget_show( pDocView ); - gtk_widget_show( pWindow ); + GtkToolItem* pZoomFit = gtk_tool_button_new_from_stock( GTK_STOCK_ZOOM_FIT ); + gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pZoomFit, -1); + g_signal_connect( G_OBJECT(pZoomFit), "clicked", G_CALLBACK(changeZoom), NULL ); + + GtkToolItem* pZoomOut = gtk_tool_button_new_from_stock( GTK_STOCK_ZOOM_OUT ); + gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), pZoomOut, -1); + g_signal_connect( G_OBJECT(pZoomOut), "clicked", G_CALLBACK(changeZoom), NULL ); + + gtk_box_pack_start( GTK_BOX(pVBox), pToolbar, FALSE, FALSE, 0 ); // Adds to top. + + // Docview + pDocView = lok_docview_new( pOffice ); + gtk_container_add( GTK_CONTAINER(pVBox), pDocView ); + + gtk_widget_show_all( pWindow ); + + lok_docview_open_document( LOK_DOCVIEW(pDocView), argv[2] ); gtk_main(); commit e73e1263d5cf7553c2d53dacbf41a7559b9c0d5b Author: Andrzej Hunt <andrzej.h...@collabora.com> Date: Mon Jun 23 15:13:25 2014 +0100 LOK Docview: add set_zoom Change-Id: I902f3a134b4a7dcc721eff3f67376014a4276885 diff --git a/include/LibreOfficeKit/LibreOfficeKitGtk.h b/include/LibreOfficeKit/LibreOfficeKitGtk.h index 2435fc2..f160925 100644 --- a/include/LibreOfficeKit/LibreOfficeKitGtk.h +++ b/include/LibreOfficeKit/LibreOfficeKitGtk.h @@ -37,6 +37,8 @@ struct _LOKDocView GtkWidget* pCanvas; GdkPixbuf* pPixBuf; + float fZoom; + LibreOfficeKit* pOffice; LibreOfficeKitDocument* pDocument; }; @@ -52,6 +54,9 @@ guint lok_docview_get_type (void); GtkWidget* lok_docview_new ( LibreOfficeKit* pOffice ); gboolean lok_docview_open_document (LOKDocView* pDocView, char* pPath); +void lok_docview_set_zoom (LOKDocView* pDocView, + float fZoom); +float lok_docview_get_zoom (LOKDocView* pDocView); #ifdef __cplusplus } diff --git a/libreofficekit/source/gtk/lokdocview.c b/libreofficekit/source/gtk/lokdocview.c index 4a16db0..99f2b15 100644 --- a/libreofficekit/source/gtk/lokdocview.c +++ b/libreofficekit/source/gtk/lokdocview.c @@ -68,6 +68,8 @@ static void lok_docview_init( LOKDocView* pDocView ) // TODO: figure out a clever view of getting paths set up. pDocView->pOffice = 0; pDocView->pDocument = 0; + + pDocView->fZoom = 1; } SAL_DLLPUBLIC_EXPORT GtkWidget* lok_docview_new( LibreOfficeKit* pOffice ) @@ -77,16 +79,10 @@ SAL_DLLPUBLIC_EXPORT GtkWidget* lok_docview_new( LibreOfficeKit* pOffice ) return GTK_WIDGET( pDocView ); } -SAL_DLLPUBLIC_EXPORT gboolean lok_docview_open_document( LOKDocView* pDocView, char* pPath ) +void renderDocument( LOKDocView* pDocView ) { - if ( pDocView->pDocument ) - { - pDocView->pDocument->pClass->destroy( pDocView->pDocument ); - pDocView->pDocument = 0; - } + g_assert( pDocView->pDocument ); - pDocView->pDocument = pDocView->pOffice->pClass->documentLoad( pDocView->pOffice, - pPath ); if ( pDocView->pPixBuf ) { g_object_unref( G_OBJECT( pDocView->pPixBuf ) ); @@ -96,15 +92,17 @@ SAL_DLLPUBLIC_EXPORT gboolean lok_docview_open_document( LOKDocView* pDocView, c pDocView->pDocument->pClass->getDocumentSize( pDocView->pDocument, &nWidth, &nHeight ); // Draw the whole document at once (for now) - int nRenderWidth = nWidth / 10; - int nRenderHeight = nHeight / 10; + + // TODO: we really should scale by screen DPI here -- 10 seems to be a vaguely + // correct factor for my screen at least. + int nRenderWidth = nWidth * pDocView->fZoom / 10; + int nRenderHeight = nHeight * pDocView->fZoom / 10; pDocView->pPixBuf = gdk_pixbuf_new( GDK_COLORSPACE_RGB, TRUE, 8, nRenderWidth, nRenderHeight); - // TODO: move the rendering into it's own function etc. unsigned char* pBuffer = gdk_pixbuf_get_pixels( pDocView->pPixBuf ); int nRowStride; pDocView->pDocument->pClass->paintTile( pDocView->pDocument, @@ -119,8 +117,34 @@ SAL_DLLPUBLIC_EXPORT gboolean lok_docview_open_document( LOKDocView* pDocView, c (void) nRowStride; gtk_image_set_from_pixbuf( GTK_IMAGE( pDocView->pCanvas ), pDocView->pPixBuf ); +} + +SAL_DLLPUBLIC_EXPORT gboolean lok_docview_open_document( LOKDocView* pDocView, char* pPath ) +{ + if ( pDocView->pDocument ) + { + pDocView->pDocument->pClass->destroy( pDocView->pDocument ); + pDocView->pDocument = 0; + } + + pDocView->pDocument = pDocView->pOffice->pClass->documentLoad( pDocView->pOffice, + pPath ); + + renderDocument( pDocView ); return FALSE; } +SAL_DLLPUBLIC_EXPORT void lok_docview_set_zoom ( LOKDocView* pDocView, float fZoom ) +{ + pDocView->fZoom = fZoom; + renderDocument( pDocView ); + // TODO: maybe remember and reset positiong? +} + +SAL_DLLPUBLIC_EXPORT float lok_docview_get_zoom ( LOKDocView* pDocView ) +{ + return pDocView->fZoom; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits