ginebra2/ScaleNinePainter.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
#include "ScaleNinePainter.h"
hgs
parents:
diff changeset
     2
#include <QtGui>
hgs
parents:
diff changeset
     3
hgs
parents:
diff changeset
     4
namespace GVA {
hgs
parents:
diff changeset
     5
hgs
parents:
diff changeset
     6
ScaleNinePainter::ScaleNinePainter(
hgs
parents:
diff changeset
     7
      const QString &topLeftFilename,
hgs
parents:
diff changeset
     8
      const QString &topMiddleFilename,
hgs
parents:
diff changeset
     9
      const QString &topRightFilename,
hgs
parents:
diff changeset
    10
      const QString &middleLeftFilename,
hgs
parents:
diff changeset
    11
      const QString &middleMiddleFilename,
hgs
parents:
diff changeset
    12
      const QString &middleRightFilename,
hgs
parents:
diff changeset
    13
      const QString &bottomLeftFilename,
hgs
parents:
diff changeset
    14
      const QString &bottomMiddleFilename,
hgs
parents:
diff changeset
    15
      const QString &bottomRightFilename)
hgs
parents:
diff changeset
    16
        : m_topLeftFilename(topLeftFilename),
hgs
parents:
diff changeset
    17
          m_topMiddleFilename(topMiddleFilename),
hgs
parents:
diff changeset
    18
          m_topRightFilename(topRightFilename),
hgs
parents:
diff changeset
    19
          m_middleLeftFilename(middleLeftFilename),
hgs
parents:
diff changeset
    20
          m_middleMiddleFilename(middleMiddleFilename),
hgs
parents:
diff changeset
    21
          m_middleRightFilename(middleRightFilename),
hgs
parents:
diff changeset
    22
          m_bottomLeftFilename(bottomLeftFilename),
hgs
parents:
diff changeset
    23
          m_bottomMiddleFilename(bottomMiddleFilename),
hgs
parents:
diff changeset
    24
          m_bottomRightFilename(bottomRightFilename),
hgs
parents:
diff changeset
    25
          m_topLeftPixmap(0),
hgs
parents:
diff changeset
    26
          m_topMiddlePixmap(0),
hgs
parents:
diff changeset
    27
          m_topRightPixmap(0),
hgs
parents:
diff changeset
    28
          m_middleLeftPixmap(0),
hgs
parents:
diff changeset
    29
          m_middleMiddlePixmap(0),
hgs
parents:
diff changeset
    30
          m_middleRightPixmap(0),
hgs
parents:
diff changeset
    31
          m_bottomLeftPixmap(0),
hgs
parents:
diff changeset
    32
          m_bottomMiddlePixmap(0),
hgs
parents:
diff changeset
    33
          m_bottomRightPixmap(0),
hgs
parents:
diff changeset
    34
          m_pixmapsLoaded(false)
hgs
parents:
diff changeset
    35
{
hgs
parents:
diff changeset
    36
}
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
ScaleNinePainter::~ScaleNinePainter() {
hgs
parents:
diff changeset
    39
    unloadPixmaps();
hgs
parents:
diff changeset
    40
}
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
void ScaleNinePainter::loadPixmaps() {
hgs
parents:
diff changeset
    43
    Q_ASSERT(!m_pixmapsLoaded);
hgs
parents:
diff changeset
    44
    m_topLeftPixmap = new QPixmap(m_topLeftFilename);
hgs
parents:
diff changeset
    45
    m_topMiddlePixmap = new QPixmap(m_topMiddleFilename);
hgs
parents:
diff changeset
    46
    m_topRightPixmap = new QPixmap(m_topRightFilename);
hgs
parents:
diff changeset
    47
    m_middleLeftPixmap = new QPixmap(m_middleLeftFilename);
hgs
parents:
diff changeset
    48
    m_middleMiddlePixmap = new QPixmap(m_middleMiddleFilename);
hgs
parents:
diff changeset
    49
    m_middleRightPixmap = new QPixmap(m_middleRightFilename);
hgs
parents:
diff changeset
    50
    m_bottomLeftPixmap = new QPixmap(m_bottomLeftFilename);
hgs
parents:
diff changeset
    51
    m_bottomMiddlePixmap = new QPixmap(m_bottomMiddleFilename);
hgs
parents:
diff changeset
    52
    m_bottomRightPixmap = new QPixmap(m_bottomRightFilename);
hgs
parents:
diff changeset
    53
    m_pixmapsLoaded = true;
hgs
parents:
diff changeset
    54
}
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
void ScaleNinePainter::unloadPixmaps() {
hgs
parents:
diff changeset
    57
    delete m_topLeftPixmap; m_topLeftPixmap = 0;
hgs
parents:
diff changeset
    58
    delete m_topMiddlePixmap; m_topMiddlePixmap = 0;
hgs
parents:
diff changeset
    59
    delete m_topRightPixmap; m_topRightPixmap = 0;
hgs
parents:
diff changeset
    60
    delete m_middleLeftPixmap; m_middleLeftPixmap = 0;
hgs
parents:
diff changeset
    61
    delete m_middleMiddlePixmap; m_middleMiddlePixmap = 0;
hgs
parents:
diff changeset
    62
    delete m_middleRightPixmap; m_middleRightPixmap = 0;
hgs
parents:
diff changeset
    63
    delete m_bottomLeftPixmap; m_bottomLeftPixmap = 0;
hgs
parents:
diff changeset
    64
    delete m_bottomMiddlePixmap; m_bottomMiddlePixmap = 0;
hgs
parents:
diff changeset
    65
    delete m_bottomRightPixmap; m_bottomRightPixmap = 0;
hgs
parents:
diff changeset
    66
    m_pixmapsLoaded = false;
hgs
parents:
diff changeset
    67
}
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
void ScaleNinePainter::paint(QPainter* painter, const QRect &rect, QWidget* widget) {
hgs
parents:
diff changeset
    70
    Q_UNUSED(widget)
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
    if(!m_pixmapsLoaded)
hgs
parents:
diff changeset
    73
        loadPixmaps();
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    painter->save();
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    // Draw top left.
hgs
parents:
diff changeset
    78
    if(m_topLeftPixmap->height() > rect.height())
hgs
parents:
diff changeset
    79
        painter->drawPixmap(0, 0, m_topLeftPixmap->width(), rect.height(), *m_topLeftPixmap);
hgs
parents:
diff changeset
    80
    else
hgs
parents:
diff changeset
    81
        painter->drawPixmap(0, 0, *m_topLeftPixmap);
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
    // Draw top middle.
hgs
parents:
diff changeset
    84
    if(!m_topMiddlePixmap->isNull()) {
hgs
parents:
diff changeset
    85
        painter->drawTiledPixmap(m_topLeftPixmap->width(),
hgs
parents:
diff changeset
    86
                                 0,
hgs
parents:
diff changeset
    87
                                 rect.width() - (m_topLeftPixmap->width() + m_topRightPixmap->width()),
hgs
parents:
diff changeset
    88
                                 qMin(m_topMiddlePixmap->height(), rect.height()),
hgs
parents:
diff changeset
    89
                                 *m_topMiddlePixmap);
hgs
parents:
diff changeset
    90
    }
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    // Draw top right.
hgs
parents:
diff changeset
    93
    painter->drawPixmap(rect.right() - m_topRightPixmap->width() + 1, 0, *m_topRightPixmap);
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
    // Draw left border.
hgs
parents:
diff changeset
    96
    if(!m_middleLeftPixmap->isNull()) {
hgs
parents:
diff changeset
    97
        painter->drawTiledPixmap(0,
hgs
parents:
diff changeset
    98
                                 m_topLeftPixmap->height(),
hgs
parents:
diff changeset
    99
                                 m_middleMiddlePixmap->width(),
hgs
parents:
diff changeset
   100
                                 rect.height() - (m_topLeftPixmap->height() + m_bottomLeftPixmap->height()),
hgs
parents:
diff changeset
   101
                                 *m_middleLeftPixmap);
hgs
parents:
diff changeset
   102
    }
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
    // Draw middle.
hgs
parents:
diff changeset
   105
    if(!m_middleMiddlePixmap->isNull()) {
hgs
parents:
diff changeset
   106
        QRect middleRect; 
hgs
parents:
diff changeset
   107
        middleRect.setLeft(m_middleLeftPixmap->isNull() ? m_topLeftPixmap->width() : m_topLeftPixmap->width());
hgs
parents:
diff changeset
   108
        middleRect.setRight(rect.width() - (m_middleRightPixmap->isNull() ? m_topRightPixmap->width() : m_topRightPixmap->width()) - 1);
hgs
parents:
diff changeset
   109
        middleRect.setTop(m_topMiddlePixmap->isNull() ? m_topLeftPixmap->height() : m_topMiddlePixmap->height());
hgs
parents:
diff changeset
   110
        middleRect.setBottom(rect.height() - (m_bottomMiddlePixmap->isNull() ? m_bottomLeftPixmap->height() : m_bottomMiddlePixmap->height()) - 1);
hgs
parents:
diff changeset
   111
        painter->drawTiledPixmap(middleRect, *m_middleMiddlePixmap);
hgs
parents:
diff changeset
   112
    }
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    // Draw right border.
hgs
parents:
diff changeset
   115
    if(!m_middleRightPixmap->isNull()) {
hgs
parents:
diff changeset
   116
        painter->drawTiledPixmap(rect.width() - m_middleRightPixmap->width(),
hgs
parents:
diff changeset
   117
                                 m_topRightPixmap->height(),
hgs
parents:
diff changeset
   118
                                 m_middleRightPixmap->width(),
hgs
parents:
diff changeset
   119
                                 rect.height() - (m_topRightPixmap->height() + m_bottomRightPixmap->height()),
hgs
parents:
diff changeset
   120
                                 *m_middleRightPixmap);
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
    // Draw bottom row.
hgs
parents:
diff changeset
   124
    if(!m_bottomLeftPixmap->isNull()) {
hgs
parents:
diff changeset
   125
        painter->drawPixmap(0,
hgs
parents:
diff changeset
   126
                            rect.bottom() - m_bottomLeftPixmap->height() + 1,
hgs
parents:
diff changeset
   127
                            *m_bottomLeftPixmap);
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
    if(!m_bottomMiddlePixmap->isNull()) {
hgs
parents:
diff changeset
   130
        QRect bottomRect;
hgs
parents:
diff changeset
   131
        bottomRect.setLeft(m_bottomLeftPixmap->width());
hgs
parents:
diff changeset
   132
        bottomRect.setRight(rect.width() - m_bottomRightPixmap->width() - 1);
hgs
parents:
diff changeset
   133
        bottomRect.setTop(rect.bottom() - m_bottomMiddlePixmap->height() + 1);
hgs
parents:
diff changeset
   134
        bottomRect.setBottom(rect.bottom());
hgs
parents:
diff changeset
   135
        painter->drawTiledPixmap(bottomRect, *m_bottomMiddlePixmap);
hgs
parents:
diff changeset
   136
    }
hgs
parents:
diff changeset
   137
    if(!m_bottomRightPixmap->isNull()) {
hgs
parents:
diff changeset
   138
        painter->drawPixmap(rect.right() - m_bottomLeftPixmap->width() + 1,
hgs
parents:
diff changeset
   139
                            rect.bottom() - m_bottomRightPixmap->height() + 1,
hgs
parents:
diff changeset
   140
                            *m_bottomRightPixmap);
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
    painter->restore();
hgs
parents:
diff changeset
   143
}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
}  // GVA namespace