Revision: 56224
          http://sourceforge.net/p/brlcad/code/56224
Author:   vladbogo
Date:     2013-07-25 20:51:36 +0000 (Thu, 25 Jul 2013)
Log Message:
-----------
Use QWindow instead of QWidget so that Qt could be successfully embedded in Tk.

Modified Paths:
--------------
    brlcad/trunk/include/dm-qt.h
    brlcad/trunk/src/libdm/dm-qt.cpp

Modified: brlcad/trunk/include/dm-qt.h
===================================================================
--- brlcad/trunk/include/dm-qt.h        2013-07-25 18:47:11 UTC (rev 56223)
+++ brlcad/trunk/include/dm-qt.h        2013-07-25 20:51:36 UTC (rev 56224)
@@ -28,22 +28,33 @@
 
 #ifdef DM_QT
 #  include <QApplication>
-#  include <QWidget>
 #  include <QPainter>
+#  include <QWindow>
+#  include <QBackingStore>
+#  include <QResizeEvent>
 
-class QTkMainWindow: public QWidget {
+class QTkMainWindow: public QWindow {
 
 public:
-    QTkMainWindow(QPixmap *pix, WId win);
+    QTkMainWindow(QPixmap *p, QWindow *parent = 0);
 
+    virtual void render(QPainter *painter);
+public slots:
+    void renderNow();
+    
 protected:
-    void paintEvent(QPaintEvent *event);
+    bool event(QEvent *event);
 
+    void resizeEvent(QResizeEvent *event);
+    void exposeEvent(QExposeEvent *event);
+
 private:
     QPixmap *pixmap;
-
+    QBackingStore *m_backingStore;
+    bool m_update_pending;
 };
 
+
 struct qt_vars {
     QApplication *qapp;
     QTkMainWindow *win;

Modified: brlcad/trunk/src/libdm/dm-qt.cpp
===================================================================
--- brlcad/trunk/src/libdm/dm-qt.cpp    2013-07-25 18:47:11 UTC (rev 56223)
+++ brlcad/trunk/src/libdm/dm-qt.cpp    2013-07-25 20:51:36 UTC (rev 56224)
@@ -82,6 +82,7 @@
     privars->painter->setPen(privars->fg);
     privars->painter->setFont(*privars->font);
 
+    bu_log("drawBegin called\n");
     return TCL_OK;
 }
 
@@ -89,7 +90,7 @@
 HIDDEN int
 qt_drawEnd(struct dm *dmp)
 {
-    struct qt_vars *privars = (struct qt_vars *)dmp->dm_vars.priv_vars;
+    struct qt_vars *privars = (struct qt_vars *)dmp->dm_vars.priv_vars;    
     privars->painter->end();
     delete privars->painter;
     privars->painter = NULL;
@@ -254,10 +255,6 @@
     dmp->dm_bg[1] = g;
     dmp->dm_bg[2] = b;
 
-    QPalette pal = privars->win->palette();
-    pal.setColor(QPalette::Background, privars->bg);
-    privars->win->setPalette(pal);
-
     privars->pix->fill(privars->bg);
 
     return TCL_OK;
@@ -534,20 +531,62 @@
 };
 
 
-QTkMainWindow::QTkMainWindow(QPixmap *pix, WId win)
-:QWidget()
+QTkMainWindow::QTkMainWindow(QPixmap *p, QWindow *win)
+    : QWindow(win)
+    , m_update_pending(false)
 {
-    create(win, false, true);
-    pixmap = pix;
+    m_backingStore = new QBackingStore(this);
+    create();
+    pixmap = p;
+
 }
 
-void QTkMainWindow::paintEvent(QPaintEvent *UNUSED(event))
+void QTkMainWindow::exposeEvent(QExposeEvent *)
 {
-    QPainter painter(this);
-    painter.drawPixmap(0, 0, *pixmap);
+    if (isExposed()) {
+       renderNow();
+    }
 }
 
+void QTkMainWindow::resizeEvent(QResizeEvent *resizeEv)
+{
+    m_backingStore->resize(resizeEv->size());
+    if (isExposed())
+       renderNow();
+}
 
+bool QTkMainWindow::event(QEvent *ev)
+{
+    if (ev->type() == QEvent::UpdateRequest) {
+       m_update_pending = false;
+       renderNow();
+       return true;
+    }
+    return QWindow::event(ev);
+}    
+
+void QTkMainWindow::renderNow()
+{
+    if (!isExposed())
+        return;
+
+    QRect rect(0, 0, width(), height());
+    m_backingStore->beginPaint(rect);
+
+    QPaintDevice *device = m_backingStore->paintDevice();
+    QPainter painter(device);
+
+    render(&painter);
+
+    m_backingStore->endPaint();
+    m_backingStore->flush(rect);
+}
+
+void QTkMainWindow::render(QPainter *painter)
+{
+    painter->drawPixmap(0, 0, *pixmap);
+}
+
 __BEGIN_DECLS
 
 /*
@@ -694,13 +733,20 @@
     pubvars->win = Tk_WindowId(pubvars->xtkwin);
     dmp->dm_id = pubvars->win;
 
+    Tk_SetWindowBackground(pubvars->xtkwin, 0);
+    Tk_MapWindow(pubvars->xtkwin);
     privars->qapp = new QApplication(argc, argv);
 
+    QWindow *window = QWindow::fromWinId(pubvars->win);
+    
     privars->pix = new QPixmap(dmp->dm_width, dmp->dm_height);
-    privars->win = new QTkMainWindow(privars->pix, (WId)pubvars->win);
-    privars->win->resize(dmp->dm_width, dmp->dm_height);
 
-    privars->win->setAutoFillBackground(true);
+    privars->win = new QTkMainWindow(privars->pix, window);
+    privars->win->create();
+    privars->win->setWidth(dmp->dm_width);
+    privars->win->setHeight(dmp->dm_height);
+    
+    privars->win->show();
 
     privars->font = NULL;
     qt_configureWin(dmp, 1);
@@ -708,11 +754,7 @@
     privars->painter = NULL;
     qt_setFGColor(dmp, 1, 0, 0, 0, 0);
     qt_setBGColor(dmp, 0, 0, 0);
-    privars->win->show();
 
-    Tk_SetWindowBackground(pubvars->xtkwin, 0);
-    Tk_MapWindow(pubvars->xtkwin);
-
     bu_log("qt_open called\n");
     return dmp;
 }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to