]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/screen.C
Fix Qt crash
[lyx.git] / src / frontends / screen.C
index 6f874d9f799fb7f904966357ec12e970bf30f777..93f7064ef7503bda204930f8f543919b14e28052 100644 (file)
@@ -1,21 +1,21 @@
 /**
  * \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__
-#pragma implementation
-#endif
 
 #include <config.h>
 
 #include "screen.h"
 #include "lyxtext.h"
+#include "lyxrc.h"
 #include "lyxrow.h"
 #include "BufferView.h"
 #include "buffer.h"
@@ -24,6 +24,7 @@
 #include "font_metrics.h"
 #include "language.h"
 #include "debug.h"
+#include "rowpainter.h"
 
 // Splash screen-specific stuff
 #include "lyxfont.h"
@@ -54,6 +55,15 @@ public:
        string const & text() const { return text_; }
        ///
        LyXFont const & font() const { return font_; }
+       ///
+       void connect(grfx::Loader::slot_type const & slot) const {
+               loader_.connect(slot);
+       }
+       ///
+       void startLoading() const {
+               if (loader_.status() == grfx::WaitingToLoad)
+                       loader_.startLoading();
+       }
 
 private:
        /** Make the c-tor private so we can control how many objects
@@ -80,7 +90,10 @@ SplashScreen const & SplashScreen::get()
 SplashScreen::SplashScreen()
        : text_(lyx_version ? lyx_version : "unknown")
 {
-       string const file = LibFileSearch("images", "banner", "xpm");
+       if (!lyxrc.show_banner)
+               return;
+
+       string const file = LibFileSearch("images", "banner", "ppm");
        if (file.empty())
                return;
 
@@ -92,22 +105,20 @@ SplashScreen::SplashScreen()
 
        // 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)
+       : cursor_visible_(false), force_clear_(true), greyed_out_(true)
 {
        // Start loading the pixmap as soon as possible
-       SplashScreen::get();
+       if (lyxrc.show_banner) {
+               SplashScreen const & splash = SplashScreen::get();
+               splash.connect(boost::bind(&LyXScreen::greyOut, this));
+               splash.startLoading();
+       }
 }
 
 
@@ -165,6 +176,7 @@ bool LyXScreen::fitManualCursor(BufferView * bv, LyXText * text,
                text->first_y = newtop;
                return true;
        }
+
        return false;
 }
 
@@ -189,8 +201,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()
@@ -225,8 +236,10 @@ bool LyXScreen::fitCursor(LyXText * text, BufferView * bv)
        // Is a change necessary?
        int const newtop = topCursorVisible(text->cursor, text->first_y);
        bool const result = (newtop != text->first_y);
-       if (result)
+       if (result) {
                draw(text, bv, newtop);
+       }
+
        return result;
 }
 
@@ -346,15 +359,15 @@ void LyXScreen::toggleToggle(LyXText * text, BufferView * bv,
 
 void LyXScreen::redraw(LyXText * text, BufferView * bv)
 {
-       workarea().getPainter().start();
+       greyed_out_ = !text;
 
-       if (!text) {
+       if (greyed_out_) {
                greyOut();
-               expose(0, 0, workarea().workWidth(), workarea().workHeight());
-               workarea().getPainter().end();
                return;
        }
 
+       workarea().getPainter().start();
+
        drawFromTo(text, bv, 0, workarea().workHeight(), 0, 0, text == bv->text);
        expose(0, 0, workarea().workWidth(), workarea().workHeight());
 
@@ -369,6 +382,11 @@ void LyXScreen::redraw(LyXText * text, BufferView * bv)
 
 void LyXScreen::greyOut()
 {
+       if (!greyed_out_)
+               return;
+
+       workarea().getPainter().start();
+
        workarea().getPainter().fillRectangle(0, 0,
                workarea().workWidth(),
                workarea().workHeight(),
@@ -381,19 +399,21 @@ void LyXScreen::greyOut()
                int const w = splash_image->getWidth();
                int const h = splash_image->getHeight();
 
-               int x = 0.5 * (workarea().workWidth() - w);
-               int y = 0.5 * (workarea().workHeight() - h);
+               int x = (workarea().workWidth() - w) / 2;
+               int y = (workarea().workHeight() - h) / 2;
 
                workarea().getPainter().image(x, y, w, h, *splash_image);
 
                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);
        }
+       expose(0, 0, workarea().workWidth(), workarea().workHeight());
+       workarea().getPainter().end();
 }
 
 
@@ -401,7 +421,7 @@ void LyXScreen::drawFromTo(LyXText * text, BufferView * bv,
        int y1, int y2, int yo, int xo,
        bool internal)
 {
-       lyxerr[Debug::GUI] << "screen: drawFromTo " << y1 << "-" << y2 << endl;
+       lyxerr[Debug::GUI] << "screen: drawFromTo " << y1 << '-' << y2 << endl;
 
        int y_text = text->first_y + y1;
 
@@ -414,16 +434,23 @@ void LyXScreen::drawFromTo(LyXText * text, BufferView * bv,
 
        while (row != 0 && y < y2) {
                LyXText::text_status st = text->status();
-               text->getVisibleRow(bv, y + yo,
-                                   xo, row, y + text->first_y);
+               // we need this here as the row pointer may be illegal
+               // at a later time (Jug20020502)
+               Row * prev = row->previous();
+               RowPainter rp(*bv, *text, *row);
+               if (rp.paint(y + yo, xo, y + text->first_y))
+                       text->markChangeInDraw(bv, row, prev);
+
                internal = internal && (st != LyXText::CHANGED_IN_DRAW);
                while (internal && text->status() == LyXText::CHANGED_IN_DRAW) {
                        text->fullRebreak(bv);
                        st = LyXText::NEED_MORE_REFRESH;
                        text->setCursor(bv, text->cursor.par(), text->cursor.pos());
                        text->status(bv, st);
-                       text->getVisibleRow(bv, y + yo,
-                                           xo, row, y + text->first_y);
+                       Row * prev = row->previous();
+                       RowPainter rp(*bv, *text, *row);
+                       if (rp.paint(y + yo, xo, y + text->first_y))
+                               text->markChangeInDraw(bv, row, prev);
                }
                y += row->height();
                row = row->next();
@@ -431,7 +458,7 @@ void LyXScreen::drawFromTo(LyXText * text, BufferView * bv,
        force_clear_ = false;
 
        // maybe we have to clear the screen at the bottom
-       if ((y < y2) && text->bv_owner) {
+       if ((y < y2) && text->isTopLevel()) {
                workarea().getPainter().fillRectangle(0, y,
                        workarea().workWidth(), y2 - y,
                        LColor::bottomarea);
@@ -446,7 +473,10 @@ void LyXScreen::drawOneRow(LyXText * text, BufferView * bv, Row * row,
 
        if (((y + row->height()) > 0) &&
            ((y - row->height()) <= static_cast<int>(workarea().workHeight()))) {
-               text->getVisibleRow(bv, y, xo, row, y + text->first_y);
+               Row * prev = row->previous();
+               RowPainter rp(*bv, *text, *row);
+               if (rp.paint(y, xo, y + text->first_y))
+                       text->markChangeInDraw(bv, row, prev);
        }
        force_clear_ = false;
 }