Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/dvscrollwidget.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/freelayout.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qlayout></qlayout>
Toshihiro Shimizu 890ddd
#include <qpushbutton></qpushbutton>
Toshihiro Shimizu 890ddd
#include <qpropertyanimation></qpropertyanimation>
Toshihiro Shimizu 890ddd
#include <qresizeevent></qresizeevent>
Toshihiro Shimizu 890ddd
#include <qmouseevent></qmouseevent>
Toshihiro Shimizu 890ddd
#include <qtimer></qtimer>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// STD includes
Toshihiro Shimizu 890ddd
#include <numeric></numeric>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//****************************************************************************
Toshihiro Shimizu 890ddd
//    Local namespace stuff
Toshihiro Shimizu 890ddd
//****************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class ScrollLayout : public DummyLayout {
Shinya Kitaoka 120a6e
  DvScrollWidget *m_scrollWidget;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  ScrollLayout(DvScrollWidget *scrollWidget) : m_scrollWidget(scrollWidget) {
Shinya Kitaoka 120a6e
    assert(m_scrollWidget);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QSize minimumSize() const override {
Shinya Kitaoka 120a6e
    struct locals {
Shinya Kitaoka 120a6e
      inline static QSize expand(const QSize &size, const QLayoutItem *item) {
Shinya Kitaoka 120a6e
        return size.expandedTo(item->minimumSize());
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QSize minSize = std::accumulate(m_items.begin(), m_items.end(), QSize(),
Shinya Kitaoka 120a6e
                                    locals::expand);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    return (m_scrollWidget->getOrientation() == Qt::Horizontal)
Shinya Kitaoka 120a6e
               ? QSize(0, minSize.height())
Shinya Kitaoka 120a6e
               : QSize(minSize.width(), 0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QSize maximumSize() const override {
Shinya Kitaoka 120a6e
    struct locals {
Shinya Kitaoka 120a6e
      inline static QSize bound(const QSize &size, const QLayoutItem *item) {
Shinya Kitaoka 120a6e
        return size.boundedTo(item->minimumSize());
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QSize maxSize =
Shinya Kitaoka 120a6e
        std::accumulate(m_items.begin(), m_items.end(),
Shinya Kitaoka 120a6e
                        QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX), locals::bound);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    return (m_scrollWidget->getOrientation() == Qt::Horizontal)
Shinya Kitaoka 120a6e
               ? QSize(QWIDGETSIZE_MAX, maxSize.height())
Shinya Kitaoka 120a6e
               : QSize(maxSize.width(), QWIDGETSIZE_MAX);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void setGeometry(const QRect &r) override {
Shinya Kitaoka 120a6e
    const Qt::Orientation orientation = m_scrollWidget->getOrientation();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QList<qlayoutitem *="">::const_iterator it, iEnd = m_items.end();</qlayoutitem>
Shinya Kitaoka 120a6e
    for (it = m_items.begin(); it != iEnd; ++it) {
Shinya Kitaoka 120a6e
      QLayoutItem *item = *it;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      QSize targetSize = item->sizeHint();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (orientation & item->expandingDirections()) {
Shinya Kitaoka 120a6e
        if (orientation & Qt::Horizontal)
Shinya Kitaoka 120a6e
          targetSize.setWidth(r.width());
Shinya Kitaoka 120a6e
        else
Shinya Kitaoka 120a6e
          targetSize.setHeight(r.height());
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      const QSize &minSize = item->minimumSize(),
Shinya Kitaoka 120a6e
                  &maxSize = item->maximumSize();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      targetSize.setWidth(
Shinya Kitaoka 120a6e
          tcrop(targetSize.width(), minSize.width(), maxSize.width()));
Shinya Kitaoka 120a6e
      targetSize.setHeight(
Shinya Kitaoka 120a6e
          tcrop(targetSize.height(), minSize.height(), maxSize.height()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      const QRect &geom = item->geometry();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (geom.size() != targetSize)
Shinya Kitaoka 120a6e
        item->setGeometry(QRect(geom.topLeft(), targetSize));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    m_scrollWidget->scroll(0);  // Refresh scroll buttons visibility
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
qreal heldScrollEasing(qreal progress) {
Shinya Kitaoka 120a6e
  // Equilibrate sum of Linear and InQuad
Shinya Kitaoka 120a6e
  return 0.5 * progress * (1.0 + progress);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//****************************************************************************
Toshihiro Shimizu 890ddd
//    DvScrollWidget implementation
Toshihiro Shimizu 890ddd
//****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DvScrollWidget::DvScrollWidget(QWidget *parent, Qt::Orientation orientation)
Shinya Kitaoka 120a6e
    : QFrame(parent)
Shinya Kitaoka 120a6e
    , m_content(0)
Shinya Kitaoka 120a6e
    , m_animation(0)
Shinya Kitaoka 120a6e
    , m_clickEase(QEasingCurve::OutCubic)
Shinya Kitaoka 120a6e
    , m_holdEase(QEasingCurve::Linear)
Shinya Kitaoka 120a6e
    , m_backwardTimer(new QTimer(this))
Shinya Kitaoka 120a6e
    , m_forwardTimer(new QTimer(this))
Shinya Kitaoka 120a6e
    , m_pressed(false)
Shinya Kitaoka 120a6e
    , m_heldRelease(false)
Shinya Kitaoka 120a6e
    , m_heldClick(false) {
Shinya Kitaoka 120a6e
  ScrollLayout *scrollLayout = new ScrollLayout(this);
Shinya Kitaoka 120a6e
  setLayout(scrollLayout);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // At the toolbar sides, add scroll buttons
Shinya Kitaoka 120a6e
  m_scrollBackward =
Shinya Kitaoka 120a6e
      new QPushButton(this);  // NOTE: Not being managed by the scroll layout.
Shinya Kitaoka 120a6e
  m_scrollBackward->setFixedSize(
Shinya Kitaoka 120a6e
      24, 24);  //       It's not necessary. They are not part
Shinya Kitaoka 120a6e
  m_scrollBackward->setFocusPolicy(Qt::NoFocus);  //       of the content.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_scrollForward =
Shinya Kitaoka 120a6e
      new QPushButton(this);  //       Observe that the parent widget must
Shinya Kitaoka 120a6e
  m_scrollForward->setFixedSize(24,
Shinya Kitaoka 120a6e
                                24);  //       therefore be explicitly supplied.
Shinya Kitaoka 120a6e
  m_scrollForward->setFocusPolicy(Qt::NoFocus);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  setOrientation(orientation);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_scrollBackward->move(0, 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_backwardTimer->setInterval(450);
Shinya Kitaoka 120a6e
  m_forwardTimer->setInterval(450);
Shinya Kitaoka 120a6e
  m_backwardTimer->setSingleShot(true);
Shinya Kitaoka 120a6e
  m_forwardTimer->setSingleShot(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(m_scrollBackward, SIGNAL(clicked(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(scrollBackward()));
Shinya Kitaoka 120a6e
  connect(m_scrollForward, SIGNAL(clicked(bool)), this, SLOT(scrollForward()));
Shinya Kitaoka 120a6e
  connect(m_backwardTimer, SIGNAL(timeout()), this, SLOT(holdBackward()));
Shinya Kitaoka 120a6e
  connect(m_forwardTimer, SIGNAL(timeout()), this, SLOT(holdForward()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(m_scrollBackward, SIGNAL(pressed()), m_backwardTimer, SLOT(start()));
Shinya Kitaoka 120a6e
  connect(m_scrollForward, SIGNAL(pressed()), m_forwardTimer, SLOT(start()));
Shinya Kitaoka 120a6e
  connect(m_scrollBackward, SIGNAL(released()), this, SLOT(releaseBackward()));
Shinya Kitaoka 120a6e
  connect(m_scrollForward, SIGNAL(released()), this, SLOT(releaseForward()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::setWidget(QWidget *widget) {
Shinya Kitaoka 120a6e
  // Delete currently set widget, if any
Shinya Kitaoka 120a6e
  QLayout *lay = layout();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  while (QLayoutItem *item = lay->takeAt(
Shinya Kitaoka 120a6e
             0))  // Should be 1 item only - while is just to be pedant
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    assert(item->widget());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    delete item->widget();  // The item DOES NOT own the widget.
Shinya Kitaoka 120a6e
    delete item;            // The parent widget (this) does - this
Shinya Kitaoka 120a6e
  }                         // is by Qt's manual.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Add widget
Shinya Kitaoka 120a6e
  lay->addWidget(widget);
Shinya Kitaoka 120a6e
  m_content = widget;
Shinya Kitaoka 120a6e
  m_content->lower();  // Needs to be below the scroll buttons.
Shinya Kitaoka 120a6e
                       // Seemingly not working on Mac (see showEvent).
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  assert(widget->parent() == this);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Use animations to make scrolling 'smooth'
Shinya Kitaoka 120a6e
  delete m_animation;
Shinya Kitaoka 120a6e
  m_animation = new QPropertyAnimation(m_content, "pos");
Shinya Kitaoka 120a6e
  connect(m_animation, SIGNAL(stateChanged(QAbstractAnimation::State,
Shinya Kitaoka 120a6e
                                           QAbstractAnimation::State)),
Shinya Kitaoka 120a6e
          this, SLOT(updateButtonsVisibility()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::setOrientation(Qt::Orientation orientation) {
Shinya Kitaoka 120a6e
  if ((m_horizontal = (orientation == Qt::Horizontal))) {
Shinya Kitaoka 120a6e
    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_scrollBackward->setObjectName("ScrollLeftButton");
Shinya Kitaoka 120a6e
    m_scrollForward->setObjectName("ScrollRightButton");
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_scrollBackward->setObjectName("ScrollUpButton");
Shinya Kitaoka 120a6e
    m_scrollForward->setObjectName("ScrollDownButton");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
Qt::Orientation DvScrollWidget::getOrientation() const {
Shinya Kitaoka 120a6e
  return m_horizontal ? Qt::Horizontal : Qt::Vertical;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::setEasing(QEasingCurve clickEase,
Shinya Kitaoka 120a6e
                               QEasingCurve holdPressEase) {
Shinya Kitaoka 120a6e
  m_clickEase = clickEase;
Shinya Kitaoka 120a6e
  m_holdEase  = holdPressEase;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::scroll(int dx, int duration, QEasingCurve ease) {
Shinya Kitaoka 120a6e
  if (m_content)
Shinya Kitaoka 120a6e
    scrollTo(m_horizontal ? m_content->x() + dx : m_content->y() + dx, duration,
Shinya Kitaoka 120a6e
             ease);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::scrollTo(int pos, int duration, QEasingCurve ease) {
Shinya Kitaoka 120a6e
  if (!m_content) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Retrieve the contents' bounds
Shinya Kitaoka 120a6e
  QRect bounds(m_content->pos(), m_content->size());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QPoint newPos;
Shinya Kitaoka 120a6e
  if (m_horizontal) {
Shinya Kitaoka 120a6e
    newPos     = QPoint(pos, 0);
Shinya Kitaoka 120a6e
    int minPos = width() - bounds.width();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (newPos.x() <= minPos) newPos.setX(minPos);
Shinya Kitaoka 120a6e
    if (newPos.x() >= 0) newPos.setX(0);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    newPos     = QPoint(0, pos);
Shinya Kitaoka 120a6e
    int minPos = height() - bounds.height();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (newPos.y() <= minPos) newPos.setY(minPos);
Shinya Kitaoka 120a6e
    if (newPos.y() >= 0) newPos.setY(0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (duration > 0) {
Shinya Kitaoka 120a6e
    m_animation->stop();
Shinya Kitaoka 120a6e
    m_animation->setEasingCurve(ease);
Shinya Kitaoka 120a6e
    m_animation->setStartValue(bounds.topLeft());
Shinya Kitaoka 120a6e
    m_animation->setEndValue(newPos);
Shinya Kitaoka 120a6e
    m_animation->setDuration(duration);
Shinya Kitaoka 120a6e
    m_animation->start();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    m_content->move(newPos);
Shinya Kitaoka 120a6e
    updateButtonsVisibility();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::updateButtonsVisibility() {
Shinya Kitaoka 120a6e
  if ((!m_content) || (m_animation->state() == QPropertyAnimation::Running))
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QRect bounds(m_content->pos(), m_content->size());
Shinya Kitaoka 120a6e
  if (m_horizontal) {
Shinya Kitaoka 120a6e
    if (bounds.right() <= width()) {
Shinya Kitaoka 120a6e
      m_scrollForward->setDown(false);
Shinya Kitaoka 120a6e
      m_scrollForward->hide();
Shinya Kitaoka 120a6e
      m_heldRelease = m_heldClick = false;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      m_scrollForward->show();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (bounds.left() >= 0) {
Shinya Kitaoka 120a6e
      m_scrollBackward->setDown(false);
Shinya Kitaoka 120a6e
      m_scrollBackward->hide();
Shinya Kitaoka 120a6e
      m_heldRelease = m_heldClick = false;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      m_scrollBackward->show();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    if (bounds.bottom() <= height()) {
Shinya Kitaoka 120a6e
      m_scrollForward->setDown(false);
Shinya Kitaoka 120a6e
      m_scrollForward->hide();
Shinya Kitaoka 120a6e
      m_heldRelease = m_heldClick = false;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      m_scrollForward->show();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (bounds.top() >= 0) {
Shinya Kitaoka 120a6e
      m_scrollBackward->setDown(false);
Shinya Kitaoka 120a6e
      m_scrollBackward->hide();
Shinya Kitaoka 120a6e
      m_heldRelease = m_heldClick = false;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      m_scrollBackward->show();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::showEvent(QShowEvent *se) {
Shinya Kitaoka 120a6e
  // These are necessary on Mac.
Shinya Kitaoka 120a6e
  m_scrollBackward->raise();
Shinya Kitaoka 120a6e
  m_scrollForward->raise();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::resizeEvent(QResizeEvent *re) {
Shinya Kitaoka 120a6e
  QWidget::resizeEvent(re);
Shinya Kitaoka 120a6e
  scroll(0);
Shinya Kitaoka 120a6e
  if (m_horizontal) {
Shinya Kitaoka 120a6e
    m_scrollBackward->setFixedSize(m_scrollBackward->width(), height());
Shinya Kitaoka 120a6e
    m_scrollForward->setFixedSize(m_scrollForward->width(), height());
Shinya Kitaoka 120a6e
    m_scrollForward->move(re->size().width() - m_scrollForward->width(), 0);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    m_scrollBackward->setFixedSize(width(), m_scrollBackward->height());
Shinya Kitaoka 120a6e
    m_scrollForward->setFixedSize(width(), m_scrollForward->height());
Shinya Kitaoka 120a6e
    m_scrollForward->move(0, re->size().height() - m_scrollForward->height());
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::mousePressEvent(QMouseEvent *me) {
Shinya Kitaoka 120a6e
  m_pressed  = true;
Shinya Kitaoka 120a6e
  m_mousePos = m_horizontal ? me->x() : me->y();
Shinya Kitaoka 120a6e
  me->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::mouseMoveEvent(QMouseEvent *me) {
Shinya Kitaoka 120a6e
  if (!m_pressed) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_horizontal) {
Shinya Kitaoka 120a6e
    scroll(me->x() - m_mousePos);
Shinya Kitaoka 120a6e
    m_mousePos = me->x();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    scroll(me->y() - m_mousePos);
Shinya Kitaoka 120a6e
    m_mousePos = me->y();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  me->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::mouseReleaseEvent(QMouseEvent *me) {
Shinya Kitaoka 120a6e
  m_pressed = false;
Shinya Kitaoka 120a6e
  me->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::holdBackward() {
Shinya Kitaoka 120a6e
  if (!m_content) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_heldRelease = m_heldClick = true;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QRect bounds(m_content->pos(), m_content->size());
Shinya Kitaoka 120a6e
  int spaceLeft = -(m_horizontal ? bounds.left() : bounds.top());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QEasingCurve ease;
Shinya Kitaoka 120a6e
  ease.setCustomType(&heldScrollEasing);
Shinya Kitaoka 120a6e
  scrollTo(0, spaceLeft * 10, ease);  // 100 pix per second
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::holdForward() {
Shinya Kitaoka 120a6e
  if (!m_content) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_heldRelease = m_heldClick = true;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QRect bounds(m_content->pos(), m_content->size());
Shinya Kitaoka 120a6e
  int pos =
Shinya Kitaoka 120a6e
      m_horizontal ? width() - bounds.width() : height() - bounds.height();
Shinya Kitaoka 120a6e
  int spaceLeft = (m_horizontal ? bounds.left() : bounds.top()) - pos;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QEasingCurve ease;
Shinya Kitaoka 120a6e
  ease.setCustomType(&heldScrollEasing);
Shinya Kitaoka 120a6e
  scrollTo(pos, spaceLeft * 10, ease);  // 100 pix per second
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::releaseBackward() {
Shinya Kitaoka 120a6e
  m_backwardTimer->stop();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_heldRelease) m_animation->stop();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_heldRelease = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::releaseForward() {
Shinya Kitaoka 120a6e
  m_forwardTimer->stop();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_heldRelease) m_animation->stop();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_heldRelease = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::scrollBackward() {
Shinya Kitaoka 120a6e
  if (!m_heldClick) scroll(0.5 * (m_horizontal ? width() : height()), 300);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_heldClick = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DvScrollWidget::scrollForward() {
Shinya Kitaoka 120a6e
  if (!m_heldClick) scroll(-0.5 * (m_horizontal ? width() : height()), 300);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_heldClick = false;
Toshihiro Shimizu 890ddd
}