Ticket #197: horizontal_list.diff

File horizontal_list.diff, 7.6 KB (added by mfgalizi@…, 15 years ago)

Add horizontal allignment of button lists

  • libs/libmythui/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
  • libs/libmythui/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()
     
    582606        LoadPixmap(&downReg, "dnarrow-reg");
    583607        LoadPixmap(&downAct, "dnarrow-sel");
    584608
     609        /* rotate the arrows if horizontally aligned */
     610        if (m_orientation == Qt::Horizontal)
     611            m_rotMatrix = new QWMatrix(1,0,1,0,0,0);
     612
    585613        m_upArrow->AddImage(MythUIStateType::Off, upReg);
    586614        m_upArrow->AddImage(MythUIStateType::Full, upAct);
    587615        m_downArrow->AddImage(MythUIStateType::Off, downReg);
    588616        m_downArrow->AddImage(MythUIStateType::Full, downAct);
    589617
    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));
     618        /* prevent rotating arrows that are acutally in the items */
     619        if (m_rotMatrix != NULL)
     620        {
     621            delete m_rotMatrix;
     622            m_rotMatrix = NULL;
     623        }
    594624
    595         arrowsRect = QRect(0, m_Area.height() - upAct->height() - 1,
    596                            m_Area.width(), upAct->height());
     625        if (m_orientation == Qt::Horizontal)
     626        {
     627            int x = m_Area.width() - upAct->width() - 1;
     628            int ytop = m_Area.height()/2 - m_itemMargin/2 - upAct->height();
     629            int ybottom = m_Area.height()/2 + m_itemMargin/2;
     630            m_upArrow->SetPosition(QPoint(x, ybottom));
     631            m_downArrow->SetPosition(QPoint(x, ytop));
    597632
     633
     634            /* rightmost rectangle (full height) */
     635            arrowsRect = QRect(x, 0, upAct->width() + 1, m_Area.height());
     636
     637            /* now calculate the item width */
     638            int dx = m_Area.width() - upAct->width() - 1 - 2*m_itemMargin -
     639                (m_itemsVisible - 1) * m_itemSpacing;
     640            m_itemWidth = dx/m_itemsVisible;
     641
     642        }
     643        else {
     644            int y = m_Area.height() - upAct->height() - 1;
     645            m_upArrow->SetPosition(QPoint(0, y));
     646            m_downArrow->SetPosition(QPoint(upAct->width() + m_itemMargin, y));
     647
     648            /* bottom-most rectangle (full width) */
     649            arrowsRect = QRect(0, y, m_Area.width(), upAct->height());
     650            m_itemWidth = m_Area.width();
     651        }
     652
    598653        upAct->DownRef();
    599654        upReg->DownRef();
    600655        downReg->DownRef();
     
    602657    }
    603658    else
    604659        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);
    608660
    609     m_itemsVisible = 0;
    610     int y = 0;
     661    if (m_orientation == Qt::Horizontal)
     662        m_contentsRect = QRect(0, 0, m_Area.width() - arrowsRect.width() -
     663                               2 * m_itemMargin, m_Area.height());
     664    else
     665        m_contentsRect = QRect(0, 0, m_Area.width(), m_Area.height() -
     666                               arrowsRect.height() - 2 * m_itemMargin);
    611667
    612     while (y <= m_contentsRect.height() - m_itemHeight)
    613     {
    614         y += m_itemHeight + m_itemSpacing;
    615         m_itemsVisible++;
     668    /* visible items are only variable with vertical alignment */
     669    if (m_orientation == Qt::Vertical) {
     670        int y = m_itemsVisible = 0;
     671        while (y <= m_contentsRect.height() - m_itemHeight)
     672        {
     673            y += m_itemHeight + m_itemSpacing;
     674            m_itemsVisible++;
     675        }
    616676    }
    617677
    618678    MythImage *itemRegPix, *itemSelActPix, *itemSelInactPix;
     
    624684   
    625685    LoadPixmap(&arrowPix, "arrow");
    626686
    627     QImage img(m_Area.width(), m_itemHeight, 32);
     687    QImage img(m_itemWidth, m_itemHeight, 32);
    628688    img.setAlphaBuffer(true);
    629689
    630690    for (int y = 0; y < img.height(); y++)
     
    763823        button->SetFont(MythUIButton::Normal, *m_fontActive);
    764824        button->SetFont(MythUIButton::Disabled, *m_fontInactive);
    765825
    766         button->SetPosition(0, i * (m_itemHeight + m_itemSpacing));
     826        if (m_orientation == Qt::Horizontal)
     827            button->SetPosition(i * (m_itemWidth + m_itemSpacing),
     828                                m_Area.height()/2 - m_itemHeight/2);
     829        else
     830            button->SetPosition(0, i * (m_itemHeight + m_itemSpacing));
    767831        m_ButtonList.push_back(button);
    768832    }
    769833
     
    782846{
    783847    QString file = "lb-" + fileName + ".png";
    784848    QImage *p = gContext->LoadScaleImage(file);
    785     *pix = MythImage::FromQImage(&p);
     849
     850    /* rotate arrows for horizontal allignment */
     851    if ((m_orientation == Qt::Horizontal) && (m_rotMatrix != NULL))
     852    {
     853        QImage *q = new QImage(p->xForm(*m_rotMatrix));
     854        delete p;
     855        *pix = MythImage::FromQImage(&q);
     856    }
     857    else *pix = MythImage::FromQImage(&p);
    786858}
    787859
    788860//////////////////////////////////////////////////////////////////////////////