]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/screen.C
fix rbearing
[lyx.git] / src / frontends / screen.C
index b9720d3be524e632fbdda6dd761cd50467bd1f6a..c3c3affcc33f5764fa17156c7b563e68052e5130 100644 (file)
@@ -1,9 +1,13 @@
 /**
  * \file screen.C
- * Copyright 2002 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- * \author John Levon <moz@compsoc.man.ac.uk>
+ * \author John Levon 
+ *
+ * Full author contact details are available in file CREDITS
+ *
+ * Splash screen code added by Angus Leeming
  */
 
 #ifdef __GNUG__
@@ -14,6 +18,7 @@
 
 #include "screen.h"
 #include "lyxtext.h"
+#include "lyxrc.h"
 #include "lyxrow.h"
 #include "BufferView.h"
 #include "buffer.h"
 #include "language.h"
 #include "debug.h"
 
+// Splash screen-specific stuff
+#include "lyxfont.h"
+#include "version.h"
+
+#include "graphics/GraphicsLoader.h"
+#include "graphics/GraphicsImage.h"
+
+#include "support/filetools.h" // LibFileSearch
+
+#include <boost/utility.hpp>
+#include <boost/bind.hpp>
+#include <boost/signals/trackable.hpp>
+
 using std::min;
 using std::max;
 using std::endl;
 
+namespace {
+
+class SplashScreen : boost::noncopyable, boost::signals::trackable {
+public:
+       /// This is a singleton class. Get the instance.
+       static SplashScreen const & get();
+       ///
+       grfx::Image const * image() const { return loader_.image(); }
+       ///
+       string const & text() const { return text_; }
+       ///
+       LyXFont const & font() const { return font_; }
+
+private:
+       /** Make the c-tor private so we can control how many objects
+        *  are instantiated.
+        */
+       SplashScreen();
+
+       ///
+       grfx::Loader loader_;
+       /// The text to be written on top of the pixmap
+       string const text_;
+       /// in this font...
+       LyXFont font_;
+};
+
+
+SplashScreen const & SplashScreen::get()
+{
+       static SplashScreen singleton;
+       return singleton;
+}
+
+
+SplashScreen::SplashScreen()
+       : text_(lyx_version ? lyx_version : "unknown")
+{
+       if (!lyxrc.show_banner)
+               return;
+
+       string const file = LibFileSearch("images", "banner", "xpm");
+       if (file.empty())
+               return;
+
+       // The font used to display the version info
+       font_.setFamily(LyXFont::SANS_FAMILY);
+       font_.setSeries(LyXFont::BOLD_SERIES);
+       font_.setSize(LyXFont::SIZE_NORMAL);
+       font_.setColor(LColor::yellow);
+
+       // Load up the graphics file
+       loader_.reset(file);
+       // We aren't interested here in when the image is loaded.
+       // If it isn't ready when we want it, then we ignore it.
+//     loader_->statusChanged.connect(
+//                     boost::bind(&SplashScreen::statusChanged, this));
+       if (loader_.status() == grfx::WaitingToLoad)
+               loader_.startLoading();
+}
+
+} // namespace anon
+
 
 LyXScreen::LyXScreen()
        : force_clear_(true), cursor_visible_(false)
 {
+       // Start loading the pixmap as soon as possible
+       SplashScreen::get();
 }
 
 
@@ -112,8 +195,7 @@ unsigned int LyXScreen::topCursorVisible(LyXCursor const & cursor, int top_y)
        if (!row)
                return max(newtop, 0);
 
-       if (cursor.y() - row->baseline() + row->height()
-           - top_y >= vheight) {
+       if (cursor.y() - row->baseline() + row->height() - top_y >= vheight) {
                if (row->height() < vheight
                    && row->height() > vheight / 4) {
                        newtop = cursor.y()
@@ -297,42 +379,26 @@ void LyXScreen::greyOut()
                workarea().workHeight(),
                LColor::bottomarea);
 
-// FIXME: pending GUIIzation / cleanup of graphics cache.
-//        We should be using something like this.
-#if 0
-       static bool first = true;
-       if (first) {
-               first = false;
-
-               splash_file_ = (lyxrc.show_banner) ?
-                       LibFileSearch("images", "banner", "xpm") : string();
-               if (splash_file_) {
-                       grfx::GCache & gc = grfx::GCache::get();
-                       gc.add(splash_file_);
-                       gc.startLoading(splash_file_);
-               }
-       }
-
        // Add a splash screen to the centre of the work area
-       grfx::GCache & gc = grfx::GCache::get();
-       grfx::ImagePtr const splash = gc.image(splash_file_);
-       if (splash.get()) {
-               int const w = splash->getWidth();
-               int const h = splash->getHeight();
+       SplashScreen const & splash = SplashScreen::get();
+       grfx::Image const * const splash_image = splash.image();
+       if (splash_image) {
+               int const w = splash_image->getWidth();
+               int const h = splash_image->getHeight();
+
+               int x = (workarea().workWidth() - w) / 2;
+               int y = (workarea().workHeight() - h) / 2;
 
-               int const x = 0.5 * (workarea().workWidth() - w);
-               int const y = 0.5 * (workarea().workHeight() - h);
+               workarea().getPainter().image(x, y, w, h, *splash_image);
 
-               workarea().getPainter().image(x, y, w, h, splash->getPixmap());
+               string const & splash_text  = splash.text();
+               LyXFont const & splash_font = splash.font();
+
+               x += 260;
+               y += 265;
+
+               workarea().getPainter().text(x, y, splash_text, splash_font);
        }
-#endif
-// Alternatively, we should compile this into the code.
-// I think that that is better here (so that the pixmap is displayed on
-// start-up).
-// Would need a new method
-//     virtual Pixmap splashPixmap() = 0;
-// or some such.
-// Angus 21 June 2002
 }