diff --git a/YACReader/goto_flow.cpp b/YACReader/goto_flow.cpp index fdb17057..8ef1fd39 100644 --- a/YACReader/goto_flow.cpp +++ b/YACReader/goto_flow.cpp @@ -225,6 +225,12 @@ void GoToFlow::updateConfig(QSettings * settings) { Q_UNUSED(settings) } + +void GoToFlow::setFlowRightToLeft(bool b) +{ + flow->setFlowRightToLeft(b); +} + //----------------------------------------------------------------------------- //SlideInitializer //----------------------------------------------------------------------------- diff --git a/YACReader/goto_flow.h b/YACReader/goto_flow.h index 53176d1c..a82d78ff 100644 --- a/YACReader/goto_flow.h +++ b/YACReader/goto_flow.h @@ -63,6 +63,8 @@ private slots: void setFlowType(FlowType flowType); void updateSize(); void updateConfig(QSettings * settings); + void setFlowRightToLeft(bool b); + signals: void goToPage(unsigned int page); diff --git a/YACReader/goto_flow_gl.cpp b/YACReader/goto_flow_gl.cpp index 0612540a..14cbe424 100644 --- a/YACReader/goto_flow_gl.cpp +++ b/YACReader/goto_flow_gl.cpp @@ -164,3 +164,8 @@ void GoToFlowGL::resizeEvent(QResizeEvent *event) toolBar->move(0, event->size().height() - toolBar->height()); toolBar->setFixedWidth(width()); } + +void GoToFlowGL::setFlowRightToLeft(bool b) +{ + flow->setFlowRightToLeft(b); +} diff --git a/YACReader/goto_flow_gl.h b/YACReader/goto_flow_gl.h index 31bd65e0..00a8ab81 100644 --- a/YACReader/goto_flow_gl.h +++ b/YACReader/goto_flow_gl.h @@ -26,6 +26,7 @@ public: void updateSize(); void updateConfig(QSettings * settings); + void setFlowRightToLeft(bool b); signals: void goToPage(unsigned int page); diff --git a/YACReader/goto_flow_widget.h b/YACReader/goto_flow_widget.h index fbb05028..845a4b05 100644 --- a/YACReader/goto_flow_widget.h +++ b/YACReader/goto_flow_widget.h @@ -29,6 +29,7 @@ public slots: virtual void setImageReady(int index,const QByteArray & image) = 0; virtual void updateSize() = 0; virtual void updateConfig(QSettings * settings) = 0; + virtual void setFlowRightToLeft(bool b) = 0; protected: void keyPressEvent(QKeyEvent* event); diff --git a/YACReader/main_window_viewer.cpp b/YACReader/main_window_viewer.cpp index 5edf3a6f..42506dca 100644 --- a/YACReader/main_window_viewer.cpp +++ b/YACReader/main_window_viewer.cpp @@ -655,13 +655,68 @@ void MainWindowViewer::createToolBars() fileMenu->addAction(openFolderAction); fileMenu->addSeparator(); fileMenu->addAction(saveImageAction); + fileMenu->addSeparator(); + + QMenu * recentmenu = new QMenu(tr("Open recent")); + recentmenu->addActions(recentFilesActionList); + recentmenu->addSeparator(); + recentmenu->addAction(clearRecentFilesAction); + refreshRecentFilesActionList(); + fileMenu->addMenu(recentmenu); + + fileMenu->addSeparator(); + fileMenu->addAction(closeAction); + + QMenu * editMenu = new QMenu(tr("Edit")); + editMenu->addAction(leftRotationAction); + editMenu->addAction(rightRotationAction); + + QMenu * viewMenu = new QMenu(tr("View")); + viewMenu->addAction(adjustHeightAction); + viewMenu->addAction(adjustWidthAction); + viewMenu->addAction(fitToPageAction); + viewMenu->addAction(adjustToFullSizeAction); + viewMenu->addSeparator(); + viewMenu->addAction(increasePageZoomAction); + viewMenu->addAction(decreasePageZoomAction); + viewMenu->addAction(resetZoomAction); + viewMenu->addAction(showZoomSliderlAction); + viewMenu->addSeparator(); + viewMenu->addAction(doublePageAction); + viewMenu->addAction(doubleMangaPageAction); + viewMenu->addSeparator(); + viewMenu->addAction(showMagnifyingGlassAction); + + QMenu * goMenu = new QMenu(tr("Go")); + goMenu->addAction(prevAction); + goMenu->addAction(nextAction); + goMenu->addAction(goToPageAction); + goMenu->addSeparator(); + goMenu->addAction(setBookmarkAction); + goMenu->addAction(showBookmarksAction); + + QMenu * windowMenu = new QMenu(tr("Window")); + windowMenu->addAction(optionsAction); // this action goes to MacOS's Preference menu by Qt + windowMenu->addAction(showShorcutsAction); + windowMenu->addAction(showFlowAction); + windowMenu->addAction(showInfoAction); + windowMenu->addAction(showDictionaryAction); + + QMenu * helpMenu = new QMenu(tr("Help")); + helpMenu->addAction(helpAboutAction); + + menuBar->addMenu(fileMenu); + menuBar->addMenu(editMenu); + menuBar->addMenu(viewMenu); + menuBar->addMenu(goMenu); + menuBar->addMenu(windowMenu); + menuBar->addMenu(helpMenu); //tool bar //QMenu * toolbarMenu = new QMenu(tr("Toolbar")); //toolbarMenu->addAction(); //TODO - menuBar->addMenu(fileMenu); //menu->addMenu(toolbarMenu); //attach toolbar @@ -1279,6 +1334,22 @@ void MainWindowViewer::setUpShortcutsManagement() autoScrollBackwardAction->setData(AUTO_SCROLL_BACKWARD_ACTION_Y); autoScrollBackwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_ACTION_Y)); + QAction * autoScrollForwardHorizontalFirstAction = new QAction(tr("Autoscroll forward, horizontal first"),orphanActions); + autoScrollForwardHorizontalFirstAction->setData(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y); + autoScrollForwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y)); + + QAction * autoScrollBackwardHorizontalFirstAction = new QAction(tr("Autoscroll backward, horizontal first"),orphanActions); + autoScrollBackwardHorizontalFirstAction->setData(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y); + autoScrollBackwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y)); + + QAction * autoScrollForwardVerticalFirstAction = new QAction(tr("Autoscroll forward, vertical first"),orphanActions); + autoScrollForwardVerticalFirstAction->setData(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y); + autoScrollForwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y)); + + QAction * autoScrollBackwardVerticalFirstAction = new QAction(tr("Autoscroll backward, vertical first"),orphanActions); + autoScrollBackwardVerticalFirstAction->setData(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y); + autoScrollBackwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y)); + QAction * moveDownAction = new QAction(tr("Move down"),orphanActions); moveDownAction->setData(MOVE_DOWN_ACTION_Y); moveDownAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_DOWN_ACTION_Y)); @@ -1311,6 +1382,10 @@ void MainWindowViewer::setUpShortcutsManagement() << showBookmarksAction << autoScrollForwardAction << autoScrollBackwardAction + << autoScrollForwardHorizontalFirstAction + << autoScrollBackwardHorizontalFirstAction + << autoScrollForwardVerticalFirstAction + << autoScrollBackwardVerticalFirstAction << moveDownAction << moveUpAction << moveLeftAction diff --git a/YACReader/viewer.cpp b/YACReader/viewer.cpp index 1030bd50..420e725d 100644 --- a/YACReader/viewer.cpp +++ b/YACReader/viewer.cpp @@ -118,6 +118,11 @@ zoom(100) //animations verticalScroller = new QPropertyAnimation(verticalScrollBar(), "sliderPosition"); connect(verticalScroller,SIGNAL(valueChanged (const QVariant &)),this,SIGNAL(backgroundChanges())); + horizontalScroller = new QPropertyAnimation(horizontalScrollBar(), "sliderPosition"); + connect(horizontalScroller,SIGNAL(valueChanged (const QVariant &)),this,SIGNAL(backgroundChanges())); + groupScroller = new QParallelAnimationGroup(); + groupScroller->addAnimation(verticalScroller); + groupScroller->addAnimation(horizontalScroller); notificationsLabel = new NotificationsLabelWidget(this); notificationsLabel->hide(); @@ -137,6 +142,8 @@ Viewer::~Viewer() delete hideCursorTimer; delete informationLabel; delete verticalScroller; + delete horizontalScroller; + delete groupScroller; delete bd; delete notificationsLabel; delete mglass; @@ -456,6 +463,142 @@ void Viewer::scrollUp() } } +void Viewer::scrollForwardHorizontalFirst() +{ + if (!doubleMangaPage) + { + scrollZigzag(RIGHT, DOWN, true); // right->right->lower left->right->...->next page + } + else + { + scrollZigzag(LEFT, DOWN, true); // left->left->lower right->left->...->next page + } +} + +void Viewer::scrollBackwardHorizontalFirst() +{ + if (!doubleMangaPage) + { + scrollZigzag(LEFT, UP, false); // left->left->upper right->left->...->prev page + } + else + { + scrollZigzag(RIGHT, UP, false); // right->right->upper left->right->...->prev page + } +} + +void Viewer::scrollForwardVerticalFirst() +{ + if (!doubleMangaPage) + { + scrollZigzag(DOWN, RIGHT, true); // down->down->upper right->down->...->next page + } + else + { + scrollZigzag(DOWN, LEFT, true); // down->down->upper left->down->...->next page + } +} + +void Viewer::scrollBackwardVerticalFirst() +{ + if (!doubleMangaPage) + { + scrollZigzag(UP, LEFT, false); // up->up->lower left->up->...->prev page + } + else + { + 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((height()*0.80))); + else if(d1 == DOWN) + scrollTo(horizontalScrollBar()->sliderPosition(), + verticalScrollBar()->sliderPosition()+static_cast((height()*0.80))); + else if(d1 == LEFT) + scrollTo(horizontalScrollBar()->sliderPosition()-static_cast((width()*0.80)), + verticalScrollBar()->sliderPosition()); + else // d1 == RIGHT + scrollTo(horizontalScrollBar()->sliderPosition()+static_cast((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((height()*0.80)), verticalScrollBar()->minimum()); + else if(d2 == DOWN) + y = std::min(verticalScrollBar()->sliderPosition()+static_cast((height()*0.80)), verticalScrollBar()->maximum()); + else if(d2 == LEFT) + x = std::max(horizontalScrollBar()->sliderPosition()-static_cast((width()*0.80)), horizontalScrollBar()->minimum()); + else // d2 == RIGHT + x = std::min(horizontalScrollBar()->sliderPosition()+static_cast((width()*0.80)), horizontalScrollBar()->maximum()); + + scrollTo(x, y); + } + else + { + // next or prev page's corner + int savedPageNumber = getCurrentPageNumber(); + + if(forward) + next(); + else + prev(); + + if(savedPageNumber != getCurrentPageNumber()){ + if(d1 == LEFT || d2 == LEFT) + horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->maximum()); + else + horizontalScrollBar()->setSliderPosition(horizontalScrollBar()->minimum()); + emit backgroundChanges(); + } + } +} + +void Viewer::scrollTo(int x, int y) +{ + if(groupScroller->state() == QAbstractAnimation::Running) + return; + horizontalScroller->setDuration(250); + horizontalScroller->setStartValue(horizontalScrollBar()->sliderPosition()); + horizontalScroller->setEndValue(x); + verticalScroller->setDuration(250); + verticalScroller->setStartValue(verticalScrollBar()->sliderPosition()); + verticalScroller->setEndValue(y); + groupScroller->start(); + emit backgroundChanges(); +} + void Viewer::keyPressEvent(QKeyEvent *event) { if(render->hasLoadedComic()) @@ -491,6 +634,26 @@ void Viewer::keyPressEvent(QKeyEvent *event) scrollUp(); } + else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y)) + { + scrollForwardHorizontalFirst(); + } + + else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y)) + { + scrollBackwardHorizontalFirst(); + } + + else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y)) + { + scrollForwardVerticalFirst(); + } + + else if (key == ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y)) + { + scrollBackwardVerticalFirst(); + } + else if (key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_DOWN_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_UP_ACTION_Y) || key == ShortcutsManager::getShortcutsManager().getShortcut(MOVE_LEFT_ACTION_Y) || @@ -800,6 +963,7 @@ void Viewer::doubleMangaPageSwitch() doubleMangaPage = !doubleMangaPage; render->doubleMangaPageSwitch(); Configuration::getConfiguration().setDoubleMangaPage(doubleMangaPage); + goToFlow->setFlowRightToLeft(doubleMangaPage); } void Viewer::resetContent() diff --git a/YACReader/viewer.h b/YACReader/viewer.h index 5800de34..e7e450f8 100644 --- a/YACReader/viewer.h +++ b/YACReader/viewer.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "scroll_management.h" @@ -55,6 +56,10 @@ class NotificationsLabelWidget; void updateOptions(); void scrollDown(); void scrollUp(); + void scrollForwardHorizontalFirst(); + void scrollBackwardHorizontalFirst(); + void scrollForwardVerticalFirst(); + void scrollBackwardVerticalFirst(); void magnifyingGlassSwitch(); void showMagnifyingGlass(); void hideMagnifyingGlass(); @@ -108,6 +113,8 @@ virtual void mouseReleaseEvent ( QMouseEvent * event ); PageLabelWidget * informationLabel; //QTimer * scroller; QPropertyAnimation * verticalScroller; + QPropertyAnimation * horizontalScroller; + QParallelAnimationGroup * groupScroller; int posByStep; int nextPos; GoToFlowWidget * goToFlow; @@ -154,6 +161,12 @@ virtual void mouseReleaseEvent ( QMouseEvent * event ); void wheelEvent(QWheelEvent * 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: Viewer(QWidget * parent = 0); ~Viewer(); diff --git a/common/gl/yacreader_flow_gl.cpp b/common/gl/yacreader_flow_gl.cpp index 9730b941..fe5b2e8b 100644 --- a/common/gl/yacreader_flow_gl.cpp +++ b/common/gl/yacreader_flow_gl.cpp @@ -200,7 +200,7 @@ struct Preset pressetYACReaderFlowDownConfig = { }; /*Constructor*/ YACReaderFlowGL::YACReaderFlowGL(QWidget *parent,struct Preset p) - :QOpenGLWidget(/*QOpenGLWidget migration QGLFormat(QGL::SampleBuffers),*/ parent),numObjects(0),lazyPopulateObjects(-1),bUseVSync(false),hasBeenInitialized(false) + :QOpenGLWidget(/*QOpenGLWidget migration QGLFormat(QGL::SampleBuffers),*/ parent),numObjects(0),lazyPopulateObjects(-1),bUseVSync(false),hasBeenInitialized(false),flowRightToLeft(false) { updateCount = 0; config = p; @@ -385,7 +385,11 @@ void YACReaderFlowGL::udpatePerspective(int width, int height) /*Private*/ void YACReaderFlowGL::calcPos(YACReader3DImage & image, int pos) { - if(pos == 0){ + if(flowRightToLeft){ + pos = pos * -1; + } + + if(pos == 0){ image.current = centerPos; }else{ if(pos > 0){ @@ -1052,6 +1056,11 @@ void YACReaderFlowGL::render() //do nothing } +void YACReaderFlowGL::setFlowRightToLeft(bool b) +{ + flowRightToLeft = b; +} + //EVENTOS void YACReaderFlowGL::wheelEvent(QWheelEvent * event) @@ -1073,7 +1082,7 @@ void YACReaderFlowGL::wheelEvent(QWheelEvent * event) void YACReaderFlowGL::keyPressEvent(QKeyEvent *event) { - if(event->key() == Qt::Key_Left) + if((event->key() == Qt::Key_Left && !flowRightToLeft) || (event->key() == Qt::Key_Right && flowRightToLeft)) { if(event->modifiers() == Qt::ControlModifier) setCurrentIndex((currentSelected-10<0)?0:currentSelected-10); @@ -1083,7 +1092,7 @@ void YACReaderFlowGL::keyPressEvent(QKeyEvent *event) return; } - if(event->key() == Qt::Key_Right) + if((event->key() == Qt::Key_Right && !flowRightToLeft) || (event->key() == Qt::Key_Left && flowRightToLeft)) { if(event->modifiers() == Qt::ControlModifier) setCurrentIndex((currentSelected+10>=numObjects)?numObjects-1:currentSelected+10); @@ -1128,7 +1137,7 @@ void YACReaderFlowGL::mousePressEvent(QMouseEvent *event) gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); - if(posX >= 0.5) + if((posX >= 0.5 && !flowRightToLeft) || (posX <=-0.5 && flowRightToLeft)) { //int index = currentSelected+1; //while((cfImages[index].current.x-cfImages[index].width/(2.0*config.rotation)) < posX) @@ -1136,7 +1145,7 @@ void YACReaderFlowGL::mousePressEvent(QMouseEvent *event) //setCurrentIndex(index-1); showNext(); } - else if(posX <=-0.5) + else if((posX <=-0.5 && !flowRightToLeft) || (posX >= 0.5 && flowRightToLeft) ) showPrevious(); } else QOpenGLWidget::mousePressEvent(event); diff --git a/common/gl/yacreader_flow_gl.h b/common/gl/yacreader_flow_gl.h index 2fc37d51..60cd8ce5 100644 --- a/common/gl/yacreader_flow_gl.h +++ b/common/gl/yacreader_flow_gl.h @@ -173,6 +173,9 @@ protected: //sets the updateInterval in ms static int updateInterval; + // sets flow direction right-to-left (manga mode) + bool flowRightToLeft; + void startAnimationTimer(); void stopAnimationTimer(); @@ -251,6 +254,8 @@ public: void useVSync(bool b); + void setFlowRightToLeft(bool b); + virtual void updateImageData() = 0; void reset(); diff --git a/common/pictureflow.cpp b/common/pictureflow.cpp index d92f4299..61fe2d60 100644 --- a/common/pictureflow.cpp +++ b/common/pictureflow.cpp @@ -207,6 +207,8 @@ public: QVector leftSlides; QVector rightSlides; int centerIndex; + + bool flowRightToLeft; }; class PictureFlowAnimator @@ -281,7 +283,7 @@ private: PictureFlowState::PictureFlowState(int a, float sr): backgroundColor(0), slideWidth(150), slideHeight(200), -reflectionEffect(PictureFlow::BlurredReflection), centerIndex(0) , rawAngle(a), spacingRatio(sr) +reflectionEffect(PictureFlow::BlurredReflection), centerIndex(0) , rawAngle(a), spacingRatio(sr), flowRightToLeft(false) { } @@ -327,7 +329,10 @@ void PictureFlowState::reset() si.angle = angle; si.cx = -(offsetX + spacing*(i)*PFREAL_ONE); si.cy = offsetY; - si.slideIndex = centerIndex-1-i; + if(!flowRightToLeft) + si.slideIndex = centerIndex-1-i; + else + si.slideIndex = centerIndex+1+i; si.blend = 200; if(i == (int)leftSlides.count()-2) si.blend = 128; @@ -344,7 +349,10 @@ void PictureFlowState::reset() si.angle = -angle; si.cx = offsetX + spacing*(i)*PFREAL_ONE; si.cy = offsetY; - si.slideIndex = centerIndex+1+i; + if(!flowRightToLeft) + si.slideIndex = centerIndex+1+i; + else + si.slideIndex = centerIndex-1-i; si.blend = 200; if(i == (int)rightSlides.count()-2) si.blend = 128; @@ -423,13 +431,31 @@ void PictureFlowAnimator::update() frame = index << 16; state->centerSlide.slideIndex = state->centerIndex; for(int i = 0; i < (int)state->leftSlides.count(); i++) - state->leftSlides[i].slideIndex = state->centerIndex-1-i; + { + if(!state->flowRightToLeft) + state->leftSlides[i].slideIndex = state->centerIndex-1-i; + else + state->leftSlides[i].slideIndex = state->centerIndex+1+i; + } for(int i = 0; i < (int)state->rightSlides.count(); i++) - state->rightSlides[i].slideIndex = state->centerIndex+1+i; + { + if(!state->flowRightToLeft) + state->rightSlides[i].slideIndex = state->centerIndex+1+i; + else + state->rightSlides[i].slideIndex = state->centerIndex-1-i; + } } - state->centerSlide.angle = (step * tick * state->angle) >> 16; - state->centerSlide.cx = -step * fmul(state->offsetX, ftick); + if(!state->flowRightToLeft) + { + state->centerSlide.angle = (step * tick * state->angle) >> 16; + state->centerSlide.cx = -step * fmul(state->offsetX, ftick); + } + else + { + state->centerSlide.angle = (-step * tick * state->angle) >> 16; + state->centerSlide.cx = step * fmul(state->offsetX, ftick); + } state->centerSlide.cy = fmul(state->offsetY, ftick); if(state->centerIndex == target) @@ -443,7 +469,10 @@ void PictureFlowAnimator::update() { SlideInfo& si = state->leftSlides[i]; si.angle = state->angle; - si.cx = -(state->offsetX + state->spacing*(i)*PFREAL_ONE + step*state->spacing*ftick); + if(!state->flowRightToLeft) + si.cx = -(state->offsetX + state->spacing*(i)*PFREAL_ONE + step*state->spacing*ftick); + else + si.cx = -(state->offsetX + state->spacing*(i)*PFREAL_ONE - step*state->spacing*ftick); si.cy = state->offsetY; } @@ -451,24 +480,41 @@ void PictureFlowAnimator::update() { SlideInfo& si = state->rightSlides[i]; si.angle = -state->angle; - si.cx = state->offsetX + state->spacing*(i)*PFREAL_ONE - step*state->spacing*ftick; + if(!state->flowRightToLeft) + si.cx = state->offsetX + state->spacing*(i)*PFREAL_ONE - step*state->spacing*ftick; + else + si.cx = state->offsetX + state->spacing*(i)*PFREAL_ONE + step*state->spacing*ftick; si.cy = state->offsetY; } - if(step > 0) + if(step > 0 && !state->flowRightToLeft) { PFreal ftick = (neg * PFREAL_ONE) >> 16; state->rightSlides[0].angle = -(neg * state->angle) >> 16; state->rightSlides[0].cx = fmul(state->offsetX, ftick); state->rightSlides[0].cy = fmul(state->offsetY, ftick); } - else + else if(!state->flowRightToLeft) { PFreal ftick = (pos * PFREAL_ONE) >> 16; state->leftSlides[0].angle = (pos * state->angle) >> 16; state->leftSlides[0].cx = -fmul(state->offsetX, ftick); state->leftSlides[0].cy = fmul(state->offsetY, ftick); } + else if(step < 0) + { + PFreal ftick = (pos * PFREAL_ONE) >> 16; + state->rightSlides[0].angle = -(pos * state->angle) >> 16; + state->rightSlides[0].cx = fmul(state->offsetX, ftick); + state->rightSlides[0].cy = fmul(state->offsetY, ftick); + } + else + { + PFreal ftick = (neg * PFREAL_ONE) >> 16; + state->leftSlides[0].angle = (neg * state->angle) >> 16; + state->leftSlides[0].cx = -fmul(state->offsetX, ftick); + state->leftSlides[0].cy = fmul(state->offsetY, ftick); + } // must change direction ? if(target < index) if(step > 0) @@ -1053,6 +1099,13 @@ void PictureFlow::setReflectionEffect(ReflectionEffect effect) triggerRender(); } +void PictureFlow::setFlowRightToLeft(bool b) +{ + d->state->flowRightToLeft = b; + d->state->reset(); + triggerRender(); +} + QImage PictureFlow::slide(int index) const { QImage* i = 0; @@ -1225,7 +1278,8 @@ void PictureFlow::showSlide(unsigned int index) void PictureFlow::keyPressEvent(QKeyEvent* event) { - if(event->key() == Qt::Key_Left) + if((event->key() == Qt::Key_Left && !(d->state->flowRightToLeft)) + || (event->key() == Qt::Key_Right && d->state->flowRightToLeft)) { /*if(event->modifiers() == Qt::ControlModifier) showSlide(centerIndex()-10); @@ -1235,7 +1289,8 @@ void PictureFlow::keyPressEvent(QKeyEvent* event) return; } - if(event->key() == Qt::Key_Right) + if((event->key() == Qt::Key_Right && !(d->state->flowRightToLeft)) + || (event->key() == Qt::Key_Left && d->state->flowRightToLeft)) { /*if(event->modifiers() == Qt::ControlModifier) showSlide(centerIndex()+10); @@ -1256,10 +1311,19 @@ void PictureFlow::keyPressEvent(QKeyEvent* event) void PictureFlow::mousePressEvent(QMouseEvent* event) { - if(event->x() > width()/2) + mousePressEvent(event, 0); +} + +void PictureFlow::mousePressEvent(QMouseEvent* event, int slideWidth) +{ + if((event->x() > (width() + slideWidth)/2 && !(d->state->flowRightToLeft)) + || (event->x() < (width() - slideWidth)/2 && d->state->flowRightToLeft)) showNext(); - else - showPrevious(); + else if((event->x() < (width() - slideWidth)/2 && !(d->state->flowRightToLeft)) + || (event->x() > (width() + slideWidth)/2 && d->state->flowRightToLeft)) + showPrevious(); + + //else (centered slide space) } void PictureFlow::paintEvent(QPaintEvent* event) diff --git a/common/pictureflow.h b/common/pictureflow.h index 0ac197d4..df071d2a 100644 --- a/common/pictureflow.h +++ b/common/pictureflow.h @@ -119,7 +119,12 @@ public: */ void setReflectionEffect(ReflectionEffect effect); + /*! + Sets the flow direction right-to-left (manga mode) + */ + void setFlowRightToLeft(bool b); + public slots: /*! @@ -213,6 +218,7 @@ public: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent* event); void mousePressEvent(QMouseEvent* event); + void mousePressEvent(QMouseEvent* event, int slideWidth); void resizeEvent(QResizeEvent* event); private slots: diff --git a/custom_widgets/yacreader_flow.cpp b/custom_widgets/yacreader_flow.cpp index e40507d3..7da4715f 100644 --- a/custom_widgets/yacreader_flow.cpp +++ b/custom_widgets/yacreader_flow.cpp @@ -7,12 +7,7 @@ YACReaderFlow::YACReaderFlow(QWidget * parent,FlowType flowType) : PictureFlow(p void YACReaderFlow::mousePressEvent(QMouseEvent* event) { - if(event->x() > (width()+slideSize().width())/2) - showNext(); - else - if(event->x() < (width()-slideSize().width())/2) - showPrevious(); - //else (centered cover space) + PictureFlow::mousePressEvent(event, slideSize().width()); } void YACReaderFlow::mouseDoubleClickEvent(QMouseEvent* event) diff --git a/shortcuts_management/shortcuts_manager.h b/shortcuts_management/shortcuts_manager.h index 24aa40ef..7997a4f2 100644 --- a/shortcuts_management/shortcuts_manager.h +++ b/shortcuts_management/shortcuts_manager.h @@ -125,6 +125,10 @@ public: //viewer #define AUTO_SCROLL_FORWARD_ACTION_Y "AUTO_SCROLL_FORWARD_ACTION_Y" #define AUTO_SCROLL_BACKWARD_ACTION_Y "AUTO_SCROLL_BACKWARD_ACTION_Y" +#define AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y "AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y" +#define AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y "AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y" +#define AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y "AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y" +#define AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y "AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y" #define MOVE_DOWN_ACTION_Y "MOVE_DOWN_ACTION_Y" #define MOVE_UP_ACTION_Y "MOVE_UP_ACTION_Y" #define MOVE_LEFT_ACTION_Y "MOVE_LEFT_ACTION_Y"