From 030f2f1ebd1f776b45576079a1a4c2768553873a Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 02:12:38 +0200 Subject: Inkview: Refactoring - move SPSlideShow to separate source file (bzr r15690.1.8) --- src/svg-view-slideshow.cpp | 300 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 src/svg-view-slideshow.cpp (limited to 'src/svg-view-slideshow.cpp') diff --git a/src/svg-view-slideshow.cpp b/src/svg-view-slideshow.cpp new file mode 100644 index 000000000..eebcd94df --- /dev/null +++ b/src/svg-view-slideshow.cpp @@ -0,0 +1,300 @@ +/* + * Inkscape - an ambitious vector drawing program + * + * Authors: + * Lauris Kaplinski + * Frank Felfe + * Davide Puricelli + * Mitsuru Oka + * Masatake YAMATO + * F.J.Franklin + * Michael Meeks + * Chema Celorio + * Pawel Palucha + * ... and various people who have worked with various projects + * Abhishek Sharma + * + * Copyright (C) 1999-2002 authors + * Copyright (C) 2001-2002 Ximian, Inc. + * + * Inkscape authors: + * Johan Ceuppens + * + * Copyright (C) 2004 Inkscape authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "document.h" +#include "ui/icon-names.h" +#include "util/units.h" + +#include "svg-view.h" +#include "svg-view-slideshow.h" +#include "svg-view-widget.h" + + + +SPSlideShow::SPSlideShow(std::vector const &slides) + : + _slides(slides), + _current(0), + _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)), + _view(NULL), + is_fullscreen(false), + _timer(0), + _ctrlwin(NULL) +{ + update_title(); + + auto default_screen = Gdk::Screen::get_default(); + + set_default_size(MIN ((int)_doc->getWidth().value("px"), default_screen->get_width() - 64), + MIN ((int)_doc->getHeight().value("px"), default_screen->get_height() - 64)); + + this->signal_key_press_event().connect(sigc::mem_fun(*this, &SPSlideShow::key_press), false); + this->signal_delete_event().connect(sigc::mem_fun(*this, &SPSlideShow::main_delete), false); + + _doc->ensureUpToDate(); + _view = sp_svg_view_widget_new (_doc); + _doc->doUnref (); + SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); + gtk_widget_show (_view); + add(*Glib::wrap(_view)); + + show(); +} + + + +/** + * @brief Show the control buttons (next, previous etc) for the application + */ +void SPSlideShow::control_show() +{ + if (!_ctrlwin) { + _ctrlwin = new Gtk::Window(); + _ctrlwin->set_resizable(false); + _ctrlwin->set_transient_for(*this); + + _ctrlwin->signal_key_press_event().connect(sigc::mem_fun(*this, &SPSlideShow::key_press), false); + _ctrlwin->signal_delete_event().connect(sigc::mem_fun(*this, &SPSlideShow::ctrlwin_delete), false); + + auto t = Gtk::manage(new Gtk::ButtonBox()); + _ctrlwin->add(*t); + + auto btn_go_first = Gtk::manage(new Gtk::Button()); + auto img_go_first = Gtk::manage(new Gtk::Image()); + img_go_first->set_from_icon_name(INKSCAPE_ICON("go-first"), Gtk::ICON_SIZE_BUTTON); + btn_go_first->set_image(*img_go_first); + t->add(*btn_go_first); + btn_go_first->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_first)); + + auto btn_go_prev = Gtk::manage(new Gtk::Button()); + auto img_go_prev = Gtk::manage(new Gtk::Image()); + img_go_prev->set_from_icon_name(INKSCAPE_ICON("go-previous"), Gtk::ICON_SIZE_BUTTON); + btn_go_prev->set_image(*img_go_prev); + t->add(*btn_go_prev); + btn_go_prev->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_prev)); + + auto btn_go_next = Gtk::manage(new Gtk::Button()); + auto img_go_next = Gtk::manage(new Gtk::Image()); + img_go_next->set_from_icon_name(INKSCAPE_ICON("go-next"), Gtk::ICON_SIZE_BUTTON); + btn_go_next->set_image(*img_go_next); + t->add(*btn_go_next); + btn_go_next->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::show_next)); + + auto btn_go_last = Gtk::manage(new Gtk::Button()); + auto img_go_last = Gtk::manage(new Gtk::Image()); + img_go_last->set_from_icon_name(INKSCAPE_ICON("go-last"), Gtk::ICON_SIZE_BUTTON); + btn_go_last->set_image(*img_go_last); + t->add(*btn_go_last); + btn_go_last->signal_clicked().connect(sigc::mem_fun(*this, &SPSlideShow::goto_last)); + + _ctrlwin->show_all(); + } else { + _ctrlwin->present(); + } +} + +void SPSlideShow::waiting_cursor() +{ + auto display = Gdk::Display::get_default(); + auto waiting = Gdk::Cursor::create(display, Gdk::WATCH); + get_window()->set_cursor(waiting); + + if (_ctrlwin) { + _ctrlwin->get_window()->set_cursor(waiting); + } + while(Gtk::Main::events_pending()) { + Gtk::Main::iteration(); + } +} + +void SPSlideShow::normal_cursor() +{ + get_window()->set_cursor(); + if (_ctrlwin) { + _ctrlwin->get_window()->set_cursor(); + } +} + +void SPSlideShow::set_document(SPDocument *doc, + int current) +{ + if (doc && doc != _doc) { + doc->ensureUpToDate(); + reinterpret_cast(SP_VIEW_WIDGET_VIEW (_view))->setDocument (doc); + _doc = doc; + _current = current; + update_title(); + } +} + +/** + * @brief Show the next file in the slideshow + */ +void SPSlideShow::show_next() +{ + waiting_cursor(); + + SPDocument *doc = NULL; + while (!doc && (_current < _slides.size() - 1)) { + doc = SPDocument::createNewDoc ((_slides[++_current]).c_str(), TRUE, false); + } + + set_document(doc, _current); + normal_cursor(); +} + +/** + * @brief Show the previous file in the slideshow + */ +void SPSlideShow::show_prev() +{ + waiting_cursor(); + + SPDocument *doc = NULL; + while (!doc && (_current > 0)) { + doc = SPDocument::createNewDoc ((_slides[--_current]).c_str(), TRUE, false); + } + + set_document(doc, _current); + normal_cursor(); +} + +/** + * @brief Switch to first slide in slideshow + */ +void SPSlideShow::goto_first() +{ + waiting_cursor(); + + SPDocument *doc = NULL; + int current = 0; + while ( !doc && (current < _slides.size() - 1)) { + doc = SPDocument::createNewDoc((_slides[current++]).c_str(), TRUE, false); + } + + set_document(doc, current - 1); + + normal_cursor(); +} + +/** + * @brief Switch to last slide in slideshow + */ +void SPSlideShow::goto_last() +{ + waiting_cursor(); + + SPDocument *doc = NULL; + int current = _slides.size() - 1; + while (!doc && (current >= 0)) { + doc = SPDocument::createNewDoc((_slides[current--]).c_str(), TRUE, false); + } + + set_document(doc, current + 1); + + normal_cursor(); +} + +bool SPSlideShow::ctrlwin_delete (GdkEventAny */*event*/) +{ + if(_ctrlwin) delete _ctrlwin; + _ctrlwin = NULL; + return true; +} + +bool SPSlideShow::main_delete (GdkEventAny */*event*/) +{ + Gtk::Main::quit(); + return true; +} + +bool SPSlideShow::key_press(GdkEventKey* event) +{ + switch (event->keyval) { + case GDK_KEY_Up: + case GDK_KEY_Home: + goto_first(); + break; + case GDK_KEY_Down: + case GDK_KEY_End: + goto_last(); + break; + case GDK_KEY_F11: + if (is_fullscreen) { + unfullscreen(); + is_fullscreen = false; + } else { + fullscreen(); + is_fullscreen = true; + } + break; + case GDK_KEY_Return: + control_show(); + break; + case GDK_KEY_KP_Page_Down: + case GDK_KEY_Page_Down: + case GDK_KEY_Right: + case GDK_KEY_space: + show_next(); + break; + case GDK_KEY_KP_Page_Up: + case GDK_KEY_Page_Up: + case GDK_KEY_Left: + case GDK_KEY_BackSpace: + show_prev(); + break; + case GDK_KEY_Escape: + case GDK_KEY_q: + case GDK_KEY_Q: + Gtk::Main::quit(); + break; + default: + break; + } + return false; +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : -- cgit v1.2.3 From 9607306c03378d38b9ba67b7f0120593b7820826 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 02:41:40 +0200 Subject: Inkview: Some more refactoring (bzr r15690.1.9) --- src/svg-view-slideshow.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/svg-view-slideshow.cpp') diff --git a/src/svg-view-slideshow.cpp b/src/svg-view-slideshow.cpp index eebcd94df..f9a392d3e 100644 --- a/src/svg-view-slideshow.cpp +++ b/src/svg-view-slideshow.cpp @@ -29,7 +29,6 @@ # include "config.h" #endif -#include #include #include #include @@ -149,6 +148,18 @@ void SPSlideShow::normal_cursor() } } + +/// Update the window title with current document name +void SPSlideShow::update_title() +{ + Glib::ustring title(_doc->getName()); + if (_slides.size() > 1) { + title += Glib::ustring::compose(" (%1/%2)", _current+1, _slides.size()); + } + + set_title(title); +} + void SPSlideShow::set_document(SPDocument *doc, int current) { -- cgit v1.2.3 From 8b5ac2ae58d3857d98b4e6d12b95be8430a1ca50 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 03:49:13 +0200 Subject: Inkview: Finally implement the -t or --timer option after we dragged it around for over 10 years without implementation (bzr r15690.1.10) --- src/svg-view-slideshow.cpp | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'src/svg-view-slideshow.cpp') diff --git a/src/svg-view-slideshow.cpp b/src/svg-view-slideshow.cpp index f9a392d3e..00552130d 100644 --- a/src/svg-view-slideshow.cpp +++ b/src/svg-view-slideshow.cpp @@ -29,6 +29,8 @@ # include "config.h" #endif +#include + #include #include #include @@ -44,15 +46,14 @@ -SPSlideShow::SPSlideShow(std::vector const &slides) - : - _slides(slides), - _current(0), - _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)), - _view(NULL), - is_fullscreen(false), - _timer(0), - _ctrlwin(NULL) +SPSlideShow::SPSlideShow(std::vector const &slides, int timer) + : _slides(slides) + , _current(0) + , _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)) + , _timer(timer) + , _view(NULL) + , _ctrlwin(NULL) + , is_fullscreen(false) { update_title(); @@ -72,6 +73,10 @@ SPSlideShow::SPSlideShow(std::vector const &slides) add(*Glib::wrap(_view)); show(); + + if(_timer) { + Glib::signal_timeout().connect_seconds(sigc::mem_fun(*this, &timer_callback), _timer); + } } @@ -240,6 +245,18 @@ void SPSlideShow::goto_last() normal_cursor(); } +bool SPSlideShow::timer_callback() +{ + show_next(); + + // stop the timer if the last slide is reached + if (_current == _slides.size()-1) { + return false; + } else { + return true; + } +} + bool SPSlideShow::ctrlwin_delete (GdkEventAny */*event*/) { if(_ctrlwin) delete _ctrlwin; -- cgit v1.2.3 From f878665ef5fa1193157d436ce153c0a43c9ace94 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 04:13:34 +0200 Subject: Inkview: minor refactoring (bzr r15690.1.11) --- src/svg-view-slideshow.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'src/svg-view-slideshow.cpp') diff --git a/src/svg-view-slideshow.cpp b/src/svg-view-slideshow.cpp index 00552130d..a025eed9e 100644 --- a/src/svg-view-slideshow.cpp +++ b/src/svg-view-slideshow.cpp @@ -55,25 +55,22 @@ SPSlideShow::SPSlideShow(std::vector const &slides, int timer) , _ctrlwin(NULL) , is_fullscreen(false) { - update_title(); - + // setup initial document auto default_screen = Gdk::Screen::get_default(); - set_default_size(MIN ((int)_doc->getWidth().value("px"), default_screen->get_width() - 64), - MIN ((int)_doc->getHeight().value("px"), default_screen->get_height() - 64)); + MIN ((int)_doc->getHeight().value("px"), default_screen->get_height() - 64)); - this->signal_key_press_event().connect(sigc::mem_fun(*this, &SPSlideShow::key_press), false); - this->signal_delete_event().connect(sigc::mem_fun(*this, &SPSlideShow::main_delete), false); - - _doc->ensureUpToDate(); - _view = sp_svg_view_widget_new (_doc); - _doc->doUnref (); + _view = sp_svg_view_widget_new(_doc); SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); gtk_widget_show (_view); add(*Glib::wrap(_view)); - + + update_title(); show(); + // connect signals + this->signal_key_press_event().connect(sigc::mem_fun(*this, &SPSlideShow::key_press), false); + this->signal_delete_event().connect(sigc::mem_fun(*this, &SPSlideShow::main_delete), false); if(_timer) { Glib::signal_timeout().connect_seconds(sigc::mem_fun(*this, &timer_callback), _timer); } @@ -248,7 +245,7 @@ void SPSlideShow::goto_last() bool SPSlideShow::timer_callback() { show_next(); - + // stop the timer if the last slide is reached if (_current == _slides.size()-1) { return false; -- cgit v1.2.3 From 1be23961b14fb409ee1a13fde6de676111587356 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 14 May 2017 06:11:55 +0200 Subject: Inkview: add option -s or --scale to set a factor by witch to scale the displayed image Fixed bugs: - https://launchpad.net/bugs/1550897 (bzr r15690.1.14) --- src/svg-view-slideshow.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/svg-view-slideshow.cpp') diff --git a/src/svg-view-slideshow.cpp b/src/svg-view-slideshow.cpp index a025eed9e..109b0fcab 100644 --- a/src/svg-view-slideshow.cpp +++ b/src/svg-view-slideshow.cpp @@ -46,19 +46,20 @@ -SPSlideShow::SPSlideShow(std::vector const &slides, int timer) +SPSlideShow::SPSlideShow(std::vector const &slides, int timer, double scale) : _slides(slides) , _current(0) , _doc(SPDocument::createNewDoc(_slides[0].c_str(), true, false)) , _timer(timer) + , _scale(scale) , _view(NULL) , _ctrlwin(NULL) , is_fullscreen(false) { // setup initial document auto default_screen = Gdk::Screen::get_default(); - set_default_size(MIN ((int)_doc->getWidth().value("px"), default_screen->get_width() - 64), - MIN ((int)_doc->getHeight().value("px"), default_screen->get_height() - 64)); + set_default_size(MIN ((int)_doc->getWidth().value("px")*_scale, default_screen->get_width() - 64), + MIN ((int)_doc->getHeight().value("px")*_scale, default_screen->get_height() - 64)); _view = sp_svg_view_widget_new(_doc); SP_SVG_VIEW_WIDGET(_view)->setResize( false, _doc->getWidth().value("px"), _doc->getHeight().value("px") ); -- cgit v1.2.3