Ticket #197: horiz_list_and_gradient_2.diff

File horiz_list_and_gradient_2.diff, 15.8 KB (added by mfgalizi@…, 15 years ago)

Same as the previous patch, but locking in the gradient method

  • mythlistbutton.h

     
    99class MythListButtonItem;
    1010class MythFontProperties;
    1111class MythUIStateType;
     12class QWMatrix;
    1213
    1314class MythListButton : public MythUIType
    1415{
     
    2425
    2526    void SetTextFlags(int flags);
    2627
     28    /* if the theme "schema" requires an orientation, putting this in
     29       the constructor would probably be better */
     30    void SetOrientation(Qt::Orientation orientation);
     31
     32    /* this only does somthing if the orientation is horizontal.  Same
     33       comment above applies here */
     34    void SetHorizontalItems(uint horizontalItems);
     35
    2736    void SetSpacing(int spacing);
    2837    void SetMargin(int margin);
    2938    void SetDrawFromBottom(bool draw);
     
    5160    enum MovementUnit { MoveItem, MovePage, MoveMax };
    5261    void MoveDown(MovementUnit unit = MoveItem);
    5362    void MoveUp(MovementUnit unit = MoveItem);
     63
     64    /* aliases for horizontal allignment */
     65    inline void MoveRight(MovementUnit unit = MoveItem) { MoveDown(unit); }
     66    inline void MoveLeft(MovementUnit unit = MoveItem) { MoveUp(unit); }
    5467    bool MoveToNamedPosition(const QString &position_name);
    5568
    5669    void SetDrawOffset(QPoint off) { m_drawoffset = off; }
     
    7386    QRect m_contentsRect;
    7487
    7588    int m_itemHeight;
     89    int m_itemWidth;
    7690    int m_itemSpacing;
    7791    int m_itemMargin;
     92    Qt::Orientation m_orientation;
    7893    uint m_itemsVisible;
    7994
    8095    bool m_active;
     
    117132    int m_textFlags;
    118133
    119134    friend class MythListButtonItem;
     135
     136    /* this is for rotating the arrows for horizontal allignment */
     137    QWMatrix *m_rotMatrix;
    120138};
    121139
    122140class MythListButtonItem
  • mythimage.cpp

     
    11#include <cassert>
    22
     3#include <qpainter.h>
     4#include <qapplication.h>
     5
    36#include "mythimage.h"
    47#include "mythmainwindow.h"
    58#include "mythcontext.h"
     
    5962    return ret;
    6063}
    6164
     65MythImage *MythImage::Gradient(const QSize & size, const QColor &begin,
     66                               const QColor &end, uint alpha)
     67{
     68    QImage *img = new QImage(size.width(), size.height(), 32);
     69    img->setAlphaBuffer(true);
     70
     71    for (int y = 0; y < img->height(); y++)
     72    {
     73        for (int x = 0; x < img->width(); x++)
     74        {
     75            uint *p = (uint *)img->scanLine(y) + x;
     76            *p = qRgba(0, 0, 0, alpha);
     77        }
     78    }
     79
     80    // calculate how much to change the colour by at each step
     81    float rstep = float(end.red() - begin.red()) /
     82                  float(img->height());
     83    float gstep = float(end.green() - begin.green()) /
     84                  float(img->height());
     85    float bstep = float(end.blue() - begin.blue()) /
     86                  float(img->height());
     87
     88    /** @todo lock here */
     89    qApp->lock();
     90
     91    /* create the painter */
     92    QPixmap pix = QPixmap(*img);
     93    QPainter p(&pix);
     94
     95    float r = begin.red();
     96    float g = begin.green();
     97    float b = begin.blue();
     98
     99    for (int y = 0; y < img->height(); y++)
     100    {
     101        QColor c((int)r, (int)g, (int)b);
     102        p.setPen(c);
     103        p.drawLine(0, y, img->width(), y);
     104        r += rstep;
     105        g += gstep;
     106        b += bstep;
     107    }
     108    p.setPen(Qt::black);
     109    p.drawLine(0, 0, 0, img->height() - 1);
     110    p.drawLine(0, 0, img->width() - 1, 0);
     111    p.drawLine(0, img->height() - 1, img->width() - 1, img->height() - 1);
     112    p.drawLine(img->width() - 1, 0, img->width() - 1, img->height() - 1);
     113    p.end();
     114
     115    /** @todo unlock here */
     116    qApp->unlock();
     117
     118    return MythImage::FromQImage(&img);
     119}
     120
    62121// FIXME: Get rid of LoadScaleImage
    63122bool MythImage::Load(const QString &filename)
    64123{
  • mythlistbutton.cpp

     
    3838    m_clearing        = false;
    3939    m_itemSpacing     = 0;
    4040    m_itemMargin      = 0;
     41
     42    m_orientation     = Qt::Vertical;
    4143    m_itemHeight      = 0;
    4244    m_itemsVisible    = 0;
    4345
     
    5052
    5153    m_fontActive = new MythFontProperties();
    5254    m_fontInactive = new MythFontProperties();
     55
     56    /* default vertical -> no rotation */
     57    /*m_rotMatrix = new QWMatrix(1,0,1,0,0,0);*/
     58    m_rotMatrix = NULL;
    5359}
    5460
    5561MythListButton::~MythListButton()
     
    5763    Reset();
    5864    delete m_topIterator;
    5965    delete m_selIterator;
     66    delete m_rotMatrix;
    6067
    6168    if (m_fontActive)
    6269       delete m_fontActive;
     
    9299    *m_fontInactive = font;
    93100}
    94101
     102void MythListButton::SetOrientation(Qt::Orientation orientation)
     103{
     104    m_orientation = orientation;
     105}
     106
     107void MythListButton::SetHorizontalItems(uint horizontalItems)
     108{
     109    if (m_orientation == Qt::Horizontal)
     110    {
     111        m_itemsVisible = horizontalItems;
     112        delete m_rotMatrix;
     113        /* 90 degree rotation matrix */
     114        m_rotMatrix = new QWMatrix(0, -1, 1, 0, 0, 0);
     115    }
     116}
     117
    95118void MythListButton::SetSpacing(int spacing)
    96119{
    97120    m_itemSpacing = spacing;   
     
    115138void MythListButton::SetActive(bool active)
    116139{
    117140    m_active = active;
     141    this->SetChildNeedsRedraw(this);
    118142}
    119143
    120144void MythListButton::Reset()
     
    562586
    563587    m_initialized = true;
    564588
    565     MythPainter *painter = GetMythPainter();
    566 
    567589    QFontMetrics fm(m_fontActive->face);
    568590    QSize sz1 = fm.size(Qt::SingleLine, "XXXXX");
    569591    fm = QFontMetrics(m_fontInactive->face);
     
    582604        LoadPixmap(&downReg, "dnarrow-reg");
    583605        LoadPixmap(&downAct, "dnarrow-sel");
    584606
     607        /* rotate the arrows if horizontally aligned */
     608        if (m_orientation == Qt::Horizontal)
     609            m_rotMatrix = new QWMatrix(1,0,1,0,0,0);
     610
    585611        m_upArrow->AddImage(MythUIStateType::Off, upReg);
    586612        m_upArrow->AddImage(MythUIStateType::Full, upAct);
    587613        m_downArrow->AddImage(MythUIStateType::Off, downReg);
    588614        m_downArrow->AddImage(MythUIStateType::Full, downAct);
    589615
    590         m_upArrow->SetPosition(QPoint(0,
    591                                       m_Area.height() - upAct->height() - 1));
    592         m_downArrow->SetPosition(QPoint(upAct->width() + m_itemMargin,
    593                                         m_Area.height() - upAct->height() - 1));
     616        /* prevent rotating arrows that are acutally in the items */
     617        if (m_rotMatrix != NULL)
     618        {
     619            delete m_rotMatrix;
     620            m_rotMatrix = NULL;
     621        }
    594622
    595         arrowsRect = QRect(0, m_Area.height() - upAct->height() - 1,
    596                            m_Area.width(), upAct->height());
     623        if (m_orientation == Qt::Horizontal)
     624        {
     625            int x = m_Area.width() - upAct->width() - 1;
     626            int ytop = m_Area.height()/2 - m_itemMargin/2 - upAct->height();
     627            int ybottom = m_Area.height()/2 + m_itemMargin/2;
     628            m_upArrow->SetPosition(QPoint(x, ybottom));
     629            m_downArrow->SetPosition(QPoint(x, ytop));
    597630
     631            /* rightmost rectangle (full height) */
     632            arrowsRect = QRect(x, 0, upAct->width() + 1, m_Area.height());
     633
     634            /* now calculate the item width */
     635            int dx = m_Area.width() - upAct->width() - 1 - 2*m_itemMargin -
     636                (m_itemsVisible - 1) * m_itemSpacing;
     637            m_itemWidth = dx/m_itemsVisible;
     638
     639        }
     640        else {
     641            int y = m_Area.height() - upAct->height() - 1;
     642            m_upArrow->SetPosition(QPoint(0, y));
     643            m_downArrow->SetPosition(QPoint(upAct->width() + m_itemMargin, y));
     644
     645            /* bottom-most rectangle (full width) */
     646            arrowsRect = QRect(0, y, m_Area.width(), upAct->height());
     647            m_itemWidth = m_Area.width();
     648        }
     649
    598650        upAct->DownRef();
    599651        upReg->DownRef();
    600652        downReg->DownRef();
     
    602654    }
    603655    else
    604656        arrowsRect = QRect(0, 0, 0, 0);
    605        
    606     m_contentsRect = QRect(0, 0, m_Area.width(), m_Area.height() -
    607                            arrowsRect.height() - 2 * m_itemMargin);
    608657
    609     m_itemsVisible = 0;
    610     int y = 0;
     658    if (m_orientation == Qt::Horizontal)
     659        m_contentsRect = QRect(0, 0, m_Area.width() - arrowsRect.width() -
     660                               2 * m_itemMargin, m_Area.height());
     661    else
     662        m_contentsRect = QRect(0, 0, m_Area.width(), m_Area.height() -
     663                               arrowsRect.height() - 2 * m_itemMargin);
    611664
    612     while (y <= m_contentsRect.height() - m_itemHeight)
    613     {
    614         y += m_itemHeight + m_itemSpacing;
    615         m_itemsVisible++;
     665    /* visible items are only variable with vertical alignment */
     666    if (m_orientation == Qt::Vertical) {
     667        int y = m_itemsVisible = 0;
     668        while (y <= m_contentsRect.height() - m_itemHeight)
     669        {
     670            y += m_itemHeight + m_itemSpacing;
     671            m_itemsVisible++;
     672        }
    616673    }
    617674
    618675    MythImage *itemRegPix, *itemSelActPix, *itemSelInactPix;
     
    624681   
    625682    LoadPixmap(&arrowPix, "arrow");
    626683
    627     QImage img(m_Area.width(), m_itemHeight, 32);
    628     img.setAlphaBuffer(true);
     684    QSize size(m_itemWidth, m_itemHeight);
    629685
    630     for (int y = 0; y < img.height(); y++)
    631     {
    632         for (int x = 0; x < img.width(); x++)
    633         {
    634             uint *p = (uint *)img.scanLine(y) + x;
    635             *p = qRgba(0, 0, 0, m_itemRegAlpha);
    636         }
    637     }
     686    MythImage *reg = MythImage::Gradient(size, m_itemRegBeg, m_itemRegEnd,
     687                                         m_itemRegAlpha);
     688    MythImage *selinact = MythImage::Gradient(size, m_itemSelBeg, m_itemSelEnd,
     689                                              m_itemRegAlpha);
     690    MythImage *selact = MythImage::Gradient(size, m_itemSelBeg, m_itemSelEnd,
     691                                            m_itemSelAlpha);
    638692
    639     qApp->lock();
    640 
    641     {
    642         float rstep = float(m_itemRegEnd.red() - m_itemRegBeg.red()) /
    643                       float(m_itemHeight);
    644         float gstep = float(m_itemRegEnd.green() - m_itemRegBeg.green()) /
    645                       float(m_itemHeight);
    646         float bstep = float(m_itemRegEnd.blue() - m_itemRegBeg.blue()) /
    647                       float(m_itemHeight);
    648 
    649         QPixmap itemRegPmap = QPixmap(img);
    650         QPainter p(&itemRegPmap);
    651 
    652         float r = m_itemRegBeg.red();
    653         float g = m_itemRegBeg.green();
    654         float b = m_itemRegBeg.blue();
    655         for (int y = 0; y < img.height(); y++)
    656         {
    657             QColor c((int)r, (int)g, (int)b);
    658             p.setPen(c);
    659             p.drawLine(0, y, img.width(), y);
    660             r += rstep;
    661             g += gstep;
    662             b += bstep;
    663         }
    664         p.setPen(black);
    665         p.drawLine(0, 0, 0, img.height() - 1);
    666         p.drawLine(0, 0, img.width() - 1, 0);
    667         p.drawLine(0, img.height() - 1, img.width() - 1, img.height() - 1);
    668         p.drawLine(img.width() - 1, 0, img.width() - 1, img.height() - 1);
    669         p.end();
    670 
    671         itemRegPix = painter->GetFormatImage();
    672         itemRegPix->Assign(itemRegPmap.convertToImage());
    673     }   
    674 
    675     {
    676         float rstep = float(m_itemSelEnd.red() - m_itemSelBeg.red()) /
    677                       float(m_itemHeight);
    678         float gstep = float(m_itemSelEnd.green() - m_itemSelBeg.green()) /
    679                       float(m_itemHeight);
    680         float bstep = float(m_itemSelEnd.blue() - m_itemSelBeg.blue()) /
    681                       float(m_itemHeight);
    682 
    683         QPixmap itemSelInactPmap = QPixmap(img);
    684         QPainter p(&itemSelInactPmap);
    685 
    686         float r = m_itemSelBeg.red();
    687         float g = m_itemSelBeg.green();
    688         float b = m_itemSelBeg.blue();
    689         for (int y = 0; y < img.height(); y++)
    690         {
    691             QColor c((int)r, (int)g, (int)b);
    692             p.setPen(c);
    693             p.drawLine(0, y, img.width(), y);
    694             r += rstep;
    695             g += gstep;
    696             b += bstep;
    697         }
    698         p.setPen(black);
    699         p.drawLine(0, 0, 0, img.height() - 1);
    700         p.drawLine(0, 0, img.width() - 1, 0);
    701         p.drawLine(0, img.height() - 1, img.width() - 1, img.height() - 1);
    702         p.drawLine(img.width() - 1, 0, img.width() - 1, img.height() - 1);
    703         p.end();
    704 
    705         itemSelInactPix = painter->GetFormatImage();
    706         itemSelInactPix->Assign(itemSelInactPmap.convertToImage());
    707 
    708         for (int y = 0; y < img.height(); y++)
    709         {
    710             for (int x = 0; x < img.width(); x++)
    711             {
    712                 uint *p = (uint *)img.scanLine(y) + x;
    713                 *p = qRgba(0, 0, 0, 255);
    714             }
    715         }
    716        
    717         QPixmap itemSelActPmap = QPixmap(img);
    718         p.begin(&itemSelActPmap);
    719 
    720         r = m_itemSelBeg.red();
    721         g = m_itemSelBeg.green();
    722         b = m_itemSelBeg.blue();
    723         for (int y = 0; y < img.height(); y++)
    724         {
    725             QColor c((int)r, (int)g, (int)b);
    726             p.setPen(c);
    727             p.drawLine(0, y, img.width(), y);
    728             r += rstep;
    729             g += gstep;
    730             b += bstep;
    731         }
    732         p.setPen(black);
    733         p.drawLine(0, 0, 0, img.height() - 1);
    734         p.drawLine(0, 0, img.width() - 1, 0);
    735         p.drawLine(0, img.height() - 1, img.width() - 1, img.height() - 1);
    736         p.drawLine(img.width() - 1, 0, img.width() - 1, img.height() - 1);
    737         p.end();
    738 
    739         itemSelActPix = painter->GetFormatImage();
    740         itemSelActPix->Assign(itemSelActPmap.convertToImage());
    741     }
    742 
    743     qApp->unlock();
    744 
    745693    for (int i = 0; i < (int)m_itemsVisible; i++)
    746694    {
    747695        QString name = QString("buttonlist button %1").arg(i);
    748696        MythUIButton *button = new MythUIButton(this, name);
    749         button->SetBackgroundImage(MythUIButton::Normal, itemRegPix);
    750         button->SetBackgroundImage(MythUIButton::Active, itemRegPix);
    751         button->SetBackgroundImage(MythUIButton::SelectedInactive,
    752                                    itemSelInactPix);
    753         button->SetBackgroundImage(MythUIButton::Selected, itemSelActPix);
     697        button->SetBackgroundImage(MythUIButton::Normal, reg);
     698        button->SetBackgroundImage(MythUIButton::Active, reg);
     699        button->SetBackgroundImage(MythUIButton::SelectedInactive, selinact);
     700        button->SetBackgroundImage(MythUIButton::Selected, selact);
    754701
    755702        button->SetPaddingMargin(m_itemMargin);
    756703
     
    763710        button->SetFont(MythUIButton::Normal, *m_fontActive);
    764711        button->SetFont(MythUIButton::Disabled, *m_fontInactive);
    765712
    766         button->SetPosition(0, i * (m_itemHeight + m_itemSpacing));
     713        if (m_orientation == Qt::Horizontal)
     714            button->SetPosition(i * (m_itemWidth + m_itemSpacing),
     715                                m_Area.height()/2 - m_itemHeight/2);
     716        else
     717            button->SetPosition(0, i * (m_itemHeight + m_itemSpacing));
    767718        m_ButtonList.push_back(button);
    768719    }
    769720
     
    782733{
    783734    QString file = "lb-" + fileName + ".png";
    784735    QImage *p = gContext->LoadScaleImage(file);
    785     *pix = MythImage::FromQImage(&p);
     736
     737    /* rotate arrows for horizontal allignment */
     738    if ((m_orientation == Qt::Horizontal) && (m_rotMatrix != NULL))
     739    {
     740        QImage *q = new QImage(p->xForm(*m_rotMatrix));
     741        delete p;
     742        *pix = MythImage::FromQImage(&q);
     743    }
     744    else *pix = MythImage::FromQImage(&p);
    786745}
    787746
    788747//////////////////////////////////////////////////////////////////////////////
  • mythimage.h

     
    2626    // *NOTE* *DELETES* img!
    2727    static MythImage *FromQImage(QImage **img);
    2828
     29    /**
     30     * @brief Create a gradient image.
     31     * @param size The size of the image.
     32     * @param begin The beginning colour.
     33     * @param end The ending colour.
     34     * @return A MythImage filled with a gradient.
     35     *
     36     * IMPORTANT: You must call QApplication::lock and
     37     * QApplication::unlock before and after this method. since it
     38     * uses a QPainter... I guess.
     39     */
     40    static MythImage *Gradient(const QSize & size, const QColor &begin, const QColor &end, uint alpha);
     41
    2942    bool Load(const QString &filename);
    3043
    3144  protected: