ginebra2/ScaleNinePainter.cpp
changeset 16 3c88a81ff781
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ginebra2/ScaleNinePainter.cpp	Fri Oct 15 17:30:59 2010 -0400
@@ -0,0 +1,145 @@
+#include "ScaleNinePainter.h"
+#include <QtGui>
+
+namespace GVA {
+
+ScaleNinePainter::ScaleNinePainter(
+      const QString &topLeftFilename,
+      const QString &topMiddleFilename,
+      const QString &topRightFilename,
+      const QString &middleLeftFilename,
+      const QString &middleMiddleFilename,
+      const QString &middleRightFilename,
+      const QString &bottomLeftFilename,
+      const QString &bottomMiddleFilename,
+      const QString &bottomRightFilename)
+        : m_topLeftFilename(topLeftFilename),
+          m_topMiddleFilename(topMiddleFilename),
+          m_topRightFilename(topRightFilename),
+          m_middleLeftFilename(middleLeftFilename),
+          m_middleMiddleFilename(middleMiddleFilename),
+          m_middleRightFilename(middleRightFilename),
+          m_bottomLeftFilename(bottomLeftFilename),
+          m_bottomMiddleFilename(bottomMiddleFilename),
+          m_bottomRightFilename(bottomRightFilename),
+          m_topLeftPixmap(0),
+          m_topMiddlePixmap(0),
+          m_topRightPixmap(0),
+          m_middleLeftPixmap(0),
+          m_middleMiddlePixmap(0),
+          m_middleRightPixmap(0),
+          m_bottomLeftPixmap(0),
+          m_bottomMiddlePixmap(0),
+          m_bottomRightPixmap(0),
+          m_pixmapsLoaded(false)
+{
+}
+
+ScaleNinePainter::~ScaleNinePainter() {
+    unloadPixmaps();
+}
+
+void ScaleNinePainter::loadPixmaps() {
+    Q_ASSERT(!m_pixmapsLoaded);
+    m_topLeftPixmap = new QPixmap(m_topLeftFilename);
+    m_topMiddlePixmap = new QPixmap(m_topMiddleFilename);
+    m_topRightPixmap = new QPixmap(m_topRightFilename);
+    m_middleLeftPixmap = new QPixmap(m_middleLeftFilename);
+    m_middleMiddlePixmap = new QPixmap(m_middleMiddleFilename);
+    m_middleRightPixmap = new QPixmap(m_middleRightFilename);
+    m_bottomLeftPixmap = new QPixmap(m_bottomLeftFilename);
+    m_bottomMiddlePixmap = new QPixmap(m_bottomMiddleFilename);
+    m_bottomRightPixmap = new QPixmap(m_bottomRightFilename);
+    m_pixmapsLoaded = true;
+}
+
+void ScaleNinePainter::unloadPixmaps() {
+    delete m_topLeftPixmap; m_topLeftPixmap = 0;
+    delete m_topMiddlePixmap; m_topMiddlePixmap = 0;
+    delete m_topRightPixmap; m_topRightPixmap = 0;
+    delete m_middleLeftPixmap; m_middleLeftPixmap = 0;
+    delete m_middleMiddlePixmap; m_middleMiddlePixmap = 0;
+    delete m_middleRightPixmap; m_middleRightPixmap = 0;
+    delete m_bottomLeftPixmap; m_bottomLeftPixmap = 0;
+    delete m_bottomMiddlePixmap; m_bottomMiddlePixmap = 0;
+    delete m_bottomRightPixmap; m_bottomRightPixmap = 0;
+    m_pixmapsLoaded = false;
+}
+
+void ScaleNinePainter::paint(QPainter* painter, const QRect &rect, QWidget* widget) {
+    Q_UNUSED(widget)
+
+    if(!m_pixmapsLoaded)
+        loadPixmaps();
+
+    painter->save();
+
+    // Draw top left.
+    if(m_topLeftPixmap->height() > rect.height())
+        painter->drawPixmap(0, 0, m_topLeftPixmap->width(), rect.height(), *m_topLeftPixmap);
+    else
+        painter->drawPixmap(0, 0, *m_topLeftPixmap);
+
+    // Draw top middle.
+    if(!m_topMiddlePixmap->isNull()) {
+        painter->drawTiledPixmap(m_topLeftPixmap->width(),
+                                 0,
+                                 rect.width() - (m_topLeftPixmap->width() + m_topRightPixmap->width()),
+                                 qMin(m_topMiddlePixmap->height(), rect.height()),
+                                 *m_topMiddlePixmap);
+    }
+
+    // Draw top right.
+    painter->drawPixmap(rect.right() - m_topRightPixmap->width() + 1, 0, *m_topRightPixmap);
+
+    // Draw left border.
+    if(!m_middleLeftPixmap->isNull()) {
+        painter->drawTiledPixmap(0,
+                                 m_topLeftPixmap->height(),
+                                 m_middleMiddlePixmap->width(),
+                                 rect.height() - (m_topLeftPixmap->height() + m_bottomLeftPixmap->height()),
+                                 *m_middleLeftPixmap);
+    }
+
+    // Draw middle.
+    if(!m_middleMiddlePixmap->isNull()) {
+        QRect middleRect; 
+        middleRect.setLeft(m_middleLeftPixmap->isNull() ? m_topLeftPixmap->width() : m_topLeftPixmap->width());
+        middleRect.setRight(rect.width() - (m_middleRightPixmap->isNull() ? m_topRightPixmap->width() : m_topRightPixmap->width()) - 1);
+        middleRect.setTop(m_topMiddlePixmap->isNull() ? m_topLeftPixmap->height() : m_topMiddlePixmap->height());
+        middleRect.setBottom(rect.height() - (m_bottomMiddlePixmap->isNull() ? m_bottomLeftPixmap->height() : m_bottomMiddlePixmap->height()) - 1);
+        painter->drawTiledPixmap(middleRect, *m_middleMiddlePixmap);
+    }
+
+    // Draw right border.
+    if(!m_middleRightPixmap->isNull()) {
+        painter->drawTiledPixmap(rect.width() - m_middleRightPixmap->width(),
+                                 m_topRightPixmap->height(),
+                                 m_middleRightPixmap->width(),
+                                 rect.height() - (m_topRightPixmap->height() + m_bottomRightPixmap->height()),
+                                 *m_middleRightPixmap);
+    }
+
+    // Draw bottom row.
+    if(!m_bottomLeftPixmap->isNull()) {
+        painter->drawPixmap(0,
+                            rect.bottom() - m_bottomLeftPixmap->height() + 1,
+                            *m_bottomLeftPixmap);
+    }
+    if(!m_bottomMiddlePixmap->isNull()) {
+        QRect bottomRect;
+        bottomRect.setLeft(m_bottomLeftPixmap->width());
+        bottomRect.setRight(rect.width() - m_bottomRightPixmap->width() - 1);
+        bottomRect.setTop(rect.bottom() - m_bottomMiddlePixmap->height() + 1);
+        bottomRect.setBottom(rect.bottom());
+        painter->drawTiledPixmap(bottomRect, *m_bottomMiddlePixmap);
+    }
+    if(!m_bottomRightPixmap->isNull()) {
+        painter->drawPixmap(rect.right() - m_bottomLeftPixmap->width() + 1,
+                            rect.bottom() - m_bottomRightPixmap->height() + 1,
+                            *m_bottomRightPixmap);
+    }
+    painter->restore();
+}
+
+}  // GVA namespace