Zigzag auto scroll function refactoring.

This commit is contained in:
Daisuke Cato 2016-10-15 05:40:27 +09:00
parent e4365dadce
commit 2813817b52
2 changed files with 81 additions and 178 deletions

View File

@ -466,225 +466,123 @@ void Viewer::scrollUp()
void Viewer::scrollForwardHorizontalFirst() void Viewer::scrollForwardHorizontalFirst()
{ {
if (!doubleMangaPage) if (!doubleMangaPage)
// left to right mode. scroll right -> lower left -> right -> ...-> next page
{ {
if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->maximum()) scrollZigzag(RIGHT, DOWN, true); // right->right->lower left->right->...->next page
{
// scroll straight right
scrollTo(horizontalScrollBar()->sliderPosition()+static_cast<int>((width()*0.80)),
verticalScrollBar()->sliderPosition());
}
else if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->maximum())
{
// scroll lower left
scrollTo(horizontalScrollBar()->minimum(),
std::min(verticalScrollBar()->sliderPosition()+static_cast<int>((height()*0.80)), verticalScrollBar()->maximum()));
} }
else else
{ {
// next page's upper left corner scrollZigzag(LEFT, DOWN, true); // left->left->lower right->left->...->next page
int savedPageNumber = getCurrentPageNumber();
next();
if(savedPageNumber != getCurrentPageNumber()){
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->minimum());
emit backgroundChanges();
}
}
}
else
// right to left mode (manga mode). scroll down -> upper left -> down -> ...-> next page
{
if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->minimum())
{
// scroll straight left
scrollTo(horizontalScrollBar()->sliderPosition()-static_cast<int>((width()*0.80)),
verticalScrollBar()->sliderPosition());
}
else if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->maximum())
{
// scroll lower right
scrollTo(horizontalScrollBar()->maximum(),
std::min(verticalScrollBar()->sliderPosition()+static_cast<int>((height()*0.80)), verticalScrollBar()->maximum()));
}
else
{
// next page's upper right corner
int savedPageNumber = getCurrentPageNumber();
next();
if(savedPageNumber != getCurrentPageNumber()){
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->maximum());
emit backgroundChanges();
}
}
} }
} }
void Viewer::scrollBackwardHorizontalFirst() void Viewer::scrollBackwardHorizontalFirst()
{ {
if (!doubleMangaPage) if (!doubleMangaPage)
// left to right mode. scroll left -> upper right -> left -> ...-> prev page
{ {
if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->minimum()) scrollZigzag(LEFT, UP, false); // left->left->upper right->left->...->prev page
{
// scroll straight left
scrollTo(horizontalScrollBar()->sliderPosition()-static_cast<int>((width()*0.80)),
verticalScrollBar()->sliderPosition());
}
else if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->minimum())
{
// scroll upper right
scrollTo(horizontalScrollBar()->maximum(),
std::max(verticalScrollBar()->sliderPosition()-static_cast<int>((height()*0.80)), verticalScrollBar()->minimum()));
} }
else else
{ {
// prev page's lower right corner scrollZigzag(RIGHT, UP, false); // right->right->upper left->right->...->prev page
int savedPageNumber = getCurrentPageNumber();
prev();
if(savedPageNumber != getCurrentPageNumber()){
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->maximum());
emit backgroundChanges();
}
}
}
else
// right to left mode (manga mode). scroll right -> upper left -> right -> ...-> prev page
{
if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->maximum())
{
// scroll straight right
scrollTo(horizontalScrollBar()->sliderPosition()+static_cast<int>((width()*0.80)),
verticalScrollBar()->sliderPosition());
}
else if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->minimum())
{
// scroll upper left
scrollTo(horizontalScrollBar()->minimum(),
std::max(verticalScrollBar()->sliderPosition()-static_cast<int>((height()*0.80)), verticalScrollBar()->minimum()));
}
else
{
// next page's lower left corner
int savedPageNumber = getCurrentPageNumber();
prev();
if(savedPageNumber != getCurrentPageNumber()){
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->minimum());
emit backgroundChanges();
}
}
} }
} }
void Viewer::scrollForwardVerticalFirst() void Viewer::scrollForwardVerticalFirst()
{ {
if (!doubleMangaPage) if (!doubleMangaPage)
// left to right mode. scroll down -> upper right -> down -> ...-> next page
{ {
if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->maximum()) scrollZigzag(DOWN, RIGHT, true); // down->down->upper right->down->...->next page
{
// scroll straight down
scrollTo(horizontalScrollBar()->sliderPosition(),
verticalScrollBar()->sliderPosition()+static_cast<int>((height()*0.80)));
}
else if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->maximum())
{
// scroll upper right
scrollTo(std::min(horizontalScrollBar()->sliderPosition()+static_cast<int>((width()*0.80)), horizontalScrollBar()->maximum()),
verticalScrollBar()->minimum());
} }
else else
{ {
// next page's upper left corner scrollZigzag(DOWN, LEFT, true); // down->down->upper left->down->...->next page
int savedPageNumber = getCurrentPageNumber();
next();
if(savedPageNumber != getCurrentPageNumber()){
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->minimum());
emit backgroundChanges();
}
}
}
else
// right to left mode (manga mode). scroll down -> upper left -> down -> ...-> next page
{
if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->maximum())
{
// scroll straight down
scrollTo(horizontalScrollBar()->sliderPosition(),
verticalScrollBar()->sliderPosition()+static_cast<int>((height()*0.80)));
}
else if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->minimum())
{
// scroll upper left
scrollTo(std::max(horizontalScrollBar()->sliderPosition()-static_cast<int>((width()*0.80)), horizontalScrollBar()->minimum()),
verticalScrollBar()->minimum());
}
else
{
// next page's upper right corner
int savedPageNumber = getCurrentPageNumber();
next();
if(savedPageNumber != getCurrentPageNumber()){
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->maximum());
emit backgroundChanges();
}
}
} }
} }
void Viewer::scrollBackwardVerticalFirst() void Viewer::scrollBackwardVerticalFirst()
{ {
if (!doubleMangaPage) if (!doubleMangaPage)
// left to right mode. scroll up -> lower left -> up -> ...-> prev page
{ {
if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->minimum()) scrollZigzag(UP, LEFT, false); // up->up->lower left->up->...->prev page
{
// scroll straight up
scrollTo(horizontalScrollBar()->sliderPosition(),
verticalScrollBar()->sliderPosition()-static_cast<int>((height()*0.80)));
}
else if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->minimum())
{
// scroll lower left
scrollTo(std::max(horizontalScrollBar()->sliderPosition()-static_cast<int>((width()*0.80)), horizontalScrollBar()->minimum()),
verticalScrollBar()->maximum());
} }
else else
{ {
// prev page's lower right corner scrollZigzag(UP, RIGHT, false); // up->up->lower right->up->...->prev page
}
}
bool Viewer::isEdge(scrollDirection d)
{
if(d == UP)
return verticalScrollBar()->sliderPosition() == verticalScrollBar()->minimum();
else if(d == DOWN)
return verticalScrollBar()->sliderPosition() == verticalScrollBar()->maximum();
else if(d == LEFT)
return horizontalScrollBar()->sliderPosition() == horizontalScrollBar()->minimum();
else // d == RIGHT
return horizontalScrollBar()->sliderPosition() == horizontalScrollBar()->maximum();
}
void Viewer::scrollZigzag(scrollDirection d1, scrollDirection d2, bool forward)
{
if(!isEdge(d1))
{
if(d1 == UP)
scrollTo(horizontalScrollBar()->sliderPosition(),
verticalScrollBar()->sliderPosition()-static_cast<int>((height()*0.80)));
else if(d1 == DOWN)
scrollTo(horizontalScrollBar()->sliderPosition(),
verticalScrollBar()->sliderPosition()+static_cast<int>((height()*0.80)));
else if(d1 == LEFT)
scrollTo(horizontalScrollBar()->sliderPosition()-static_cast<int>((width()*0.80)),
verticalScrollBar()->sliderPosition());
else // d1 == RIGHT
scrollTo(horizontalScrollBar()->sliderPosition()+static_cast<int>((width()*0.80)),
verticalScrollBar()->sliderPosition());
}
else if(!isEdge(d2))
{
int x = 0;
int y = 0;
if(d1 == UP)
y = verticalScrollBar()->maximum();
else if(d1 == DOWN)
y = verticalScrollBar()->minimum();
else if(d1 == LEFT)
x = horizontalScrollBar()->maximum();
else // d1 == RIGHT
x = horizontalScrollBar()->minimum();
if(d2 == UP)
y = std::max(verticalScrollBar()->sliderPosition()-static_cast<int>((height()*0.80)), verticalScrollBar()->minimum());
else if(d2 == DOWN)
y = std::min(verticalScrollBar()->sliderPosition()+static_cast<int>((height()*0.80)), verticalScrollBar()->maximum());
else if(d2 == LEFT)
x = std::max(horizontalScrollBar()->sliderPosition()-static_cast<int>((width()*0.80)), horizontalScrollBar()->minimum());
else // d2 == RIGHT
x = std::min(horizontalScrollBar()->sliderPosition()+static_cast<int>((width()*0.80)), horizontalScrollBar()->maximum());
scrollTo(x, y);
}
else
{
// next or prev page's corner
int savedPageNumber = getCurrentPageNumber(); int savedPageNumber = getCurrentPageNumber();
if(forward)
next();
else
prev(); prev();
if(savedPageNumber != getCurrentPageNumber()){ if(savedPageNumber != getCurrentPageNumber()){
if(d1 == LEFT || d2 == LEFT)
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->maximum()); horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->maximum());
emit backgroundChanges();
}
}
}
else else
// right to left mode (manga mode). scroll up -> lower left -> up -> ...-> prev page
{
if(verticalScrollBar()->sliderPosition()!=verticalScrollBar()->minimum())
{
// scroll straight up
scrollTo(horizontalScrollBar()->sliderPosition(),
verticalScrollBar()->sliderPosition()-static_cast<int>((height()*0.80)));
}
else if(horizontalScrollBar()->sliderPosition()!=horizontalScrollBar()->maximum())
{
// scroll lower right
scrollTo(std::min(horizontalScrollBar()->sliderPosition()+static_cast<int>((width()*0.80)), horizontalScrollBar()->maximum()),
verticalScrollBar()->maximum());
}
else
{
// next page's lower left corner
int savedPageNumber = getCurrentPageNumber();
prev();
if(savedPageNumber != getCurrentPageNumber()){
horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->minimum()); horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->minimum());
emit backgroundChanges(); emit backgroundChanges();
} }
} }
}
} }
void Viewer::scrollTo(int x, int y) void Viewer::scrollTo(int x, int y)

View File

@ -60,7 +60,6 @@ class NotificationsLabelWidget;
void scrollBackwardHorizontalFirst(); void scrollBackwardHorizontalFirst();
void scrollForwardVerticalFirst(); void scrollForwardVerticalFirst();
void scrollBackwardVerticalFirst(); void scrollBackwardVerticalFirst();
void scrollTo(int x, int y);
void magnifyingGlassSwitch(); void magnifyingGlassSwitch();
void showMagnifyingGlass(); void showMagnifyingGlass();
void hideMagnifyingGlass(); void hideMagnifyingGlass();
@ -162,6 +161,12 @@ virtual void mouseReleaseEvent ( QMouseEvent * event );
void wheelEvent(QWheelEvent * event); void wheelEvent(QWheelEvent * event);
void mouseMoveEvent(QMouseEvent * event); void mouseMoveEvent(QMouseEvent * event);
//!ZigzagScroll
enum scrollDirection{ UP, DOWN, LEFT, RIGHT };
bool isEdge(scrollDirection d);
void scrollZigzag(scrollDirection d1, scrollDirection d2, bool forward);
void scrollTo(int x, int y);
public: public:
Viewer(QWidget * parent = 0); Viewer(QWidget * parent = 0);
~Viewer(); ~Viewer();