]> git.lyx.org Git - features.git/commitdiff
do not draw to intermediate pixmap
authorAndré Pönitz <poenitz@gmx.net>
Mon, 23 Oct 2006 08:46:09 +0000 (08:46 +0000)
committerAndré Pönitz <poenitz@gmx.net>
Mon, 23 Oct 2006 08:46:09 +0000 (08:46 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15501 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/qt4/GuiFontMetrics.C
src/frontends/qt4/GuiWorkArea.C
src/frontends/qt4/GuiWorkArea.h
src/frontends/qt4/QLPainter.C
src/frontends/qt4/QLPainter.h

index 544ee5348fa6dd051bc10d1235b3b8de1d7bd938..36fc33dde0b2cb22cbb4e1130d303bacad65cc54 100644 (file)
@@ -116,9 +116,10 @@ int GuiFontMetrics::smallcapsWidth(QString const & s) const
 int GuiFontMetrics::width(char_type const * s, size_t ls) const
 {
        if (ls == 1 && !smallcaps_shape_) {
-               QChar c = ucs4_to_qchar(s[0]);
+               QChar const c = ucs4_to_qchar(s[0]);
                return width(c.unicode());
        }
+
        QString ucs2;
        ucs4_to_qstring(s, ls, ucs2);
 
index 2f04f8a6f9215bb07fed24f9dcbe14b2d24861e5..12978499a926356b2aad04a63d801903a6a69a3d 100644 (file)
 #include "LyXView.h"
 
 #include "BufferView.h"
+#include "rowpainter.h"
 #include "debug.h"
 #include "funcrequest.h"
 #include "LColor.h"
+#include "version.h"
+#include "lyxrc.h"
 
+#include "support/filetools.h" // LibFileSearch
 #include "support/os.h"
 
+#include "graphics/GraphicsImage.h"
+#include "graphics/GraphicsLoader.h"
+
 #include <QLayout>
 #include <QMainWindow>
 #include <QMimeData>
@@ -53,6 +60,15 @@ using std::string;
 
 namespace os = lyx::support::os;
 
+
+volatile int NN;
+
+void recCalled()
+{
+       ++NN;
+}
+
+
 namespace lyx {
 
 /// return the LyX key state from Qt's
@@ -115,17 +131,15 @@ SyntheticMouseEvent::SyntheticMouseEvent()
 
 
 GuiWorkArea::GuiWorkArea(int w, int h, LyXView & lyx_view)
-       : WorkArea(lyx_view), painter_(this)
+       : WorkArea(lyx_view)
 {
        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-
        setAcceptDrops(true);
-
        setMinimumSize(100, 70);
 
-       viewport()->setAutoFillBackground(false);
-       viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
+       //viewport()->setAutoFillBackground(false);
+       //viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
        setFocusPolicy(Qt::WheelFocus);
 
        viewport()->setCursor(Qt::IBeamCursor);
@@ -410,10 +424,11 @@ void GuiWorkArea::mouseDoubleClickEvent(QMouseEvent * e)
 }
 
 
-void GuiWorkArea::resizeEvent(QResizeEvent *)
+void GuiWorkArea::resizeEvent(QResizeEvent * ev)
 {
        verticalScrollBar()->setPageStep(viewport()->height());
-       paint_device_ = QPixmap(viewport()->width(), viewport()->height());
+       //paint_device_ = QPixmap(viewport()->width(), viewport()->height());
+       QAbstractScrollArea::resizeEvent(ev);
        resizeBufferView();
 }
 
@@ -424,12 +439,93 @@ void GuiWorkArea::update(int x, int y, int w, int h)
 }
 
 
-void GuiWorkArea::paintEvent(QPaintEvent * e)
+void GuiWorkArea::doGreyOut(QLPainter & pain)
 {
-       lyxerr << "paintEvent begin: x: " << e->rect().x()
-               << " y: " << e->rect().y()
-               << " w: " << e->rect().width()
-               << " h: " << e->rect().height() << endl;
+       greyed_out_ = true;
+       pain.fillRectangle(0, 0, width(), height(),
+               LColor::bottomarea);
+
+       //if (!lyxrc.show_banner)
+       //      return;
+       lyxerr << "show banner: " << lyxrc.show_banner << endl;
+       /// The text to be written on top of the pixmap
+       string const text = lyx_version ? lyx_version : "unknown";
+       string const file = support::libFileSearch("images", "banner", "ppm");
+       if (file.empty())
+               return;
+
+       QPixmap pm(toqstr(file));
+       if (!pm) {
+               lyxerr << "could not load splash screen: '" << file << "'" << endl;
+               return;
+       }
+
+       QFont font;
+       // The font used to display the version info
+       font.setStyleHint(QFont::SansSerif);
+       font.setWeight(QFont::Bold);
+       font.setPointSize(LyXFont::SIZE_NORMAL);
+
+       int const w = pm.width();
+       int const h = pm.height();
+
+       int x = (width() - w) / 2;
+       int y = (height() - h) / 2;
+
+       pain.drawPixmap(x, y, pm);
+
+       x += 260;
+       y += 265;
+
+       pain.setPen(QColor(255, 255, 0));
+       pain.setFont(font);
+       pain.drawText(x, y, toqstr(text));
+}
+
+
+void GuiWorkArea::paintEvent(QPaintEvent * ev)
+{
+       //setAttribute(Qt::WA_PaintOutsidePaintEvent, true);
+       QRect const rc = ev->rect(); 
+       lyxerr << "paintEvent begin: x: " << rc.x()
+               << " y: " << rc.y()
+               << " w: " << rc.width()
+               << " h: " << rc.height() << endl;
+
+       if (!buffer_view_) {
+               lyxerr << "no bufferview" << endl;
+               return;
+       }
+
+       QLPainter pain(viewport());
+
+       if (rc.width() == 3) { // FIXME HACK
+               // Assume splash screen drawing is requested when
+               // widht == 3
+               doGreyOut(pain);
+               return;
+       }
+
+       if (!buffer_view_->buffer()) {
+               lyxerr << "no buffer: " << endl;
+               doGreyOut(pain);
+               updateScrollbar();
+               return;
+       }
+
+
+       if (rc.width() != 2)  { // FIXME HACK
+               // Assumes cursor drawing is requested when the
+               // width is 2
+               lyxerr << "Real drawing requested" << endl;
+               ViewMetricsInfo const & vi = buffer_view_->viewMetricsInfo();
+               paintText(*buffer_view_, vi, pain);
+       }
+       else {
+               //
+               lyxerr << "only cursor drawing requested" << endl;
+       }
+
        /*
        lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
                << "\n QWidget width\t" << this->width()
@@ -445,15 +541,13 @@ void GuiWorkArea::paintEvent(QPaintEvent * e)
                << endl;
        */
 
-       QPainter q(viewport());
-       q.drawPixmap(e->rect(), paint_device_, e->rect());
+       //pain.drawPixmap(e->rect(), paint_device_, e->rect());
 
        if (show_vcursor_)
-               q.drawPixmap(cursor_x_, cursor_y_, vcursor_);
+               pain.drawPixmap(cursor_x_, cursor_y_, vcursor_);
 
        if (show_hcursor_)
-               q.drawPixmap(cursor_x_, cursor_y_ + cursor_h_ - 1, hcursor_);
-
+               pain.drawPixmap(cursor_x_, cursor_y_ + cursor_h_ - 1, hcursor_);
        lyxerr << "paintEvent end" << endl;
 }
 
@@ -550,8 +644,7 @@ void GuiWorkArea::inputMethodEvent(QInputMethodEvent * e)
                        key = Qt::Key_AsciiCircum;
                // FIXME: Needs for investigation, this key is not really used,
                // the ctor below just check if key is different from 0.
-               QKeyEvent ev(QEvent::KeyPress, key,
-                       Qt::NoModifier, text);
+               QKeyEvent ev(QEvent::KeyPress, key, Qt::NoModifier, text);
                keyPressEvent(&ev);
        }
        e->accept();
index c8aaac8b8e94d2be3331a3277b11b3ae404b18cd..2117f073cc860c2e43f6553bc964a68087051043 100644 (file)
@@ -15,8 +15,6 @@
 
 #include "frontends/WorkArea.h"
 
-#include "QLPainter.h"
-
 #include "funcrequest.h"
 #include "frontends/Timeout.h"
 
@@ -36,12 +34,10 @@ class QWheelEvent;
 class QPaintEvent;
 
 namespace lyx {
-
-class Painter;
-
 namespace frontend {
 
 class GuiView;
+class QLPainter;
 
 /// for emulating triple click
 class double_click {
@@ -89,7 +85,7 @@ public:
  * Qt-specific implementation of the work area
  * (buffer view GUI)
 */
-class GuiWorkArea: public QAbstractScrollArea, public WorkArea
+class GuiWorkArea : public QAbstractScrollArea, public WorkArea
 {
        Q_OBJECT
 
@@ -104,18 +100,6 @@ public:
        ///
        virtual void setScrollbarParams(int height, int pos, int line_height);
 
-       ///
-       virtual void dragEnterEvent(QDragEnterEvent * event);
-
-       ///
-       virtual void dropEvent(QDropEvent* event);
-
-       /// return the widget's painter
-       virtual Painter & getPainter() { return (Painter &) painter_; }
-
-       /// return the backing pixmap
-       QPaintDevice * paintDevice() { return &paint_device_; }
-
        /// update the passed area.
        void update(int x, int y, int w, int h);
 
@@ -128,8 +112,12 @@ public:
        /// hide the cursor
        virtual void removeCursor();
 
-protected:
-
+private:
+       void doGreyOut(QLPainter & pain);
+       ///
+       void dragEnterEvent(QDragEnterEvent * event);
+       ///
+       void dropEvent(QDropEvent* event);
        /// repaint part of the widget
        void paintEvent(QPaintEvent * e);
        /// widget has been resized
@@ -164,10 +152,6 @@ public Q_SLOTS:
        void adjustViewWithScrollBar(int action = 0);
 
 private:
-
-       /// Our painter.
-       QLPainter painter_;
-
        /// The slot connected to SyntheticMouseEvent::timeout.
        void generateSyntheticMouseEvent();
 
@@ -175,7 +159,7 @@ private:
        SyntheticMouseEvent synthetic_mouse_event_;
 
        /// Our client side painting device.
-       QPixmap paint_device_;
+       //QPixmap paint_device_;
 
        /// \todo remove
        QTimer step_timer_;
index db3f13bd4fcb2a09df7113a03225fa1ca7adeba5..b08a0ae698c16f77469576d0a336a1f70d306b09 100644 (file)
@@ -33,8 +33,6 @@
 #include <QPixmap>
 #include <QImage>
 
-using lyx::char_type;
-using lyx::docstring;
 
 using std::endl;
 using std::string;
@@ -42,22 +40,12 @@ using std::string;
 namespace lyx {
 namespace frontend {
 
-QLPainter::~QLPainter()
-{
-}
-
-
-QLPainter::QLPainter(GuiWorkArea * qwa)
-       : Painter(), qwa_(qwa)
+QLPainter::QLPainter(QWidget * qwa)
+       : qwa_(qwa)
 {
-}
-
-
-void QLPainter::start()
-{
-       lyxerr << "QLPainter::start()" << endl;
-       qp_.reset(new QPainter(qwa_->paintDevice()));
-       qp_->setRenderHint(QPainter::TextAntialiasing);
+       //lyxerr << "QLPainter::start()" << endl;
+       QPainter::begin(qwa_);
+       setRenderHint(QPainter::TextAntialiasing);
        // new QPainter has default QPen:
        current_color_ = LColor::black;
        current_ls_ = line_solid;
@@ -65,24 +53,25 @@ void QLPainter::start()
 }
 
 
-void QLPainter::end()
+QLPainter::~QLPainter()
 {
-       qp_->end();
-       lyxerr << "QLPainter::end()" << endl;
+       QPainter::end();
+       //lyxerr << "QLPainter::end()" << endl;
 }
 
 
 int QLPainter::paperWidth() const
 {
-       return qwa_->viewport()->width();
+       return qwa_->width();
 }
 
 
 int QLPainter::paperHeight() const
 {
-       return qwa_->viewport()->height();
+       return qwa_->height();
 }
 
+
 void QLPainter::setQPainterPen(LColor_color col,
        Painter::line_style ls, Painter::line_width lw)
 {
@@ -93,7 +82,7 @@ void QLPainter::setQPainterPen(LColor_color col,
        current_ls_ = ls;
        current_lw_ = lw;
 
-       QPen pen = qp_.get()->pen();
+       QPen pen = QPainter::pen();
 
        pen.setColor(guiApp->colorCache().get(col));
 
@@ -107,14 +96,14 @@ void QLPainter::setQPainterPen(LColor_color col,
                case line_thick: pen.setWidth(3); break;
        }
 
-       qp_.get()->setPen(pen);
+       setPen(pen);
 }
 
 
 void QLPainter::point(int x, int y, LColor_color col)
 {
        setQPainterPen(col);
-       qp_->drawPoint(x, y);
+       drawPoint(x, y);
 }
 
 
@@ -124,7 +113,7 @@ void QLPainter::line(int x1, int y1, int x2, int y2,
        line_width lw)
 {
        setQPainterPen(col, ls, lw);
-       qp_->drawLine(x1, y1, x2, y2);
+       drawLine(x1, y1, x2, y2);
 }
 
 
@@ -144,7 +133,7 @@ void QLPainter::lines(int const * xp, int const * yp, int np,
        }
 
        setQPainterPen(col, ls, lw);
-       qp_->drawPolyline(points.get(), np);
+       drawPolyline(points.get(), np);
 }
 
 
@@ -154,13 +143,13 @@ void QLPainter::rectangle(int x, int y, int w, int h,
        line_width lw)
 {
        setQPainterPen(col, ls, lw);
-       qp_->drawRect(x, y, w, h);
+       drawRect(x, y, w, h);
 }
 
 
 void QLPainter::fillRectangle(int x, int y, int w, int h, LColor_color col)
 {
-       qp_->fillRect(x, y, w, h, guiApp->colorCache().get(col));
+       fillRect(x, y, w, h, guiApp->colorCache().get(col));
 }
 
 
@@ -169,25 +158,24 @@ void QLPainter::arc(int x, int y, unsigned int w, unsigned int h,
 {
        // LyX usings 1/64ths degree, Qt usings 1/16th
        setQPainterPen(col);
-       qp_->drawArc(x, y, w, h, a1 / 4, a2 / 4);
+       drawArc(x, y, w, h, a1 / 4, a2 / 4);
 }
 
 
-void QLPainter::image(int x, int y, int w, int h,
-       lyx::graphics::Image const & i)
+void QLPainter::image(int x, int y, int w, int h, graphics::Image const & i)
 {
-       lyx::graphics::QLImage const & qlimage =
-               static_cast<lyx::graphics::QLImage const &>(i);
+       graphics::QLImage const & qlimage =
+               static_cast<graphics::QLImage const &>(i);
 
        fillRectangle(x, y, w, h, LColor::graphicsbg);
 
-       qp_->drawImage(x, y, qlimage.qimage(), 0, 0, w, h);
+       drawImage(x, y, qlimage.qimage(), 0, 0, w, h);
 }
 
 
 int QLPainter::text(int x, int y, docstring const & s, LyXFont const & f)
 {
-    return text(x, y, reinterpret_cast<char_type const *>(s.data()), s.length(), f);
+        return text(x, y, reinterpret_cast<char_type const *>(s.data()), s.length(), f);
 }
 
 
@@ -209,16 +197,16 @@ int QLPainter::smallCapsText(int x, int y,
 
        setQPainterPen(f.realColor());
        int textwidth = 0;
-       size_t ls = s.length();
+       size_t const ls = s.length();
        for (unsigned int i = 0; i < ls; ++i) {
                QChar const c = s[i].toUpper();
                if (c != s.at(i)) {
-                       qp_->setFont(qsmallfont);
+                       setFont(qsmallfont);
                } else {
-                       qp_->setFont(qfont);
+                       setFont(qfont);
                }
-               qp_->drawText(x + textwidth, y, c);
-               textwidth += qp_->fontMetrics().width(c);
+               drawText(x + textwidth, y, c);
+               textwidth += fontMetrics().width(c);
        }
        return textwidth;
 }
@@ -249,13 +237,12 @@ int QLPainter::text(int x, int y, char_type const * s, size_t ls,
 
        if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
                setQPainterPen(f.realColor());
-               if (qp_->font() != fi.font) {
-                       qp_->setFont(fi.font);
-               }
+               if (font() != fi.font)
+                       setFont(fi.font);
                // We need to draw the text as LTR as we use our own bidi code.
-               qp_->setLayoutDirection(Qt::LeftToRight);
-               qp_->drawText(x, y, str);
-               textwidth = qp_->fontMetrics().width(str);
+               setLayoutDirection(Qt::LeftToRight);
+               drawText(x, y, str);
+               textwidth = fontMetrics().width(str);
        } else {
                textwidth = smallCapsText(x, y, str, f);
        }
@@ -268,16 +255,5 @@ int QLPainter::text(int x, int y, char_type const * s, size_t ls,
 }
 
 
-void QLPainter::drawPixmap(int x, int y, QPixmap const & pixmap)
-{
-       qp_->drawPixmap(x, y, pixmap);
-}
-
-
-void QLPainter::drawImage(int x, int y, QImage const & image)
-{
-       qp_->drawImage(x, y, image);
-}
-
 } // namespace frontend
 } // namespace lyx
index 0a80eaa42ca64499fa15edbfb8251b0deabfe00b..72048e89f3a9e098c51bf1a422152148cde78eab 100644 (file)
@@ -17,6 +17,8 @@
 
 #include <boost/scoped_ptr.hpp>
 
+#include <QPainter>
+
 class QPaintDevice;
 class QPainter;
 class QString;
@@ -34,18 +36,8 @@ class GuiWorkArea;
 /**
  * QLPainter - a painter implementation for Qt4
  */
-class QLPainter : public Painter {
+class QLPainter : public QPainter, public Painter {
 public:
-       QLPainter(GuiWorkArea *);
-
-       ~QLPainter();
-
-       /// begin painting
-       virtual void start();
-
-       /// end painting
-       virtual void end();
-
        /// return the width of the work area in pixels
        virtual int paperWidth() const;
        /// return the height of the work area in pixels
@@ -119,13 +111,11 @@ public:
        virtual int text(int x, int y,
                 lyx::char_type c, LyXFont const & f);
 
-       /// draw a pixmap from the image cache
-       virtual void drawPixmap(int x, int y, QPixmap const & pixmap);
-
-       /// draw a pixmap from the image cache
-       virtual void drawImage(int x, int y, QImage const & image);
-
 private:
+       friend class GuiWorkArea;
+       QLPainter(QWidget *);
+       ~QLPainter();
+
        /// draw small caps text
        /**
        \return width of the drawn text.
@@ -138,11 +128,8 @@ private:
                line_style ls = line_solid,
                line_width lw = line_thin);
 
-       /// our qt painter
-       boost::scoped_ptr<QPainter> qp_;
-
        /// the working area
-       GuiWorkArea * qwa_;
+       QWidget * qwa_;
 
        LColor::color current_color_;
        Painter::line_style current_ls_;