mirror of
https://github.com/YACReader/yacreader
synced 2025-07-19 13:34:44 -04:00
modificados los iconos del input de b?squeda
modificado el estilo de las titled toolbars
This commit is contained in:
BIN
YACReader/YACReader.icns
Normal file
BIN
YACReader/YACReader.icns
Normal file
Binary file not shown.
118
YACReader/YACReader.pro
Normal file
118
YACReader/YACReader.pro
Normal file
@ -0,0 +1,118 @@
|
||||
# #####################################################################
|
||||
# Automatically generated by qmake (2.01a) mi<EFBFBD> 8. oct 20:54:05 2008
|
||||
# #####################################################################
|
||||
TEMPLATE = app
|
||||
TARGET =
|
||||
DEPENDPATH += . \
|
||||
release
|
||||
INCLUDEPATH += .
|
||||
INCLUDEPATH += ../common \
|
||||
../custom_widgets
|
||||
|
||||
win32 {
|
||||
INCLUDEPATH += ../dependencies/poppler/include
|
||||
LIBS += -L../dependencies/poppler/lib -lpoppler-qt4
|
||||
QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT /GL
|
||||
QMAKE_LFLAGS_RELEASE += /LTCG
|
||||
CONFIG -= embed_manifest_exe
|
||||
}
|
||||
|
||||
unix:!macx{
|
||||
INCLUDEPATH += /usr/include/poppler/qt4
|
||||
LIBS += -L/usr/lib -lpoppler-qt4
|
||||
LIBS += -lGLU
|
||||
}
|
||||
|
||||
macx{
|
||||
#INCLUDEPATH += "/Volumes/Mac OS X Lion/usr/X11/include"
|
||||
INCLUDEPATH += /usr/local/include/poppler/qt4
|
||||
LIBS += -L/usr/local/lib -lpoppler-qt4
|
||||
}
|
||||
|
||||
QT += network webkit phonon opengl
|
||||
CONFIG += release
|
||||
CONFIG -= flat
|
||||
|
||||
# Input
|
||||
HEADERS += comic.h \
|
||||
configuration.h \
|
||||
goto_dialog.h \
|
||||
magnifying_glass.h \
|
||||
main_window_viewer.h \
|
||||
viewer.h \
|
||||
goto_flow.h \
|
||||
options_dialog.h \
|
||||
bookmarks.h \
|
||||
bookmarks_dialog.h \
|
||||
render.h \
|
||||
shortcuts_dialog.h \
|
||||
translator.h \
|
||||
goto_flow_gl.h \
|
||||
goto_flow_widget.h \
|
||||
page_label_widget.h \
|
||||
goto_flow_toolbar.h \
|
||||
goto_flow_decorationbar.h \
|
||||
width_slider.h \
|
||||
notifications_label_widget.h \
|
||||
../common/pictureflow.h \
|
||||
../common/custom_widgets.h \
|
||||
../common/check_new_version.h \
|
||||
../common/qnaturalsorting.h \
|
||||
../common/yacreader_flow_gl.h \
|
||||
../common/yacreader_global.h \
|
||||
../common/onstart_flow_selection_dialog.h \
|
||||
../common/comic_db.h \
|
||||
../common/folder.h \
|
||||
../common/library_item.h \
|
||||
yacreader_local_client.h
|
||||
|
||||
SOURCES += comic.cpp \
|
||||
configuration.cpp \
|
||||
goto_dialog.cpp \
|
||||
magnifying_glass.cpp \
|
||||
main.cpp \
|
||||
main_window_viewer.cpp \
|
||||
viewer.cpp \
|
||||
goto_flow.cpp \
|
||||
options_dialog.cpp \
|
||||
bookmarks.cpp \
|
||||
bookmarks_dialog.cpp \
|
||||
render.cpp \
|
||||
shortcuts_dialog.cpp \
|
||||
translator.cpp \
|
||||
goto_flow_gl.cpp \
|
||||
goto_flow_widget.cpp \
|
||||
page_label_widget.cpp \
|
||||
goto_flow_toolbar.cpp \
|
||||
goto_flow_decorationbar.cpp \
|
||||
width_slider.cpp \
|
||||
notifications_label_widget.cpp \
|
||||
../common/pictureflow.cpp \
|
||||
../common/custom_widgets.cpp \
|
||||
../common/check_new_version.cpp \
|
||||
../common/qnaturalsorting.cpp \
|
||||
../common/yacreader_flow_gl.cpp \
|
||||
../common/onstart_flow_selection_dialog.cpp \
|
||||
../common/comic_db.cpp \
|
||||
../common/folder.cpp \
|
||||
../common/library_item.cpp \
|
||||
yacreader_local_client.cpp
|
||||
|
||||
include(../custom_widgets/custom_widgets.pri)
|
||||
|
||||
RESOURCES += images.qrc \
|
||||
files.qrc
|
||||
RC_FILE = icon.rc
|
||||
|
||||
macx {
|
||||
ICON = YACReader.icns
|
||||
}
|
||||
|
||||
TRANSLATIONS = yacreader_es.ts \
|
||||
yacreader_fr.ts \
|
||||
yacreader_ru.ts \
|
||||
yacreader_pt.ts \
|
||||
FORMS +=
|
||||
|
||||
Release:DESTDIR = ../release
|
||||
Debug:DESTDIR = ../debug
|
159
YACReader/bookmarks.cpp
Normal file
159
YACReader/bookmarks.cpp
Normal file
@ -0,0 +1,159 @@
|
||||
#include "bookmarks.h"
|
||||
#include <QFile>
|
||||
#include <QDataStream>
|
||||
#include <QCoreApplication>
|
||||
#include <QFileInfo>
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
#define NUM_BOOKMARKS 250
|
||||
|
||||
Bookmarks::Bookmarks()
|
||||
:lastPageIndex(0)
|
||||
{
|
||||
list.load();
|
||||
}
|
||||
void Bookmarks::setLastPage(int index,const QImage & page)
|
||||
{
|
||||
lastPageIndex = index;
|
||||
lastPage = page;
|
||||
}
|
||||
void Bookmarks::setBookmark(int index,const QImage & page)
|
||||
{
|
||||
if(!bookmarks.contains(index))
|
||||
{
|
||||
bookmarks.insert(index,page);
|
||||
latestBookmarks.push_front(index);
|
||||
if(latestBookmarks.count()>3)
|
||||
{
|
||||
bookmarks.remove(latestBookmarks.back());
|
||||
latestBookmarks.pop_back();
|
||||
}
|
||||
}
|
||||
else //udate de pixmap;
|
||||
{
|
||||
bookmarks[index]=page;
|
||||
}
|
||||
}
|
||||
|
||||
void Bookmarks::removeBookmark(int index)
|
||||
{
|
||||
bookmarks.remove(index);
|
||||
}
|
||||
|
||||
QList<int> Bookmarks::getBookmarkPages() const
|
||||
{
|
||||
return bookmarks.keys();
|
||||
}
|
||||
|
||||
QImage Bookmarks::getBookmarkPixmap(int page) const
|
||||
{
|
||||
return bookmarks.value(page);
|
||||
}
|
||||
|
||||
QImage Bookmarks::getLastPagePixmap() const
|
||||
{
|
||||
return lastPage;
|
||||
}
|
||||
|
||||
int Bookmarks::getLastPage() const
|
||||
{
|
||||
return lastPageIndex;
|
||||
}
|
||||
|
||||
|
||||
bool Bookmarks::isBookmark(int page)
|
||||
{
|
||||
return bookmarks.contains(page);
|
||||
}
|
||||
|
||||
bool Bookmarks::imageLoaded(int page)
|
||||
{
|
||||
return !bookmarks.value(page).isNull();
|
||||
}
|
||||
|
||||
void Bookmarks::newComic(const QString & path)
|
||||
{
|
||||
QFileInfo f(path);
|
||||
QString comicID = f.fileName().toLower()+QString::number(f.size());
|
||||
clear();
|
||||
BookmarksList::Bookmark b = list.get(comicID);
|
||||
comicPath=comicID;
|
||||
lastPageIndex = b.lastPage;
|
||||
latestBookmarks = b.bookmarks;
|
||||
for(int i=0;i<latestBookmarks.count();i++)
|
||||
bookmarks.insert(latestBookmarks.at(i),QImage());
|
||||
added = b.added;
|
||||
|
||||
}
|
||||
void Bookmarks::clear()
|
||||
{
|
||||
bookmarks.clear();
|
||||
latestBookmarks.clear();
|
||||
lastPageIndex=0;
|
||||
lastPage = QImage();
|
||||
}
|
||||
|
||||
void Bookmarks::save()
|
||||
{
|
||||
BookmarksList::Bookmark b;
|
||||
b.lastPage = lastPageIndex;
|
||||
b.bookmarks = getBookmarkPages();
|
||||
|
||||
BookmarksList::Bookmark previousBookmarks;
|
||||
bool updated = ((previousBookmarks.lastPage != b.lastPage) || (previousBookmarks.bookmarks != b.bookmarks));
|
||||
|
||||
if(b.added.isNull() || updated)
|
||||
b.added = QDateTime::currentDateTime();
|
||||
list.add(comicPath,b);
|
||||
list.save();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void BookmarksList::load()
|
||||
{
|
||||
QFile f(QCoreApplication::applicationDirPath()+"/bookmarks.yacr");
|
||||
if(f.open(QIODevice::ReadOnly))
|
||||
{
|
||||
QDataStream dataS(&f);
|
||||
dataS >> list;
|
||||
f.close();
|
||||
}
|
||||
}
|
||||
|
||||
void BookmarksList::save()
|
||||
{
|
||||
QFile f(QCoreApplication::applicationDirPath()+"/bookmarks.yacr");
|
||||
f.open(QIODevice::WriteOnly);
|
||||
QDataStream dataS(&f);
|
||||
if(list.count()>NUM_BOOKMARKS)
|
||||
deleteOldest(list.count()-NUM_BOOKMARKS);
|
||||
dataS << list;
|
||||
f.close();
|
||||
}
|
||||
|
||||
|
||||
void BookmarksList::deleteOldest(int num)
|
||||
{
|
||||
QString comic;
|
||||
QDateTime date(QDate(10000,1,1));//TODO MAX_DATE??
|
||||
for(QMap<QString,Bookmark>::const_iterator itr=list.begin();itr!=list.end();itr++)
|
||||
{
|
||||
if(itr->added<date)
|
||||
{
|
||||
comic=itr.key();
|
||||
date = itr->added;
|
||||
}
|
||||
}
|
||||
list.remove(comic);
|
||||
}
|
||||
|
||||
void BookmarksList::add(const QString & comicID, const Bookmark & b)
|
||||
{
|
||||
list.insert(comicID,b);
|
||||
}
|
||||
|
||||
BookmarksList::Bookmark BookmarksList::get(const QString & comicID)
|
||||
{
|
||||
//if(list.contains(comicID)
|
||||
return list.value(comicID);
|
||||
}
|
77
YACReader/bookmarks.h
Normal file
77
YACReader/bookmarks.h
Normal file
@ -0,0 +1,77 @@
|
||||
#ifndef BOOKMARKS_H
|
||||
#define BOOKMARKS_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QMap>
|
||||
#include <QImage>
|
||||
#include <QString>
|
||||
#include <QMap>
|
||||
#include <QDateTime>
|
||||
class BookmarksList
|
||||
{
|
||||
public:
|
||||
struct Bookmark {
|
||||
int lastPage;
|
||||
QList<int> bookmarks;
|
||||
QDateTime added;
|
||||
Bookmark():lastPage(0){};
|
||||
friend QDataStream & operator<< ( QDataStream & out, const Bookmark & bm )
|
||||
{
|
||||
out << bm.lastPage;
|
||||
out << bm.bookmarks;
|
||||
out << bm.added;
|
||||
return out;
|
||||
}
|
||||
friend QDataStream & operator>> ( QDataStream & in, Bookmark & bm )
|
||||
{
|
||||
in >> bm.lastPage;
|
||||
in >> bm.bookmarks;
|
||||
in >> bm.added;
|
||||
return in;
|
||||
}
|
||||
|
||||
};
|
||||
BookmarksList(){}
|
||||
void load();
|
||||
void save();
|
||||
void add(const QString & comicID, const Bookmark & b);
|
||||
Bookmark get(const QString & comicID);
|
||||
protected:
|
||||
QMap<QString,Bookmark> list;
|
||||
void deleteOldest(int num);
|
||||
|
||||
};
|
||||
|
||||
class Bookmarks : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
protected:
|
||||
QString comicPath;
|
||||
//bookmarks setted by the user
|
||||
QMap<int,QImage> bookmarks;
|
||||
QList<int> latestBookmarks;
|
||||
//last page readed
|
||||
int lastPageIndex;
|
||||
QImage lastPage;
|
||||
BookmarksList list;
|
||||
QDateTime added;
|
||||
|
||||
public:
|
||||
Bookmarks();
|
||||
void setLastPage(int index,const QImage & page);
|
||||
void setBookmark(int index,const QImage & page);
|
||||
void removeBookmark(int index);
|
||||
QList<int> getBookmarkPages() const;
|
||||
QImage getBookmarkPixmap(int page) const;
|
||||
QImage getLastPagePixmap() const;
|
||||
int getLastPage() const;
|
||||
bool isBookmark(int page);
|
||||
bool imageLoaded(int page);
|
||||
void newComic(const QString & path);
|
||||
void clear();
|
||||
void save();
|
||||
|
||||
};
|
||||
|
||||
#endif // BOOKMARKS_H
|
182
YACReader/bookmarks_dialog.cpp
Normal file
182
YACReader/bookmarks_dialog.cpp
Normal file
@ -0,0 +1,182 @@
|
||||
#include "bookmarks_dialog.h"
|
||||
|
||||
#include <QGridLayout>
|
||||
#include <QLabel>
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
#include <QFrame>
|
||||
#include <QImage>
|
||||
|
||||
#include "bookmarks.h"
|
||||
|
||||
BookmarksDialog::BookmarksDialog(QWidget * parent)
|
||||
:QDialog(parent,Qt::FramelessWindowHint)
|
||||
{
|
||||
setModal(true);
|
||||
|
||||
animation = new QPropertyAnimation(this,"windowOpacity");
|
||||
animation->setDuration(150);
|
||||
|
||||
QHBoxLayout * layout = new QHBoxLayout();
|
||||
|
||||
//bookmarks
|
||||
QGridLayout * bookmarksL = new QGridLayout();
|
||||
|
||||
pages.push_back(new QLabel(tr("Lastest Page")));
|
||||
for(int i=0;i<3;i++)
|
||||
pages.push_back(new QLabel("-"));
|
||||
|
||||
int heightDesktopResolution = QApplication::desktop()->screenGeometry().height();
|
||||
int height,width;
|
||||
height = heightDesktopResolution*0.50;
|
||||
width = height*0.65;
|
||||
|
||||
coverSize = QSize(width,height);
|
||||
|
||||
for(int i=0;i<4;i++)
|
||||
{
|
||||
QLabel * l = new QLabel();
|
||||
l->setFixedSize(coverSize);
|
||||
l->setScaledContents(false);
|
||||
//l->setPixmap(QPixmap(":/images/notCover.png"));
|
||||
l->installEventFilter(this);
|
||||
images.push_back(l);
|
||||
}
|
||||
|
||||
for(int i=0;i<3;i++)
|
||||
bookmarksL->addWidget(pages.at(i+1),0,i,Qt::AlignCenter);
|
||||
|
||||
for(int i=0;i<3;i++)
|
||||
bookmarksL->addWidget(images.at(i+1),1,i,Qt::AlignCenter);
|
||||
|
||||
|
||||
//last page
|
||||
QGridLayout * lp = new QGridLayout();
|
||||
lp->addWidget(pages.at(0),0,0,Qt::AlignCenter);
|
||||
lp->addWidget(images.at(0),1,0,Qt::AlignCenter);
|
||||
|
||||
layout->addLayout(bookmarksL);
|
||||
QFrame *f = new QFrame( this );
|
||||
f->setFrameStyle( QFrame::VLine | QFrame::Sunken );
|
||||
layout->addWidget(f);
|
||||
layout->addLayout(lp);
|
||||
|
||||
QHBoxLayout * buttons = new QHBoxLayout();
|
||||
|
||||
cancel = new QPushButton(tr("Close"));
|
||||
cancel->setFlat(true);
|
||||
connect(cancel,SIGNAL(clicked()),this,SLOT(hide()));
|
||||
buttons->addStretch();
|
||||
buttons->addWidget(cancel);
|
||||
|
||||
QVBoxLayout * l = new QVBoxLayout();
|
||||
|
||||
l->addWidget(new QLabel(tr("Click on any image to go to the bookmark")),0,Qt::AlignCenter);
|
||||
l->addLayout(layout);
|
||||
l->addLayout(buttons);
|
||||
|
||||
this->setPalette(QPalette(QColor(25,25,25)));
|
||||
//this->setAutoFillBackground(true);
|
||||
setLayout(l);
|
||||
}
|
||||
|
||||
void BookmarksDialog::setBookmarks(const Bookmarks & bm)
|
||||
{
|
||||
lastPage = bm.getLastPage();
|
||||
if (lastPage > 0)
|
||||
{
|
||||
QPixmap p = QPixmap::fromImage(bm.getLastPagePixmap());
|
||||
if(p.isNull())
|
||||
{
|
||||
images.at(0)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||
images.at(0)->setText(tr("Loading..."));
|
||||
}
|
||||
else
|
||||
{
|
||||
images.at(0)->setAlignment(Qt::AlignHCenter|Qt::AlignBottom);
|
||||
images.at(0)->setPixmap(p.scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
images.at(0)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||
images.at(0)->setPixmap(QPixmap(":/images/notCover.png").scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation));
|
||||
|
||||
}
|
||||
|
||||
QList<int> l = bm.getBookmarkPages();
|
||||
int s = l.count();
|
||||
for(int i=0;i<s;i++)
|
||||
{
|
||||
pages.at(i+1)->setText(QString::number(l.at(i)+1));
|
||||
QPixmap p = QPixmap::fromImage(bm.getBookmarkPixmap(l.at(i)));
|
||||
if(p.isNull())
|
||||
{
|
||||
images.at(i+1)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||
images.at(i+1)->setText(tr("Loading..."));
|
||||
}
|
||||
else
|
||||
{
|
||||
images.at(i+1)->setAlignment(Qt::AlignHCenter|Qt::AlignBottom);
|
||||
images.at(i+1)->setPixmap(p.scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation));
|
||||
}
|
||||
}
|
||||
for(int i=s;i<3;i++)
|
||||
{
|
||||
pages.at(i+1)->setText("-");
|
||||
images.at(i+1)->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||
images.at(i+1)->setPixmap(QPixmap(":/images/notCover.png").scaled(coverSize,Qt::KeepAspectRatio,Qt::SmoothTransformation));
|
||||
}
|
||||
}
|
||||
|
||||
bool BookmarksDialog::eventFilter(QObject *obj, QEvent *event)
|
||||
{
|
||||
if(event->type() == QEvent::MouseButtonPress)
|
||||
{
|
||||
if (obj == images.at(0))
|
||||
{
|
||||
emit(goToPage(lastPage));
|
||||
close();
|
||||
event->accept();
|
||||
}
|
||||
for(int i=1;i<=3;i++)
|
||||
{
|
||||
if(obj == images.at(i))
|
||||
{
|
||||
bool b;
|
||||
int page = pages.at(i)->text().toInt(&b)-1;
|
||||
if(b)
|
||||
{
|
||||
emit(goToPage(page));
|
||||
close();
|
||||
}
|
||||
event->accept();
|
||||
}
|
||||
}
|
||||
}
|
||||
// pass the event on to the parent class
|
||||
return QDialog::eventFilter(obj, event);
|
||||
}
|
||||
|
||||
void BookmarksDialog::keyPressEvent(QKeyEvent * event)
|
||||
{
|
||||
if(event->key() == Qt::Key_M)
|
||||
hide();
|
||||
}
|
||||
|
||||
void BookmarksDialog::show()
|
||||
{
|
||||
QDialog::show();
|
||||
disconnect(animation,SIGNAL(finished()),this,SLOT(close()));
|
||||
animation->setStartValue(0);
|
||||
animation->setEndValue(1);
|
||||
animation->start();
|
||||
}
|
||||
|
||||
void BookmarksDialog::hide()
|
||||
{
|
||||
connect(animation,SIGNAL(finished()),this,SLOT(close()));
|
||||
animation->setStartValue(1);
|
||||
animation->setEndValue(0);
|
||||
animation->start();
|
||||
}
|
45
YACReader/bookmarks_dialog.h
Normal file
45
YACReader/bookmarks_dialog.h
Normal file
@ -0,0 +1,45 @@
|
||||
#ifndef __BOOKMARKS_DIALOG_H
|
||||
#define __BOOKMARKS_DIALOG_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QDialog>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QEvent>
|
||||
#include <QKeyEvent>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
#include "bookmarks.h"
|
||||
|
||||
class BookmarksDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
protected:
|
||||
QList<QLabel *> pages;
|
||||
QList<QLabel *> images;
|
||||
|
||||
int lastPage;
|
||||
|
||||
QPushButton * accept;
|
||||
QPushButton * cancel;
|
||||
|
||||
QSize coverSize;
|
||||
|
||||
bool eventFilter(QObject *obj, QEvent *event);
|
||||
void keyPressEvent(QKeyEvent * event);
|
||||
QPropertyAnimation * animation;
|
||||
|
||||
public:
|
||||
BookmarksDialog(QWidget * parent = 0);
|
||||
|
||||
public slots:
|
||||
void setBookmarks(const Bookmarks & bookmarks);
|
||||
void show();
|
||||
void hide();
|
||||
|
||||
signals:
|
||||
void goToPage(unsigned int page);
|
||||
};
|
||||
|
||||
#endif // BOOKMARKS_DIALOG_H
|
488
YACReader/comic.cpp
Normal file
488
YACReader/comic.cpp
Normal file
@ -0,0 +1,488 @@
|
||||
#include "comic.h"
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QRegExp>
|
||||
#include <QString>
|
||||
#include <algorithm>
|
||||
#include <QDir>
|
||||
#include <QFileInfoList>
|
||||
#include "bookmarks.h" //TODO desacoplar la dependencia con bookmarks
|
||||
#include "qnaturalsorting.h"
|
||||
|
||||
#define EXTENSIONS << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
Comic::Comic()
|
||||
:_pages(),_index(0),_path(),_loaded(false),bm(new Bookmarks()),_loadedPages(),_isPDF(false)
|
||||
{
|
||||
setup();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
Comic::Comic(const QString & pathFile)
|
||||
:_pages(),_index(0),_path(pathFile),_loaded(false),bm(new Bookmarks()),_loadedPages(),_isPDF(false)
|
||||
{
|
||||
setup();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
Comic::~Comic()
|
||||
{
|
||||
delete bm; //TODO safe delete
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::setup()
|
||||
{
|
||||
connect(this,SIGNAL(pageChanged(int)),this,SLOT(checkIsBookmark(int)));
|
||||
connect(this,SIGNAL(imageLoaded(int)),this,SLOT(updateBookmarkImage(int)));
|
||||
connect(this,SIGNAL(imageLoaded(int)),this,SLOT(setPageLoaded(int)));
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
int Comic::nextPage()
|
||||
{
|
||||
if(_index<_pages.size()-1)
|
||||
{
|
||||
_index++;
|
||||
|
||||
emit pageChanged(_index);
|
||||
}
|
||||
else
|
||||
emit isLast();
|
||||
return _index;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
int Comic::previousPage()
|
||||
{
|
||||
if(_index>0)
|
||||
{
|
||||
_index--;
|
||||
|
||||
emit pageChanged(_index);
|
||||
}
|
||||
else
|
||||
emit isCover();
|
||||
|
||||
return _index;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::setIndex(unsigned int index)
|
||||
{
|
||||
int previousIndex = _index;
|
||||
if(static_cast<int>(index)<_pages.size()-1)
|
||||
_index = index;
|
||||
else
|
||||
_index = _pages.size()-1;
|
||||
|
||||
if(previousIndex != _index)
|
||||
emit pageChanged(_index);
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
/*QPixmap * Comic::currentPage()
|
||||
{
|
||||
QPixmap * p = new QPixmap();
|
||||
p->loadFromData(_pages[_index]);
|
||||
return p;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
QPixmap * Comic::operator[](unsigned int index)
|
||||
{
|
||||
QPixmap * p = new QPixmap();
|
||||
p->loadFromData(_pages[index]);
|
||||
return p;
|
||||
}*/
|
||||
//-----------------------------------------------------------------------------
|
||||
bool Comic::loaded()
|
||||
{
|
||||
return _loaded;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::loadFinished()
|
||||
{
|
||||
emit imagesLoaded();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::setBookmark()
|
||||
{
|
||||
QImage p;
|
||||
p.loadFromData(_pages[_index]);
|
||||
bm->setBookmark(_index,p);
|
||||
//emit bookmarksLoaded(*bm);
|
||||
emit bookmarksUpdated();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::removeBookmark()
|
||||
{
|
||||
bm->removeBookmark(_index);
|
||||
//emit bookmarksLoaded(*bm);
|
||||
emit bookmarksUpdated();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::saveBookmarks()
|
||||
{
|
||||
QImage p;
|
||||
p.loadFromData(_pages[_index]);
|
||||
bm->setLastPage(_index,p);
|
||||
bm->save();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::checkIsBookmark(int index)
|
||||
{
|
||||
emit isBookmark(bm->isBookmark(index));
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::updateBookmarkImage(int index)
|
||||
{
|
||||
if(bm->isBookmark(index))
|
||||
{
|
||||
QImage p;
|
||||
p.loadFromData(_pages[index]);
|
||||
bm->setBookmark(index,p);
|
||||
emit bookmarksUpdated();
|
||||
//emit bookmarksLoaded(*bm);
|
||||
|
||||
}
|
||||
if(bm->getLastPage() == index)
|
||||
{
|
||||
QImage p;
|
||||
p.loadFromData(_pages[index]);
|
||||
bm->setLastPage(index,p);
|
||||
emit bookmarksUpdated();
|
||||
//emit bookmarksLoaded(*bm);
|
||||
}
|
||||
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void Comic::setPageLoaded(int page)
|
||||
{
|
||||
_loadedPages[page] = true;
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
QByteArray Comic::getRawPage(int page)
|
||||
{
|
||||
if(page < 0 || page >= _pages.size())
|
||||
return QByteArray();
|
||||
return _pages[page];
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
bool Comic::pageIsLoaded(int page)
|
||||
{
|
||||
if(page < 0 || page >= _pages.size())
|
||||
return false;
|
||||
return _loadedPages[page];
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
FileComic::FileComic()
|
||||
:Comic()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
FileComic::FileComic(const QString & path)
|
||||
:Comic(path)
|
||||
{
|
||||
load(path);
|
||||
}
|
||||
|
||||
FileComic::~FileComic()
|
||||
{
|
||||
//Comic::~Comic();
|
||||
}
|
||||
|
||||
bool FileComic::load(const QString & path)
|
||||
{
|
||||
QFileInfo fi(path);
|
||||
|
||||
if(fi.exists())
|
||||
{
|
||||
bm->newComic(path);
|
||||
emit bookmarksUpdated();
|
||||
//emit bookmarksLoaded(*bm);
|
||||
|
||||
_path = QDir::cleanPath(path);
|
||||
//load files size
|
||||
_7z = new QProcess();
|
||||
QStringList attributes;
|
||||
attributes << "l" << "-ssc-" << "-r" << _path EXTENSIONS;
|
||||
connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(loadSizes(void)));
|
||||
connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SLOT(openingError(QProcess::ProcessError)));
|
||||
_7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes);
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::critical(NULL,tr("Not found"),tr("Comic not found"));
|
||||
emit errorOpening();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void FileComic::loadSizes()
|
||||
{
|
||||
QRegExp rx("[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]+[0-9]{2}:[0-9]{2}:[0-9]{2}[ ]+.{5}[ ]+([0-9]+)[ ]+([0-9]+)[ ]+(.+)");
|
||||
|
||||
QByteArray ba = _7z->readAllStandardOutput();
|
||||
QList<QByteArray> lines = ba.split('\n');
|
||||
QByteArray line;
|
||||
QString name;
|
||||
foreach(line,lines)
|
||||
{
|
||||
if(rx.indexIn(QString(line))!=-1)
|
||||
{
|
||||
_sizes.push_back(rx.cap(1).toInt());
|
||||
name = rx.cap(3).trimmed();
|
||||
_order.push_back(name);
|
||||
_fileNames.push_back(name);
|
||||
}
|
||||
}
|
||||
if(_sizes.size()==0)
|
||||
{
|
||||
QMessageBox::critical(NULL,tr("File error"),tr("File not found or not images in file"));
|
||||
emit errorOpening();
|
||||
return;
|
||||
}
|
||||
_pages.resize(_sizes.size());
|
||||
_loadedPages = QVector<bool>(_sizes.size(),false);
|
||||
|
||||
emit pageChanged(0); // this indicates new comic, index=0
|
||||
emit numPages(_pages.size());
|
||||
_loaded = true;
|
||||
|
||||
_cfi=0;
|
||||
qSort(_fileNames.begin(),_fileNames.end(), naturalSortLessThanCI);
|
||||
int i=0;
|
||||
foreach(name,_fileNames)
|
||||
{
|
||||
_newOrder.insert(name,i);
|
||||
i++;
|
||||
}
|
||||
_7ze = new QProcess();
|
||||
QStringList attributes;
|
||||
attributes << "e" << "-ssc-" << "-so" << "-r" << _path EXTENSIONS;
|
||||
connect(_7ze,SIGNAL(error(QProcess::ProcessError)),this,SLOT(openingError(QProcess::ProcessError)));
|
||||
connect(_7ze,SIGNAL(readyReadStandardOutput()),this,SLOT(loadImages(void)));
|
||||
connect(_7ze,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(loadFinished(void)));
|
||||
_7ze->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes);
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void FileComic::loadImages()
|
||||
{
|
||||
|
||||
QByteArray ba = _7ze->readAllStandardOutput();
|
||||
int s;
|
||||
int rigthIndex;
|
||||
while(ba.size()>0)
|
||||
{
|
||||
rigthIndex = _newOrder.value(_order[_cfi]);
|
||||
s = _pages[rigthIndex].size();
|
||||
_pages[rigthIndex].append(ba.left(_sizes[_cfi]-s));
|
||||
ba.remove(0,_sizes[_cfi]-s);
|
||||
if(_pages[rigthIndex].size()==static_cast<int>(_sizes[_cfi]))
|
||||
{
|
||||
emit imageLoaded(rigthIndex);
|
||||
emit imageLoaded(rigthIndex,_pages[rigthIndex]);
|
||||
_cfi++;
|
||||
}
|
||||
}
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
void FileComic::openingError(QProcess::ProcessError error)
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case QProcess::FailedToStart:
|
||||
QMessageBox::critical(NULL,tr("7z not found"),tr("7z wasn't found in your PATH."));
|
||||
break;
|
||||
case QProcess::Crashed:
|
||||
QMessageBox::critical(NULL,tr("7z crashed"),tr("7z crashed."));
|
||||
break;
|
||||
case QProcess::ReadError:
|
||||
QMessageBox::critical(NULL,tr("7z reading"),tr("problem reading from 7z"));
|
||||
break;
|
||||
case QProcess::UnknownError:
|
||||
QMessageBox::critical(NULL,tr("7z problem"),tr("Unknown error 7z"));
|
||||
break;
|
||||
default:
|
||||
//TODO
|
||||
break;
|
||||
}
|
||||
_loaded = false;
|
||||
emit errorOpening();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
FolderComic::FolderComic()
|
||||
:Comic()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
FolderComic::FolderComic(const QString & path)
|
||||
:Comic(path)
|
||||
{
|
||||
load(path);
|
||||
}
|
||||
|
||||
FolderComic::~FolderComic()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool FolderComic::load(const QString & path)
|
||||
{
|
||||
_path = path;
|
||||
bm->newComic(_path);
|
||||
emit bookmarksUpdated();
|
||||
//emit bookmarksLoaded(*bm);
|
||||
return true;
|
||||
}
|
||||
|
||||
void FolderComic::process()
|
||||
{
|
||||
QDir d(_path);
|
||||
QStringList l;
|
||||
l EXTENSIONS;
|
||||
d.setNameFilters(l);
|
||||
d.setFilter(QDir::Files|QDir::NoDotAndDotDot);
|
||||
//d.setSorting(QDir::Name|QDir::IgnoreCase|QDir::LocaleAware);
|
||||
QFileInfoList list = d.entryInfoList();
|
||||
|
||||
qSort(list.begin(),list.end(),naturalSortLessThanCIFileInfo);
|
||||
|
||||
int nPages = list.size();
|
||||
_pages.clear();
|
||||
_pages.resize(nPages);
|
||||
_loadedPages = QVector<bool>(nPages,false);
|
||||
if(nPages==0)
|
||||
{
|
||||
//TODO emitir este mensaje en otro sitio
|
||||
//QMessageBox::critical(NULL,QObject::tr("No images found"),QObject::tr("There are not images on the selected folder"));
|
||||
emit errorOpening();
|
||||
}
|
||||
else
|
||||
{
|
||||
emit pageChanged(0); // this indicates new comic, index=0
|
||||
emit numPages(_pages.size());
|
||||
_loaded = true;
|
||||
|
||||
for(int i=0;i<nPages;i++)
|
||||
{
|
||||
QFile f(list.at(i).absoluteFilePath());
|
||||
f.open(QIODevice::ReadOnly);
|
||||
_pages[i]=f.readAll();
|
||||
emit imageLoaded(i);
|
||||
emit imageLoaded(i,_pages[i]);
|
||||
}
|
||||
}
|
||||
emit imagesLoaded();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
PDFComic::PDFComic()
|
||||
:Comic()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PDFComic::PDFComic(const QString & path)
|
||||
:Comic(path)
|
||||
{
|
||||
load(path);
|
||||
}
|
||||
|
||||
PDFComic::~PDFComic()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool PDFComic::load(const QString & path)
|
||||
{
|
||||
_path = path;
|
||||
bm->newComic(_path);
|
||||
emit bookmarksUpdated();
|
||||
//emit bookmarksLoaded(*bm);
|
||||
return true;
|
||||
}
|
||||
|
||||
void PDFComic::process()
|
||||
{
|
||||
pdfComic = Poppler::Document::load(_path);
|
||||
if (!pdfComic)
|
||||
{
|
||||
delete pdfComic;
|
||||
pdfComic = 0;
|
||||
//TODO emitir este mensaje en otro sitio
|
||||
//QMessageBox::critical(NULL,QObject::tr("Bad PDF File"),QObject::tr("Invalid PDF file"));
|
||||
emit errorOpening();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//pdfComic->setRenderHint(Poppler::Document::Antialiasing, true);
|
||||
pdfComic->setRenderHint(Poppler::Document::TextAntialiasing, true);
|
||||
int nPages = pdfComic->numPages();
|
||||
emit pageChanged(0); // this indicates new comic, index=0
|
||||
emit numPages(nPages);
|
||||
_loaded = true;
|
||||
//QMessageBox::critical(NULL,QString("%1").arg(nPages),tr("Invalid PDF file"));
|
||||
|
||||
_pages.clear();
|
||||
_pages.resize(nPages);
|
||||
_loadedPages = QVector<bool>(nPages,false);
|
||||
for(int i=0;i<nPages;i++)
|
||||
{
|
||||
|
||||
Poppler::Page* pdfpage = pdfComic->page(i);
|
||||
if (pdfpage)
|
||||
{
|
||||
QImage img = pdfpage->renderToImage(150,150);
|
||||
delete pdfpage;
|
||||
QByteArray ba;
|
||||
QBuffer buf(&ba);
|
||||
img.save(&buf, "jpg");
|
||||
_pages[i] = ba;
|
||||
emit imageLoaded(i);
|
||||
emit imageLoaded(i,_pages[i]);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
delete pdfComic;
|
||||
emit imagesLoaded();
|
||||
}
|
||||
|
||||
|
||||
Comic * FactoryComic::newComic(const QString & path)
|
||||
{
|
||||
|
||||
QFileInfo fi(path);
|
||||
if(fi.exists())
|
||||
{
|
||||
if(fi.isFile())
|
||||
{
|
||||
if(fi.suffix().compare("pdf",Qt::CaseInsensitive) == 0)
|
||||
return new PDFComic();
|
||||
else
|
||||
return new FileComic();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(fi.isDir())
|
||||
return new FolderComic();
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
|
||||
}
|
142
YACReader/comic.h
Normal file
142
YACReader/comic.h
Normal file
@ -0,0 +1,142 @@
|
||||
#ifndef __COMIC_H
|
||||
#define __COMIC_H
|
||||
#include <QtCore>
|
||||
#include <QImage>
|
||||
#include <QtGui>
|
||||
#include <QByteArray>
|
||||
#include <QMap>
|
||||
|
||||
#include "bookmarks.h"
|
||||
|
||||
#include "poppler-qt4.h"
|
||||
|
||||
class Comic : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
protected:
|
||||
//Comic pages, one QPixmap for each file.
|
||||
QVector<QByteArray> _pages;
|
||||
QVector<bool> _loadedPages;
|
||||
QVector<uint> _sizes;
|
||||
QStringList _fileNames;
|
||||
QMap<QString,int> _newOrder;
|
||||
QVector<QString> _order;
|
||||
int _index;
|
||||
QString _path;
|
||||
bool _loaded;
|
||||
|
||||
int _cfi;
|
||||
|
||||
|
||||
|
||||
|
||||
bool _isPDF;
|
||||
public:
|
||||
Bookmarks * bm;
|
||||
|
||||
//Constructors
|
||||
Comic();
|
||||
Comic(const QString & pathFile);
|
||||
~Comic();
|
||||
void setup();
|
||||
//Load pages from file
|
||||
virtual bool load(const QString & path) = 0;
|
||||
|
||||
/*void loadFromFile(const QString & pathFile);
|
||||
void loadFromDir(const QString & pathDir);
|
||||
void loadFromPDF(const QString & pathPDF);*/
|
||||
int nextPage();
|
||||
int previousPage();
|
||||
void setIndex(unsigned int index);
|
||||
unsigned int getIndex(){return _index;};
|
||||
unsigned int numPages(){return _pages.size();}
|
||||
//QPixmap * currentPage();
|
||||
bool loaded();
|
||||
//QPixmap * operator[](unsigned int index);
|
||||
QVector<QByteArray> * getRawData(){return &_pages;};
|
||||
QByteArray getRawPage(int page);
|
||||
bool pageIsLoaded(int page);
|
||||
|
||||
public slots:
|
||||
void loadFinished();
|
||||
void setBookmark();
|
||||
void removeBookmark();
|
||||
void saveBookmarks();
|
||||
void checkIsBookmark(int index);
|
||||
void updateBookmarkImage(int);
|
||||
void setPageLoaded(int page);
|
||||
signals:
|
||||
void imagesLoaded();
|
||||
void imageLoaded(int index);
|
||||
void imageLoaded(int index,const QByteArray & image);
|
||||
void pageChanged(int index);
|
||||
void numPages(unsigned int numPages);
|
||||
void errorOpening();
|
||||
void isBookmark(bool);
|
||||
void bookmarksUpdated();
|
||||
void isCover();
|
||||
void isLast();
|
||||
|
||||
};
|
||||
|
||||
class FileComic : public Comic
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
QProcess * _7z;
|
||||
QProcess * _7ze;
|
||||
public:
|
||||
FileComic();
|
||||
FileComic(const QString & path);
|
||||
~FileComic();
|
||||
|
||||
virtual bool load(const QString & path);
|
||||
|
||||
public slots:
|
||||
void loadImages();
|
||||
void loadSizes();
|
||||
void openingError(QProcess::ProcessError error);
|
||||
};
|
||||
|
||||
class FolderComic : public Comic
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
//void run();
|
||||
public:
|
||||
FolderComic();
|
||||
FolderComic(const QString & path);
|
||||
~FolderComic();
|
||||
|
||||
virtual bool load(const QString & path);
|
||||
public slots:
|
||||
void process();
|
||||
|
||||
};
|
||||
|
||||
class PDFComic : public Comic
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
//pdf
|
||||
Poppler::Document * pdfComic;
|
||||
|
||||
//void run();
|
||||
public:
|
||||
PDFComic();
|
||||
PDFComic(const QString & path);
|
||||
~PDFComic();
|
||||
|
||||
virtual bool load(const QString & path);
|
||||
public slots:
|
||||
void process();
|
||||
};
|
||||
|
||||
class FactoryComic
|
||||
{
|
||||
public:
|
||||
static Comic * newComic(const QString & path);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
218
YACReader/configuration.cpp
Normal file
218
YACReader/configuration.cpp
Normal file
@ -0,0 +1,218 @@
|
||||
#include "configuration.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QCoreApplication>
|
||||
#include <QStringList>
|
||||
#include <QMessageBox>
|
||||
|
||||
Configuration::Configuration()
|
||||
{
|
||||
//read configuration
|
||||
//load("/YACReader.conf");
|
||||
}
|
||||
|
||||
Configuration::Configuration(const Configuration & conf)
|
||||
{
|
||||
//nothing
|
||||
}
|
||||
|
||||
void Configuration::load(QSettings * settings)
|
||||
{
|
||||
this->settings = settings;
|
||||
|
||||
//TODO set defaults
|
||||
if(!settings->contains(PATH))
|
||||
settings->setValue(PATH,".");
|
||||
if(!settings->contains(GO_TO_FLOW_SIZE))
|
||||
settings->setValue(GO_TO_FLOW_SIZE,QSize(126,200));
|
||||
if(!settings->contains(MAG_GLASS_SIZE))
|
||||
settings->setValue(MAG_GLASS_SIZE,QSize(350,175));
|
||||
if(!settings->contains(ZOOM_LEVEL))
|
||||
settings->setValue(MAG_GLASS_SIZE,QSize(350,175));
|
||||
if(!settings->contains(FIT))
|
||||
settings->setValue(FIT,true);
|
||||
if(!settings->contains(FLOW_TYPE))
|
||||
settings->setValue(FLOW_TYPE,0);
|
||||
if(!settings->contains(FULLSCREEN))
|
||||
settings->setValue(FULLSCREEN,false);
|
||||
if(!settings->contains(FIT_TO_WIDTH_RATIO))
|
||||
settings->setValue(FIT_TO_WIDTH_RATIO,1);
|
||||
if(!settings->contains(Y_WINDOW_SIZE))
|
||||
settings->setValue(Y_WINDOW_SIZE,QSize(0,0));
|
||||
if(!settings->contains(MAXIMIZED))
|
||||
settings->setValue(MAXIMIZED,false);
|
||||
if(!settings->contains(DOUBLE_PAGE))
|
||||
settings->setValue(DOUBLE_PAGE,false);
|
||||
if(!settings->contains(ADJUST_TO_FULL_SIZE))
|
||||
settings->setValue(ADJUST_TO_FULL_SIZE,false);
|
||||
if(!settings->contains(BACKGROUND_COLOR))
|
||||
settings->setValue(BACKGROUND_COLOR,QColor(0,0,0));
|
||||
if(!settings->contains(ALWAYS_ON_TOP))
|
||||
settings->setValue(ALWAYS_ON_TOP,false);
|
||||
if(!settings->contains(SHOW_TOOLBARS))
|
||||
settings->setValue(SHOW_TOOLBARS, true);
|
||||
}
|
||||
|
||||
void Configuration::load(const QString & path)
|
||||
{
|
||||
//load default configuration
|
||||
defaultPath = ".";
|
||||
magnifyingGlassSize = QSize(350,175);
|
||||
gotoSlideSize = QSize(126,200); //normal
|
||||
//gotoSlideSize = QSize(79,125); //small
|
||||
//gotoSlideSize = QSize(173,275); //big
|
||||
//gotoSlideSize = QSize(220,350); //huge
|
||||
zoomLevel = 0.5;
|
||||
adjustToWidth = true;
|
||||
flowType = Strip;
|
||||
fullScreen = false;
|
||||
fitToWidthRatio = 1;
|
||||
windowSize = QSize(0,0);
|
||||
maximized = false;
|
||||
doublePage = false;
|
||||
adjustToFullSize = false;
|
||||
backgroundColor = QColor(0,0,0);
|
||||
alwaysOnTop = false;
|
||||
|
||||
//load from file
|
||||
QFile f(QCoreApplication::applicationDirPath()+path);
|
||||
f.open(QIODevice::ReadOnly);
|
||||
QTextStream txtS(&f);
|
||||
QString content = txtS.readAll();
|
||||
QStringList lines = content.split('\n');
|
||||
QString line,name;
|
||||
int i=0;
|
||||
foreach(line,lines)
|
||||
{
|
||||
if((i%2)==0)
|
||||
{
|
||||
name = line.trimmed();
|
||||
}
|
||||
else
|
||||
{
|
||||
if(name==PATH)
|
||||
defaultPath = line.trimmed();
|
||||
else
|
||||
if(name==MAG_GLASS_SIZE)
|
||||
{
|
||||
QStringList values = line.split(',');
|
||||
magnifyingGlassSize = QSize(values[0].toInt(),values[1].toInt());
|
||||
}
|
||||
else
|
||||
if(name==ZOOM_LEVEL)
|
||||
zoomLevel = line.toFloat();
|
||||
else
|
||||
if(name==SLIDE_SIZE)
|
||||
{
|
||||
int height = line.toInt();
|
||||
gotoSlideSize = QSize(static_cast<int>(height/SLIDE_ASPECT_RATIO),height);
|
||||
}
|
||||
else
|
||||
if(name==FIT)
|
||||
adjustToWidth = line.toInt();
|
||||
else
|
||||
if(name==FLOW_TYPE)
|
||||
flowType = (FlowType)line.toInt();
|
||||
else
|
||||
if(name==FULLSCREEN)
|
||||
fullScreen = line.toInt();
|
||||
else
|
||||
if(name==FIT_TO_WIDTH_RATIO)
|
||||
fitToWidthRatio = line.toFloat();
|
||||
else
|
||||
if(name==Y_WINDOW_POS)
|
||||
{
|
||||
QStringList l = line.split(',');
|
||||
windowPos = QPoint(l[0].toInt(),l[1].toInt());
|
||||
}
|
||||
else
|
||||
if(name==Y_WINDOW_SIZE)
|
||||
{
|
||||
QStringList l = line.split(',');
|
||||
windowSize = QSize(l[0].toInt(),l[1].toInt());
|
||||
}
|
||||
else
|
||||
if(name==MAXIMIZED)
|
||||
maximized = line.toInt();
|
||||
else
|
||||
if(name==DOUBLE_PAGE)
|
||||
doublePage = line.toInt();
|
||||
else
|
||||
if(name==ADJUST_TO_FULL_SIZE)
|
||||
adjustToFullSize = line.toInt();
|
||||
else
|
||||
if(name==BACKGROUND_COLOR)
|
||||
{
|
||||
QStringList l = line.split(',');
|
||||
backgroundColor = QColor(l[0].toInt(),l[1].toInt(),l[2].toInt());
|
||||
}
|
||||
else
|
||||
if(name==ALWAYS_ON_TOP)
|
||||
alwaysOnTop = line.toInt();
|
||||
|
||||
|
||||
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void Configuration::save()
|
||||
{
|
||||
QFile f(QCoreApplication::applicationDirPath()+"/YACReader.conf");
|
||||
if(!f.open(QIODevice::WriteOnly))
|
||||
{
|
||||
QMessageBox::critical(NULL,tr("Saving config file...."),tr("There was a problem saving YACReader configuration. Please, check if you have enough permissions in the YACReader root folder."));
|
||||
}
|
||||
else
|
||||
{
|
||||
QTextStream txtS(&f);
|
||||
|
||||
txtS << PATH << "\n";
|
||||
txtS << defaultPath << "\n";
|
||||
|
||||
txtS << MAG_GLASS_SIZE << "\n";
|
||||
txtS << magnifyingGlassSize.width() <<","<< magnifyingGlassSize.height() << "\n";
|
||||
|
||||
txtS << ZOOM_LEVEL << "\n";
|
||||
txtS << zoomLevel << "\n";
|
||||
|
||||
txtS << SLIDE_SIZE << "\n";
|
||||
txtS << gotoSlideSize.height() << "\n";
|
||||
|
||||
txtS << FIT << "\n";
|
||||
txtS << (int)adjustToWidth << "\n";
|
||||
|
||||
txtS << FLOW_TYPE << "\n";
|
||||
txtS << (int)flowType << "\n";
|
||||
|
||||
txtS << FULLSCREEN << "\n";
|
||||
txtS << (int)fullScreen << "\n";
|
||||
|
||||
txtS << FIT_TO_WIDTH_RATIO << "\n";
|
||||
txtS << fitToWidthRatio << "\n";
|
||||
|
||||
txtS << Y_WINDOW_POS << "\n";
|
||||
txtS << windowPos.x() << "," << windowPos.y() << "\n";
|
||||
|
||||
txtS << Y_WINDOW_SIZE << "\n";
|
||||
txtS << windowSize.width() << "," << windowSize.height() << "\n";
|
||||
|
||||
txtS << MAXIMIZED << "\n";
|
||||
txtS << (int)maximized << "\n";
|
||||
|
||||
txtS << DOUBLE_PAGE << "\n";
|
||||
txtS << (int)doublePage << "\n";
|
||||
|
||||
txtS << ADJUST_TO_FULL_SIZE << "\n";
|
||||
txtS << (int) adjustToFullSize << "\n";
|
||||
|
||||
txtS << BACKGROUND_COLOR << "\n";
|
||||
txtS << backgroundColor.red() << "," << backgroundColor.green() << "," << backgroundColor.blue() << "\n";
|
||||
|
||||
txtS << ALWAYS_ON_TOP << "\n";
|
||||
txtS << (int)alwaysOnTop << "\n";
|
||||
}
|
||||
}
|
90
YACReader/configuration.h
Normal file
90
YACReader/configuration.h
Normal file
@ -0,0 +1,90 @@
|
||||
#ifndef __CONFIGURATION_H
|
||||
#define __CONFIGURATION_H
|
||||
#include <QString>
|
||||
#include <QSize>
|
||||
#include <QObject>
|
||||
#include <QPoint>
|
||||
#include <QColor>
|
||||
#include <QSettings>
|
||||
|
||||
#include "yacreader_global.h"
|
||||
|
||||
#define CONF_FILE_PATH "."
|
||||
#define SLIDE_ASPECT_RATIO 1.585
|
||||
|
||||
class Configuration : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
QSettings * settings;
|
||||
|
||||
QString defaultPath;
|
||||
//configuration properties
|
||||
QSize magnifyingGlassSize;
|
||||
QSize gotoSlideSize;
|
||||
float zoomLevel;
|
||||
bool adjustToWidth;
|
||||
bool fullScreen;
|
||||
FlowType flowType;
|
||||
float fitToWidthRatio;
|
||||
QPoint windowPos;
|
||||
QSize windowSize;
|
||||
bool maximized;
|
||||
bool doublePage;
|
||||
bool alwaysOnTop;
|
||||
bool adjustToFullSize;
|
||||
QColor backgroundColor;
|
||||
|
||||
Configuration();
|
||||
Configuration(const Configuration & conf);
|
||||
void load(const QString & path = CONF_FILE_PATH);
|
||||
|
||||
|
||||
public:
|
||||
static Configuration & getConfiguration()
|
||||
{
|
||||
static Configuration configuration;
|
||||
return configuration;
|
||||
};
|
||||
void load(QSettings * settings);
|
||||
QString getDefaultPath() { return settings->value(PATH).toString(); };
|
||||
void setDefaultPath(QString defaultPath){settings->setValue(PATH,defaultPath);};
|
||||
QSize getMagnifyingGlassSize() { return settings->value(MAG_GLASS_SIZE).toSize();};
|
||||
void setMagnifyingGlassSize(const QSize & mgs) { settings->setValue(MAG_GLASS_SIZE,mgs);};
|
||||
QSize getGotoSlideSize() { return settings->value(GO_TO_FLOW_SIZE).toSize();};
|
||||
void setGotoSlideSize(const QSize & gss) { settings->setValue(GO_TO_FLOW_SIZE,gss);};
|
||||
float getZoomLevel() { return settings->value(ZOOM_LEVEL).toFloat();};
|
||||
void setZoomLevel(float zl) { settings->setValue(ZOOM_LEVEL,zl);};
|
||||
bool getAdjustToWidth() {return settings->value(FIT).toBool();};
|
||||
void setAdjustToWidth(bool atw=true) {settings->setValue(FIT,atw);};
|
||||
FlowType getFlowType(){return (FlowType)settings->value(FLOW_TYPE_SW).toInt();};
|
||||
void setFlowType(FlowType type){settings->setValue(FLOW_TYPE_SW,type);};
|
||||
bool getFullScreen(){return settings->value(FULLSCREEN).toBool();};
|
||||
void setFullScreen(bool f){settings->setValue(FULLSCREEN,f);};
|
||||
float getFitToWidthRatio(){return settings->value(FIT_TO_WIDTH_RATIO).toFloat();};
|
||||
void setFitToWidthRatio(float r){settings->setValue(FIT_TO_WIDTH_RATIO,r);};
|
||||
QPoint getPos(){return settings->value(Y_WINDOW_POS).toPoint();};
|
||||
void setPos(QPoint p){settings->setValue(Y_WINDOW_POS,p);};
|
||||
QSize getSize(){return settings->value(Y_WINDOW_SIZE).toSize();};
|
||||
void setSize(QSize s){settings->setValue(Y_WINDOW_SIZE,s);};
|
||||
bool getMaximized(){return settings->value(MAXIMIZED).toBool();};
|
||||
void setMaximized(bool b){settings->setValue(MAXIMIZED,b);};
|
||||
bool getDoublePage(){return settings->value(DOUBLE_PAGE).toBool();};
|
||||
void setDoublePage(bool b){settings->setValue(DOUBLE_PAGE,b);};
|
||||
bool getAdjustToFullSize(){return settings->value(ADJUST_TO_FULL_SIZE).toBool();};
|
||||
void setAdjustToFullSize(bool b){settings->setValue(ADJUST_TO_FULL_SIZE,b);};
|
||||
QColor getBackgroundColor(){return settings->value(BACKGROUND_COLOR).value<QColor>();};
|
||||
void setBackgroundColor(const QColor& color){settings->value(BACKGROUND_COLOR,color);};
|
||||
bool getAlwaysOnTop(){return settings->value(ALWAYS_ON_TOP).toBool();};
|
||||
void setAlwaysOnTop(bool b){ settings->setValue(ALWAYS_ON_TOP,b);};
|
||||
bool getShowToolbars(){return settings->value(SHOW_TOOLBARS).toBool();};
|
||||
void setShowToolbars(bool b){settings->setValue(SHOW_TOOLBARS,b);};
|
||||
bool getShowInformation(){return settings->value(SHOW_INFO,false).toBool();};
|
||||
void setShowInformation(bool b){settings->setValue(SHOW_INFO,b);};
|
||||
|
||||
void save();
|
||||
|
||||
};
|
||||
|
||||
#endif
|
14
YACReader/files.qrc
Normal file
14
YACReader/files.qrc
Normal file
@ -0,0 +1,14 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>../files/about.html</file>
|
||||
<file>../files/helpYACReader.html</file>
|
||||
<file>../files/shortcuts.html</file>
|
||||
<file>../files/shortcuts2.html</file>
|
||||
<file>../files/translator.html</file>
|
||||
</qresource>
|
||||
|
||||
<qresource lang="es_ES">
|
||||
<file alias="/files/about.html">../files/about_es_ES.html</file>
|
||||
<file alias="/files/helpYACReader.html">../files/helpYACReader_es_ES.html</file>
|
||||
</qresource>
|
||||
</RCC>
|
75
YACReader/goto_dialog.cpp
Normal file
75
YACReader/goto_dialog.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
#include "goto_dialog.h"
|
||||
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QIntValidator>
|
||||
|
||||
|
||||
|
||||
GoToDialog::GoToDialog(QWidget * parent)
|
||||
:QDialog(parent)
|
||||
{
|
||||
setupUI();
|
||||
}
|
||||
|
||||
void GoToDialog::setupUI()
|
||||
{
|
||||
textLabel = new QLabel(tr("Page : "));
|
||||
pageNumber = new QLineEdit;
|
||||
v = new QIntValidator(this);
|
||||
v->setBottom(1);
|
||||
pageNumber->setValidator(v);
|
||||
textLabel->setBuddy(pageNumber);
|
||||
textLabel->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
||||
|
||||
accept = new QPushButton(tr("Go To"));
|
||||
connect(accept,SIGNAL(clicked()),this,SLOT(goTo()));
|
||||
cancel = new QPushButton(tr("Cancel"));
|
||||
connect(cancel,SIGNAL(clicked()),this,SLOT(close()));
|
||||
|
||||
QHBoxLayout *topLayout = new QHBoxLayout;
|
||||
|
||||
topLayout->addWidget(textLabel);
|
||||
topLayout->addWidget(pageNumber);
|
||||
|
||||
QHBoxLayout *bottomLayout = new QHBoxLayout;
|
||||
bottomLayout->addStretch();
|
||||
bottomLayout->addWidget(accept);
|
||||
bottomLayout->addWidget(cancel);
|
||||
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout;
|
||||
mainLayout->addWidget(numPagesLabel = new QLabel(tr("Total pages : ")));
|
||||
mainLayout->addLayout(topLayout);
|
||||
mainLayout->addStretch();
|
||||
mainLayout->addLayout(bottomLayout);
|
||||
|
||||
QHBoxLayout *imgMainLayout = new QHBoxLayout;
|
||||
QLabel * imgLabel = new QLabel();
|
||||
QPixmap p(":/images/goto.png");
|
||||
imgLabel->setPixmap(p);
|
||||
imgMainLayout->addWidget(imgLabel);
|
||||
imgMainLayout->addLayout(mainLayout);
|
||||
|
||||
setLayout(imgMainLayout);
|
||||
|
||||
setWindowTitle(tr("Go to..."));
|
||||
setModal (true);
|
||||
}
|
||||
|
||||
void GoToDialog::goTo()
|
||||
{
|
||||
unsigned int page = pageNumber->text().toInt();
|
||||
pageNumber->clear();
|
||||
|
||||
if(page >= 1)
|
||||
emit(goToPage(page-1));
|
||||
|
||||
close();
|
||||
|
||||
}
|
||||
|
||||
void GoToDialog::setNumPages(unsigned int numPages)
|
||||
{
|
||||
numPagesLabel->setText(tr("Total pages : ")+QString::number(numPages));
|
||||
v->setTop(numPages);
|
||||
}
|
31
YACReader/goto_dialog.h
Normal file
31
YACReader/goto_dialog.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef __GOTODIALOG_H
|
||||
#define __GOTODIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
#include <QIntValidator>
|
||||
|
||||
class GoToDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
GoToDialog(QWidget * parent = 0);
|
||||
private:
|
||||
QLabel * numPagesLabel;
|
||||
QLabel * textLabel;
|
||||
QLineEdit * pageNumber;
|
||||
QIntValidator * v;
|
||||
QPushButton * accept;
|
||||
QPushButton * cancel;
|
||||
void setupUI();
|
||||
public slots:
|
||||
void goTo();
|
||||
void setNumPages(unsigned int numPages);
|
||||
signals:
|
||||
void goToPage(unsigned int page);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
325
YACReader/goto_flow.cpp
Normal file
325
YACReader/goto_flow.cpp
Normal file
@ -0,0 +1,325 @@
|
||||
#include "goto_flow.h"
|
||||
#include "configuration.h"
|
||||
#include "comic.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QSize>
|
||||
#include <QImage>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QMutex>
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
#include <QPixmap>
|
||||
#include <QThread>
|
||||
#include <QSize>
|
||||
#include <QIntValidator>
|
||||
#include <QWaitCondition>
|
||||
#include <QObject>
|
||||
#include <QEvent>
|
||||
#include <QLabel>
|
||||
|
||||
#include "yacreader_flow.h"
|
||||
|
||||
#include "goto_flow_toolbar.h"
|
||||
#include "goto_flow_decorationbar.h"
|
||||
|
||||
/*#define WIDTH 126
|
||||
#define HEIGHT 200*/
|
||||
|
||||
QMutex mutexGoToFlow;
|
||||
|
||||
|
||||
|
||||
GoToFlow::GoToFlow(QWidget *parent,FlowType flowType)
|
||||
:GoToFlowWidget(parent),ready(false)
|
||||
{
|
||||
updateTimer = new QTimer;
|
||||
connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateImageData()));
|
||||
|
||||
worker = new PageLoader;
|
||||
|
||||
|
||||
flow = new YACReaderFlow(this,flowType);
|
||||
flow->setReflectionEffect(PictureFlow::PlainReflection);
|
||||
imageSize = Configuration::getConfiguration().getGotoSlideSize();
|
||||
|
||||
flow->setSlideSize(imageSize);
|
||||
connect(flow,SIGNAL(centerIndexChanged(int)),this,SLOT(setPageNumber(int)));
|
||||
connect(flow,SIGNAL(selected(unsigned int)),this,SIGNAL(goToPage(unsigned int)));
|
||||
|
||||
connect(toolBar,SIGNAL(goTo(unsigned int)),this,SIGNAL(goToPage(unsigned int)));
|
||||
connect(toolBar,SIGNAL(setCenter(unsigned int)),flow,SLOT(showSlide(unsigned int)));
|
||||
|
||||
mainLayout->insertWidget(1,flow);
|
||||
mainLayout->setStretchFactor(flow,1);
|
||||
|
||||
resize(static_cast<int>(5*imageSize.width()),static_cast<int>(imageSize.height()*1.7));
|
||||
|
||||
//install eventFilter
|
||||
//flow->installEventFilter(this);
|
||||
/*edit->installEventFilter(this);
|
||||
centerButton->installEventFilter(this);
|
||||
goToButton->installEventFilter(this);
|
||||
|
||||
connect(edit,SIGNAL(returnPressed()),goToButton,SIGNAL(clicked()));*/
|
||||
|
||||
this->setCursor(QCursor(Qt::ArrowCursor));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void GoToFlow::centerSlide(int slide)
|
||||
{
|
||||
if(flow->centerIndex()!=slide)
|
||||
{
|
||||
flow->setCenterIndex(slide);
|
||||
if(ready)// load images if pages are loaded.
|
||||
{
|
||||
//worker->reset(); //BUG FIXED : image didn't load if worker was working
|
||||
preload();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GoToFlow::setNumSlides(unsigned int slides)
|
||||
{
|
||||
// numPagesLabel->setText(tr("Total pages : ")+QString::number(slides));
|
||||
// numPagesLabel->adjustSize();
|
||||
imagesReady.clear();
|
||||
imagesReady.fill(false,slides);
|
||||
|
||||
rawImages.clear();
|
||||
rawImages.resize(slides);
|
||||
|
||||
toolBar->setTop(slides);
|
||||
|
||||
SlideInitializer * si = new SlideInitializer(flow,slides);
|
||||
|
||||
imagesLoaded.clear();
|
||||
imagesLoaded.fill(false,slides);
|
||||
|
||||
imagesSetted.clear();
|
||||
imagesSetted.fill(false,slides);
|
||||
|
||||
numImagesLoaded = 0;
|
||||
|
||||
connect(flow, SIGNAL(centerIndexChanged(int)), this, SLOT(preload()));
|
||||
connect(flow, SIGNAL(centerIndexChangedSilent(int)), this, SLOT(preload()));
|
||||
|
||||
ready = true;
|
||||
worker->reset();
|
||||
|
||||
si->start();
|
||||
}
|
||||
|
||||
void GoToFlow::reset()
|
||||
{
|
||||
updateTimer->stop();
|
||||
/*imagesLoaded.clear();
|
||||
numImagesLoaded = 0;
|
||||
imagesReady.clear();
|
||||
rawImages.clear();*/
|
||||
ready = false;
|
||||
}
|
||||
|
||||
void GoToFlow::setImageReady(int index,const QByteArray & image)
|
||||
{
|
||||
rawImages[index]=image;
|
||||
imagesReady[index]=true;
|
||||
preload();
|
||||
}
|
||||
|
||||
void GoToFlow::preload()
|
||||
{
|
||||
if(numImagesLoaded < imagesLoaded.size())
|
||||
updateTimer->start(30); //TODO comprobar rendimiento, antes era 70
|
||||
}
|
||||
|
||||
void GoToFlow::updateImageData()
|
||||
{
|
||||
// can't do anything, wait for the next possibility
|
||||
if(worker->busy())
|
||||
return;
|
||||
|
||||
// set image of last one
|
||||
int idx = worker->index();
|
||||
if( idx >= 0 && !worker->result().isNull())
|
||||
{
|
||||
if(!imagesSetted[idx])
|
||||
{
|
||||
flow->setSlide(idx, worker->result());
|
||||
imagesSetted[idx] = true;
|
||||
numImagesLoaded++;
|
||||
rawImages[idx].clear();; //release memory
|
||||
imagesLoaded[idx]=true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// try to load only few images on the left and right side
|
||||
// i.e. all visible ones plus some extra
|
||||
#define COUNT 8
|
||||
int indexes[2*COUNT+1];
|
||||
int center = flow->centerIndex();
|
||||
indexes[0] = center;
|
||||
for(int j = 0; j < COUNT; j++)
|
||||
{
|
||||
indexes[j*2+1] = center+j+1;
|
||||
indexes[j*2+2] = center-j-1;
|
||||
}
|
||||
for(int c = 0; c < 2*COUNT+1; c++)
|
||||
{
|
||||
int i = indexes[c];
|
||||
if((i >= 0) && (i < flow->slideCount()))
|
||||
if(!imagesLoaded[i]&&imagesReady[i])//slide(i).isNull())
|
||||
{
|
||||
// schedule thumbnail generation
|
||||
|
||||
worker->generate(i, flow->slideSize(),rawImages[i]);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// no need to generate anything? stop polling...
|
||||
updateTimer->stop();
|
||||
}
|
||||
|
||||
bool GoToFlow::eventFilter(QObject *target, QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::KeyPress)
|
||||
{
|
||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
||||
int key = keyEvent->key();
|
||||
if((key==Qt::Key_Return)||
|
||||
(key==Qt::Key_Enter)||
|
||||
(key==Qt::Key_Space)||
|
||||
(key==Qt::Key_Left)||
|
||||
(key==Qt::Key_Right)||
|
||||
(key==Qt::Key_S))
|
||||
this->keyPressEvent(keyEvent);
|
||||
}
|
||||
return QWidget::eventFilter(target, event);
|
||||
}
|
||||
|
||||
void GoToFlow::wheelEvent(QWheelEvent * event)
|
||||
{
|
||||
if(event->delta()<0)
|
||||
flow->showNext();
|
||||
else
|
||||
flow->showPrevious();
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void GoToFlow::setFlowType(FlowType flowType)
|
||||
{
|
||||
flow->setFlowType(flowType);
|
||||
}
|
||||
|
||||
void GoToFlow::updateSize() //TODO : fix. it doesn't work.
|
||||
{
|
||||
imageSize = Configuration::getConfiguration().getGotoSlideSize();
|
||||
flow->setSlideSize(imageSize);
|
||||
resize(static_cast<int>(5*imageSize.width()),static_cast<int>(imageSize.height()*1.7));
|
||||
}
|
||||
|
||||
void GoToFlow::updateConfig(QSettings * settings)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
//SlideInitializer
|
||||
//-----------------------------------------------------------------------------
|
||||
SlideInitializer::SlideInitializer(PictureFlow * flow,int slides)
|
||||
:QThread(),_flow(flow),_slides(slides)
|
||||
{
|
||||
|
||||
}
|
||||
void SlideInitializer::run()
|
||||
{
|
||||
mutexGoToFlow.lock();
|
||||
|
||||
_flow->clear();
|
||||
for(int i=0;i<_slides;i++)
|
||||
_flow->addSlide(QImage());
|
||||
_flow->setCenterIndex(0);
|
||||
|
||||
mutexGoToFlow.unlock();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
//PageLoader
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
PageLoader::PageLoader():
|
||||
QThread(), restart(false), working(false), idx(-1)
|
||||
{
|
||||
}
|
||||
|
||||
PageLoader::~PageLoader()
|
||||
{
|
||||
mutexGoToFlow.lock();
|
||||
condition.wakeOne();
|
||||
mutexGoToFlow.unlock();
|
||||
wait();
|
||||
}
|
||||
|
||||
bool PageLoader::busy() const
|
||||
{
|
||||
return isRunning() ? working : false;
|
||||
}
|
||||
|
||||
void PageLoader::generate(int index, QSize size,const QByteArray & rImage)
|
||||
{
|
||||
mutexGoToFlow.lock();
|
||||
this->idx = index;
|
||||
//this->img = QImage();
|
||||
this->size = size;
|
||||
this->rawImage = rImage;
|
||||
mutexGoToFlow.unlock();
|
||||
|
||||
if (!isRunning())
|
||||
start();
|
||||
else
|
||||
{
|
||||
// already running, wake up whenever ready
|
||||
restart = true;
|
||||
condition.wakeOne();
|
||||
}
|
||||
}
|
||||
|
||||
void PageLoader::run()
|
||||
{
|
||||
for(;;)
|
||||
{
|
||||
// copy necessary data
|
||||
mutexGoToFlow.lock();
|
||||
this->working = true;
|
||||
//int idx = this->idx;
|
||||
|
||||
|
||||
QImage image;
|
||||
image.loadFromData(this->rawImage);
|
||||
// let everyone knows it is ready
|
||||
image = image.scaled(this->size,Qt::KeepAspectRatio,Qt::SmoothTransformation);
|
||||
|
||||
mutexGoToFlow.unlock();
|
||||
|
||||
mutexGoToFlow.lock();
|
||||
this->working = false;
|
||||
this->img = image;
|
||||
mutexGoToFlow.unlock();
|
||||
|
||||
// put to sleep
|
||||
mutexGoToFlow.lock();
|
||||
if (!this->restart)
|
||||
condition.wait(&mutexGoToFlow);
|
||||
restart = false;
|
||||
mutexGoToFlow.unlock();
|
||||
}
|
||||
}
|
105
YACReader/goto_flow.h
Normal file
105
YACReader/goto_flow.h
Normal file
@ -0,0 +1,105 @@
|
||||
#ifndef __GOTO_FLOW_H
|
||||
#define __GOTO_FLOW_H
|
||||
|
||||
#include "goto_flow_widget.h"
|
||||
#include <QThread>
|
||||
|
||||
#include <QWaitCondition>
|
||||
|
||||
class QLineEdit;
|
||||
class QPushButton;
|
||||
class QPixmap;
|
||||
class QThread;
|
||||
class QSize;
|
||||
class QIntValidator;
|
||||
class QWaitCondition;
|
||||
class QEvent;
|
||||
class QLabel;
|
||||
|
||||
|
||||
class Comic;
|
||||
class SlideInitializer;
|
||||
class PageLoader;
|
||||
class YACReaderFlow;
|
||||
class PictureFlow;
|
||||
|
||||
class GoToFlow : public GoToFlowWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
GoToFlow(QWidget* parent = 0,FlowType flowType = CoverFlowLike);
|
||||
bool ready; //comic is ready for read.
|
||||
bool eventFilter(QObject *target, QEvent *event);
|
||||
private:
|
||||
YACReaderFlow * flow;
|
||||
//Comic * comic;
|
||||
QSize imageSize;
|
||||
|
||||
QVector<bool> imagesLoaded;
|
||||
QVector<bool> imagesSetted;
|
||||
uint numImagesLoaded;
|
||||
QVector<bool> imagesReady;
|
||||
QVector<QByteArray> rawImages;
|
||||
QTimer* updateTimer;
|
||||
PageLoader* worker;
|
||||
virtual void wheelEvent(QWheelEvent * event);
|
||||
|
||||
private slots:
|
||||
void preload();
|
||||
void updateImageData();
|
||||
|
||||
public slots:
|
||||
void centerSlide(int slide);
|
||||
void reset();
|
||||
void setNumSlides(unsigned int slides);
|
||||
void setImageReady(int index,const QByteArray & image);
|
||||
void setFlowType(FlowType flowType);
|
||||
void updateSize();
|
||||
void updateConfig(QSettings * settings);
|
||||
signals:
|
||||
void goToPage(unsigned int page);
|
||||
|
||||
|
||||
};
|
||||
//-----------------------------------------------------------------------------
|
||||
//SlideInitializer
|
||||
//-----------------------------------------------------------------------------
|
||||
class SlideInitializer : public QThread
|
||||
{
|
||||
public:
|
||||
SlideInitializer(PictureFlow * flow,int slides);
|
||||
private:
|
||||
PictureFlow * _flow;
|
||||
int _slides;
|
||||
void run();
|
||||
};
|
||||
//-----------------------------------------------------------------------------
|
||||
//PageLoader
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class PageLoader : public QThread
|
||||
{
|
||||
public:
|
||||
PageLoader();
|
||||
~PageLoader();
|
||||
// returns FALSE if worker is still busy and can't take the task
|
||||
bool busy() const;
|
||||
void generate(int index, QSize size,const QByteArray & rImage);
|
||||
void reset(){idx = -1;};
|
||||
int index() const { return idx; }
|
||||
QImage result() const { return img; }
|
||||
protected:
|
||||
void run();
|
||||
private:
|
||||
QWaitCondition condition;
|
||||
|
||||
bool restart;
|
||||
bool working;
|
||||
int idx;
|
||||
|
||||
QSize size;
|
||||
QImage img;
|
||||
QByteArray rawImage;
|
||||
};
|
||||
|
||||
#endif
|
33
YACReader/goto_flow_decorationbar.cpp
Normal file
33
YACReader/goto_flow_decorationbar.cpp
Normal file
@ -0,0 +1,33 @@
|
||||
#include "goto_flow_decorationbar.h"
|
||||
|
||||
#include <QHBoxLayout>
|
||||
#include <qlabel.h>
|
||||
|
||||
GoToFlowDecorationBar::GoToFlowDecorationBar(QWidget * parent)
|
||||
:QWidget(parent)
|
||||
{
|
||||
QHBoxLayout * topBar = new QHBoxLayout();
|
||||
|
||||
QLabel * imgTopLeft = new QLabel();
|
||||
QLabel * imgTopRight = new QLabel();
|
||||
QLabel * imgTopMiddle = new QLabel();
|
||||
QPixmap pL(":/images/imgTopLeft.png");
|
||||
QPixmap pM(":/images/imgTopMiddle.png");
|
||||
QPixmap pR(":/images/imgTopRight.png");
|
||||
imgTopLeft->setPixmap(pL);
|
||||
imgTopRight->setPixmap(pR);
|
||||
imgTopMiddle->setPixmap(pM);
|
||||
imgTopMiddle->setScaledContents(true);
|
||||
|
||||
topBar->addWidget(imgTopLeft);
|
||||
topBar->addWidget(imgTopMiddle);
|
||||
topBar->addWidget(imgTopRight);
|
||||
topBar->setStretchFactor(imgTopLeft,0);
|
||||
topBar->setStretchFactor(imgTopMiddle,1);
|
||||
topBar->setStretchFactor(imgTopRight,0);
|
||||
|
||||
topBar->setMargin(0);
|
||||
topBar->setSpacing(0);
|
||||
|
||||
setLayout(topBar);
|
||||
}
|
13
YACReader/goto_flow_decorationbar.h
Normal file
13
YACReader/goto_flow_decorationbar.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef GOTO_FLOW_DECORATIONBAR_H
|
||||
#define GOTO_FLOW_DECORATIONBAR_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class GoToFlowDecorationBar : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
GoToFlowDecorationBar(QWidget * parent = 0);
|
||||
};
|
||||
|
||||
#endif
|
164
YACReader/goto_flow_gl.cpp
Normal file
164
YACReader/goto_flow_gl.cpp
Normal file
@ -0,0 +1,164 @@
|
||||
#include "goto_flow_gl.h"
|
||||
|
||||
#include <QLineEdit>
|
||||
#include <QIntValidator>
|
||||
#include <QPushButton>
|
||||
#include <QPushButton>
|
||||
#include <QSize>
|
||||
|
||||
#include "configuration.h"
|
||||
|
||||
#include "goto_flow_toolbar.h"
|
||||
#include "goto_flow_decorationbar.h"
|
||||
|
||||
GoToFlowGL::GoToFlowGL(QWidget* parent, FlowType flowType)
|
||||
:GoToFlowWidget(parent)
|
||||
{
|
||||
|
||||
flow = new YACReaderPageFlowGL(this);
|
||||
flow->setShowMarks(false);
|
||||
|
||||
imageSize = Configuration::getConfiguration().getGotoSlideSize();
|
||||
|
||||
flow->setSlideSize(imageSize);
|
||||
connect(flow,SIGNAL(centerIndexChanged(int)),this,SLOT(setPageNumber(int)));
|
||||
connect(flow,SIGNAL(selected(unsigned int)),this,SIGNAL(goToPage(unsigned int)));
|
||||
|
||||
connect(toolBar,SIGNAL(goTo(unsigned int)),this,SIGNAL(goToPage(unsigned int)));
|
||||
connect(toolBar,SIGNAL(setCenter(unsigned int)),flow,SLOT(setCenterIndex(unsigned int)));
|
||||
|
||||
mainLayout->insertWidget(1,flow);
|
||||
mainLayout->setStretchFactor(flow,1);
|
||||
|
||||
resize(static_cast<int>(5*imageSize.width()),static_cast<int>(imageSize.height()*1.7));
|
||||
|
||||
//install eventFilter
|
||||
//flow->installEventFilter(this);
|
||||
//edit->installEventFilter(this);
|
||||
//centerButton->installEventFilter(this);
|
||||
//goToButton->installEventFilter(this);
|
||||
|
||||
this->setCursor(QCursor(Qt::ArrowCursor));
|
||||
}
|
||||
|
||||
bool GoToFlowGL::eventFilter(QObject *target, QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::KeyPress)
|
||||
{
|
||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
||||
int key = keyEvent->key();
|
||||
if((key==Qt::Key_Return)||
|
||||
(key==Qt::Key_Enter)||
|
||||
(key==Qt::Key_Space)||
|
||||
(key==Qt::Key_Left)||
|
||||
(key==Qt::Key_Right)||
|
||||
(key==Qt::Key_S))
|
||||
this->keyPressEvent(keyEvent);
|
||||
}
|
||||
return QWidget::eventFilter(target, event);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void GoToFlowGL::reset()
|
||||
{
|
||||
flow->reset();
|
||||
}
|
||||
|
||||
void GoToFlowGL::centerSlide(int slide)
|
||||
{
|
||||
if(flow->centerIndex()!=slide)
|
||||
{
|
||||
flow->setCenterIndex(slide);
|
||||
}
|
||||
}
|
||||
|
||||
void GoToFlowGL::setFlowType(FlowType flowType)
|
||||
{
|
||||
if(flowType == CoverFlowLike)
|
||||
flow->setPreset(presetYACReaderFlowClassicConfig);
|
||||
else if(flowType == Strip)
|
||||
flow->setPreset(presetYACReaderFlowStripeConfig);
|
||||
else if(flowType == StripOverlapped)
|
||||
flow->setPreset(presetYACReaderFlowOverlappedStripeConfig);
|
||||
else
|
||||
flow->setPreset(defaultYACReaderFlowConfig);
|
||||
}
|
||||
|
||||
void GoToFlowGL::setNumSlides(unsigned int slides)
|
||||
{
|
||||
flow->populate(slides);
|
||||
toolBar->setTop(slides);
|
||||
}
|
||||
void GoToFlowGL::setImageReady(int index,const QByteArray & imageData)
|
||||
{
|
||||
flow->rawImages[index] = imageData;
|
||||
flow->imagesReady[index] = true;
|
||||
}
|
||||
|
||||
void GoToFlowGL::updateSize()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void GoToFlowGL::updateConfig(QSettings * settings)
|
||||
{
|
||||
Performance performance = medium;
|
||||
|
||||
switch (settings->value(PERFORMANCE).toInt())
|
||||
{
|
||||
case 0:
|
||||
performance = low;
|
||||
break;
|
||||
case 1:
|
||||
performance = medium;
|
||||
break;
|
||||
case 2:
|
||||
performance = high;
|
||||
break;
|
||||
case 3:
|
||||
performance = ultraHigh;
|
||||
break;
|
||||
}
|
||||
|
||||
flow->setPerformance(performance);
|
||||
|
||||
switch (settings->value(FLOW_TYPE_GL).toInt())
|
||||
{
|
||||
case 0:
|
||||
flow->setPreset(presetYACReaderFlowClassicConfig);
|
||||
return;
|
||||
case 1:
|
||||
flow->setPreset(presetYACReaderFlowStripeConfig);
|
||||
return;
|
||||
case 2:
|
||||
flow->setPreset(presetYACReaderFlowOverlappedStripeConfig);
|
||||
return;
|
||||
case 3:
|
||||
flow->setPreset(defaultYACReaderFlowConfig);
|
||||
return;
|
||||
case 4:
|
||||
flow->setPreset(pressetYACReaderFlowDownConfig);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//custom config
|
||||
|
||||
flow->setCF_RX(settings->value(X_ROTATION).toInt());
|
||||
flow->setCF_Y(settings->value(Y_POSITION).toInt());
|
||||
flow->setX_Distance(settings->value(COVER_DISTANCE).toInt());
|
||||
flow->setCenter_Distance(settings->value(CENTRAL_DISTANCE).toInt());
|
||||
flow->setCF_Z(settings->value(ZOOM_LEVEL).toInt());
|
||||
flow->setY_Distance(settings->value(Y_COVER_OFFSET).toInt());
|
||||
flow->setZ_Distance(settings->value(Z_COVER_OFFSET).toInt());
|
||||
flow->setRotation(settings->value(COVER_ROTATION).toInt());
|
||||
flow->setFadeOutDist(settings->value(FADE_OUT_DIST).toInt());
|
||||
flow->setLightStrenght(settings->value(LIGHT_STRENGTH).toInt());
|
||||
flow->setMaxAngle(settings->value(MAX_ANGLE).toInt());
|
||||
|
||||
/* flow->setVisibility(settings->value("visibilityDistance").toInt());
|
||||
flow->setLightStrenght(settings->value("lightStrength").toInt())*/;
|
||||
|
||||
}
|
||||
|
39
YACReader/goto_flow_gl.h
Normal file
39
YACReader/goto_flow_gl.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef __GOTO_FLOW_GL_H
|
||||
#define __GOTO_FLOW_GL_H
|
||||
|
||||
#include "yacreader_global.h"
|
||||
#include "goto_flow_widget.h"
|
||||
#include "yacreader_flow_gl.h"
|
||||
|
||||
class QLineEdit;
|
||||
class QIntValidator;
|
||||
class QPushButton;
|
||||
class QPushButton;
|
||||
class QSize;
|
||||
|
||||
class GoToFlowGL : public GoToFlowWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
GoToFlowGL(QWidget* parent = 0,FlowType flowType = CoverFlowLike);
|
||||
void reset();
|
||||
void centerSlide(int slide);
|
||||
void setFlowType(FlowType flowType);
|
||||
void setNumSlides(unsigned int slides);
|
||||
void setImageReady(int index,const QByteArray & image);
|
||||
void updateSize();
|
||||
bool eventFilter(QObject *target, QEvent *event);
|
||||
|
||||
void updateConfig(QSettings * settings);
|
||||
|
||||
signals:
|
||||
void goToPage(unsigned int page);
|
||||
private:
|
||||
YACReaderPageFlowGL * flow;
|
||||
|
||||
|
||||
//Comic * comic;
|
||||
QSize imageSize;
|
||||
};
|
||||
|
||||
#endif
|
120
YACReader/goto_flow_toolbar.cpp
Normal file
120
YACReader/goto_flow_toolbar.cpp
Normal file
@ -0,0 +1,120 @@
|
||||
#include "goto_flow_toolbar.h"
|
||||
|
||||
#include <QLineEdit>
|
||||
#include <QIntValidator>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QResizeEvent>
|
||||
|
||||
GoToFlowToolBar::GoToFlowToolBar(QWidget * parent)
|
||||
:QWidget(parent)
|
||||
{
|
||||
//fondo
|
||||
QBoxLayout * background = new QHBoxLayout(this);
|
||||
|
||||
QLabel * imgBottomLeft = new QLabel(this);
|
||||
QLabel * imgBottomRight = new QLabel(this);
|
||||
QLabel * imgBottomMiddle = new QLabel(this);
|
||||
QPixmap pBL(":/images/imgBottomLeft.png");
|
||||
QPixmap pBM(":/images/imgBottomMiddle.png");
|
||||
QPixmap pBR(":/images/imgBottomRight.png");
|
||||
imgBottomLeft->setPixmap(pBL);
|
||||
imgBottomRight->setPixmap(pBR);
|
||||
imgBottomMiddle->setPixmap(pBM);
|
||||
imgBottomMiddle->setScaledContents(true);
|
||||
//imgTop->setStyleSheet("background-image: url(:/images/numPagesLabel.png); width: 100%; height:100%; background-repeat: none; border: none");
|
||||
|
||||
background->addWidget(imgBottomLeft);
|
||||
background->addWidget(imgBottomMiddle);
|
||||
background->addWidget(imgBottomRight);
|
||||
background->setStretchFactor(imgBottomLeft,0);
|
||||
background->setStretchFactor(imgBottomMiddle,1);
|
||||
background->setStretchFactor(imgBottomRight,0);
|
||||
|
||||
background->setMargin(0);
|
||||
background->setSpacing(0);
|
||||
|
||||
//elementos interactivos
|
||||
//QVBoxLayout * mainLayout = new QVBoxLayout;
|
||||
bar = new QWidget(this);
|
||||
QHBoxLayout * bottom = new QHBoxLayout(bar);
|
||||
bottom->addStretch();
|
||||
bottom->addWidget(new QLabel(tr("Page : "),bar));
|
||||
bottom->addWidget(edit = new QLineEdit(bar));
|
||||
v = new QIntValidator(bar);
|
||||
v->setBottom(1);
|
||||
edit->setValidator(v);
|
||||
edit->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
|
||||
edit->setStyleSheet("background-image: url(:/images/imgEdit.png); width: 100%; height:100%; background-repeat: none; border: none; padding: 3px; color: white;");
|
||||
QPixmap p(":/images/imgEdit.png");
|
||||
edit->setFixedSize(54,50);
|
||||
edit->setAttribute(Qt::WA_MacShowFocusRect,false);
|
||||
edit->setAttribute(Qt::WA_LayoutUsesWidgetRect,true);
|
||||
//edit->resize(QSize(54,50));
|
||||
edit->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed));
|
||||
edit->setAutoFillBackground(false);
|
||||
connect(edit,SIGNAL(returnPressed()),this,SLOT(goTo()));
|
||||
|
||||
QString centerButtonCSS = "QPushButton {background-image: url(:/images/imgCenterSlide.png); width: 100%; height:100%; background-repeat: none; border: none;} "
|
||||
"QPushButton:focus { border: none; outline: none;}"
|
||||
"QPushButton:pressed {background-image: url(:/images/imgCenterSlidePressed.png); width: 100%; height:100%; background-repeat: none; border: none;} ";
|
||||
centerButton = new QPushButton(bar);
|
||||
//centerButton->setIcon(QIcon(":/images/center.png"));
|
||||
centerButton->setStyleSheet(centerButtonCSS);
|
||||
centerButton->setFixedSize(26,50);
|
||||
centerButton->setAttribute(Qt::WA_LayoutUsesWidgetRect,true);
|
||||
connect(centerButton,SIGNAL(clicked()),this,SLOT(centerSlide()));
|
||||
bottom->addWidget(centerButton);
|
||||
|
||||
QString goToButtonCSS = "QPushButton {background-image: url(:/images/imgGoToSlide.png); width: 100%; height:100%; background-repeat: none; border: none;} "
|
||||
"QPushButton:focus { border: none; outline: none;}"
|
||||
"QPushButton:pressed {background-image: url(:/images/imgGoToSlidePressed.png); width: 100%; height:100%; background-repeat: none; border: none;} ";
|
||||
goToButton = new QPushButton(bar);
|
||||
//goToButton->setIcon(QIcon(":/images/goto.png"));
|
||||
goToButton->setStyleSheet(goToButtonCSS);
|
||||
goToButton->setFixedSize(32,50);
|
||||
goToButton->setAttribute(Qt::WA_LayoutUsesWidgetRect,true);
|
||||
|
||||
connect(goToButton,SIGNAL(clicked()),this,SLOT(goTo()));
|
||||
bottom->addWidget(goToButton);
|
||||
|
||||
bottom->addStretch();
|
||||
bottom->setMargin(0);
|
||||
bottom->setSpacing(0);
|
||||
|
||||
bar->setLayout(bottom);
|
||||
//mainLayout->addWidget(bar);
|
||||
setLayout(background);
|
||||
bar->setGeometry(QRect(0,0,400,50));
|
||||
|
||||
}
|
||||
|
||||
void GoToFlowToolBar::setPage(int pageNumber)
|
||||
{
|
||||
edit->setText(QString::number(pageNumber+1));
|
||||
}
|
||||
|
||||
void GoToFlowToolBar::setTop(int numPages)
|
||||
{
|
||||
v->setTop(numPages);
|
||||
}
|
||||
|
||||
void GoToFlowToolBar::resizeEvent(QResizeEvent * event)
|
||||
{
|
||||
|
||||
bar->setGeometry(QRect(0,(event->size().height()-50)+((50-bar->height())/2),event->size().width(),50));
|
||||
|
||||
QWidget::resizeEvent(event);
|
||||
}
|
||||
|
||||
void GoToFlowToolBar::goTo()
|
||||
{
|
||||
emit(goTo(edit->text().toInt()-1));
|
||||
}
|
||||
|
||||
void GoToFlowToolBar::centerSlide()
|
||||
{
|
||||
emit(setCenter(edit->text().toInt()-1));
|
||||
}
|
33
YACReader/goto_flow_toolbar.h
Normal file
33
YACReader/goto_flow_toolbar.h
Normal file
@ -0,0 +1,33 @@
|
||||
#ifndef GOTO_FLOW_TOOLBAR_H
|
||||
#define GOTO_FLOW_TOOLBAR_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class QLineEdit;
|
||||
class QIntValidator;
|
||||
class QPushButton;
|
||||
|
||||
class GoToFlowToolBar : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
QLineEdit * edit;
|
||||
QIntValidator * v;
|
||||
QPushButton * centerButton;
|
||||
QPushButton * goToButton;
|
||||
QWidget * bar;
|
||||
void resizeEvent(QResizeEvent * event);
|
||||
|
||||
public:
|
||||
GoToFlowToolBar(QWidget * parent = 0);
|
||||
public slots:
|
||||
void setPage(int pageNumber);
|
||||
void setTop(int numPages);
|
||||
void goTo();
|
||||
void centerSlide();
|
||||
signals:
|
||||
void setCenter(unsigned int);
|
||||
void goTo(unsigned int);
|
||||
};
|
||||
|
||||
#endif
|
58
YACReader/goto_flow_widget.cpp
Normal file
58
YACReader/goto_flow_widget.cpp
Normal file
@ -0,0 +1,58 @@
|
||||
#include "goto_flow_widget.h"
|
||||
|
||||
#include <QSettings>
|
||||
#include <QHBoxLayout>
|
||||
#include <QKeyEvent>
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include "goto_flow_toolbar.h"
|
||||
#include "goto_flow_decorationbar.h"
|
||||
|
||||
GoToFlowWidget::GoToFlowWidget(QWidget * parent)
|
||||
:QWidget(parent)
|
||||
{
|
||||
mainLayout = new QVBoxLayout;
|
||||
|
||||
mainLayout->setMargin(0);
|
||||
mainLayout->setSpacing(0);
|
||||
|
||||
topBar = new GoToFlowDecorationBar(this);
|
||||
toolBar = new GoToFlowToolBar(this);
|
||||
|
||||
mainLayout->addWidget(topBar);
|
||||
mainLayout->addWidget(toolBar);
|
||||
|
||||
mainLayout->setMargin(0);
|
||||
mainLayout->setSpacing(0);
|
||||
|
||||
setLayout(mainLayout);
|
||||
}
|
||||
|
||||
void GoToFlowWidget::setPageNumber(int page)
|
||||
{
|
||||
toolBar->setPage(page);
|
||||
}
|
||||
|
||||
void GoToFlowWidget::keyPressEvent(QKeyEvent* event)
|
||||
{
|
||||
switch (event->key())
|
||||
{
|
||||
case Qt::Key_Return: case Qt::Key_Enter:
|
||||
toolBar->goTo();
|
||||
toolBar->centerSlide();
|
||||
break;
|
||||
case Qt::Key_Space:
|
||||
toolBar->centerSlide();
|
||||
break;
|
||||
case Qt::Key_S:
|
||||
QCoreApplication::sendEvent(this->parent(),event);
|
||||
break;
|
||||
case Qt::Key_Left: case Qt::Key_Right:
|
||||
//if(event->modifiers() == Qt::ControlModifier)
|
||||
//flow->keyPressEvent(event);
|
||||
//QCoreApplication::sendEvent(flow,event);
|
||||
break;
|
||||
}
|
||||
|
||||
event->accept();
|
||||
}
|
37
YACReader/goto_flow_widget.h
Normal file
37
YACReader/goto_flow_widget.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef __GOTO_FLOW_WIDGET_H
|
||||
#define __GOTO_FLOW_WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QSettings>
|
||||
#include "yacreader_global.h"
|
||||
|
||||
class QSettings;
|
||||
class GoToFlowDecorationBar;
|
||||
class GoToFlowToolBar;
|
||||
class QVBoxLayout;
|
||||
|
||||
class GoToFlowWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
protected:
|
||||
QVBoxLayout * mainLayout;
|
||||
GoToFlowDecorationBar * topBar;
|
||||
GoToFlowToolBar * toolBar;
|
||||
public:
|
||||
GoToFlowWidget(QWidget * paret = 0);
|
||||
public slots:
|
||||
virtual void reset() = 0;
|
||||
virtual void centerSlide(int slide) = 0;
|
||||
virtual void setPageNumber(int page);
|
||||
virtual void setFlowType(FlowType flowType) = 0;
|
||||
virtual void setNumSlides(unsigned int slides) = 0;
|
||||
virtual void setImageReady(int index,const QByteArray & image) = 0;
|
||||
virtual void updateSize() = 0;
|
||||
virtual void updateConfig(QSettings * settings) = 0;
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent* event);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
BIN
YACReader/icon.ico
Normal file
BIN
YACReader/icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 97 KiB |
1
YACReader/icon.rc
Normal file
1
YACReader/icon.rc
Normal file
@ -0,0 +1 @@
|
||||
IDI_ICON1 ICON DISCARDABLE "icon.ico"
|
95
YACReader/images.qrc
Normal file
95
YACReader/images.qrc
Normal file
@ -0,0 +1,95 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>../images/open.png</file>
|
||||
<file>../images/openFolder.png</file>
|
||||
<file>../images/next.png</file>
|
||||
<file>../images/prev.png</file>
|
||||
<file>../images/icon.png</file>
|
||||
<file>../images/zoom.png</file>
|
||||
<file>../images/fit.png</file>
|
||||
<file>../images/goto.png</file>
|
||||
<file>../images/help.png</file>
|
||||
<file>../images/center.png</file>
|
||||
<file>../images/options.png</file>
|
||||
<file>../images/comicFolder.png</file>
|
||||
<file>../images/save.png</file>
|
||||
<file>../images/rotateL.png</file>
|
||||
<file>../images/rotateR.png</file>
|
||||
<file>../images/flow1.png</file>
|
||||
<file>../images/flow2.png</file>
|
||||
<file>../images/flow3.png</file>
|
||||
<file>../images/flow4.png</file>
|
||||
<file>../images/flow5.png</file>
|
||||
<file>../images/bookmark.png</file>
|
||||
<file>../images/setBookmark.png</file>
|
||||
<file>../images/notCover.png</file>
|
||||
<file>../images/previousComic.png</file>
|
||||
<file>../images/nextComic.png</file>
|
||||
<file>../images/deleteLibrary.png</file>
|
||||
<file>../images/properties.png</file>
|
||||
<file>../images/doublePage.png</file>
|
||||
<file>../images/shortcuts.png</file>
|
||||
<file>../images/close.png</file>
|
||||
<file>../images/up.png</file>
|
||||
<file>../images/down.png</file>
|
||||
<file>../images/dictionary.png</file>
|
||||
<file>../images/alwaysOnTop.png</file>
|
||||
<file>../images/adjustToFullSize.png</file>
|
||||
<file>../images/numPagesLabel.png</file>
|
||||
<file>../images/numPagesLabelMedium.png</file>
|
||||
<file>../images/numPagesLabelBig.png</file>
|
||||
<file>../images/imgTopLeft.png</file>
|
||||
<file>../images/imgTopMiddle.png</file>
|
||||
<file>../images/imgTopRight.png</file>
|
||||
<file>../images/imgBottomLeft.png</file>
|
||||
<file>../images/imgBottomMiddle.png</file>
|
||||
<file>../images/imgBottomRight.png</file>
|
||||
<file>../images/imgEdit.png</file>
|
||||
<file>../images/imgCenterSlide.png</file>
|
||||
<file>../images/imgGoToSlide.png</file>
|
||||
<file>../images/imgCenterSlidePressed.png</file>
|
||||
<file>../images/imgGoToSlidePressed.png</file>
|
||||
<file>../images/sliderBackground.png</file>
|
||||
<file>../images/sliderGround.png</file>
|
||||
<file>../images/sliderSubPage.png</file>
|
||||
<file>../images/sliderAddPage.png</file>
|
||||
<file>../images/sliderHandle.png</file>
|
||||
|
||||
<file>../images/helpImages/open.png</file>
|
||||
<file>../images/helpImages/openFolder.png</file>
|
||||
<file>../images/helpImages/next.png</file>
|
||||
<file>../images/helpImages/prev.png</file>
|
||||
<file>../images/helpImages/icon.png</file>
|
||||
<file>../images/helpImages/zoom.png</file>
|
||||
<file>../images/helpImages/fit.png</file>
|
||||
<file>../images/helpImages/goto.png</file>
|
||||
<file>../images/helpImages/help.png</file>
|
||||
<file>../images/helpImages/center.png</file>
|
||||
<file>../images/helpImages/options.png</file>
|
||||
<file>../images/helpImages/comicFolder.png</file>
|
||||
<file>../images/helpImages/save.png</file>
|
||||
<file>../images/helpImages/rotateL.png</file>
|
||||
<file>../images/helpImages/rotateR.png</file>
|
||||
<file>../images/helpImages/flow1.png</file>
|
||||
<file>../images/helpImages/flow2.png</file>
|
||||
<file>../images/helpImages/flow3.png</file>
|
||||
<file>../images/helpImages/bookmark.png</file>
|
||||
<file>../images/helpImages/setBookmark.png</file>
|
||||
<file>../images/helpImages/notCover.png</file>
|
||||
<file>../images/helpImages/previousComic.png</file>
|
||||
<file>../images/helpImages/nextComic.png</file>
|
||||
<file>../images/helpImages/deleteLibrary.png</file>
|
||||
<file>../images/helpImages/properties.png</file>
|
||||
<file>../images/helpImages/doublePage.png</file>
|
||||
<file>../images/helpImages/shortcuts.png</file>
|
||||
<file>../images/helpImages/keyboard.png</file>
|
||||
<file>../images/helpImages/mouse.png</file>
|
||||
<file>../images/helpImages/speaker.png</file>
|
||||
<file>../images/defaultCover.png</file>
|
||||
<file>../images/onStartFlowSelection.png</file>
|
||||
<file>../images/onStartFlowSelection_es.png</file>
|
||||
<file>../images/useNewFlowButton.png</file>
|
||||
<file>../images/useOldFlowButton.png</file>
|
||||
<file>../images/notificationsLabel.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
267
YACReader/magnifying_glass.cpp
Normal file
267
YACReader/magnifying_glass.cpp
Normal file
@ -0,0 +1,267 @@
|
||||
#include "magnifying_glass.h"
|
||||
#include "viewer.h"
|
||||
|
||||
|
||||
|
||||
MagnifyingGlass::MagnifyingGlass(int w, int h, QWidget * parent)
|
||||
:QLabel(parent),zoomLevel(0.5)
|
||||
{
|
||||
setup(QSize(w,h));
|
||||
}
|
||||
|
||||
MagnifyingGlass::MagnifyingGlass(const QSize & size, QWidget * parent)
|
||||
:QLabel(parent),zoomLevel(0.5)
|
||||
{
|
||||
setup(size);
|
||||
}
|
||||
|
||||
void MagnifyingGlass::setup(const QSize & size)
|
||||
{
|
||||
resize(size);
|
||||
setScaledContents(true);
|
||||
setMouseTracking(true);
|
||||
setCursor(QCursor(QBitmap(1,1),QBitmap(1,1)));
|
||||
}
|
||||
|
||||
void MagnifyingGlass::mouseMoveEvent(QMouseEvent * event)
|
||||
{
|
||||
updateImage();
|
||||
}
|
||||
|
||||
void MagnifyingGlass::updateImage(int x, int y)
|
||||
{
|
||||
//image section augmented
|
||||
int zoomWidth = static_cast<int>(width() * zoomLevel);
|
||||
int zoomHeight = static_cast<int>(height() * zoomLevel);
|
||||
Viewer * p = (Viewer *)parent();
|
||||
int currentPos = p->verticalScrollBar()->sliderPosition();
|
||||
const QPixmap * image = p->pixmap();
|
||||
int iWidth = image->width();
|
||||
int iHeight = image->height();
|
||||
float wFactor = static_cast<float>(iWidth) / p->widget()->width();
|
||||
float hFactor = static_cast<float>(iHeight) / p->widget()->height();
|
||||
zoomWidth *= wFactor;
|
||||
zoomHeight *= hFactor;
|
||||
if(p->verticalScrollBar()->minimum()==p->verticalScrollBar()->maximum())
|
||||
{
|
||||
int xp = static_cast<int>(((x-p->widget()->pos().x())*wFactor)-zoomWidth/2);
|
||||
int yp = static_cast<int>((y-p->widget()->pos().y()+currentPos)*hFactor-zoomHeight/2);
|
||||
int xOffset=0;
|
||||
int yOffset=0;
|
||||
int zw=zoomWidth;
|
||||
int zh=zoomHeight;
|
||||
//int wOffset,hOffset=0;
|
||||
bool outImage = false;
|
||||
if(xp<0)
|
||||
{
|
||||
xOffset = -xp;
|
||||
xp=0;
|
||||
zw = zw - xOffset;
|
||||
outImage = true;
|
||||
}
|
||||
if(yp<0)
|
||||
{
|
||||
yOffset = -yp;
|
||||
yp=0;
|
||||
zh = zh - yOffset;
|
||||
outImage = true;
|
||||
}
|
||||
|
||||
if(xp+zoomWidth >= image->width())
|
||||
{
|
||||
zw -= xp+zw - image->width();
|
||||
outImage = true;
|
||||
}
|
||||
if(yp+zoomHeight >= image->height())
|
||||
{
|
||||
zh -= yp+zh - image->height();
|
||||
outImage = true;
|
||||
}
|
||||
if(outImage)
|
||||
{
|
||||
QImage img(zoomWidth,zoomHeight,QImage::Format_RGB32);
|
||||
img.fill(0);
|
||||
if(zw>0&&zh>0)
|
||||
{
|
||||
QPainter painter(&img);
|
||||
painter.drawPixmap(xOffset,yOffset,p->pixmap()->copy(xp,yp,zw,zh));
|
||||
}
|
||||
setPixmap(QPixmap().fromImage(img));
|
||||
}
|
||||
else
|
||||
setPixmap(p->pixmap()->copy(xp,yp,zoomWidth,zoomHeight));
|
||||
}
|
||||
else
|
||||
{
|
||||
int xp = static_cast<int>(((x-p->widget()->pos().x())*wFactor)-zoomWidth/2);
|
||||
int yp = static_cast<int>((y+currentPos)*hFactor-zoomHeight/2);
|
||||
int xOffset=0;
|
||||
int yOffset=0;
|
||||
int zw=zoomWidth;
|
||||
int zh=zoomHeight;
|
||||
//int wOffset,hOffset=0;
|
||||
bool outImage = false;
|
||||
if(xp<0)
|
||||
{
|
||||
xOffset = -xp;
|
||||
xp=0;
|
||||
zw = zw - xOffset;
|
||||
outImage = true;
|
||||
}
|
||||
if(yp<0)
|
||||
{
|
||||
yOffset = -yp;
|
||||
yp=0;
|
||||
zh = zh - yOffset;
|
||||
outImage = true;
|
||||
}
|
||||
|
||||
if(xp+zoomWidth >= image->width())
|
||||
{
|
||||
zw -= xp+zw - image->width();
|
||||
outImage = true;
|
||||
}
|
||||
if(yp+zoomHeight >= image->height())
|
||||
{
|
||||
zh -= yp+zh - image->height();
|
||||
outImage = true;
|
||||
}
|
||||
if(outImage)
|
||||
{
|
||||
QImage img(zoomWidth,zoomHeight,QImage::Format_RGB32);
|
||||
img.fill(0);
|
||||
if(zw>0&&zh>0)
|
||||
{
|
||||
QPainter painter(&img);
|
||||
painter.drawPixmap(xOffset,yOffset,p->pixmap()->copy(xp,yp,zw,zh));
|
||||
}
|
||||
setPixmap(QPixmap().fromImage(img));
|
||||
}
|
||||
else
|
||||
setPixmap(p->pixmap()->copy(xp,yp,zoomWidth,zoomHeight));
|
||||
}
|
||||
move(static_cast<int>(x-float(width())/2),static_cast<int>(y-float(height())/2));
|
||||
}
|
||||
|
||||
void MagnifyingGlass::updateImage()
|
||||
{
|
||||
if(isVisible())
|
||||
{
|
||||
QPoint p = QPoint(cursor().pos().x(),cursor().pos().y());
|
||||
p = this->parentWidget()->mapFromGlobal(p);
|
||||
updateImage(p.x(),p.y());
|
||||
}
|
||||
}
|
||||
void MagnifyingGlass::wheelEvent(QWheelEvent * event)
|
||||
{
|
||||
switch(event->modifiers())
|
||||
{
|
||||
//size
|
||||
case Qt::NoModifier:
|
||||
if(event->delta()<0)
|
||||
sizeUp();
|
||||
else
|
||||
sizeDown();
|
||||
break;
|
||||
//size height
|
||||
case Qt::ControlModifier:
|
||||
if(event->delta()<0)
|
||||
heightUp();
|
||||
else
|
||||
heightDown();
|
||||
break;
|
||||
//size width
|
||||
case Qt::AltModifier:
|
||||
if(event->delta()<0)
|
||||
widthUp();
|
||||
else
|
||||
widthDown();
|
||||
break;
|
||||
//zoom level
|
||||
case Qt::ShiftModifier:
|
||||
if(event->delta()<0)
|
||||
zoomIn();
|
||||
else
|
||||
zoomOut();
|
||||
break;
|
||||
}
|
||||
updateImage();
|
||||
event->setAccepted(true);
|
||||
}
|
||||
void MagnifyingGlass::zoomIn()
|
||||
{
|
||||
if(zoomLevel>0.2)
|
||||
zoomLevel -= 0.025;
|
||||
}
|
||||
|
||||
void MagnifyingGlass::zoomOut()
|
||||
{
|
||||
if(zoomLevel<0.9)
|
||||
zoomLevel += 0.025;
|
||||
}
|
||||
|
||||
void MagnifyingGlass::sizeUp()
|
||||
{
|
||||
Viewer * p = (Viewer *)parent();
|
||||
if(width()<(p->width()*0.90))
|
||||
resize(width()+30,height()+15);
|
||||
}
|
||||
|
||||
void MagnifyingGlass::sizeDown()
|
||||
{
|
||||
if(width()>175)
|
||||
resize(width()-30,height()-15);
|
||||
}
|
||||
|
||||
void MagnifyingGlass::heightUp()
|
||||
{
|
||||
Viewer * p = (Viewer *)parent();
|
||||
if(height()<(p->height()*0.90))
|
||||
resize(width(),height()+15);
|
||||
}
|
||||
|
||||
void MagnifyingGlass::heightDown()
|
||||
{
|
||||
if(height()>80)
|
||||
resize(width(),height()-15);
|
||||
}
|
||||
|
||||
void MagnifyingGlass::widthUp()
|
||||
{
|
||||
Viewer * p = (Viewer *)parent();
|
||||
if(width()<(p->width()*0.90))
|
||||
resize(width()+30,height());
|
||||
}
|
||||
|
||||
void MagnifyingGlass::widthDown()
|
||||
{
|
||||
if(width()>175)
|
||||
resize(width()-30,height());
|
||||
}
|
||||
|
||||
void MagnifyingGlass::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
bool validKey = false;
|
||||
switch (event->key())
|
||||
{
|
||||
case Qt::Key_Plus:
|
||||
sizeUp();
|
||||
validKey = true;
|
||||
break;
|
||||
case Qt::Key_Minus:
|
||||
sizeDown();
|
||||
validKey = true;
|
||||
break;
|
||||
case Qt::Key_Underscore:
|
||||
zoomOut();
|
||||
validKey = true;
|
||||
break;
|
||||
case Qt::Key_Asterisk:
|
||||
zoomIn();
|
||||
validKey = true;
|
||||
break;
|
||||
}
|
||||
updateImage();
|
||||
if(validKey)
|
||||
event->setAccepted(true);
|
||||
}
|
34
YACReader/magnifying_glass.h
Normal file
34
YACReader/magnifying_glass.h
Normal file
@ -0,0 +1,34 @@
|
||||
#ifndef __MAGNIFYING_GLASS
|
||||
#define __MAGNIFYING_GLASS
|
||||
|
||||
#include <QLabel>
|
||||
#include <QtGui>
|
||||
#include <QMouseEvent>
|
||||
#include <QWidget>
|
||||
|
||||
class MagnifyingGlass : public QLabel
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
float zoomLevel;
|
||||
void setup(const QSize & size);
|
||||
void keyPressEvent(QKeyEvent * event);
|
||||
public:
|
||||
MagnifyingGlass(int width,int height,QWidget * parent);
|
||||
MagnifyingGlass(const QSize & size, QWidget * parent);
|
||||
void mouseMoveEvent(QMouseEvent * event);
|
||||
public slots:
|
||||
void updateImage(int x, int y);
|
||||
void updateImage();
|
||||
void wheelEvent(QWheelEvent * event);
|
||||
void zoomIn();
|
||||
void zoomOut();
|
||||
void sizeUp();
|
||||
void sizeDown();
|
||||
void heightUp();
|
||||
void heightDown();
|
||||
void widthUp();
|
||||
void widthDown();
|
||||
};
|
||||
|
||||
#endif
|
47
YACReader/main.cpp
Normal file
47
YACReader/main.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
#include <QApplication>
|
||||
#include <QPixmap>
|
||||
#include <QLabel>
|
||||
//#include <QMetaObject>
|
||||
#include <QPushButton>
|
||||
#include <QMainWindow>
|
||||
#include <QtCore>
|
||||
#include <QThread>
|
||||
#include <QFile>
|
||||
#include <QDataStream>
|
||||
#include <QTranslator>
|
||||
#include "main_window_viewer.h"
|
||||
#include "configuration.h"
|
||||
|
||||
|
||||
|
||||
#if defined(WIN32) && defined(_DEBUG)
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
#include <stdlib.h>
|
||||
#include <crtdbg.h>
|
||||
#define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
{
|
||||
#if defined(_MSC_VER) && defined(_DEBUG)
|
||||
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
|
||||
#endif
|
||||
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QTranslator translator;
|
||||
QString sufix = QLocale::system().name();
|
||||
translator.load(QCoreApplication::applicationDirPath()+"/languages/yacreader_"+sufix);
|
||||
app.installTranslator(&translator);
|
||||
app.setApplicationName("YACReader");
|
||||
|
||||
MainWindowViewer * mwv = new MainWindowViewer();
|
||||
mwv->show();
|
||||
|
||||
int ret = app.exec();
|
||||
|
||||
Configuration::getConfiguration().save();
|
||||
|
||||
return ret;
|
||||
}
|
782
YACReader/main_window_viewer.cpp
Normal file
782
YACReader/main_window_viewer.cpp
Normal file
@ -0,0 +1,782 @@
|
||||
#include "main_window_viewer.h"
|
||||
#include "configuration.h"
|
||||
#include "viewer.h"
|
||||
#include "goto_dialog.h"
|
||||
#include "custom_widgets.h"
|
||||
#include "options_dialog.h"
|
||||
#include "check_new_version.h"
|
||||
#include "comic.h"
|
||||
#include "bookmarks_dialog.h"
|
||||
#include "shortcuts_dialog.h"
|
||||
#include "width_slider.h"
|
||||
#include "qnaturalsorting.h"
|
||||
#include "help_about_dialog.h"
|
||||
#include "yacreader_tool_bar_stretch.h"
|
||||
|
||||
#include <ctime>
|
||||
#include <algorithm>
|
||||
|
||||
MainWindowViewer::MainWindowViewer()
|
||||
:QMainWindow(),fullscreen(false),toolbars(true),alwaysOnTop(false),currentDirectory("."),currentDirectoryImgDest(".")
|
||||
{
|
||||
loadConfiguration();
|
||||
setupUI();
|
||||
}
|
||||
|
||||
void MainWindowViewer::loadConfiguration()
|
||||
{
|
||||
settings = new QSettings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
|
||||
Configuration & config = Configuration::getConfiguration();
|
||||
config.load(settings);
|
||||
currentDirectory = config.getDefaultPath();
|
||||
fullscreen = config.getFullScreen();
|
||||
}
|
||||
|
||||
void MainWindowViewer::setupUI()
|
||||
{
|
||||
setWindowIcon(QIcon(":/images/icon.png"));
|
||||
|
||||
setUnifiedTitleAndToolBarOnMac(true);
|
||||
|
||||
viewer = new Viewer(this);
|
||||
connect(viewer,SIGNAL(reset()),this,SLOT(disableActions()));
|
||||
|
||||
setCentralWidget(viewer);
|
||||
int heightDesktopResolution = QApplication::desktop()->screenGeometry().height();
|
||||
int widthDesktopResolution = QApplication::desktop()->screenGeometry().width();
|
||||
int height,width;
|
||||
height = static_cast<int>(heightDesktopResolution*0.84);
|
||||
width = static_cast<int>(height*0.70);
|
||||
Configuration & conf = Configuration::getConfiguration();
|
||||
QPoint p = conf.getPos();
|
||||
QSize s = conf.getSize();
|
||||
if(s.width()!=0)
|
||||
{
|
||||
move(p);
|
||||
resize(s);
|
||||
}
|
||||
else
|
||||
{
|
||||
move(QPoint((widthDesktopResolution-width)/2,((heightDesktopResolution-height)-40)/2));
|
||||
resize(QSize(width,height));
|
||||
}
|
||||
|
||||
had = new HelpAboutDialog(this); //TODO load data
|
||||
|
||||
had->loadAboutInformation(":/files/about.html");
|
||||
had->loadHelp(":/files/helpYACReader.html");
|
||||
|
||||
optionsDialog = new OptionsDialog(this);
|
||||
connect(optionsDialog,SIGNAL(accepted()),viewer,SLOT(updateOptions()));
|
||||
connect(optionsDialog,SIGNAL(fitToWidthRatioChanged(float)),viewer,SLOT(updateFitToWidthRatio(float)));
|
||||
connect(optionsDialog, SIGNAL(optionsChanged()),this,SLOT(reloadOptions()));
|
||||
connect(optionsDialog,SIGNAL(changedImageOptions()),viewer,SLOT(updateImageOptions()));
|
||||
|
||||
optionsDialog->restoreOptions(settings);
|
||||
shortcutsDialog = new ShortcutsDialog(this);
|
||||
|
||||
createActions();
|
||||
createToolBars();
|
||||
|
||||
setWindowTitle("YACReader");
|
||||
|
||||
if(QCoreApplication::argc()>1)
|
||||
{
|
||||
//TODO: new method open(QString)
|
||||
QString pathFile = QCoreApplication::arguments().at(1);
|
||||
currentDirectory = pathFile;
|
||||
QFileInfo fi(pathFile);
|
||||
getSiblingComics(fi.absolutePath(),fi.fileName());
|
||||
|
||||
setWindowTitle("YACReader - " + fi.fileName());
|
||||
|
||||
enableActions();
|
||||
|
||||
viewer->open(pathFile);
|
||||
|
||||
}
|
||||
|
||||
versionChecker = new HttpVersionChecker();
|
||||
|
||||
connect(versionChecker,SIGNAL(newVersionDetected()),
|
||||
this,SLOT(newVersion()));
|
||||
|
||||
QTimer * tT = new QTimer;
|
||||
|
||||
tT->setSingleShot(true);
|
||||
connect(tT, SIGNAL(timeout()), versionChecker, SLOT(get()));
|
||||
//versionChecker->get(); //TOD<4F>
|
||||
tT->start(100);
|
||||
|
||||
viewer->setFocusPolicy(Qt::StrongFocus);
|
||||
|
||||
|
||||
if(Configuration::getConfiguration().getAlwaysOnTop())
|
||||
{
|
||||
setWindowFlags(this->windowFlags() | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);
|
||||
}
|
||||
|
||||
if(fullscreen)
|
||||
toFullScreen();
|
||||
if(conf.getMaximized())
|
||||
showMaximized();
|
||||
|
||||
setAcceptDrops(true);
|
||||
|
||||
if(Configuration::getConfiguration().getShowToolbars() && !Configuration::getConfiguration().getFullScreen())
|
||||
showToolBars();
|
||||
else
|
||||
hideToolBars();
|
||||
}
|
||||
|
||||
void MainWindowViewer::createActions()
|
||||
{
|
||||
openAction = new QAction(tr("&Open"),this);
|
||||
openAction->setShortcut(tr("O"));
|
||||
openAction->setIcon(QIcon(":/images/open.png"));
|
||||
openAction->setToolTip(tr("Open a comic"));
|
||||
connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
|
||||
|
||||
openFolderAction = new QAction(tr("Open Folder"),this);
|
||||
openFolderAction->setShortcut(tr("Ctrl+O"));
|
||||
openFolderAction->setIcon(QIcon(":/images/openFolder.png"));
|
||||
openFolderAction->setToolTip(tr("Open image folder"));
|
||||
connect(openFolderAction, SIGNAL(triggered()), this, SLOT(openFolder()));
|
||||
|
||||
saveImageAction = new QAction(tr("Save"),this);
|
||||
saveImageAction->setIcon(QIcon(":/images/save.png"));
|
||||
saveImageAction->setToolTip(tr("Save current page"));
|
||||
saveImageAction->setDisabled(true);
|
||||
connect(saveImageAction,SIGNAL(triggered()),this,SLOT(saveImage()));
|
||||
|
||||
openPreviousComicAction = new QAction(tr("Previous Comic"),this);
|
||||
openPreviousComicAction->setIcon(QIcon(":/images/previousComic.png"));
|
||||
openPreviousComicAction->setShortcut(Qt::CTRL + Qt::Key_Left);
|
||||
openPreviousComicAction->setToolTip(tr("Open previous comic"));
|
||||
openPreviousComicAction->setDisabled(true);
|
||||
connect(openPreviousComicAction,SIGNAL(triggered()),this,SLOT(openPreviousComic()));
|
||||
|
||||
openNextComicAction = new QAction(tr("Next Comic"),this);
|
||||
openNextComicAction->setIcon(QIcon(":/images/nextComic.png"));
|
||||
openNextComicAction->setShortcut(Qt::CTRL + Qt::Key_Right);
|
||||
openNextComicAction->setToolTip(tr("Open next comic"));
|
||||
openNextComicAction->setDisabled(true);
|
||||
connect(openNextComicAction,SIGNAL(triggered()),this,SLOT(openNextComic()));
|
||||
|
||||
prevAction = new QAction(tr("&Previous"),this);
|
||||
prevAction->setIcon(QIcon(":/images/prev.png"));
|
||||
prevAction->setShortcut(Qt::Key_Left);
|
||||
prevAction->setToolTip(tr("Go to previous page"));
|
||||
prevAction->setDisabled(true);
|
||||
connect(prevAction, SIGNAL(triggered()),viewer,SLOT(prev()));
|
||||
|
||||
nextAction = new QAction(tr("&Next"),this);
|
||||
nextAction->setIcon(QIcon(":/images/next.png"));
|
||||
nextAction->setShortcut(Qt::Key_Right);
|
||||
nextAction->setToolTip(tr("Go to next page"));
|
||||
nextAction->setDisabled(true);
|
||||
connect(nextAction, SIGNAL(triggered()),viewer,SLOT(next()));
|
||||
|
||||
adjustWidth = new QAction(tr("Fit Width"),this);
|
||||
adjustWidth->setShortcut(tr("A"));
|
||||
adjustWidth->setIcon(QIcon(":/images/fit.png"));
|
||||
adjustWidth->setCheckable(true);
|
||||
adjustWidth->setDisabled(true);
|
||||
adjustWidth->setChecked(Configuration::getConfiguration().getAdjustToWidth());
|
||||
adjustWidth->setToolTip(tr("Fit image to ..."));
|
||||
//adjustWidth->setIcon(QIcon(":/images/fitWidth.png"));
|
||||
connect(adjustWidth, SIGNAL(triggered()),this,SLOT(changeFit()));
|
||||
|
||||
leftRotationAction = new QAction(tr("Rotate image to the left"),this);
|
||||
leftRotationAction->setShortcut(tr("L"));
|
||||
leftRotationAction->setIcon(QIcon(":/images/rotateL.png"));
|
||||
leftRotationAction->setDisabled(true);
|
||||
connect(leftRotationAction, SIGNAL(triggered()),viewer,SLOT(rotateLeft()));
|
||||
|
||||
rightRotationAction = new QAction(tr("Rotate image to the right"),this);
|
||||
rightRotationAction->setShortcut(tr("R"));
|
||||
rightRotationAction->setIcon(QIcon(":/images/rotateR.png"));
|
||||
rightRotationAction->setDisabled(true);
|
||||
connect(rightRotationAction, SIGNAL(triggered()),viewer,SLOT(rotateRight()));
|
||||
|
||||
doublePageAction = new QAction(tr("Double page mode"),this);
|
||||
doublePageAction->setToolTip(tr("Switch to double page mode"));
|
||||
doublePageAction->setShortcut(tr("D"));
|
||||
doublePageAction->setIcon(QIcon(":/images/doublePage.png"));
|
||||
doublePageAction->setDisabled(true);
|
||||
doublePageAction->setCheckable(true);
|
||||
doublePageAction->setChecked(Configuration::getConfiguration().getDoublePage());
|
||||
connect(doublePageAction, SIGNAL(triggered()),viewer,SLOT(doublePageSwitch()));
|
||||
|
||||
goToPage = new QAction(tr("Go To"),this);
|
||||
goToPage->setShortcut(tr("G"));
|
||||
goToPage->setIcon(QIcon(":/images/goto.png"));
|
||||
goToPage->setDisabled(true);
|
||||
goToPage->setToolTip(tr("Go to page ..."));
|
||||
connect(goToPage, SIGNAL(triggered()),viewer,SLOT(showGoToDialog()));
|
||||
|
||||
optionsAction = new QAction(tr("Options"),this);
|
||||
optionsAction->setShortcut(tr("C"));
|
||||
optionsAction->setToolTip(tr("YACReader options"));
|
||||
optionsAction->setIcon(QIcon(":/images/options.png"));
|
||||
|
||||
connect(optionsAction, SIGNAL(triggered()),optionsDialog,SLOT(show()));
|
||||
|
||||
helpAboutAction = new QAction(tr("Help"),this);
|
||||
helpAboutAction->setToolTip(tr("Help, About YACReader"));
|
||||
helpAboutAction->setShortcut(Qt::Key_F1);
|
||||
helpAboutAction->setIcon(QIcon(":/images/help.png"));
|
||||
connect(helpAboutAction, SIGNAL(triggered()),had,SLOT(show()));
|
||||
|
||||
showMagnifyingGlass = new QAction(tr("Magnifying glass"),this);
|
||||
showMagnifyingGlass->setToolTip(tr("Switch Magnifying glass"));
|
||||
showMagnifyingGlass->setShortcut(tr("Z"));
|
||||
showMagnifyingGlass->setIcon(QIcon(":/images/zoom.png"));
|
||||
showMagnifyingGlass->setDisabled(true);
|
||||
showMagnifyingGlass->setCheckable(true);
|
||||
connect(showMagnifyingGlass, SIGNAL(triggered()),viewer,SLOT(magnifyingGlassSwitch()));
|
||||
|
||||
setBookmark = new QAction(tr("Set bookmark"),this);
|
||||
setBookmark->setToolTip(tr("Set a bookmark on the current page"));
|
||||
setBookmark->setShortcut(Qt::CTRL+Qt::Key_M);
|
||||
setBookmark->setIcon(QIcon(":/images/setBookmark.png"));
|
||||
setBookmark->setDisabled(true);
|
||||
setBookmark->setCheckable(true);
|
||||
connect(setBookmark,SIGNAL(triggered (bool)),viewer,SLOT(setBookmark(bool)));
|
||||
connect(viewer,SIGNAL(pageAvailable(bool)),setBookmark,SLOT(setEnabled(bool)));
|
||||
connect(viewer,SIGNAL(pageIsBookmark(bool)),setBookmark,SLOT(setChecked(bool)));
|
||||
|
||||
showBookmarks = new QAction(tr("Show bookmarks"),this);
|
||||
showBookmarks->setToolTip(tr("Show the bookmarks of the current comic"));
|
||||
showBookmarks->setShortcut(tr("M"));
|
||||
showBookmarks->setIcon(QIcon(":/images/bookmark.png"));
|
||||
showBookmarks->setDisabled(true);
|
||||
connect(showBookmarks, SIGNAL(triggered()),viewer->getBookmarksDialog(),SLOT(show()));
|
||||
|
||||
showShorcutsAction = new QAction(tr("Show keyboard shortcuts"), this );
|
||||
showShorcutsAction->setIcon(QIcon(":/images/shortcuts.png"));
|
||||
connect(showShorcutsAction, SIGNAL(triggered()),shortcutsDialog,SLOT(show()));
|
||||
|
||||
showInfo = new QAction(tr("Show Info"),this);
|
||||
showInfo->setShortcut(tr("I"));
|
||||
showInfo->setIcon(QIcon(":/images/properties.png"));
|
||||
showInfo->setDisabled(true);
|
||||
connect(showInfo, SIGNAL(triggered()),viewer,SLOT(informationSwitch()));
|
||||
|
||||
closeAction = new QAction(tr("Close"),this);
|
||||
closeAction->setShortcut(Qt::Key_Escape);
|
||||
closeAction->setIcon(QIcon(":/images/deleteLibrary.png"));
|
||||
connect(closeAction,SIGNAL(triggered()),this,SLOT(close()));
|
||||
|
||||
showDictionaryAction = new QAction(tr("Show Dictionary"),this);
|
||||
showDictionaryAction->setShortcut(Qt::Key_T);
|
||||
showDictionaryAction->setIcon(QIcon(":/images/dictionary.png"));
|
||||
showDictionaryAction->setCheckable(true);
|
||||
showDictionaryAction->setDisabled(true);
|
||||
connect(showDictionaryAction,SIGNAL(triggered()),viewer,SLOT(translatorSwitch()));
|
||||
|
||||
alwaysOnTopAction = new QAction(tr("Always on top"),this);
|
||||
alwaysOnTopAction->setShortcut(Qt::Key_Q);
|
||||
alwaysOnTopAction->setIcon(QIcon(":/images/alwaysOnTop.png"));
|
||||
alwaysOnTopAction->setCheckable(true);
|
||||
alwaysOnTopAction->setDisabled(true);
|
||||
alwaysOnTopAction->setChecked(Configuration::getConfiguration().getAlwaysOnTop());
|
||||
connect(alwaysOnTopAction,SIGNAL(triggered()),this,SLOT(alwaysOnTopSwitch()));
|
||||
|
||||
adjustToFullSizeAction = new QAction(tr("Show full size"),this);
|
||||
adjustToFullSizeAction->setShortcut(Qt::Key_W);
|
||||
adjustToFullSizeAction->setIcon(QIcon(":/images/adjustToFullSize.png"));
|
||||
adjustToFullSizeAction->setCheckable(true);
|
||||
adjustToFullSizeAction->setDisabled(true);
|
||||
adjustToFullSizeAction->setChecked(Configuration::getConfiguration().getAdjustToFullSize());
|
||||
connect(adjustToFullSizeAction,SIGNAL(triggered()),this,SLOT(adjustToFullSizeSwitch()));
|
||||
}
|
||||
|
||||
void MainWindowViewer::createToolBars()
|
||||
{
|
||||
comicToolBar = addToolBar(tr("&File"));
|
||||
|
||||
QToolButton * tb = new QToolButton();
|
||||
tb->addAction(openAction);
|
||||
tb->addAction(openFolderAction);
|
||||
tb->setPopupMode(QToolButton::MenuButtonPopup);
|
||||
tb->setDefaultAction(openAction);
|
||||
|
||||
comicToolBar->addWidget(tb);
|
||||
comicToolBar->addAction(saveImageAction);
|
||||
comicToolBar->addAction(openPreviousComicAction);
|
||||
comicToolBar->addAction(openNextComicAction);
|
||||
|
||||
comicToolBar->addSeparator();
|
||||
comicToolBar->addAction(prevAction);
|
||||
comicToolBar->addAction(nextAction);
|
||||
comicToolBar->addAction(goToPage);
|
||||
#ifndef Q_OS_MAC
|
||||
comicToolBar->addSeparator();
|
||||
comicToolBar->addAction(alwaysOnTopAction);
|
||||
#else
|
||||
alwaysOnTopAction->setEnabled(false);
|
||||
#endif
|
||||
|
||||
comicToolBar->addSeparator();
|
||||
|
||||
//QWidget * widget = new QWidget();
|
||||
|
||||
//QToolButton * tbW = new QToolButton(widget);
|
||||
//tbW->addAction(adjustWidth);
|
||||
//tbW->setPopupMode(QToolButton::MenuButtonPopup);
|
||||
//tbW->setDefaultAction(adjustWidth);
|
||||
|
||||
//QHBoxLayout *layout = new QHBoxLayout;
|
||||
//layout->addWidget(tbW);
|
||||
//layout->setContentsMargins(0,0,0,0);
|
||||
//widget->setLayout(layout);
|
||||
//widget->setContentsMargins(0,0,0,0);
|
||||
|
||||
//comicToolBar->addWidget(widget);
|
||||
|
||||
//comicToolBar->addAction(adjustWidth);
|
||||
QMenu * menu = new QMenu();
|
||||
sliderAction = new YACReaderSliderAction(this);
|
||||
menu->setAutoFillBackground(false);
|
||||
menu->setStyleSheet(" QMenu {background:transparent; border: 0px;padding: 0px; }"
|
||||
);
|
||||
menu->addAction(sliderAction);
|
||||
QToolButton * tb2 = new QToolButton();
|
||||
tb2->addAction(adjustWidth);
|
||||
tb2->setMenu(menu);
|
||||
|
||||
connect(sliderAction,SIGNAL(fitToWidthRatioChanged(float)),viewer,SLOT(updateFitToWidthRatio(float)));
|
||||
connect(optionsDialog,SIGNAL(fitToWidthRatioChanged(float)),sliderAction,SLOT(updateFitToWidthRatio(float)));
|
||||
|
||||
|
||||
//tb2->addAction();
|
||||
tb2->setPopupMode(QToolButton::MenuButtonPopup);
|
||||
tb2->setDefaultAction(adjustWidth);
|
||||
comicToolBar->addWidget(tb2);
|
||||
comicToolBar->addAction(adjustToFullSizeAction);
|
||||
comicToolBar->addAction(leftRotationAction);
|
||||
comicToolBar->addAction(rightRotationAction);
|
||||
comicToolBar->addAction(doublePageAction);
|
||||
|
||||
comicToolBar->addSeparator();
|
||||
comicToolBar->addAction(showMagnifyingGlass);
|
||||
|
||||
comicToolBar->addSeparator();
|
||||
comicToolBar->addAction(setBookmark);
|
||||
comicToolBar->addAction(showBookmarks);
|
||||
|
||||
comicToolBar->addSeparator();
|
||||
comicToolBar->addAction(showDictionaryAction);
|
||||
|
||||
comicToolBar->addWidget(new QToolBarStretch());
|
||||
|
||||
comicToolBar->addAction(showShorcutsAction);
|
||||
comicToolBar->addAction(optionsAction);
|
||||
comicToolBar->addAction(helpAboutAction);
|
||||
comicToolBar->addAction(closeAction);
|
||||
|
||||
comicToolBar->setMovable(false);
|
||||
|
||||
|
||||
viewer->addAction(openAction);
|
||||
viewer->addAction(openFolderAction);
|
||||
viewer->addAction(saveImageAction);
|
||||
viewer->addAction(openPreviousComicAction);
|
||||
viewer->addAction(openNextComicAction);
|
||||
QAction * separator = new QAction("",this);
|
||||
separator->setSeparator(true);
|
||||
viewer->addAction(separator);
|
||||
viewer->addAction(prevAction);
|
||||
viewer->addAction(nextAction);
|
||||
viewer->addAction(goToPage);
|
||||
viewer->addAction(adjustWidth);
|
||||
viewer->addAction(adjustToFullSizeAction);
|
||||
viewer->addAction(leftRotationAction);
|
||||
viewer->addAction(rightRotationAction);
|
||||
viewer->addAction(doublePageAction);
|
||||
separator = new QAction("",this);
|
||||
separator->setSeparator(true);
|
||||
viewer->addAction(separator);
|
||||
|
||||
viewer->addAction(setBookmark);
|
||||
viewer->addAction(showBookmarks);
|
||||
separator = new QAction("",this);
|
||||
separator->setSeparator(true);
|
||||
viewer->addAction(separator);
|
||||
|
||||
viewer->addAction(showDictionaryAction);
|
||||
separator = new QAction("",this);
|
||||
separator->setSeparator(true);
|
||||
viewer->addAction(separator);
|
||||
|
||||
viewer->addAction(showMagnifyingGlass);
|
||||
viewer->addAction(optionsAction);
|
||||
viewer->addAction(helpAboutAction);
|
||||
viewer->addAction(showInfo);
|
||||
viewer->addAction(showShorcutsAction);
|
||||
separator = new QAction("",this);
|
||||
separator->setSeparator(true);
|
||||
viewer->addAction(separator);
|
||||
viewer->addAction(closeAction);
|
||||
|
||||
viewer->setContextMenuPolicy(Qt::ActionsContextMenu);
|
||||
}
|
||||
|
||||
void MainWindowViewer::reloadOptions()
|
||||
{
|
||||
viewer->updateConfig(settings);
|
||||
}
|
||||
|
||||
void MainWindowViewer::open()
|
||||
{
|
||||
QFileDialog openDialog;
|
||||
QString pathFile = openDialog.getOpenFileName(this,tr("Open Comic"),currentDirectory,tr("Comic files") + "(*.cbr *.cbz *.rar *.zip *.tar *.pdf *.7z *.cb7 *.arj *.cbt)");
|
||||
if (!pathFile.isEmpty())
|
||||
{
|
||||
openComicFromPath(pathFile);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowViewer::openComicFromPath(QString pathFile)
|
||||
{
|
||||
currentDirectory = pathFile;
|
||||
QFileInfo fi(pathFile);
|
||||
getSiblingComics(fi.absolutePath(),fi.fileName());
|
||||
|
||||
setWindowTitle("YACReader - " + fi.fileName());
|
||||
|
||||
enableActions();
|
||||
|
||||
viewer->open(pathFile);
|
||||
|
||||
}
|
||||
|
||||
void MainWindowViewer::openFolder()
|
||||
{
|
||||
QFileDialog openDialog;
|
||||
QString pathDir = openDialog.getExistingDirectory(this,tr("Open folder"),currentDirectory);
|
||||
if (!pathDir.isEmpty())
|
||||
{
|
||||
openFolderFromPath(pathDir);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowViewer::openFolderFromPath(QString pathDir)
|
||||
{
|
||||
currentDirectory = pathDir; //TODO ??
|
||||
QFileInfo fi(pathDir);
|
||||
getSiblingComics(fi.absolutePath(),fi.fileName());
|
||||
|
||||
setWindowTitle("YACReader - " + fi.fileName());
|
||||
|
||||
enableActions();
|
||||
|
||||
viewer->open(pathDir);
|
||||
|
||||
}
|
||||
|
||||
void MainWindowViewer::saveImage()
|
||||
{
|
||||
QFileDialog saveDialog;
|
||||
QString pathFile = saveDialog.getSaveFileName(this,tr("Save current page"),currentDirectoryImgDest,tr("Image files (*.jpg)"));
|
||||
if (!pathFile.isEmpty())
|
||||
{
|
||||
currentDirectoryImgDest = pathFile;
|
||||
const QPixmap * p = viewer->pixmap();
|
||||
if(p!=NULL)
|
||||
p->save(pathFile);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowViewer::enableActions()
|
||||
{
|
||||
saveImageAction->setDisabled(false);
|
||||
prevAction->setDisabled(false);
|
||||
nextAction->setDisabled(false);
|
||||
adjustWidth->setDisabled(false);
|
||||
goToPage->setDisabled(false);
|
||||
alwaysOnTopAction->setDisabled(false);
|
||||
leftRotationAction->setDisabled(false);
|
||||
rightRotationAction->setDisabled(false);
|
||||
showMagnifyingGlass->setDisabled(false);
|
||||
doublePageAction->setDisabled(false);
|
||||
adjustToFullSizeAction->setDisabled(false);
|
||||
//setBookmark->setDisabled(false);
|
||||
showBookmarks->setDisabled(false);
|
||||
showInfo->setDisabled(false); //TODO enable goTo and showInfo (or update) when numPages emited
|
||||
showDictionaryAction->setDisabled(false);
|
||||
}
|
||||
void MainWindowViewer::disableActions()
|
||||
{
|
||||
saveImageAction->setDisabled(true);
|
||||
prevAction->setDisabled(true);
|
||||
nextAction->setDisabled(true);
|
||||
adjustWidth->setDisabled(true);
|
||||
goToPage->setDisabled(true);
|
||||
alwaysOnTopAction->setDisabled(true);
|
||||
leftRotationAction->setDisabled(true);
|
||||
rightRotationAction->setDisabled(true);
|
||||
showMagnifyingGlass->setDisabled(true);
|
||||
doublePageAction->setDisabled(true);
|
||||
adjustToFullSizeAction->setDisabled(true);
|
||||
setBookmark->setDisabled(true);
|
||||
showBookmarks->setDisabled(true);
|
||||
showInfo->setDisabled(true); //TODO enable goTo and showInfo (or update) when numPages emited
|
||||
openPreviousComicAction->setDisabled(true);
|
||||
openNextComicAction->setDisabled(true);
|
||||
showDictionaryAction->setDisabled(true);
|
||||
}
|
||||
|
||||
void MainWindowViewer::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
switch (event->key())
|
||||
{
|
||||
case Qt::Key_Escape:
|
||||
this->close();
|
||||
break;
|
||||
case Qt::Key_F:
|
||||
toggleFullScreen();
|
||||
break;
|
||||
case Qt::Key_H:
|
||||
toggleToolBars();
|
||||
break;
|
||||
case Qt::Key_O:
|
||||
open();
|
||||
break;
|
||||
default:
|
||||
QWidget::keyPressEvent(event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowViewer::mouseDoubleClickEvent ( QMouseEvent * event )
|
||||
{
|
||||
toggleFullScreen();
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void MainWindowViewer::toggleFullScreen()
|
||||
{
|
||||
fullscreen?toNormal():toFullScreen();
|
||||
Configuration::getConfiguration().setFullScreen(fullscreen = !fullscreen);
|
||||
}
|
||||
|
||||
void MainWindowViewer::toFullScreen()
|
||||
{
|
||||
fromMaximized = this->isMaximized();
|
||||
|
||||
hideToolBars();
|
||||
viewer->hide();
|
||||
viewer->fullscreen = true;//TODO, change by the right use of windowState();
|
||||
showFullScreen();
|
||||
viewer->show();
|
||||
if(viewer->magnifyingGlassIsVisible())
|
||||
viewer->showMagnifyingGlass();
|
||||
}
|
||||
|
||||
void MainWindowViewer::toNormal()
|
||||
{
|
||||
//show all
|
||||
viewer->hide();
|
||||
viewer->fullscreen = false;//TODO, change by the right use of windowState();
|
||||
//viewer->hideMagnifyingGlass();
|
||||
if(fromMaximized)
|
||||
showMaximized();
|
||||
else
|
||||
showNormal();
|
||||
|
||||
if(Configuration::getConfiguration().getShowToolbars())
|
||||
showToolBars();
|
||||
viewer->show();
|
||||
if(viewer->magnifyingGlassIsVisible())
|
||||
viewer->showMagnifyingGlass();
|
||||
}
|
||||
void MainWindowViewer::toggleToolBars()
|
||||
{
|
||||
toolbars?hideToolBars():showToolBars();
|
||||
|
||||
Configuration::getConfiguration().setShowToolbars(toolbars);
|
||||
|
||||
comicToolBar->setMovable(false);
|
||||
}
|
||||
void MainWindowViewer::hideToolBars()
|
||||
{
|
||||
//hide all
|
||||
this->comicToolBar->hide();
|
||||
toolbars = false;
|
||||
}
|
||||
|
||||
void MainWindowViewer::showToolBars()
|
||||
{
|
||||
this->comicToolBar->show();
|
||||
toolbars = true;
|
||||
}
|
||||
|
||||
void MainWindowViewer::changeFit()
|
||||
{
|
||||
Configuration & conf = Configuration::getConfiguration();
|
||||
conf.setAdjustToWidth(!conf.getAdjustToWidth());
|
||||
viewer->updatePage();
|
||||
}
|
||||
|
||||
void MainWindowViewer::newVersion()
|
||||
{
|
||||
QMessageBox msgBox;
|
||||
msgBox.setText(tr("There is a new version avaliable"));
|
||||
msgBox.setInformativeText(tr("Do you want to download the new version?"));
|
||||
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
|
||||
msgBox.setDefaultButton(QMessageBox::Yes);
|
||||
msgBox.setWindowFlags(Qt::WindowStaysOnTopHint);
|
||||
msgBox.setModal(true);
|
||||
int ret = msgBox.exec();
|
||||
|
||||
if(ret==QMessageBox::Yes){
|
||||
QDesktopServices::openUrl(QUrl("http://www.yacreader.com"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void MainWindowViewer::closeEvent ( QCloseEvent * event )
|
||||
{
|
||||
viewer->save();
|
||||
Configuration & conf = Configuration::getConfiguration();
|
||||
if(!fullscreen && !isMaximized())
|
||||
{
|
||||
conf.setPos(pos());
|
||||
conf.setSize(size());
|
||||
}
|
||||
conf.setMaximized(isMaximized());
|
||||
}
|
||||
|
||||
void MainWindowViewer::openPreviousComic()
|
||||
{
|
||||
if(!previousComicPath.isEmpty())
|
||||
{
|
||||
viewer->open(previousComicPath);
|
||||
QFileInfo fi(previousComicPath);
|
||||
getSiblingComics(fi.absolutePath(),fi.fileName());
|
||||
|
||||
setWindowTitle("YACReader - " + fi.fileName());
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowViewer::openNextComic()
|
||||
{
|
||||
if(!nextComicPath.isEmpty())
|
||||
{
|
||||
viewer->open(nextComicPath);
|
||||
QFileInfo fi(nextComicPath);
|
||||
getSiblingComics(fi.absolutePath(),fi.fileName());
|
||||
|
||||
setWindowTitle("YACReader - " + fi.fileName());
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowViewer::getSiblingComics(QString path,QString currentComic)
|
||||
{
|
||||
QDir d(path);
|
||||
d.setFilter(QDir::Files|QDir::NoDotAndDotDot);
|
||||
d.setNameFilters(QStringList() << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar" << "*.pdf" << "*.7z" << "*.cb7" << "*.arj" << "*.cbt");
|
||||
d.setSorting(QDir::Name|QDir::IgnoreCase|QDir::LocaleAware);
|
||||
QStringList list = d.entryList();
|
||||
qSort(list.begin(),list.end(),naturalSortLessThanCI);
|
||||
//std::sort(list.begin(),list.end(),naturalSortLessThanCI);
|
||||
int index = list.indexOf(currentComic);
|
||||
if(index == -1) //comic not found
|
||||
{
|
||||
QFile f(QCoreApplication::applicationDirPath()+"/errorLog.txt");
|
||||
if(!f.open(QIODevice::WriteOnly))
|
||||
{
|
||||
QMessageBox::critical(NULL,tr("Saving error log file...."),tr("There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder."));
|
||||
}
|
||||
else
|
||||
{
|
||||
QTextStream txtS(&f);
|
||||
txtS << "METHOD : MainWindowViewer::getSiblingComics" << '\n';
|
||||
txtS << "ERROR : current comic not found in its own path" << '\n';
|
||||
txtS << path << '\n';
|
||||
txtS << currentComic << '\n';
|
||||
txtS << "Comic list count : " + list.count() << '\n';
|
||||
foreach(QString s, list){
|
||||
txtS << s << '\n';
|
||||
}
|
||||
f.close();
|
||||
}
|
||||
}
|
||||
|
||||
previousComicPath = nextComicPath = "";
|
||||
if(index>0)
|
||||
{
|
||||
previousComicPath = path+"/"+list.at(index-1);
|
||||
openPreviousComicAction->setDisabled(false);
|
||||
}
|
||||
else
|
||||
openPreviousComicAction->setDisabled(true);
|
||||
|
||||
if(index+1<list.count())
|
||||
{
|
||||
nextComicPath = path+"/"+list.at(index+1);
|
||||
openNextComicAction->setDisabled(false);
|
||||
}
|
||||
else
|
||||
openNextComicAction->setDisabled(true);
|
||||
}
|
||||
|
||||
void MainWindowViewer::dropEvent(QDropEvent *event)
|
||||
{
|
||||
QList<QUrl> urlList;
|
||||
QString fName;
|
||||
QFileInfo info;
|
||||
|
||||
if (event->mimeData()->hasUrls())
|
||||
{
|
||||
urlList = event->mimeData()->urls();
|
||||
|
||||
if ( urlList.size() > 0)
|
||||
{
|
||||
fName = urlList[0].toLocalFile(); // convert first QUrl to local path
|
||||
info.setFile( fName ); // information about file
|
||||
if (info.isFile())
|
||||
openComicFromPath(fName); // if is file, setText
|
||||
else
|
||||
if(info.isDir())
|
||||
openFolderFromPath(fName);
|
||||
}
|
||||
}
|
||||
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
void MainWindowViewer::dragEnterEvent(QDragEnterEvent *event)
|
||||
{
|
||||
// accept just text/uri-list mime format
|
||||
if (event->mimeData()->hasFormat("text/uri-list"))
|
||||
{
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindowViewer::alwaysOnTopSwitch()
|
||||
{
|
||||
if(!Configuration::getConfiguration().getAlwaysOnTop())
|
||||
{
|
||||
setWindowFlags(this->windowFlags() | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint); //always on top
|
||||
show();
|
||||
}
|
||||
else
|
||||
{
|
||||
setWindowFlags(this->windowFlags() ^ (Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint));
|
||||
show();
|
||||
}
|
||||
Configuration::getConfiguration().setAlwaysOnTop(!Configuration::getConfiguration().getAlwaysOnTop());
|
||||
}
|
||||
|
||||
void MainWindowViewer::adjustToFullSizeSwitch()
|
||||
{
|
||||
Configuration::getConfiguration().setAdjustToFullSize(!Configuration::getConfiguration().getAdjustToFullSize());
|
||||
viewer->updatePage();
|
||||
}
|
121
YACReader/main_window_viewer.h
Normal file
121
YACReader/main_window_viewer.h
Normal file
@ -0,0 +1,121 @@
|
||||
#ifndef __MAIN_WINDOW_VIEWER_H
|
||||
#define __MAIN_WINDOW_VIEWER_H
|
||||
#include <QMainWindow>
|
||||
#include <QScrollArea>
|
||||
#include <QToolBar>
|
||||
#include <QAction>
|
||||
#include <QKeyEvent>
|
||||
#include <QMouseEvent>
|
||||
#include <QCloseEvent>
|
||||
#include <QSettings>
|
||||
|
||||
class Comic;
|
||||
class Viewer;
|
||||
class OptionsDialog;
|
||||
class HelpAboutDialog;
|
||||
class HttpVersionChecker;
|
||||
class ShortcutsDialog;
|
||||
class YACReaderSliderAction;
|
||||
|
||||
class MainWindowViewer : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public slots:
|
||||
void open();
|
||||
void openFolder();
|
||||
void saveImage();
|
||||
void toggleToolBars();
|
||||
void hideToolBars();
|
||||
void showToolBars();
|
||||
void changeFit();
|
||||
void enableActions();
|
||||
void disableActions();
|
||||
void toggleFullScreen();
|
||||
void toFullScreen();
|
||||
void toNormal();
|
||||
void loadConfiguration();
|
||||
void newVersion();
|
||||
void openPreviousComic();
|
||||
void openNextComic();
|
||||
void openComicFromPath(QString pathFile);
|
||||
void openFolderFromPath(QString pathDir);
|
||||
void alwaysOnTopSwitch();
|
||||
void adjustToFullSizeSwitch();
|
||||
void reloadOptions();
|
||||
/*void viewComic();
|
||||
void prev();
|
||||
void next();
|
||||
void updatePage();*/
|
||||
|
||||
private:
|
||||
//!State
|
||||
bool fullscreen;
|
||||
bool toolbars;
|
||||
bool alwaysOnTop;
|
||||
bool fromMaximized;
|
||||
|
||||
QString currentDirectory;
|
||||
QString currentDirectoryImgDest;
|
||||
//!Widgets
|
||||
Viewer * viewer;
|
||||
//GoToDialog * goToDialog;
|
||||
OptionsDialog * optionsDialog;
|
||||
HelpAboutDialog * had;
|
||||
ShortcutsDialog * shortcutsDialog;
|
||||
|
||||
//! ToolBars
|
||||
QToolBar *comicToolBar;
|
||||
|
||||
//! Actions
|
||||
QAction *openAction;
|
||||
QAction *openFolderAction;
|
||||
QAction *saveImageAction;
|
||||
QAction *openPreviousComicAction;
|
||||
QAction *openNextComicAction;
|
||||
QAction *nextAction;
|
||||
QAction *prevAction;
|
||||
QAction *adjustWidth;
|
||||
QAction *adjustHeight;
|
||||
QAction *goToPage;
|
||||
QAction *optionsAction;
|
||||
QAction *helpAboutAction;
|
||||
QAction *showMagnifyingGlass;
|
||||
QAction *setBookmark;
|
||||
QAction *showBookmarks;
|
||||
QAction *leftRotationAction;
|
||||
QAction *rightRotationAction;
|
||||
QAction *showInfo;
|
||||
QAction *closeAction;
|
||||
QAction *doublePageAction;
|
||||
QAction *showShorcutsAction;
|
||||
QAction *showDictionaryAction;
|
||||
QAction *alwaysOnTopAction;
|
||||
QAction *adjustToFullSizeAction;
|
||||
YACReaderSliderAction * sliderAction;
|
||||
|
||||
HttpVersionChecker * versionChecker;
|
||||
QString previousComicPath;
|
||||
QString nextComicPath;
|
||||
//! M<>todo que inicializa el interfaz.
|
||||
void setupUI();
|
||||
void createActions();
|
||||
void createToolBars();
|
||||
void getSiblingComics(QString path,QString currentComic);
|
||||
|
||||
//! Manejadores de evento:
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
//void resizeEvent(QResizeEvent * event);
|
||||
void mouseDoubleClickEvent ( QMouseEvent * event );
|
||||
void dropEvent(QDropEvent *event);
|
||||
void dragEnterEvent(QDragEnterEvent *event);
|
||||
|
||||
QSettings * settings;
|
||||
|
||||
protected:
|
||||
virtual void closeEvent ( QCloseEvent * event );
|
||||
public:
|
||||
MainWindowViewer();
|
||||
|
||||
};
|
||||
#endif
|
83
YACReader/notifications_label_widget.cpp
Normal file
83
YACReader/notifications_label_widget.cpp
Normal file
@ -0,0 +1,83 @@
|
||||
#include "notifications_label_widget.h"
|
||||
|
||||
#include <QLabel>
|
||||
#include <QHBoxLayout>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QGraphicsOpacityEffect>
|
||||
|
||||
NotificationsLabelWidget::NotificationsLabelWidget(QWidget * parent)
|
||||
:QWidget(parent)
|
||||
{
|
||||
setAttribute(Qt::WA_LayoutUsesWidgetRect,true);
|
||||
effect = new QGraphicsOpacityEffect(this);
|
||||
effect->setOpacity(1.0);
|
||||
|
||||
effect2= new QGraphicsOpacityEffect(this);
|
||||
effect->setOpacity(1.0);
|
||||
|
||||
anim = new QPropertyAnimation(effect,"opacity");
|
||||
anim->setDuration(500);
|
||||
anim->setStartValue(1.0);
|
||||
anim->setEndValue(0.0);
|
||||
anim->setEasingCurve(QEasingCurve::InExpo);
|
||||
|
||||
anim2 = new QPropertyAnimation(effect2,"opacity");
|
||||
anim2->setDuration(500);
|
||||
anim2->setStartValue(1.0);
|
||||
anim2->setEndValue(0.0);
|
||||
anim2->setEasingCurve(QEasingCurve::InExpo);
|
||||
anim2->start();
|
||||
|
||||
connect(anim,SIGNAL(finished()),this,SLOT(hide()));
|
||||
|
||||
imgLabel = new QLabel(this);
|
||||
QPixmap p(":/images/notificationsLabel.png");
|
||||
imgLabel->resize(p.size());
|
||||
imgLabel->setPixmap(p);
|
||||
imgLabel->setAttribute(Qt::WA_LayoutUsesWidgetRect,true);
|
||||
|
||||
textLabel = new QLabel(this);
|
||||
textLabel->setAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
|
||||
textLabel->setStyleSheet("QLabel { color : white; font-size:24px; }");
|
||||
textLabel->setAttribute(Qt::WA_LayoutUsesWidgetRect,true);
|
||||
|
||||
textLabel->setGeometry(imgLabel->geometry());
|
||||
#ifndef Q_OS_MAC
|
||||
imgLabel->setGraphicsEffect(effect);
|
||||
textLabel->setGraphicsEffect(effect2);
|
||||
#endif
|
||||
resize(p.size());
|
||||
updatePosition();
|
||||
|
||||
}
|
||||
|
||||
void NotificationsLabelWidget::flash()
|
||||
{
|
||||
updatePosition();
|
||||
anim->stop();
|
||||
anim2->stop();
|
||||
anim->start();
|
||||
anim2->start();
|
||||
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
void NotificationsLabelWidget::setText(const QString & text)
|
||||
{
|
||||
textLabel->setText(text);
|
||||
QRect geom = imgLabel->geometry();
|
||||
QSize size = geom.size();
|
||||
size.setHeight(size.height() - 10); //TODO remove this amazing magic number
|
||||
geom.setSize(size);
|
||||
textLabel->setGeometry(geom);
|
||||
}
|
||||
|
||||
void NotificationsLabelWidget::updatePosition()
|
||||
{
|
||||
QWidget * parent = dynamic_cast<QWidget *>(this->parent());
|
||||
if(parent == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
move(QPoint((parent->geometry().size().width()-this->width())/2,(parent->geometry().size().height()-this->height())/2));
|
||||
}
|
29
YACReader/notifications_label_widget.h
Normal file
29
YACReader/notifications_label_widget.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef NOTIFICATIONS_LABEL_WIDGET_H
|
||||
#define NOTIFICATIONS_LABEL_WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class QLabel;
|
||||
class QPropertyAnimation;
|
||||
class QGraphicsOpacityEffect;
|
||||
|
||||
class NotificationsLabelWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
QLabel * imgLabel;
|
||||
QLabel * textLabel;
|
||||
QPropertyAnimation * anim;
|
||||
QPropertyAnimation * anim2;
|
||||
QGraphicsOpacityEffect * effect;
|
||||
QGraphicsOpacityEffect * effect2;
|
||||
public:
|
||||
NotificationsLabelWidget(QWidget * parent);
|
||||
|
||||
public slots:
|
||||
void flash();
|
||||
void setText(const QString & text);
|
||||
void updatePosition();
|
||||
};
|
||||
|
||||
#endif
|
283
YACReader/options_dialog.cpp
Normal file
283
YACReader/options_dialog.cpp
Normal file
@ -0,0 +1,283 @@
|
||||
#include "options_dialog.h"
|
||||
#include "configuration.h"
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QFileDialog>
|
||||
#include <QGroupBox>
|
||||
#include <QRadioButton>
|
||||
#include <QTabWidget>
|
||||
#include <QSlider>
|
||||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
#include <QColorDialog>
|
||||
|
||||
#include "yacreader_spin_slider_widget.h"
|
||||
#include "yacreader_flow_config_widget.h"
|
||||
#include "yacreader_gl_flow_config_widget.h"
|
||||
|
||||
OptionsDialog::OptionsDialog(QWidget * parent)
|
||||
:YACReaderOptionsDialog(parent)
|
||||
{
|
||||
|
||||
QTabWidget * tabWidget = new QTabWidget();
|
||||
|
||||
QVBoxLayout * layout = new QVBoxLayout(this);
|
||||
|
||||
QWidget * pageGeneral = new QWidget();
|
||||
QWidget * pageFlow = new QWidget();
|
||||
QWidget * pageImage = new QWidget();
|
||||
QVBoxLayout * layoutGeneral = new QVBoxLayout();
|
||||
QVBoxLayout * layoutFlow = new QVBoxLayout();
|
||||
QVBoxLayout * layoutImageV = new QVBoxLayout();
|
||||
QGridLayout * layoutImage = new QGridLayout();
|
||||
|
||||
QGroupBox *slideSizeBox = new QGroupBox(tr("\"Go to flow\" size"));
|
||||
//slideSizeLabel = new QLabel(,this);
|
||||
slideSize = new QSlider(this);
|
||||
slideSize->setMinimum(125);
|
||||
slideSize->setMaximum(350);
|
||||
slideSize->setPageStep(5);
|
||||
slideSize->setOrientation(Qt::Horizontal);
|
||||
QHBoxLayout * slideLayout = new QHBoxLayout();
|
||||
slideLayout->addWidget(slideSize);
|
||||
slideSizeBox->setLayout(slideLayout);
|
||||
|
||||
QGroupBox *pathBox = new QGroupBox(tr("My comics path"));
|
||||
|
||||
QHBoxLayout * path = new QHBoxLayout();
|
||||
path->addWidget(pathEdit = new QLineEdit());
|
||||
path->addWidget(pathFindButton = new QPushButton(QIcon(":/images/comicFolder.png"),""));
|
||||
pathBox->setLayout(path);
|
||||
|
||||
connect(pathFindButton,SIGNAL(clicked()),this,SLOT(findFolder()));
|
||||
|
||||
//fitToWidthRatioLabel = new QLabel(tr("Page width stretch"),this);
|
||||
QGroupBox *fitBox = new QGroupBox(tr("Page width stretch"));
|
||||
fitToWidthRatioS = new QSlider(this);
|
||||
fitToWidthRatioS->setMinimum(50);
|
||||
fitToWidthRatioS->setMaximum(100);
|
||||
fitToWidthRatioS->setPageStep(5);
|
||||
fitToWidthRatioS->setOrientation(Qt::Horizontal);
|
||||
connect(fitToWidthRatioS,SIGNAL(valueChanged(int)),this,SLOT(fitToWidthRatio(int)));
|
||||
QHBoxLayout * fitLayout = new QHBoxLayout;
|
||||
fitLayout->addWidget(fitToWidthRatioS);
|
||||
fitBox->setLayout(fitLayout);
|
||||
|
||||
QHBoxLayout * colorSelection = new QHBoxLayout;
|
||||
backgroundColor = new QLabel();
|
||||
QPalette pal = backgroundColor->palette();
|
||||
pal.setColor(backgroundColor->backgroundRole(), Qt::black);
|
||||
backgroundColor->setPalette(pal);
|
||||
backgroundColor->setAutoFillBackground(true);
|
||||
|
||||
colorDialog = new QColorDialog(Qt::red,this);
|
||||
connect(colorDialog,SIGNAL(colorSelected(QColor)),this,SLOT(updateColor(QColor)));
|
||||
|
||||
QGroupBox *colorBox = new QGroupBox(tr("Background color"));
|
||||
//backgroundColor->setMinimumWidth(100);
|
||||
colorSelection->addWidget(backgroundColor);
|
||||
colorSelection->addWidget(selectBackgroundColorButton = new QPushButton(tr("Choose")));
|
||||
colorSelection->setStretchFactor(backgroundColor,1);
|
||||
colorSelection->setStretchFactor(selectBackgroundColorButton,0);
|
||||
//colorSelection->addStretch();
|
||||
connect(selectBackgroundColorButton, SIGNAL(clicked()), colorDialog, SLOT(show()));
|
||||
colorBox->setLayout(colorSelection);
|
||||
|
||||
brightnessS = new YACReaderSpinSliderWidget(this,true);
|
||||
brightnessS->setRange(0,100);
|
||||
//brightnessS->setText(tr("Brightness"));
|
||||
brightnessS->setTracking(false);
|
||||
connect(brightnessS,SIGNAL(valueChanged(int)),this,SLOT(brightnessChanged(int)));
|
||||
|
||||
contrastS = new YACReaderSpinSliderWidget(this,true);
|
||||
contrastS->setRange(0,250);
|
||||
//contrastS->setText(tr("Contrast"));
|
||||
contrastS->setTracking(false);
|
||||
connect(contrastS,SIGNAL(valueChanged(int)),this,SLOT(contrastChanged(int)));
|
||||
|
||||
gammaS = new YACReaderSpinSliderWidget(this,true);
|
||||
gammaS->setRange(0,250);
|
||||
//gammaS->setText(tr("Gamma"));
|
||||
gammaS->setTracking(false);
|
||||
connect(gammaS,SIGNAL(valueChanged(int)),this,SLOT(gammaChanged(int)));
|
||||
//connect(brightnessS,SIGNAL(valueChanged(int)),this,SIGNAL(changedOptions()));
|
||||
|
||||
QHBoxLayout * buttons = new QHBoxLayout();
|
||||
buttons->addStretch();
|
||||
buttons->addWidget(new QLabel(tr("Restart is needed")));
|
||||
buttons->addWidget(accept);
|
||||
buttons->addWidget(cancel);
|
||||
|
||||
layoutGeneral->addWidget(pathBox);
|
||||
layoutGeneral->addWidget(slideSizeBox);
|
||||
layoutGeneral->addWidget(fitBox);
|
||||
layoutGeneral->addWidget(colorBox);
|
||||
layoutGeneral->addStretch();
|
||||
layoutFlow->addWidget(sw);
|
||||
layoutFlow->addWidget(gl);
|
||||
layoutFlow->addWidget(useGL);
|
||||
layoutFlow->addStretch();
|
||||
layoutImage->addWidget(new QLabel(tr("Brightness")),0,0);
|
||||
layoutImage->addWidget(new QLabel(tr("Contrast")),1,0);
|
||||
layoutImage->addWidget(new QLabel(tr("Gamma")),2,0);
|
||||
layoutImage->addWidget(brightnessS,0,1);
|
||||
layoutImage->addWidget(contrastS,1,1);
|
||||
layoutImage->addWidget(gammaS,2,1);
|
||||
QPushButton * pushButton = new QPushButton(tr("Reset"));
|
||||
connect(pushButton,SIGNAL(pressed()),this,SLOT(resetImageConfig()));
|
||||
layoutImage->addWidget(pushButton,3,0);
|
||||
layoutImage->setColumnStretch(1,1);
|
||||
|
||||
|
||||
QGroupBox *imageBox = new QGroupBox(tr("Image options"));
|
||||
imageBox->setLayout(layoutImage);
|
||||
layoutImageV->addWidget(imageBox);
|
||||
layoutImageV->addStretch();
|
||||
|
||||
|
||||
pageGeneral->setLayout(layoutGeneral);
|
||||
pageFlow->setLayout(layoutFlow);
|
||||
pageImage->setLayout(layoutImageV);
|
||||
|
||||
tabWidget->addTab(pageGeneral,tr("General"));
|
||||
tabWidget->addTab(pageFlow,tr("Page Flow"));
|
||||
tabWidget->addTab(pageImage,tr("Image adjustment"));
|
||||
|
||||
layout->addWidget(tabWidget);
|
||||
layout->addLayout(buttons);
|
||||
|
||||
setLayout(layout);
|
||||
|
||||
//disable vSyncCheck
|
||||
gl->vSyncCheck->hide();
|
||||
|
||||
//restoreOptions(); //load options
|
||||
//resize(400,0);
|
||||
setModal (true);
|
||||
setWindowTitle(tr("Options"));
|
||||
|
||||
this->layout()->setSizeConstraint(QLayout::SetFixedSize);
|
||||
}
|
||||
|
||||
void OptionsDialog::findFolder()
|
||||
{
|
||||
QString s = QFileDialog::getExistingDirectory(0,tr("Comics directory"),".");
|
||||
if(!s.isEmpty())
|
||||
{
|
||||
pathEdit->setText(s);
|
||||
}
|
||||
}
|
||||
|
||||
void OptionsDialog::saveOptions()
|
||||
{
|
||||
|
||||
settings->setValue(GO_TO_FLOW_SIZE,QSize(static_cast<int>(slideSize->sliderPosition()/SLIDE_ASPECT_RATIO),slideSize->sliderPosition()));
|
||||
|
||||
if(sw->radio1->isChecked())
|
||||
settings->setValue(FLOW_TYPE_SW,0);
|
||||
if(sw->radio2->isChecked())
|
||||
settings->setValue(FLOW_TYPE_SW,1);
|
||||
if(sw->radio3->isChecked())
|
||||
settings->setValue(FLOW_TYPE_SW,2);
|
||||
|
||||
settings->setValue(PATH,pathEdit->text());
|
||||
|
||||
settings->setValue(BACKGROUND_COLOR,colorDialog->currentColor());
|
||||
settings->setValue(FIT_TO_WIDTH_RATIO,fitToWidthRatioS->sliderPosition()/100.0);
|
||||
|
||||
YACReaderOptionsDialog::saveOptions();
|
||||
}
|
||||
|
||||
void OptionsDialog::restoreOptions(QSettings * settings)
|
||||
{
|
||||
YACReaderOptionsDialog::restoreOptions(settings);
|
||||
|
||||
slideSize->setSliderPosition(settings->value(GO_TO_FLOW_SIZE).toSize().height());
|
||||
switch(settings->value(FLOW_TYPE_SW).toInt())
|
||||
{
|
||||
case 0:
|
||||
sw->radio1->setChecked(true);
|
||||
break;
|
||||
case 1:
|
||||
sw->radio2->setChecked(true);
|
||||
break;
|
||||
case 2:
|
||||
sw->radio3->setChecked(true);
|
||||
break;
|
||||
default:
|
||||
sw->radio1->setChecked(true);
|
||||
break;
|
||||
}
|
||||
|
||||
pathEdit->setText(settings->value(PATH).toString());
|
||||
|
||||
updateColor(settings->value(BACKGROUND_COLOR).value<QColor>());
|
||||
fitToWidthRatioS->setSliderPosition(settings->value(FIT_TO_WIDTH_RATIO).toFloat()*100);
|
||||
|
||||
brightnessS->setValue(settings->value(BRIGHTNESS,0).toInt());
|
||||
contrastS->setValue(settings->value(CONTRAST,100).toInt());
|
||||
gammaS->setValue(settings->value(GAMMA,100).toInt());
|
||||
}
|
||||
|
||||
|
||||
void OptionsDialog::updateColor(const QColor & color)
|
||||
{
|
||||
QPalette pal = backgroundColor->palette();
|
||||
pal.setColor(backgroundColor->backgroundRole(), color);
|
||||
backgroundColor->setPalette(pal);
|
||||
backgroundColor->setAutoFillBackground(true);
|
||||
colorDialog->setCurrentColor(color);
|
||||
|
||||
settings->setValue(BACKGROUND_COLOR,color);
|
||||
|
||||
emit(changedOptions());
|
||||
}
|
||||
|
||||
void OptionsDialog::fitToWidthRatio(int value)
|
||||
{
|
||||
Configuration::getConfiguration().setFitToWidthRatio(value/100.0);
|
||||
emit(fitToWidthRatioChanged(value/100.0));
|
||||
}
|
||||
|
||||
void OptionsDialog::brightnessChanged(int value)
|
||||
{
|
||||
QSettings settings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
settings.setValue(BRIGHTNESS,value);
|
||||
emit(changedImageOptions());
|
||||
}
|
||||
|
||||
void OptionsDialog::contrastChanged(int value)
|
||||
{
|
||||
QSettings settings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
settings.setValue(CONTRAST,value);
|
||||
emit(changedImageOptions());
|
||||
}
|
||||
|
||||
void OptionsDialog::gammaChanged(int value)
|
||||
{
|
||||
QSettings settings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
settings.setValue(GAMMA,value);
|
||||
emit(changedImageOptions());
|
||||
}
|
||||
|
||||
void OptionsDialog::resetImageConfig()
|
||||
{
|
||||
brightnessS->setValue(0);
|
||||
contrastS->setValue(100);
|
||||
gammaS->setValue(100);
|
||||
QSettings settings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
settings.setValue(BRIGHTNESS,0);
|
||||
settings.setValue(CONTRAST,100);
|
||||
settings.setValue(GAMMA,100);
|
||||
emit(changedImageOptions());
|
||||
}
|
||||
|
||||
void OptionsDialog::show()
|
||||
{
|
||||
//TODO solucionar el tema de las settings, esto s<>lo deber<65>a aparecer en una <20>nica l<>nea de c<>digo
|
||||
QSettings *s = new QSettings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
fitToWidthRatioS->setSliderPosition(settings->value(FIT_TO_WIDTH_RATIO).toFloat()*100);
|
||||
QDialog::show();
|
||||
delete s;
|
||||
}
|
68
YACReader/options_dialog.h
Normal file
68
YACReader/options_dialog.h
Normal file
@ -0,0 +1,68 @@
|
||||
#ifndef __OPTIONS_DIALOG_H
|
||||
#define __OPTIONS_DIALOG_H
|
||||
|
||||
#include "yacreader_options_dialog.h"
|
||||
|
||||
class QDialog;
|
||||
class QLabel;
|
||||
class QLineEdit;
|
||||
class QPushButton;
|
||||
class QSlider;
|
||||
class QPushButton;
|
||||
class QRadioButton;
|
||||
class QColorDialog;
|
||||
class YACReaderSpinSliderWidget;
|
||||
|
||||
|
||||
class OptionsDialog : public YACReaderOptionsDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
OptionsDialog(QWidget * parent = 0);
|
||||
private:
|
||||
//QLabel * pathLabel;
|
||||
QLineEdit * pathEdit;
|
||||
QPushButton * pathFindButton;
|
||||
|
||||
QLabel * magGlassSizeLabel;
|
||||
|
||||
QLabel * zoomLevel;
|
||||
|
||||
//QLabel * slideSizeLabel;
|
||||
QSlider * slideSize;
|
||||
|
||||
//QLabel * fitToWidthRatioLabel;
|
||||
QSlider * fitToWidthRatioS;
|
||||
|
||||
QLabel * backgroundColor;
|
||||
QPushButton * selectBackgroundColorButton;
|
||||
|
||||
QColorDialog * colorDialog;
|
||||
|
||||
YACReaderSpinSliderWidget * brightnessS;
|
||||
|
||||
YACReaderSpinSliderWidget * contrastS;
|
||||
|
||||
YACReaderSpinSliderWidget * gammaS;
|
||||
|
||||
public slots:
|
||||
void saveOptions();
|
||||
void restoreOptions(QSettings * settings);
|
||||
void findFolder();
|
||||
void updateColor(const QColor & color);
|
||||
void fitToWidthRatio(int value);
|
||||
void brightnessChanged(int value);
|
||||
void contrastChanged(int value);
|
||||
void gammaChanged(int value);
|
||||
void resetImageConfig();
|
||||
void show();
|
||||
|
||||
signals:
|
||||
void changedOptions();
|
||||
void changedImageOptions();
|
||||
void fitToWidthRatioChanged(float ratio);
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
116
YACReader/page_label_widget.cpp
Normal file
116
YACReader/page_label_widget.cpp
Normal file
@ -0,0 +1,116 @@
|
||||
#include "page_label_widget.h"
|
||||
|
||||
#include <QLabel>
|
||||
#include <QHBoxLayout>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
|
||||
PageLabelWidget::PageLabelWidget(QWidget * parent)
|
||||
:QWidget(parent)
|
||||
{
|
||||
animation = new QPropertyAnimation(this,"pos");
|
||||
animation->setDuration(150);
|
||||
|
||||
int verticalRes = QApplication::desktop()->screenGeometry().height();
|
||||
|
||||
imgLabel = new QLabel(this);
|
||||
QPixmap p;
|
||||
if (verticalRes <= 1024)
|
||||
p.load(":/images/numPagesLabel.png");
|
||||
else if (verticalRes <= 1200)
|
||||
p.load(":/images/numPagesLabelMedium.png");
|
||||
else
|
||||
p.load(":/images/numPagesLabelBig.png");
|
||||
imgLabel->resize(p.size());
|
||||
imgLabel->setPixmap(p);
|
||||
|
||||
textLabel = new QLabel(this);
|
||||
textLabel->setAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
|
||||
if(verticalRes <= 1024)
|
||||
textLabel->setStyleSheet("QLabel { color : white; font-size:12px; padding-left:8px; }");
|
||||
else if (verticalRes <= 1200)
|
||||
textLabel->setStyleSheet("QLabel { color : white; font-size:16px; padding-left:8px;}");
|
||||
else
|
||||
textLabel->setStyleSheet("QLabel { color : white; font-size:20px; padding-left:8px; }");
|
||||
|
||||
//informationLabel->setAutoFillBackground(true);
|
||||
//textLabel->setFont(QFont("courier new bold", 12));
|
||||
//textLabel->resize(100,25);
|
||||
|
||||
resize(p.size());
|
||||
//por defecto aparece oculto
|
||||
if(parent != 0)
|
||||
move(QPoint((parent->geometry().size().width()-this->width()),-this->height()));
|
||||
/*QSize size = textLabel->sizeHint();
|
||||
|
||||
int w = width(); // returns screen width
|
||||
int h = height(); // returns screen height
|
||||
int mw = size.width();
|
||||
int mh = size.height();
|
||||
int cw = (w-mw)/2;
|
||||
int ch = 0;
|
||||
textLabel->move(cw,ch);*/
|
||||
}
|
||||
|
||||
void PageLabelWidget::show()
|
||||
{
|
||||
if(this->pos().y() <= 0 && animation->state()!=QPropertyAnimation::Running)
|
||||
{
|
||||
QWidget * parent = dynamic_cast<QWidget *>(this->parent());
|
||||
if(parent == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QWidget::show();
|
||||
//connect(animation,SIGNAL(finished()),this,SLOT(QWidget::hide()));
|
||||
animation->disconnect();
|
||||
|
||||
animation->setStartValue(QPoint((parent->geometry().size().width()-this->width()),-this->height()));
|
||||
animation->setEndValue(QPoint((parent->geometry().size().width()-this->width()),0));
|
||||
animation->start();
|
||||
}
|
||||
}
|
||||
|
||||
void PageLabelWidget::hide()
|
||||
{
|
||||
|
||||
if(this->pos().y() >= 0 && animation->state()!=QPropertyAnimation::Running)
|
||||
{
|
||||
QWidget * parent = dynamic_cast<QWidget *>(this->parent());
|
||||
if(parent == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//connect(animation,SIGNAL(finished()),this,SLOT(setHidden()));
|
||||
animation->setStartValue(QPoint((parent->geometry().size().width()-this->width()),0));
|
||||
animation->setEndValue(QPoint((parent->geometry().size().width()-this->width()),-this->height()));
|
||||
animation->start();
|
||||
}
|
||||
}
|
||||
|
||||
void PageLabelWidget::setText(const QString & text)
|
||||
{
|
||||
textLabel->setText(text);
|
||||
QRect geom = imgLabel->geometry();
|
||||
QSize size = geom.size();
|
||||
size.setHeight(size.height() - 10);//TODO remove this amazing magic number
|
||||
geom.setSize(size);
|
||||
textLabel->setGeometry(geom);
|
||||
}
|
||||
|
||||
/*void PageLabelWidget::resizeEvent(QResizeEvent * event)
|
||||
{
|
||||
move(QPoint((((QWidget *) parent())->geometry().size().width()-this->width())/2,0));
|
||||
}*/
|
||||
|
||||
void PageLabelWidget::updatePosition()
|
||||
{
|
||||
QWidget * parent = dynamic_cast<QWidget *>(this->parent());
|
||||
if(parent == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
move(QPoint((parent->geometry().size().width()-this->width()),this->pos().y()));
|
||||
}
|
29
YACReader/page_label_widget.h
Normal file
29
YACReader/page_label_widget.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef PAGE_LABEL_WIDGET_H
|
||||
#define PAGE_LABEL_WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class QLabel;
|
||||
class QPropertyAnimation;
|
||||
|
||||
class PageLabelWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
QLabel * imgLabel;
|
||||
QLabel * textLabel;
|
||||
QPropertyAnimation * animation;
|
||||
|
||||
//void resizeEvent(QResizeEvent * event);
|
||||
|
||||
public:
|
||||
PageLabelWidget(QWidget * parent);
|
||||
|
||||
public slots:
|
||||
void show();
|
||||
void hide();
|
||||
void setText(const QString & text);
|
||||
void updatePosition();
|
||||
};
|
||||
|
||||
#endif
|
963
YACReader/render.cpp
Normal file
963
YACReader/render.cpp
Normal file
@ -0,0 +1,963 @@
|
||||
#include "render.h"
|
||||
#include <cmath>
|
||||
#include <QList>
|
||||
#include <algorithm>
|
||||
#include <QByteArray>
|
||||
#include <QPixmap>
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
#define NL 2
|
||||
#define NR 2
|
||||
|
||||
#include "yacreader_global.h"
|
||||
|
||||
template<class T>
|
||||
inline const T& kClamp( const T& x, const T& low, const T& high )
|
||||
{
|
||||
if ( x < low ) return low;
|
||||
else if ( high < x ) return high;
|
||||
else return x;
|
||||
}
|
||||
|
||||
inline
|
||||
int changeBrightness( int value, int brightness )
|
||||
{
|
||||
return kClamp( value + brightness * 255 / 100, 0, 255 );
|
||||
}
|
||||
|
||||
inline
|
||||
int changeContrast( int value, int contrast )
|
||||
{
|
||||
return kClamp((( value - 127 ) * contrast / 100 ) + 127, 0, 255 );
|
||||
}
|
||||
|
||||
inline
|
||||
int changeGamma( int value, int gamma )
|
||||
{
|
||||
return kClamp( int( pow( value / 255.0, 100.0 / gamma ) * 255 ), 0, 255 );
|
||||
}
|
||||
|
||||
inline
|
||||
int changeUsingTable( int value, const int table[] )
|
||||
{
|
||||
return table[ value ];
|
||||
}
|
||||
|
||||
template< int operation( int, int ) >
|
||||
static
|
||||
QImage changeImage( const QImage& image, int value )
|
||||
{
|
||||
QImage im = image;
|
||||
im.detach();
|
||||
if( im.numColors() == 0 ) /* truecolor */
|
||||
{
|
||||
if( im.format() != QImage::Format_RGB32 ) /* just in case */
|
||||
im = im.convertToFormat( QImage::Format_RGB32 );
|
||||
int table[ 256 ];
|
||||
for( int i = 0;
|
||||
i < 256;
|
||||
++i )
|
||||
table[ i ] = operation( i, value );
|
||||
if( im.hasAlphaChannel() )
|
||||
{
|
||||
for( int y = 0;
|
||||
y < im.height();
|
||||
++y )
|
||||
{
|
||||
QRgb* line = reinterpret_cast< QRgb* >( im.scanLine( y ));
|
||||
for( int x = 0;
|
||||
x < im.width();
|
||||
++x )
|
||||
line[ x ] = qRgba( changeUsingTable( qRed( line[ x ] ), table ),
|
||||
changeUsingTable( qGreen( line[ x ] ), table ),
|
||||
changeUsingTable( qBlue( line[ x ] ), table ),
|
||||
changeUsingTable( qAlpha( line[ x ] ), table ));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for( int y = 0;
|
||||
y < im.height();
|
||||
++y )
|
||||
{
|
||||
QRgb* line = reinterpret_cast< QRgb* >( im.scanLine( y ));
|
||||
for( int x = 0;
|
||||
x < im.width();
|
||||
++x )
|
||||
line[ x ] = qRgb( changeUsingTable( qRed( line[ x ] ), table ),
|
||||
changeUsingTable( qGreen( line[ x ] ), table ),
|
||||
changeUsingTable( qBlue( line[ x ] ), table ));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
QVector<QRgb> colors = im.colorTable();
|
||||
for( int i = 0;
|
||||
i < im.numColors();
|
||||
++i )
|
||||
colors[ i ] = qRgb( operation( qRed( colors[ i ] ), value ),
|
||||
operation( qGreen( colors[ i ] ), value ),
|
||||
operation( qBlue( colors[ i ] ), value ));
|
||||
}
|
||||
return im;
|
||||
}
|
||||
|
||||
|
||||
// brightness is multiplied by 100 in order to avoid floating point numbers
|
||||
QImage changeBrightness( const QImage& image, int brightness )
|
||||
{
|
||||
if( brightness == 0 ) // no change
|
||||
return image;
|
||||
return changeImage< changeBrightness >( image, brightness );
|
||||
}
|
||||
|
||||
|
||||
// contrast is multiplied by 100 in order to avoid floating point numbers
|
||||
QImage changeContrast( const QImage& image, int contrast )
|
||||
{
|
||||
if( contrast == 100 ) // no change
|
||||
return image;
|
||||
return changeImage< changeContrast >( image, contrast );
|
||||
}
|
||||
|
||||
// gamma is multiplied by 100 in order to avoid floating point numbers
|
||||
QImage changeGamma( const QImage& image, int gamma )
|
||||
{
|
||||
if( gamma == 100 ) // no change
|
||||
return image;
|
||||
return changeImage< changeGamma >( image, gamma );
|
||||
}
|
||||
|
||||
QMutex mutex;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// MeanNoiseReductionFilter
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
MeanNoiseReductionFilter::MeanNoiseReductionFilter(enum NeighborghoodSize ns)
|
||||
:neighborghoodSize(ns)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QImage MeanNoiseReductionFilter::setFilter(const QImage & image)
|
||||
{
|
||||
int width = image.width();
|
||||
int height = image.height();
|
||||
QImage result(width,height,image.format());
|
||||
int filterSize = sqrt((float)neighborghoodSize);
|
||||
int bound = filterSize/2;
|
||||
QRgb pix;
|
||||
int r,g,b;
|
||||
for(int j=bound;j<height-bound;j++){
|
||||
for(int i=bound;i<width-bound;i++){
|
||||
r=g=b=0;
|
||||
for(int y=j-bound;y<=j+bound;y++)
|
||||
{
|
||||
for(int x=i-bound;x<=i+bound;x++)
|
||||
{
|
||||
pix = image.pixel(x,y);
|
||||
r += qRed(pix);
|
||||
g += qGreen(pix);
|
||||
b += qBlue(pix);
|
||||
}
|
||||
}
|
||||
result.setPixel(i,j,QColor(r/neighborghoodSize,g/neighborghoodSize,b/neighborghoodSize).rgb());
|
||||
//qDebug((QString::number(redChannel.at(4))+" "+QString::number(greenChannel.at(4))+" "+QString::number(blueChannel.at(4))).toAscii());
|
||||
//qDebug((QString::number(redChannel.size())+" "+QString::number(greenChannel.size())+" "+QString::number(blueChannel.size())).toAscii());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// MedianNoiseReductionFilter
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
MedianNoiseReductionFilter::MedianNoiseReductionFilter(enum NeighborghoodSize ns)
|
||||
:neighborghoodSize(ns)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QImage MedianNoiseReductionFilter::setFilter(const QImage & image)
|
||||
{
|
||||
int width = image.width();
|
||||
int height = image.height();
|
||||
QImage result(width,height,image.format());
|
||||
int filterSize = sqrt((float)neighborghoodSize);
|
||||
int bound = filterSize/2;
|
||||
QRgb pix;
|
||||
QList<int> redChannel;
|
||||
QList<int> greenChannel;
|
||||
QList<int> blueChannel;
|
||||
for(int j=bound;j<height-bound;j++){
|
||||
for(int i=bound;i<width-bound;i++){
|
||||
redChannel.clear();
|
||||
greenChannel.clear();
|
||||
blueChannel.clear();
|
||||
for(int y=j-bound;y<=j+bound;y++)
|
||||
{
|
||||
for(int x=i-bound;x<=i+bound;x++)
|
||||
{
|
||||
pix = image.pixel(x,y);
|
||||
redChannel.push_back(qRed(pix));
|
||||
greenChannel.push_back(qGreen(pix));
|
||||
blueChannel.push_back(qBlue(pix));
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(redChannel.begin(),redChannel.end());
|
||||
std::sort(greenChannel.begin(),greenChannel.end());
|
||||
std::sort(blueChannel.begin(),blueChannel.end());
|
||||
result.setPixel(i,j,QColor(redChannel.at(4),greenChannel.at(4),blueChannel.at(4)).rgb());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// BrightnessFilter
|
||||
//-----------------------------------------------------------------------------
|
||||
BrightnessFilter::BrightnessFilter(int l)
|
||||
:level(l)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QImage BrightnessFilter::setFilter(const QImage & image)
|
||||
{
|
||||
/*int width = image.width();
|
||||
int height = image.height();
|
||||
QImage result(width,height,image.format());
|
||||
|
||||
for(int j=0;j<height;j++){
|
||||
for(int i=0;i<width;i++){
|
||||
result.setPixel(i,j,QColor(image.pixel(i,j)).light(level).rgb());
|
||||
}
|
||||
}
|
||||
return result;*/
|
||||
QSettings settings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
return changeBrightness(image,settings.value(BRIGHTNESS,0).toInt());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// ContrastFilter
|
||||
//-----------------------------------------------------------------------------
|
||||
ContrastFilter::ContrastFilter(int l)
|
||||
:level(l)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QImage ContrastFilter::setFilter(const QImage & image)
|
||||
{
|
||||
/*int width = image.width();
|
||||
int height = image.height();
|
||||
QImage result(width,height,image.format());
|
||||
|
||||
int min,max,v;
|
||||
min = 0;
|
||||
max = 255;
|
||||
int sum = 0;
|
||||
|
||||
QVector<int> hist(256,0);
|
||||
|
||||
for(int j=0;j<height;j++){
|
||||
for(int i=0;i<width;i++){
|
||||
hist[QColor(image.pixel(i,j)).lightness()]++;
|
||||
sum++;
|
||||
}
|
||||
}
|
||||
|
||||
long double count = sum;
|
||||
long double new_count = 0.0;
|
||||
long double percentage,next_percentage;
|
||||
|
||||
for (int i = 0; i < 254; i++)
|
||||
{
|
||||
new_count += hist[i];
|
||||
percentage = new_count/count;
|
||||
next_percentage = (new_count+hist[i+1])/count;
|
||||
if(fabs (percentage - 0.006) < fabs (next_percentage - 0.006))
|
||||
{
|
||||
min = i+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
new_count=0.0;
|
||||
for (int i = 255; i > 1; i--)
|
||||
{
|
||||
new_count += hist[i];
|
||||
percentage = new_count/count;
|
||||
next_percentage = (new_count+hist[i-1])/count;
|
||||
if(fabs (percentage - 0.006) < fabs (next_percentage - 0.006))
|
||||
{
|
||||
max = i-1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
QColor c;
|
||||
int range = max - min;
|
||||
for(int j=0;j<height;j++){
|
||||
for(int i=0;i<width;i++){
|
||||
c = QColor(image.pixel(i,j));
|
||||
result.setPixel(i,j,c.light(((c.lightness()-min)/range*1.0)*255).rgb());
|
||||
}
|
||||
}
|
||||
|
||||
return result;*/
|
||||
QSettings settings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
return changeContrast(image,settings.value(CONTRAST,100).toInt());
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// ContrastFilter
|
||||
//-----------------------------------------------------------------------------
|
||||
GammaFilter::GammaFilter(int l)
|
||||
:level(l)
|
||||
{
|
||||
}
|
||||
|
||||
QImage GammaFilter::setFilter(const QImage & image)
|
||||
{
|
||||
QSettings settings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
return changeGamma(image,settings.value(GAMMA,100).toInt());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// PageRender
|
||||
//-----------------------------------------------------------------------------
|
||||
PageRender::PageRender()
|
||||
:QThread()
|
||||
{
|
||||
|
||||
}
|
||||
PageRender::PageRender(int np, const QByteArray & rd, QImage * p,unsigned int d, QVector<ImageFilter *> f)
|
||||
:QThread(),
|
||||
numPage(np),
|
||||
data(rd),
|
||||
page(p),
|
||||
degrees(d),
|
||||
filters(f)
|
||||
{
|
||||
}
|
||||
|
||||
void PageRender::run()
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
|
||||
QImage img;
|
||||
img.loadFromData(data);
|
||||
if(degrees > 0)
|
||||
{
|
||||
QMatrix m;
|
||||
m.rotate(degrees);
|
||||
img = img.transformed(m,Qt::SmoothTransformation);
|
||||
}
|
||||
for(int i=0;i<filters.size();i++)
|
||||
{
|
||||
img = filters[i]->setFilter(img);
|
||||
}
|
||||
|
||||
|
||||
*page = img;
|
||||
|
||||
emit pageReady(numPage);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// DoublePageRender
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
DoublePageRender::DoublePageRender(int np, const QByteArray & rd, const QByteArray & rd2, QImage * p,unsigned int d, QVector<ImageFilter *> f)
|
||||
:PageRender(),
|
||||
numPage(np),
|
||||
data(rd),
|
||||
data2(rd2),
|
||||
page(p),
|
||||
degrees(d),
|
||||
filters(f)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DoublePageRender::run()
|
||||
{
|
||||
//QImage result;
|
||||
QMutexLocker locker(&mutex);
|
||||
QImage img, img2;
|
||||
if(!data.isEmpty())
|
||||
img.loadFromData(data);
|
||||
if(!data2.isEmpty())
|
||||
img2.loadFromData(data2);
|
||||
/*if(img.isNull())
|
||||
img = QPixmap(img2.width(),img2.height());
|
||||
if(img2.isNull())
|
||||
img2 = QPixmap(img.width(),img.height());*/
|
||||
|
||||
int x,y;
|
||||
//x = img.width()+img2.width();
|
||||
y = qMax(img.height(),img2.height());
|
||||
|
||||
//widths fiting the normalized height
|
||||
int width1, width2;
|
||||
|
||||
//altura normalizada
|
||||
if(img.height()!=y)
|
||||
x = (width1 = ((img.width() * y) / img2.height())) + (width2 = img2.width());
|
||||
else
|
||||
x = (width1 = img.width()) + (width2 = ((img2.width() * y) / img.height()));
|
||||
|
||||
|
||||
QImage auxImg(x,y,QImage::Format_RGB32);
|
||||
QPainter painter(&auxImg);
|
||||
painter.drawImage(QRect(0,0,width1,y),img);
|
||||
painter.drawImage(QRect(width1,0,width2,y),img2);
|
||||
painter.end();
|
||||
|
||||
if(degrees > 0)
|
||||
{
|
||||
QMatrix m;
|
||||
m.rotate(degrees);
|
||||
auxImg = auxImg.transformed(m,Qt::SmoothTransformation);
|
||||
}
|
||||
for(int i=0;i<filters.size();i++)
|
||||
{
|
||||
auxImg = filters[i]->setFilter(auxImg);
|
||||
}
|
||||
|
||||
*page = auxImg;
|
||||
|
||||
emit pageReady(numPage);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Render
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Render::Render()
|
||||
:currentIndex(0),doublePage(false),comic(0),loadedComic(false),imageRotation(0),numLeftPages(NL),numRightPages(NR)
|
||||
{
|
||||
int size = numLeftPages+numRightPages+1;
|
||||
currentPageBufferedIndex = numLeftPages;
|
||||
for(int i = 0; i<size; i++)
|
||||
{
|
||||
buffer.push_back(new QImage());
|
||||
pageRenders.push_back(0);
|
||||
}
|
||||
|
||||
filters.push_back(new BrightnessFilter());
|
||||
filters.push_back(new ContrastFilter());
|
||||
filters.push_back(new GammaFilter());
|
||||
}
|
||||
|
||||
//Este m<>todo se encarga de forzar el renderizado de las p<>ginas.
|
||||
//Actualiza el buffer seg<65>n es necesario.
|
||||
//si la pagina actual no est<73> renderizada, se lanza un hilo que la renderize (double or single page mode) y se emite una se<73>al que indica que se est<73> renderizando.
|
||||
void Render::render()
|
||||
{
|
||||
updateBuffer();
|
||||
if(buffer[currentPageBufferedIndex]->isNull())
|
||||
{
|
||||
if(pagesReady.size()>0)
|
||||
{
|
||||
if(doublePage)
|
||||
{
|
||||
if(pagesReady[currentIndex] && pagesReady[qMin(currentIndex+1,(int)comic->numPages()-1)])
|
||||
if(currentIndex+1 > comic->numPages()-1)
|
||||
pageRenders[currentPageBufferedIndex] = new DoublePageRender(currentIndex,comic->getRawData()->at(currentIndex),QByteArray(),buffer[currentPageBufferedIndex],imageRotation,filters);
|
||||
else
|
||||
pageRenders[currentPageBufferedIndex] = new DoublePageRender(currentIndex,comic->getRawData()->at(currentIndex),comic->getRawData()->at(currentIndex+1),buffer[currentPageBufferedIndex],imageRotation,filters);
|
||||
else
|
||||
//las p<>ginas no est<73>n listas, y se est<73>n cargando en el c<>mic
|
||||
emit processingPage(); //para evitar confusiones esta se<73>al deber<65>a llamarse de otra forma
|
||||
}
|
||||
else
|
||||
if(pagesReady[currentIndex])
|
||||
pageRenders[currentPageBufferedIndex] = new PageRender(currentIndex,comic->getRawData()->at(currentIndex),buffer[currentPageBufferedIndex],imageRotation,filters);
|
||||
else
|
||||
//las p<>ginas no est<73>n listas, y se est<73>n cargando en el c<>mic
|
||||
emit processingPage(); //para evitar confusiones esta se<73>al deber<65>a llamarse de otra forma
|
||||
|
||||
//si se ha creado un hilo para renderizar la p<>gina actual, se arranca
|
||||
if(pageRenders[currentPageBufferedIndex]!=0)
|
||||
{
|
||||
//se conecta la se<73>al pageReady del hilo, con el SLOT prepareAvailablePage
|
||||
connect(pageRenders[currentPageBufferedIndex],SIGNAL(pageReady(int)),this,SLOT(prepareAvailablePage(int)));
|
||||
//se emite la se<73>al de procesando, debido a que los hilos se arrancan aqu<71>
|
||||
if(doublePage || filters.size()>0)
|
||||
emit processingPage();
|
||||
pageRenders[currentPageBufferedIndex]->start();
|
||||
pageRenders[currentPageBufferedIndex]->setPriority(QThread::TimeCriticalPriority);
|
||||
}
|
||||
else
|
||||
//en qu<71> caso ser<65>a necesario hacer esto??? //TODO: IMPORTANTE, puede que no sea necesario.
|
||||
emit processingPage();
|
||||
}
|
||||
else
|
||||
//no hay ninguna p<>gina lista para ser renderizada, es necesario esperar.
|
||||
emit processingPage();
|
||||
}
|
||||
else
|
||||
// la p<>gina actual est<73> lista
|
||||
emit currentPageReady();
|
||||
|
||||
//se renderizan las p<>ginas restantes para llenar el buffer.
|
||||
if(doublePage)
|
||||
fillBufferDoublePage();
|
||||
else
|
||||
fillBuffer();
|
||||
}
|
||||
|
||||
QPixmap * Render::getCurrentPage()
|
||||
{
|
||||
QPixmap * page = new QPixmap();
|
||||
*page = page->fromImage(*buffer[currentPageBufferedIndex]);
|
||||
return page;
|
||||
}
|
||||
|
||||
void Render::setRotation(int degrees)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Render::setComic(Comic * c)
|
||||
{
|
||||
if(comic !=0)
|
||||
{
|
||||
comic->moveToThread(QApplication::instance()->thread());
|
||||
comic->disconnect();
|
||||
comic->deleteLater();
|
||||
}
|
||||
comic = c;
|
||||
}
|
||||
|
||||
void Render::prepareAvailablePage(int page)
|
||||
{
|
||||
if(currentIndex == page)
|
||||
emit currentPageReady();
|
||||
}
|
||||
|
||||
void Render::update()
|
||||
{
|
||||
render();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// Comic interface
|
||||
//-----------------------------------------------------------------------------
|
||||
void Render::load(const QString & path)
|
||||
{
|
||||
if(comic!=0)
|
||||
{
|
||||
comic->moveToThread(QApplication::instance()->thread());
|
||||
comic->disconnect();
|
||||
comic->deleteLater();
|
||||
}
|
||||
//comic->moveToThread(QApplication::instance()->thread());
|
||||
comic = FactoryComic::newComic(path);
|
||||
|
||||
|
||||
if(comic == NULL)//archivo no encontrado o no v<>lido
|
||||
{
|
||||
emit errorOpening();
|
||||
reset();
|
||||
return;
|
||||
}
|
||||
|
||||
previousIndex = currentIndex = 0;
|
||||
|
||||
connect(comic,SIGNAL(errorOpening()),this,SIGNAL(errorOpening()));
|
||||
connect(comic,SIGNAL(errorOpening()),this,SLOT(reset()));
|
||||
connect(comic,SIGNAL(imageLoaded(int)),this,SIGNAL(imageLoaded(int)));
|
||||
connect(comic,SIGNAL(imageLoaded(int)),this,SLOT(pageRawDataReady(int)));
|
||||
//connect(comic,SIGNAL(pageChanged(int)),this,SIGNAL(pageChanged(int)));
|
||||
connect(comic,SIGNAL(numPages(unsigned int)),this,SIGNAL(numPages(unsigned int)));
|
||||
connect(comic,SIGNAL(numPages(unsigned int)),this,SLOT(setNumPages(unsigned int)));
|
||||
connect(comic,SIGNAL(imageLoaded(int,QByteArray)),this,SIGNAL(imageLoaded(int,QByteArray)));
|
||||
connect(comic,SIGNAL(isBookmark(bool)),this,SIGNAL(currentPageIsBookmark(bool)));
|
||||
connect(comic,SIGNAL(isBookmark(bool)),this,SLOT(pageIsBookmark(bool)));
|
||||
|
||||
connect(comic,SIGNAL(bookmarksUpdated()),this,SIGNAL(bookmarksUpdated()));
|
||||
|
||||
connect(comic,SIGNAL(isLast()),this,SIGNAL(isLast()));
|
||||
connect(comic,SIGNAL(isCover()),this,SIGNAL(isCover()));
|
||||
|
||||
QThread * thread = NULL;
|
||||
if (typeid(*comic) != typeid(FileComic))
|
||||
{
|
||||
thread = new QThread();
|
||||
|
||||
comic->moveToThread(thread);
|
||||
|
||||
connect(thread, SIGNAL(started()), comic, SLOT(process()));
|
||||
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
|
||||
|
||||
}
|
||||
|
||||
pagesReady.clear();
|
||||
|
||||
comic->load(path); //garantiza que se va a intentar abrir el c<>mic
|
||||
|
||||
if(thread != NULL)
|
||||
thread->start();
|
||||
|
||||
invalidate();
|
||||
loadedComic = true;
|
||||
update();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Render::reset()
|
||||
{
|
||||
loadedComic = false;
|
||||
invalidate();
|
||||
}
|
||||
//si se solicita la siguiente p<>gina, se calcula cu<63>l debe ser en funci<63>n de si se lee en modo a doble p<>gina o no.
|
||||
//la p<>gina s<>lo se renderiza, si realmente ha cambiado.
|
||||
void Render::nextPage()
|
||||
{
|
||||
int nextPage; //indica cu<63>l ser<65> la pr<70>xima p<>gina
|
||||
if(doublePage)
|
||||
{
|
||||
nextPage = currentIndex;
|
||||
if(currentIndex+2<comic->numPages())
|
||||
{
|
||||
nextPage = currentIndex+2;
|
||||
if(currentIndex != nextPage)
|
||||
comic->setIndex(nextPage);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nextPage = comic->nextPage();
|
||||
}
|
||||
|
||||
//se fuerza renderizado si la p<>gina ha cambiado
|
||||
if(currentIndex != nextPage)
|
||||
{
|
||||
previousIndex = currentIndex;
|
||||
currentIndex = nextPage;
|
||||
update();
|
||||
}
|
||||
else
|
||||
emit isLast();
|
||||
}
|
||||
//si se solicita la p<>gina anterior, se calcula cu<63>l debe ser en funci<63>n de si se lee en modo a doble p<>gina o no.
|
||||
//la p<>gina s<>lo se renderiza, si realmente ha cambiado.
|
||||
void Render::previousPage()
|
||||
{
|
||||
int previousPage; //indica cu<63>l ser<65> la pr<70>xima p<>gina
|
||||
if(doublePage)
|
||||
{
|
||||
if(currentIndex == 1)
|
||||
invalidate();
|
||||
previousPage = qMax(currentIndex-2,0);
|
||||
if(currentIndex != previousPage)
|
||||
{
|
||||
comic->setIndex(previousPage);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
previousPage = comic->previousPage();
|
||||
}
|
||||
|
||||
//se fuerza renderizado si la p<>gina ha cambiado
|
||||
if(currentIndex != previousPage)
|
||||
{
|
||||
previousIndex = currentIndex;
|
||||
currentIndex = previousPage;
|
||||
update();
|
||||
}
|
||||
else
|
||||
emit isCover();
|
||||
}
|
||||
unsigned int Render::getIndex()
|
||||
{
|
||||
return comic->getIndex();
|
||||
}
|
||||
unsigned int Render::numPages()
|
||||
{
|
||||
return comic->numPages();
|
||||
}
|
||||
|
||||
bool Render::hasLoadedComic()
|
||||
{
|
||||
if(comic!=0)
|
||||
return comic->loaded();
|
||||
return false;
|
||||
}
|
||||
|
||||
void Render::setNumPages(unsigned int numPages)
|
||||
{
|
||||
pagesReady.fill(false,numPages);
|
||||
}
|
||||
|
||||
void Render::pageRawDataReady(int page)
|
||||
{
|
||||
pagesEmited.push_back(page);
|
||||
if(pageRenders.size()>0)
|
||||
{
|
||||
for(int i=0;i<pagesEmited.size();i++)
|
||||
{
|
||||
pagesReady[pagesEmited.at(i)] = true;
|
||||
if(pagesEmited.at(i) == currentIndex)
|
||||
update();
|
||||
|
||||
if(doublePage)
|
||||
{
|
||||
if(pagesEmited.at(i)==currentIndex+1)
|
||||
update();
|
||||
|
||||
if ( ((pagesEmited.at(i) < currentIndex) && (pagesEmited.at(i) > currentIndex-2*numLeftPages)) ||
|
||||
((pagesEmited.at(i) > currentIndex+1) && (pagesEmited.at(i) < currentIndex+1+2*numRightPages)) )
|
||||
{
|
||||
fillBufferDoublePage();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ((pagesEmited.at(i) < currentIndex) && (pagesEmited.at(i) > currentIndex-numLeftPages)) ||
|
||||
((pagesEmited.at(i) > currentIndex) && (pagesEmited.at(i) < currentIndex+numRightPages)) )
|
||||
{
|
||||
fillBuffer();
|
||||
}
|
||||
}
|
||||
}
|
||||
pagesEmited.clear();
|
||||
}
|
||||
}
|
||||
|
||||
//s<>lo se renderiza la p<>gina, si ha habido un cambio de p<>gina
|
||||
void Render::goTo(int index)
|
||||
{
|
||||
|
||||
if(currentIndex != index)
|
||||
{
|
||||
comic->setIndex(index);
|
||||
previousIndex = currentIndex;
|
||||
currentIndex = index;
|
||||
|
||||
//si cambia la paridad de las p<>gina en modo a doble p<>gina, se rellena el buffer.
|
||||
//esto solo deber<65>a orcurrir al llegar al principio o al final
|
||||
if(doublePage && ((previousIndex - index) % 2)!=0)
|
||||
invalidate();
|
||||
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void Render::rotateRight()
|
||||
{
|
||||
imageRotation = (imageRotation+90) % 360;
|
||||
reload();
|
||||
}
|
||||
void Render::rotateLeft()
|
||||
{
|
||||
if(imageRotation == 0)
|
||||
imageRotation = 270;
|
||||
else
|
||||
imageRotation = imageRotation - 90;
|
||||
reload();
|
||||
}
|
||||
|
||||
//Actualiza el buffer, a<>adiendo las im<69>genes (vac<61>as) necesarias para su posterior renderizado y
|
||||
//eliminado aquellas que ya no sean necesarias. Tambi<62>n libera los hilos (no estoy seguro de que sea responsabilidad suya)
|
||||
//Calcula el n<>mero de nuevas p<>ginas que hay que buferear y si debe hacerlo por la izquierda o la derecha (seg<65>n sea el sentido de la lectura)
|
||||
void Render::updateBuffer()
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
int windowSize = currentIndex - previousIndex;
|
||||
if(doublePage)
|
||||
{
|
||||
windowSize = windowSize/2;
|
||||
if(currentIndex == 0 && windowSize == 0 && previousIndex == 1)
|
||||
windowSize = -1;
|
||||
|
||||
}
|
||||
if(windowSize > 0)//add pages to right pages and remove on the left
|
||||
{
|
||||
windowSize = qMin(windowSize,buffer.size());
|
||||
for(int i = 0; i < windowSize; i++)
|
||||
{
|
||||
//renders
|
||||
PageRender * pr = pageRenders.front();
|
||||
pageRenders.pop_front();
|
||||
if(pr !=0)
|
||||
{
|
||||
if(pr->wait())
|
||||
delete pr;
|
||||
}
|
||||
pageRenders.push_back(0);
|
||||
|
||||
//images
|
||||
|
||||
if(buffer.front()!=0)
|
||||
delete buffer.front();
|
||||
buffer.pop_front();
|
||||
buffer.push_back(new QImage());
|
||||
}
|
||||
}
|
||||
else //add pages to left pages and remove on the right
|
||||
if(windowSize<0)
|
||||
{
|
||||
windowSize = -windowSize;
|
||||
windowSize = qMin(windowSize,buffer.size());
|
||||
for(int i = 0; i < windowSize; i++)
|
||||
{
|
||||
//renders
|
||||
PageRender * pr = pageRenders.back();
|
||||
pageRenders.pop_back();
|
||||
if(pr !=0)
|
||||
{
|
||||
if(pr->wait())
|
||||
delete pr;
|
||||
}
|
||||
pageRenders.push_front(0);
|
||||
|
||||
//images
|
||||
buffer.push_front(new QImage());
|
||||
QImage * p = buffer.back();
|
||||
if(p!=0)
|
||||
delete p;
|
||||
buffer.pop_back();
|
||||
}
|
||||
}
|
||||
previousIndex = currentIndex;
|
||||
}
|
||||
|
||||
void Render::fillBuffer()
|
||||
{
|
||||
for(int i = 1; i <= qMax(numLeftPages,numRightPages); i++)
|
||||
{
|
||||
if ((currentIndex+i < comic->numPages()) &&
|
||||
buffer[currentPageBufferedIndex+i]->isNull() &&
|
||||
i <= numRightPages &&
|
||||
pageRenders[currentPageBufferedIndex+i]==0 &&
|
||||
pagesReady[currentIndex+1]) //preload next pages
|
||||
{
|
||||
pageRenders[currentPageBufferedIndex+i] = new PageRender(currentIndex+i,comic->getRawData()->at(currentIndex+i),buffer[currentPageBufferedIndex+i],imageRotation,filters);
|
||||
connect(pageRenders[currentPageBufferedIndex],SIGNAL(pageReady(int)),this,SLOT(prepareAvailablePage(int)));
|
||||
pageRenders[currentPageBufferedIndex+i]->start();
|
||||
}
|
||||
|
||||
if ((currentIndex-i > 0) &&
|
||||
buffer[currentPageBufferedIndex-i]->isNull() &&
|
||||
i <= numLeftPages &&
|
||||
pageRenders[currentPageBufferedIndex-i]==0 &&
|
||||
pagesReady[currentIndex-1]) //preload previous pages
|
||||
{
|
||||
pageRenders[currentPageBufferedIndex-i] = new PageRender(currentIndex-i,comic->getRawData()->at(currentIndex-i),buffer[currentPageBufferedIndex-i],imageRotation,filters);
|
||||
connect(pageRenders[currentPageBufferedIndex],SIGNAL(pageReady(int)),this,SLOT(prepareAvailablePage(int)));
|
||||
pageRenders[currentPageBufferedIndex-i]->start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Render::fillBufferDoublePage()
|
||||
{
|
||||
for(int i = 1; i <= qMax(numLeftPages,numRightPages); i++)
|
||||
{
|
||||
if ((currentIndex+2*i < comic->numPages()) &&
|
||||
buffer[currentPageBufferedIndex+i]->isNull() &&
|
||||
i <= numRightPages &&
|
||||
pageRenders[currentPageBufferedIndex+i]==0 &&
|
||||
(pagesReady[currentIndex+2*i] && pagesReady[qMin(currentIndex+(2*i)+1,(int)comic->numPages()-1)])) //preload next pages
|
||||
{
|
||||
if(currentIndex+(2*i)+1 > comic->numPages()-1)
|
||||
pageRenders[currentPageBufferedIndex+i] = new DoublePageRender(currentIndex+2*i,comic->getRawData()->at(currentIndex+(2*i)),QByteArray(),buffer[currentPageBufferedIndex+i],imageRotation,filters);
|
||||
else
|
||||
pageRenders[currentPageBufferedIndex+i] = new DoublePageRender(currentIndex+2*i,comic->getRawData()->at(currentIndex+(2*i)),comic->getRawData()->at(currentIndex+(2*i)+1),buffer[currentPageBufferedIndex+i],imageRotation,filters);
|
||||
connect(pageRenders[currentPageBufferedIndex],SIGNAL(pageReady(int)),this,SLOT(prepareAvailablePage(int)));
|
||||
pageRenders[currentPageBufferedIndex+i]->start();
|
||||
}
|
||||
|
||||
if ((currentIndex-2*i >= -1) &&
|
||||
buffer[currentPageBufferedIndex-i]->isNull() &&
|
||||
i <= numLeftPages &&
|
||||
pageRenders[currentPageBufferedIndex-i]==0 &&
|
||||
(pagesReady[qMax(currentIndex-2*i,0)] && pagesReady[qMin(currentIndex-(2*i)+1,(int)comic->numPages()-1)])) //preload previous pages
|
||||
{
|
||||
if(currentIndex-2*i == -1)
|
||||
pageRenders[currentPageBufferedIndex-i] = new DoublePageRender(0,QByteArray(),comic->getRawData()->at(0),buffer[currentPageBufferedIndex-i],imageRotation,filters);
|
||||
else
|
||||
pageRenders[currentPageBufferedIndex-i] = new DoublePageRender(currentIndex-2*i,comic->getRawData()->at(currentIndex-(2*i)),comic->getRawData()->at(currentIndex-(2*i)+1),buffer[currentPageBufferedIndex-i],imageRotation,filters);
|
||||
connect(pageRenders[currentPageBufferedIndex],SIGNAL(pageReady(int)),this,SLOT(prepareAvailablePage(int)));
|
||||
pageRenders[currentPageBufferedIndex-i]->start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//M<>todo que debe ser llamado cada vez que la estructura del buffer se vuelve inconsistente con el modo de lectura actual.
|
||||
//se terminan todos los hilos en ejecuci<63>n y se libera la memoria (de hilos e im<69>genes)
|
||||
void Render::invalidate()
|
||||
{
|
||||
for(int i=0;i<pageRenders.size();i++)
|
||||
{
|
||||
if(pageRenders[i]!=0)
|
||||
{
|
||||
pageRenders[i]->wait();
|
||||
delete pageRenders[i];
|
||||
pageRenders[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0;i<buffer.size();i++)
|
||||
{
|
||||
delete buffer[i];
|
||||
buffer[i] = new QImage();
|
||||
}
|
||||
}
|
||||
|
||||
void Render::doublePageSwitch()
|
||||
{
|
||||
doublePage = !doublePage;
|
||||
if(comic)
|
||||
{
|
||||
invalidate();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
QString Render::getCurrentPagesInformation()
|
||||
{
|
||||
QString s = QString::number(currentIndex+1);
|
||||
if (doublePage && (currentIndex+1 < comic->numPages()))
|
||||
s += "-"+QString::number(currentIndex+2);
|
||||
s += "/"+QString::number(comic->numPages());
|
||||
return s;
|
||||
}
|
||||
|
||||
void Render::setBookmark()
|
||||
{
|
||||
comic->setBookmark();
|
||||
}
|
||||
|
||||
void Render::removeBookmark()
|
||||
{
|
||||
comic->removeBookmark();
|
||||
}
|
||||
|
||||
void Render::save()
|
||||
{
|
||||
comic->saveBookmarks();
|
||||
}
|
||||
|
||||
Bookmarks * Render::getBookmarks()
|
||||
{
|
||||
return comic->bm;
|
||||
}
|
||||
|
||||
void Render::reload()
|
||||
{
|
||||
if(comic)
|
||||
{
|
||||
invalidate();
|
||||
update();
|
||||
}
|
||||
}
|
192
YACReader/render.h
Normal file
192
YACReader/render.h
Normal file
@ -0,0 +1,192 @@
|
||||
#ifndef RENDER_H
|
||||
#define RENDER_H
|
||||
|
||||
#include <QImage>
|
||||
#include <QPixmap>
|
||||
#include <QPainter>
|
||||
#include <QThread>
|
||||
#include <QByteArray>
|
||||
#include <QVector>
|
||||
#include "comic.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// FILTERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include <QThread>
|
||||
|
||||
class Comic;
|
||||
|
||||
class ImageFilter {
|
||||
public:
|
||||
ImageFilter(){};
|
||||
virtual QImage setFilter(const QImage & image) = 0;
|
||||
};
|
||||
|
||||
class MeanNoiseReductionFilter : public ImageFilter {
|
||||
public:
|
||||
enum NeighborghoodSize{SMALL=9, LARGE=25 };
|
||||
MeanNoiseReductionFilter(enum NeighborghoodSize ns = SMALL);
|
||||
virtual QImage setFilter(const QImage & image);
|
||||
private:
|
||||
enum NeighborghoodSize neighborghoodSize;
|
||||
};
|
||||
|
||||
class MedianNoiseReductionFilter : public ImageFilter {
|
||||
public:
|
||||
enum NeighborghoodSize{SMALL=9, LARGE=25 };
|
||||
MedianNoiseReductionFilter(enum NeighborghoodSize ns = SMALL);
|
||||
virtual QImage setFilter(const QImage & image);
|
||||
private:
|
||||
enum NeighborghoodSize neighborghoodSize;
|
||||
};
|
||||
|
||||
class BrightnessFilter : public ImageFilter {
|
||||
public:
|
||||
BrightnessFilter(int l=150);
|
||||
virtual QImage setFilter(const QImage & image);
|
||||
private:
|
||||
int level;
|
||||
};
|
||||
|
||||
class ContrastFilter : public ImageFilter {
|
||||
public:
|
||||
ContrastFilter(int l=150);
|
||||
virtual QImage setFilter(const QImage & image);
|
||||
private:
|
||||
int level;
|
||||
};
|
||||
|
||||
class GammaFilter : public ImageFilter {
|
||||
public:
|
||||
GammaFilter(int l=150);
|
||||
virtual QImage setFilter(const QImage & image);
|
||||
private:
|
||||
int level;
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RENDER
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class PageRender : public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PageRender();
|
||||
PageRender(int numPage, const QByteArray & rawData, QImage * page,unsigned int degrees=0, QVector<ImageFilter *> filters = QVector<ImageFilter *>());
|
||||
int getNumPage(){return numPage;};
|
||||
void setData(const QByteArray & rawData){data = rawData;};
|
||||
void setPage(QImage * p){page = p;};
|
||||
void setRotation(unsigned int d){degrees = d;};
|
||||
void setFilters(QVector<ImageFilter *> f){filters = f;};
|
||||
private:
|
||||
int numPage;
|
||||
QByteArray data;
|
||||
QImage * page;
|
||||
unsigned int degrees;
|
||||
QVector<ImageFilter *> filters;
|
||||
void run();
|
||||
signals:
|
||||
void pageReady(int);
|
||||
|
||||
};
|
||||
//-----------------------------------------------------------------------------
|
||||
// RENDER
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class DoublePageRender : public PageRender
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
DoublePageRender(int firstPage, const QByteArray & firstPageData,const QByteArray & secondPageData, QImage * page,unsigned int degrees=0, QVector<ImageFilter *> filters = QVector<ImageFilter *>());
|
||||
private:
|
||||
int numPage;
|
||||
QByteArray data;
|
||||
QByteArray data2;
|
||||
QImage * page;
|
||||
unsigned int degrees;
|
||||
QVector<ImageFilter *> filters;
|
||||
void run();
|
||||
signals:
|
||||
void pageReady(int);
|
||||
|
||||
};
|
||||
|
||||
|
||||
class Render : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
Render();
|
||||
|
||||
public slots:
|
||||
void render();
|
||||
QPixmap * getCurrentPage();
|
||||
void goTo(int index);
|
||||
void doublePageSwitch();
|
||||
void setRotation(int degrees);
|
||||
void setComic(Comic * c);
|
||||
void prepareAvailablePage(int page);
|
||||
void update();
|
||||
void setNumPages(unsigned int numPages);
|
||||
void pageRawDataReady(int page);
|
||||
//--comic interface
|
||||
void nextPage();
|
||||
void previousPage();
|
||||
void load(const QString & path);
|
||||
void rotateRight();
|
||||
void rotateLeft();
|
||||
unsigned int getIndex();
|
||||
unsigned int numPages();
|
||||
bool hasLoadedComic();
|
||||
void updateBuffer();
|
||||
void fillBuffer();
|
||||
void fillBufferDoublePage();
|
||||
void invalidate();
|
||||
QString getCurrentPagesInformation();
|
||||
void setBookmark();
|
||||
void removeBookmark();
|
||||
void save();
|
||||
void reset();
|
||||
void reload();
|
||||
Bookmarks * getBookmarks();
|
||||
|
||||
signals:
|
||||
void currentPageReady();
|
||||
void processingPage();
|
||||
void imagesLoaded();
|
||||
void imageLoaded(int index);
|
||||
void imageLoaded(int index,const QByteArray & image);
|
||||
void pageChanged(int index);
|
||||
void numPages(unsigned int numPages);
|
||||
void errorOpening();
|
||||
void currentPageIsBookmark(bool);
|
||||
void isLast();
|
||||
void isCover();
|
||||
|
||||
void bookmarksUpdated();
|
||||
|
||||
|
||||
private:
|
||||
Comic * comic;
|
||||
bool doublePage;
|
||||
int previousIndex;
|
||||
int currentIndex;
|
||||
//QPixmap * currentPage;
|
||||
int currentPageBufferedIndex;
|
||||
int numLeftPages;
|
||||
int numRightPages;
|
||||
QList<PageRender *> pageRenders;
|
||||
QList<QImage *> buffer;
|
||||
void loadAll();
|
||||
void updateRightPages();
|
||||
void updateLeftPages();
|
||||
bool loadedComic;
|
||||
QList<int> pagesEmited;
|
||||
QVector<bool> pagesReady;
|
||||
int imageRotation;
|
||||
QVector<ImageFilter *> filters;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif // RENDER_H
|
67
YACReader/shortcuts_dialog.cpp
Normal file
67
YACReader/shortcuts_dialog.cpp
Normal file
@ -0,0 +1,67 @@
|
||||
#include "shortcuts_dialog.h"
|
||||
#include <QVBoxLayout>
|
||||
#include <QPushButton>
|
||||
#include <QTextEdit>
|
||||
#include <QLabel>
|
||||
#include <QPixmap>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QTextCodec>
|
||||
|
||||
ShortcutsDialog::ShortcutsDialog(QWidget * parent)
|
||||
:QDialog(parent)//,Qt::FramelessWindowHint)
|
||||
{
|
||||
setModal(true);
|
||||
setWindowIcon(QIcon(":/images/shortcuts.png"));
|
||||
setWindowTitle(tr("YACReader keyboard shortcuts"));
|
||||
|
||||
QVBoxLayout * mainLayout = new QVBoxLayout;
|
||||
|
||||
close = new QPushButton(tr("Close"));
|
||||
connect(close,SIGNAL(clicked()),this,SLOT(close()));
|
||||
|
||||
QHBoxLayout *bottomLayout = new QHBoxLayout;
|
||||
bottomLayout->addStretch();
|
||||
bottomLayout->addWidget(close);
|
||||
|
||||
QHBoxLayout * shortcutsLayout = new QHBoxLayout;
|
||||
|
||||
shortcuts = new QTextEdit();
|
||||
shortcuts->setFrameStyle(QFrame::NoFrame);
|
||||
|
||||
//"<p><b>General functions:</b><hr/><b>O</b> : Open comic<br/><b>Esc</b> : Exit</p>"
|
||||
shortcuts->setReadOnly(true);
|
||||
shortcutsLayout->addWidget(shortcuts);
|
||||
//shortcutsLayout->addWidget(shortcuts2);
|
||||
shortcutsLayout->setSpacing(0);
|
||||
mainLayout->addLayout(shortcutsLayout);
|
||||
mainLayout->addLayout(bottomLayout);
|
||||
|
||||
QHBoxLayout *imgMainLayout = new QHBoxLayout;
|
||||
QLabel * imgLabel = new QLabel();
|
||||
QPixmap p(":/images/shortcuts.png");
|
||||
imgLabel->setPixmap(p);
|
||||
|
||||
QVBoxLayout * imgLayout = new QVBoxLayout;
|
||||
imgLayout->addWidget(imgLabel);
|
||||
imgLayout->addStretch();
|
||||
|
||||
imgMainLayout->addLayout(imgLayout);
|
||||
imgMainLayout->addLayout(mainLayout);
|
||||
|
||||
setLayout(imgMainLayout);
|
||||
|
||||
setFixedSize(QSize(700,500));
|
||||
|
||||
QFile f(":/files/shortcuts.html");
|
||||
f.open(QIODevice::ReadOnly);
|
||||
QTextStream txtS(&f);
|
||||
txtS.setCodec(QTextCodec::codecForName("UTF-8"));
|
||||
QString content = txtS.readAll();
|
||||
|
||||
f.close();
|
||||
|
||||
shortcuts->setHtml(content);
|
||||
|
||||
setWindowTitle(tr("Keyboard Shortcuts"));
|
||||
}
|
19
YACReader/shortcuts_dialog.h
Normal file
19
YACReader/shortcuts_dialog.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef SHORTCUTS_DIALOG_H
|
||||
#define SHORTCUTS_DIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QTextEdit>
|
||||
#include <QPushButton>
|
||||
|
||||
class ShortcutsDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ShortcutsDialog(QWidget * parent = 0);
|
||||
private:
|
||||
QTextEdit * shortcuts;
|
||||
QPushButton * close;
|
||||
public slots:
|
||||
};
|
||||
|
||||
#endif // SHORTCUTS_DIALOG_H
|
90
YACReader/translator.cpp
Normal file
90
YACReader/translator.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
#include <QUrl>
|
||||
#include <Phonon/MediaObject>
|
||||
#include <Phonon/MediaSource>
|
||||
#include <QPushButton>
|
||||
#include <QPalette>
|
||||
#include <QMouseEvent>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWebView>
|
||||
#include <QFile>
|
||||
#include <QPoint>
|
||||
#include <QWidget>
|
||||
#include <QTextCodec>
|
||||
|
||||
#include "translator.h"
|
||||
|
||||
YACReaderTranslator::YACReaderTranslator(QWidget * parent)
|
||||
:QWidget(parent)
|
||||
{
|
||||
this->setCursor(QCursor(Qt::ArrowCursor));
|
||||
this->setAutoFillBackground(true);
|
||||
this->setBackgroundRole(QPalette::Window);
|
||||
QPalette p(this->palette());
|
||||
p.setColor(QPalette::Window, QColor(96,96,96));
|
||||
this->setPalette(p);
|
||||
|
||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||
QWebView * view = new QWebView();
|
||||
QFile f(":/files/translator.html");
|
||||
f.open(QIODevice::ReadOnly);
|
||||
QTextStream txtS(&f);
|
||||
txtS.setCodec(QTextCodec::codecForName("UTF-8"));
|
||||
QString contentHTML = txtS.readAll();
|
||||
view->setHtml(contentHTML);
|
||||
view->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks);
|
||||
connect(view->page(),SIGNAL(linkClicked(QUrl)),this,SLOT(play(QUrl)));
|
||||
|
||||
QHBoxLayout * buttonBar = new QHBoxLayout();
|
||||
QPushButton * close = new QPushButton(QIcon(QPixmap(":/images/close.png")),"");
|
||||
close->setFlat(true);
|
||||
buttonBar->addStretch();
|
||||
close->resize(18,18);
|
||||
buttonBar->addWidget(close);
|
||||
buttonBar->setMargin(0);
|
||||
connect(close,SIGNAL(clicked()),this->parent(),SLOT(animateHideTranslator()));
|
||||
|
||||
layout->setMargin(0);
|
||||
layout->setSpacing(0);
|
||||
|
||||
layout->addLayout(buttonBar);
|
||||
layout->addWidget(view);
|
||||
|
||||
resize(view->size().width()/1.60,view->size().height());
|
||||
|
||||
music = createPlayer(MusicCategory);
|
||||
|
||||
show();
|
||||
}
|
||||
|
||||
void YACReaderTranslator::play(const QUrl & url)
|
||||
{
|
||||
MediaSource src(url);
|
||||
src.setAutoDelete(true);
|
||||
music->setCurrentSource(src);
|
||||
music->play();
|
||||
}
|
||||
|
||||
YACReaderTranslator::~YACReaderTranslator()
|
||||
{
|
||||
delete music;
|
||||
}
|
||||
|
||||
void YACReaderTranslator::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
drag = true;
|
||||
click = event->pos();
|
||||
}
|
||||
|
||||
void YACReaderTranslator::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
drag = false;
|
||||
}
|
||||
|
||||
void YACReaderTranslator::mouseMoveEvent(QMouseEvent * event)
|
||||
{
|
||||
if(drag)
|
||||
this->move(QPoint(mapToParent(event->pos())-click));
|
||||
|
||||
}
|
||||
|
32
YACReader/translator.h
Normal file
32
YACReader/translator.h
Normal file
@ -0,0 +1,32 @@
|
||||
#ifndef __TRANSLATOR_H
|
||||
#define __TRANSLATOR_H
|
||||
|
||||
class QUrl;
|
||||
class QMouseEvent;
|
||||
class QPoint;
|
||||
#include<QWidget>
|
||||
#include<Phonon/MediaObject>
|
||||
|
||||
using namespace Phonon;
|
||||
|
||||
class YACReaderTranslator : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
YACReaderTranslator(QWidget * parent = 0);
|
||||
~YACReaderTranslator();
|
||||
|
||||
public slots:
|
||||
void play(const QUrl & url);
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void mouseReleaseEvent(QMouseEvent *event);
|
||||
void mouseMoveEvent ( QMouseEvent * event );
|
||||
bool drag;
|
||||
QPoint click;
|
||||
private:
|
||||
MediaObject * music;
|
||||
};
|
||||
|
||||
#endif
|
782
YACReader/viewer.cpp
Normal file
782
YACReader/viewer.cpp
Normal file
@ -0,0 +1,782 @@
|
||||
#include "viewer.h"
|
||||
#include "magnifying_glass.h"
|
||||
#include "configuration.h"
|
||||
#include "magnifying_glass.h"
|
||||
#include "goto_flow.h"
|
||||
#include "goto_flow_gl.h"
|
||||
#include "bookmarks_dialog.h"
|
||||
#include "render.h"
|
||||
#include "goto_dialog.h"
|
||||
#include "translator.h"
|
||||
#include "onstart_flow_selection_dialog.h"
|
||||
#include "page_label_widget.h"
|
||||
#include "notifications_label_widget.h"
|
||||
|
||||
#include <QWebView>
|
||||
#include <QFile>
|
||||
#define STEPS 22
|
||||
|
||||
|
||||
|
||||
Viewer::Viewer(QWidget * parent)
|
||||
:QScrollArea(parent),
|
||||
currentPage(0),
|
||||
magnifyingGlassShowed(false),
|
||||
fullscreen(false),
|
||||
information(false),
|
||||
adjustToWidthRatio(1),
|
||||
doublePage(false),
|
||||
wheelStop(false),
|
||||
direction(1),
|
||||
restoreMagnifyingGlass(false),
|
||||
drag(false)
|
||||
|
||||
{
|
||||
translator = new YACReaderTranslator(this);
|
||||
translator->hide();
|
||||
translatorAnimation = new QPropertyAnimation(translator,"pos");
|
||||
translatorAnimation->setDuration(150);
|
||||
translatorXPos = -10000;
|
||||
translator->move(-translator->width(),10);
|
||||
//current comic page
|
||||
content = new QLabel(this);
|
||||
configureContent(tr("Press 'O' to open comic."));
|
||||
//scroll area configuration
|
||||
setBackgroundRole(QPalette::Dark);
|
||||
setWidget(content);
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setFrameStyle(QFrame::NoFrame);
|
||||
setAlignment(Qt::AlignCenter);
|
||||
|
||||
QPalette palette;
|
||||
palette.setColor(backgroundRole(), Configuration::getConfiguration().getBackgroundColor());
|
||||
setPalette(palette);
|
||||
//---------------------------------------
|
||||
mglass = new MagnifyingGlass(Configuration::getConfiguration().getMagnifyingGlassSize(),this);
|
||||
mglass->hide();
|
||||
content->setMouseTracking(true);
|
||||
setMouseTracking(true);
|
||||
|
||||
showCursor();
|
||||
|
||||
goToDialog = new GoToDialog(this);
|
||||
|
||||
QSettings * settings = new QSettings(QCoreApplication::applicationDirPath()+"/YACReader.ini",QSettings::IniFormat);
|
||||
|
||||
//CONFIG GOTO_FLOW--------------------------------------------------------
|
||||
if(QGLFormat::hasOpenGL() && !settings->contains(USE_OPEN_GL))
|
||||
{
|
||||
OnStartFlowSelectionDialog * flowSelDialog = new OnStartFlowSelectionDialog();
|
||||
|
||||
flowSelDialog->exec();
|
||||
if(flowSelDialog->result() == QDialog::Accepted)
|
||||
settings->setValue(USE_OPEN_GL,2);
|
||||
else
|
||||
settings->setValue(USE_OPEN_GL,0);
|
||||
|
||||
delete flowSelDialog;
|
||||
}
|
||||
|
||||
if(QGLFormat::hasOpenGL() && (settings->value(USE_OPEN_GL).toBool() == true))
|
||||
goToFlow = new GoToFlowGL(this,Configuration::getConfiguration().getFlowType());
|
||||
else
|
||||
goToFlow = new GoToFlow(this,Configuration::getConfiguration().getFlowType());
|
||||
|
||||
goToFlow->hide();
|
||||
showGoToFlowAnimation = new QPropertyAnimation(goToFlow,"pos");
|
||||
showGoToFlowAnimation->setDuration(150);
|
||||
|
||||
bd = new BookmarksDialog(this->parentWidget());
|
||||
|
||||
render = new Render();
|
||||
|
||||
hideCursorTimer = new QTimer();
|
||||
hideCursorTimer->setSingleShot(true);
|
||||
|
||||
if(Configuration::getConfiguration().getDoublePage())
|
||||
doublePageSwitch();
|
||||
|
||||
createConnections();
|
||||
|
||||
hideCursorTimer->start(2500);
|
||||
|
||||
setMouseTracking(true);
|
||||
|
||||
//animations
|
||||
verticalScroller = new QPropertyAnimation(verticalScrollBar(), "sliderPosition");
|
||||
connect(verticalScroller,SIGNAL(valueChanged (const QVariant &)),this,SIGNAL(backgroundChanges()));
|
||||
|
||||
notificationsLabel = new NotificationsLabelWidget(this);
|
||||
notificationsLabel->hide();
|
||||
|
||||
informationLabel = new PageLabelWidget(this);
|
||||
|
||||
}
|
||||
|
||||
void Viewer::createConnections()
|
||||
{
|
||||
//magnifyingGlass (update mg after a background change
|
||||
connect(this,SIGNAL(backgroundChanges()),mglass,SLOT(updateImage()));
|
||||
|
||||
//goToDialog
|
||||
connect(goToDialog,SIGNAL(goToPage(unsigned int)),this,SLOT(goTo(unsigned int)));
|
||||
|
||||
//goToFlow goTo
|
||||
connect(goToFlow,SIGNAL(goToPage(unsigned int)),this,SLOT(goTo(unsigned int)));
|
||||
|
||||
//current time
|
||||
QTimer * t = new QTimer();
|
||||
connect(t,SIGNAL(timeout()),this,SLOT(updateInformation()));
|
||||
t->start(1000);
|
||||
|
||||
//hide cursor
|
||||
connect(hideCursorTimer,SIGNAL(timeout()),this,SLOT(hideCursor()));
|
||||
|
||||
//bookmarks
|
||||
connect(bd,SIGNAL(goToPage(unsigned int)),this,SLOT(goTo(unsigned int)));
|
||||
|
||||
//render
|
||||
connect(render,SIGNAL(errorOpening()),this,SLOT(resetContent()));
|
||||
connect(render,SIGNAL(errorOpening()),this,SLOT(showMessageErrorOpening()));
|
||||
connect(render,SIGNAL(numPages(unsigned int)),goToFlow,SLOT(setNumSlides(unsigned int)));
|
||||
connect(render,SIGNAL(numPages(unsigned int)),goToDialog,SLOT(setNumPages(unsigned int)));
|
||||
connect(render,SIGNAL(imageLoaded(int,QByteArray)),goToFlow,SLOT(setImageReady(int,QByteArray)));
|
||||
connect(render,SIGNAL(currentPageReady()),this,SLOT(updatePage()));
|
||||
connect(render,SIGNAL(processingPage()),this,SLOT(setLoadingMessage()));
|
||||
connect(render,SIGNAL(currentPageIsBookmark(bool)),this,SIGNAL(pageIsBookmark(bool)));
|
||||
//connect(render,SIGNAL(bookmarksLoaded(Bookmarks)),this,SLOT(setBookmarks(Bookmarks)));
|
||||
|
||||
connect(render,SIGNAL(isLast()),this,SLOT(showIsLastMessage()));
|
||||
connect(render,SIGNAL(isCover()),this,SLOT(showIsCoverMessage()));
|
||||
|
||||
connect(render,SIGNAL(bookmarksUpdated()),this,SLOT(setBookmarks()));
|
||||
}
|
||||
|
||||
void Viewer::open(QString pathFile)
|
||||
{
|
||||
if(render->hasLoadedComic())
|
||||
save();
|
||||
//bd->setBookmarks(*bm);
|
||||
|
||||
goToFlow->reset();
|
||||
render->load(pathFile);
|
||||
//render->update();
|
||||
|
||||
verticalScrollBar()->setSliderPosition(verticalScrollBar()->minimum());
|
||||
|
||||
if(Configuration::getConfiguration().getShowInformation() && !information)
|
||||
{
|
||||
QTimer * timer = new QTimer();
|
||||
connect(timer,SIGNAL(timeout()),this,SLOT(informationSwitch()));
|
||||
connect(timer,SIGNAL(timeout()),timer,SLOT(deleteLater()));
|
||||
timer->start();
|
||||
}
|
||||
|
||||
informationLabel->setText("...");
|
||||
|
||||
setAcceptDrops(true);
|
||||
}
|
||||
|
||||
void Viewer::showMessageErrorOpening()
|
||||
{
|
||||
QMessageBox::critical(NULL,tr("Not found"),tr("Comic not found"));
|
||||
}
|
||||
|
||||
void Viewer::next()
|
||||
{
|
||||
direction = 1;
|
||||
render->nextPage();
|
||||
updateInformation();
|
||||
}
|
||||
|
||||
void Viewer::prev()
|
||||
{
|
||||
direction = -1;
|
||||
render->previousPage();
|
||||
updateInformation();
|
||||
}
|
||||
void Viewer::showGoToDialog()
|
||||
{
|
||||
goToDialog->show();
|
||||
}
|
||||
void Viewer::goTo(unsigned int page)
|
||||
{
|
||||
direction = 1; //in "go to" direction is always fordward
|
||||
render->goTo(page);
|
||||
}
|
||||
|
||||
void Viewer::updatePage()
|
||||
{
|
||||
QPixmap * previousPage = currentPage;
|
||||
currentPage = render->getCurrentPage();
|
||||
content->setPixmap(*currentPage);
|
||||
updateContentSize();
|
||||
updateVerticalScrollBar();
|
||||
emit backgroundChanges();
|
||||
emit(pageAvailable(true));
|
||||
//TODO -> update bookmark action
|
||||
setFocus(Qt::ShortcutFocusReason);
|
||||
delete previousPage;
|
||||
if(restoreMagnifyingGlass)
|
||||
{
|
||||
restoreMagnifyingGlass = false;
|
||||
showMagnifyingGlass();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Viewer::updateContentSize()
|
||||
{
|
||||
//there is an image to resize
|
||||
if(currentPage !=0 && !currentPage->isNull())
|
||||
{
|
||||
if(Configuration::getConfiguration().getAdjustToFullSize())
|
||||
{
|
||||
content->resize(currentPage->width(),currentPage->height());
|
||||
}
|
||||
else
|
||||
{
|
||||
float aspectRatio = (float)currentPage->width()/currentPage->height();
|
||||
//Fit to width
|
||||
if(Configuration::getConfiguration().getAdjustToWidth())
|
||||
{
|
||||
adjustToWidthRatio = Configuration::getConfiguration().getFitToWidthRatio();
|
||||
if(static_cast<int>(width()*adjustToWidthRatio/aspectRatio)<height())
|
||||
if(static_cast<int>(height()*aspectRatio)>width())
|
||||
content->resize(width(),static_cast<int>(width()/aspectRatio));
|
||||
else
|
||||
content->resize(static_cast<int>(height()*aspectRatio),height());
|
||||
else
|
||||
content->resize(width()*adjustToWidthRatio,static_cast<int>(width()*adjustToWidthRatio/aspectRatio));
|
||||
}
|
||||
//Fit to height or fullsize/custom size
|
||||
else
|
||||
{
|
||||
if(static_cast<int>(height()*aspectRatio)>width()) //page width exceeds window width
|
||||
content->resize(width(),static_cast<int>(width()/aspectRatio));
|
||||
else
|
||||
content->resize(static_cast<int>(height()*aspectRatio),height());
|
||||
}
|
||||
}
|
||||
emit backgroundChanges();
|
||||
}
|
||||
content->update(); //TODO, it shouldn't be neccesary
|
||||
}
|
||||
|
||||
void Viewer::updateVerticalScrollBar()
|
||||
{
|
||||
if(direction > 0)
|
||||
verticalScrollBar()->setSliderPosition(verticalScrollBar()->minimum());
|
||||
else
|
||||
verticalScrollBar()->setSliderPosition(verticalScrollBar()->maximum());
|
||||
}
|
||||
|
||||
void Viewer::scrollDown()
|
||||
{
|
||||
if(verticalScrollBar()->sliderPosition()==verticalScrollBar()->maximum())
|
||||
{
|
||||
next();
|
||||
}
|
||||
else
|
||||
{
|
||||
int currentPos = verticalScrollBar()->sliderPosition();
|
||||
verticalScroller->setDuration(250);
|
||||
verticalScroller->setStartValue(currentPos);
|
||||
verticalScroller->setEndValue(nextPos);
|
||||
|
||||
verticalScroller->start();
|
||||
|
||||
emit backgroundChanges();
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::scrollUp()
|
||||
{
|
||||
if(verticalScrollBar()->sliderPosition()==verticalScrollBar()->minimum())
|
||||
{
|
||||
prev();
|
||||
}
|
||||
else
|
||||
{
|
||||
int currentPos = verticalScrollBar()->sliderPosition();
|
||||
verticalScroller->setDuration(250);
|
||||
verticalScroller->setStartValue(currentPos);
|
||||
verticalScroller->setEndValue(nextPos);
|
||||
|
||||
verticalScroller->start();
|
||||
|
||||
emit backgroundChanges();
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
if(render->hasLoadedComic())
|
||||
{
|
||||
if(goToFlow->isVisible() && event->key()!=Qt::Key_S)
|
||||
QCoreApplication::sendEvent(goToFlow,event);
|
||||
else
|
||||
switch (event->key())
|
||||
{
|
||||
case Qt::Key_Space:
|
||||
posByStep = height()/STEPS;
|
||||
nextPos=verticalScrollBar()->sliderPosition()+static_cast<int>((height()*0.80));
|
||||
scrollDown();
|
||||
break;
|
||||
case Qt::Key_B:
|
||||
posByStep = height()/STEPS;
|
||||
nextPos=verticalScrollBar()->sliderPosition()-static_cast<int>((height()*0.80));
|
||||
scrollUp();
|
||||
break;
|
||||
case Qt::Key_S:
|
||||
goToFlowSwitch();
|
||||
break;
|
||||
case Qt::Key_T:
|
||||
translatorSwitch();
|
||||
break;
|
||||
case Qt::Key_Down:
|
||||
/*if(verticalScrollBar()->sliderPosition()==verticalScrollBar()->maximum())
|
||||
next();
|
||||
else*/
|
||||
QAbstractScrollArea::keyPressEvent(event);
|
||||
emit backgroundChanges();
|
||||
break;
|
||||
case Qt::Key_Up:
|
||||
/*if(verticalScrollBar()->sliderPosition()==verticalScrollBar()->minimum())
|
||||
prev();
|
||||
else*/
|
||||
QAbstractScrollArea::keyPressEvent(event);
|
||||
emit backgroundChanges();
|
||||
break;
|
||||
case Qt::Key_Home:
|
||||
goTo(0);
|
||||
break;
|
||||
case Qt::Key_End:
|
||||
goTo(this->render->numPages()-1);
|
||||
break;
|
||||
default:
|
||||
QAbstractScrollArea::keyPressEvent(event);
|
||||
break;
|
||||
}
|
||||
if(mglass->isVisible())
|
||||
switch(event->key())
|
||||
{
|
||||
case Qt::Key_Plus: case Qt::Key_Minus: case Qt::Key_Underscore: case Qt::Key_Asterisk:
|
||||
QCoreApplication::sendEvent(mglass,event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::wheelEvent(QWheelEvent * event)
|
||||
{
|
||||
if(render->hasLoadedComic())
|
||||
{
|
||||
if((event->delta()<0)&&(verticalScrollBar()->sliderPosition()==verticalScrollBar()->maximum()))
|
||||
{
|
||||
if(wheelStop)
|
||||
{
|
||||
next();
|
||||
verticalScroller->stop();
|
||||
event->accept();
|
||||
wheelStop = false;
|
||||
return;
|
||||
}
|
||||
else
|
||||
wheelStop = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if((event->delta()>0)&&(verticalScrollBar()->sliderPosition()==verticalScrollBar()->minimum()))
|
||||
{
|
||||
if(wheelStop)
|
||||
{
|
||||
prev();
|
||||
verticalScroller->stop();
|
||||
event->accept();
|
||||
wheelStop = false;
|
||||
return;
|
||||
}
|
||||
else
|
||||
wheelStop = true;
|
||||
}
|
||||
}
|
||||
|
||||
int deltaNotFinished = 0;
|
||||
if(verticalScroller->state() == QAbstractAnimation::Running)
|
||||
{
|
||||
deltaNotFinished = verticalScroller->startValue().toInt() - verticalScroller->endValue().toInt();
|
||||
verticalScroller->stop();
|
||||
}
|
||||
|
||||
|
||||
int currentPos = verticalScrollBar()->sliderPosition();
|
||||
verticalScroller->setDuration(250);
|
||||
verticalScroller->setStartValue(currentPos);
|
||||
verticalScroller->setEndValue(currentPos - event->delta() - deltaNotFinished);
|
||||
|
||||
verticalScroller->start();
|
||||
|
||||
//QAbstractScrollArea::wheelEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::resizeEvent(QResizeEvent * event)
|
||||
{
|
||||
updateContentSize();
|
||||
goToFlow->move(QPoint((width()-goToFlow->width())/2,height()-goToFlow->height()));
|
||||
informationLabel->updatePosition();
|
||||
QScrollArea::resizeEvent(event);
|
||||
}
|
||||
|
||||
void Viewer::mouseMoveEvent(QMouseEvent * event)
|
||||
{
|
||||
showCursor();
|
||||
hideCursorTimer->start(2500);
|
||||
|
||||
if(magnifyingGlassShowed)
|
||||
mglass->move(static_cast<int>(event->x()-float(mglass->width())/2),static_cast<int>(event->y()-float(mglass->height())/2));
|
||||
|
||||
if(render->hasLoadedComic())
|
||||
{
|
||||
if(showGoToFlowAnimation->state()!=QPropertyAnimation::Running)
|
||||
{
|
||||
if(goToFlow->isVisible())
|
||||
{
|
||||
animateHideGoToFlow();
|
||||
//goToFlow->hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
int umbral = (width()-goToFlow->width())/2;
|
||||
if((event->y()>height()-15)&&(event->x()>umbral)&&(event->x()<width()-umbral))
|
||||
{
|
||||
|
||||
animateShowGoToFlow();
|
||||
hideCursorTimer->stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(drag)
|
||||
{
|
||||
int currentPosY = verticalScrollBar()->sliderPosition();
|
||||
int currentPosX = horizontalScrollBar()->sliderPosition();
|
||||
verticalScrollBar()->setSliderPosition(currentPosY=currentPosY+(yDragOrigin-event->y()));
|
||||
horizontalScrollBar()->setSliderPosition(currentPosX=currentPosX+(xDragOrigin-event->x()));
|
||||
yDragOrigin = event->y();
|
||||
xDragOrigin = event->x();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
const QPixmap * Viewer::pixmap()
|
||||
{
|
||||
return content->pixmap();
|
||||
}
|
||||
|
||||
void Viewer::magnifyingGlassSwitch()
|
||||
{
|
||||
magnifyingGlassShowed?hideMagnifyingGlass():showMagnifyingGlass();
|
||||
}
|
||||
|
||||
void Viewer::showMagnifyingGlass()
|
||||
{
|
||||
if(render->hasLoadedComic())
|
||||
{
|
||||
QPoint p = QPoint(cursor().pos().x(),cursor().pos().y());
|
||||
p = this->parentWidget()->mapFromGlobal(p);
|
||||
mglass->move(static_cast<int>(p.x()-float(mglass->width())/2)
|
||||
,static_cast<int>(p.y()-float(mglass->height())/2));
|
||||
mglass->show();
|
||||
mglass->updateImage(mglass->x()+mglass->width()/2,mglass->y()+mglass->height()/2);
|
||||
magnifyingGlassShowed = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::hideMagnifyingGlass()
|
||||
{
|
||||
mglass->hide();
|
||||
magnifyingGlassShowed = false;
|
||||
}
|
||||
|
||||
void Viewer::informationSwitch()
|
||||
{
|
||||
information?informationLabel->hide():informationLabel->show();
|
||||
//informationLabel->move(QPoint((width()-informationLabel->width())/2,0));
|
||||
information=!information;
|
||||
Configuration::getConfiguration().setShowInformation(information);
|
||||
//TODO it shouldn't be neccesary
|
||||
informationLabel->adjustSize();
|
||||
informationLabel->update();
|
||||
}
|
||||
|
||||
void Viewer::updateInformation()
|
||||
{
|
||||
if(render->hasLoadedComic())
|
||||
{
|
||||
informationLabel->setText(render->getCurrentPagesInformation()+" - "+QTime::currentTime().toString("HH:mm"));
|
||||
informationLabel->adjustSize();
|
||||
informationLabel->update(); //TODO it shouldn't be neccesary
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::goToFlowSwitch()
|
||||
{
|
||||
goToFlow->isVisible()?animateHideGoToFlow():showGoToFlow();
|
||||
}
|
||||
|
||||
void Viewer::translatorSwitch()
|
||||
{
|
||||
translator->isVisible()?animateHideTranslator():animateShowTranslator();
|
||||
}
|
||||
|
||||
void Viewer::showGoToFlow()
|
||||
{
|
||||
if(render->hasLoadedComic())
|
||||
{
|
||||
animateShowGoToFlow();
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::animateShowGoToFlow()
|
||||
{
|
||||
if(goToFlow->isHidden() && showGoToFlowAnimation->state()!=QPropertyAnimation::Running)
|
||||
{
|
||||
disconnect(showGoToFlowAnimation,SIGNAL(finished()),goToFlow,SLOT(hide()));
|
||||
connect(showGoToFlowAnimation,SIGNAL(finished()),this,SLOT(moveCursoToGoToFlow()));
|
||||
showGoToFlowAnimation->setStartValue(QPoint((width()-goToFlow->width())/2,height()-10));
|
||||
showGoToFlowAnimation->setEndValue(QPoint((width()-goToFlow->width())/2,height()-goToFlow->height()));
|
||||
showGoToFlowAnimation->start();
|
||||
goToFlow->centerSlide(render->getIndex());
|
||||
goToFlow->setPageNumber(render->getIndex());
|
||||
goToFlow->show();
|
||||
goToFlow->setFocus(Qt::OtherFocusReason);
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::animateHideGoToFlow()
|
||||
{
|
||||
if(goToFlow->isVisible() && showGoToFlowAnimation->state()!=QPropertyAnimation::Running)
|
||||
{
|
||||
connect(showGoToFlowAnimation,SIGNAL(finished()),goToFlow,SLOT(hide()));
|
||||
disconnect(showGoToFlowAnimation,SIGNAL(finished()),this,SLOT(moveCursoToGoToFlow()));
|
||||
showGoToFlowAnimation->setStartValue(QPoint((width()-goToFlow->width())/2,height()-goToFlow->height()));
|
||||
showGoToFlowAnimation->setEndValue(QPoint((width()-goToFlow->width())/2,height()));
|
||||
showGoToFlowAnimation->start();
|
||||
goToFlow->centerSlide(render->getIndex());
|
||||
goToFlow->setPageNumber(render->getIndex());
|
||||
this->setFocus(Qt::OtherFocusReason);
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::moveCursoToGoToFlow()
|
||||
{
|
||||
//Move cursor to goToFlow widget on show (this avoid hide when mouse is moved)
|
||||
int y = goToFlow->pos().y();
|
||||
int x1 = goToFlow->pos().x();
|
||||
int x2 = x1 + goToFlow->width();
|
||||
QPoint cursorPos = mapFromGlobal(cursor().pos());
|
||||
int cursorX = cursorPos.x();
|
||||
int cursorY = cursorPos.y();
|
||||
|
||||
if(cursorY <= y)
|
||||
cursorY = y + 10;
|
||||
if(cursorX <= x1)
|
||||
cursorX = x1 + 10;
|
||||
if(cursorX >= x2)
|
||||
cursorX = x2 - 10;
|
||||
cursor().setPos(mapToGlobal(QPoint(cursorX,cursorY)));
|
||||
hideCursorTimer->stop();
|
||||
showCursor();
|
||||
}
|
||||
|
||||
void Viewer::rotateLeft()
|
||||
{
|
||||
render->rotateLeft();
|
||||
}
|
||||
void Viewer::rotateRight()
|
||||
{
|
||||
render->rotateRight();
|
||||
}
|
||||
|
||||
//TODO
|
||||
void Viewer::setBookmark(bool set)
|
||||
{
|
||||
render->setBookmark();
|
||||
if(set) //add bookmark
|
||||
{
|
||||
render->setBookmark();
|
||||
}
|
||||
else //remove bookmark
|
||||
{
|
||||
render->removeBookmark();
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::save ()
|
||||
{
|
||||
if(render->hasLoadedComic())
|
||||
render->save();
|
||||
}
|
||||
|
||||
void Viewer::doublePageSwitch()
|
||||
{
|
||||
doublePage = !doublePage;
|
||||
render->doublePageSwitch();
|
||||
Configuration::getConfiguration().setDoublePage(doublePage);
|
||||
}
|
||||
|
||||
void Viewer::resetContent()
|
||||
{
|
||||
configureContent(tr("Press 'O' to open comic."));
|
||||
goToFlow->reset();
|
||||
emit reset();
|
||||
}
|
||||
|
||||
void Viewer::setLoadingMessage()
|
||||
{
|
||||
if(magnifyingGlassShowed)
|
||||
{
|
||||
hideMagnifyingGlass();
|
||||
restoreMagnifyingGlass = true;
|
||||
}
|
||||
emit(pageAvailable(false));
|
||||
configureContent(tr("Loading...please wait!"));
|
||||
}
|
||||
|
||||
void Viewer::configureContent(QString msg)
|
||||
{
|
||||
content->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
||||
content->setScaledContents(true);
|
||||
content->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
|
||||
content->setText(msg);
|
||||
content->setFont(QFont("courier new", 12));
|
||||
content->adjustSize();
|
||||
setFocus(Qt::ShortcutFocusReason);
|
||||
//emit showingText();
|
||||
}
|
||||
|
||||
void Viewer::hideCursor()
|
||||
{
|
||||
#ifdef Q_OS_MAC
|
||||
setCursor(QCursor(QBitmap(1,1),QBitmap(1,1)));
|
||||
#else
|
||||
setCursor(Qt::BlankCursor);
|
||||
#endif
|
||||
}
|
||||
void Viewer::showCursor()
|
||||
{
|
||||
if(drag)
|
||||
setCursor(Qt::ClosedHandCursor);
|
||||
else
|
||||
setCursor(Qt::OpenHandCursor);
|
||||
}
|
||||
|
||||
void Viewer::updateOptions()
|
||||
{
|
||||
|
||||
goToFlow->setFlowType(Configuration::getConfiguration().getFlowType());
|
||||
updateBackgroundColor(Configuration::getConfiguration().getBackgroundColor());
|
||||
updateContentSize();
|
||||
//goToFlow->updateSize();
|
||||
}
|
||||
|
||||
void Viewer::updateBackgroundColor(const QColor & color)
|
||||
{
|
||||
QPalette palette;
|
||||
palette.setColor(backgroundRole(), color);
|
||||
setPalette(palette);
|
||||
}
|
||||
|
||||
void Viewer::animateShowTranslator()
|
||||
{
|
||||
if(translator->isHidden() && translatorAnimation->state()!=QPropertyAnimation::Running)
|
||||
{
|
||||
disconnect(translatorAnimation,SIGNAL(finished()),translator,SLOT(hide()));
|
||||
if(translatorXPos == -10000)
|
||||
translatorXPos = (width()-translator->width())/2;
|
||||
int x = qMax(0,qMin(translatorXPos,width()-translator->width()));
|
||||
if(translator->pos().x()<0)
|
||||
{
|
||||
translatorAnimation->setStartValue(QPoint(-translator->width(),translator->pos().y()));
|
||||
}
|
||||
else
|
||||
{
|
||||
translatorAnimation->setStartValue(QPoint(width()+translator->width(),translator->pos().y()));
|
||||
}
|
||||
translatorAnimation->setEndValue(QPoint(x,translator->pos().y()));
|
||||
translatorAnimation->start();
|
||||
translator->show();
|
||||
translator->setFocus(Qt::OtherFocusReason);
|
||||
}
|
||||
}
|
||||
void Viewer::animateHideTranslator()
|
||||
{
|
||||
if(translator->isVisible() && translatorAnimation->state()!=QPropertyAnimation::Running)
|
||||
{
|
||||
connect(translatorAnimation,SIGNAL(finished()),translator,SLOT(hide()));
|
||||
translatorAnimation->setStartValue(QPoint(translatorXPos = translator->pos().x(),translator->pos().y()));
|
||||
if((translator->width()/2)+translator->pos().x() <= width()/2)
|
||||
translatorAnimation->setEndValue(QPoint(-translator->width(),translator->pos().y()));
|
||||
else
|
||||
translatorAnimation->setEndValue(QPoint(width()+translator->width(),translator->pos().y()));
|
||||
translatorAnimation->start();
|
||||
this->setFocus(Qt::OtherFocusReason);
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::mousePressEvent ( QMouseEvent * event )
|
||||
{
|
||||
drag = true;
|
||||
yDragOrigin = event->y();
|
||||
xDragOrigin = event->x();
|
||||
setCursor(Qt::ClosedHandCursor);
|
||||
}
|
||||
void Viewer::mouseReleaseEvent ( QMouseEvent * event )
|
||||
{
|
||||
drag = false;
|
||||
setCursor(Qt::OpenHandCursor);
|
||||
}
|
||||
|
||||
void Viewer::updateFitToWidthRatio(float ratio)
|
||||
{
|
||||
adjustToWidthRatio = ratio;
|
||||
updateContentSize();
|
||||
}
|
||||
|
||||
void Viewer::updateConfig(QSettings * settings)
|
||||
{
|
||||
goToFlow->updateConfig(settings);
|
||||
|
||||
QPalette palette;
|
||||
palette.setColor(backgroundRole(), Configuration::getConfiguration().getBackgroundColor());
|
||||
setPalette(palette);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Viewer::updateImageOptions()
|
||||
{
|
||||
render->reload();
|
||||
}
|
||||
|
||||
void Viewer::setBookmarks()
|
||||
{
|
||||
bd->setBookmarks(*render->getBookmarks());
|
||||
}
|
||||
|
||||
void Viewer::showIsCoverMessage()
|
||||
{
|
||||
notificationsLabel->setText(tr("Cover!"));
|
||||
notificationsLabel->flash();
|
||||
|
||||
}
|
||||
|
||||
void Viewer::showIsLastMessage()
|
||||
{
|
||||
notificationsLabel->setText(tr("Last page!"));
|
||||
notificationsLabel->flash();
|
||||
}
|
146
YACReader/viewer.h
Normal file
146
YACReader/viewer.h
Normal file
@ -0,0 +1,146 @@
|
||||
#ifndef __VIEWER_H
|
||||
#define __VIEWER_H
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
#include <QScrollArea>
|
||||
#include <QAction>
|
||||
#include <QTimer>
|
||||
#include <QLabel>
|
||||
#include <QPixmap>
|
||||
#include <QKeyEvent>
|
||||
#include <QResizeEvent>
|
||||
#include <QWheelEvent>
|
||||
#include <QMouseEvent>
|
||||
#include <QCloseEvent>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QSettings>
|
||||
|
||||
|
||||
class Comic;
|
||||
class MagnifyingGlass;
|
||||
class GoToFlow;
|
||||
class BookmarksDialog;
|
||||
class Render;
|
||||
class GoToDialog;
|
||||
class YACReaderTranslator;
|
||||
class GoToFlowWidget;
|
||||
class Bookmarks;
|
||||
class PageLabelWidget;
|
||||
class NotificationsLabelWidget;
|
||||
|
||||
class Viewer : public QScrollArea
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
bool fullscreen; //TODO, change by the right use of windowState();
|
||||
public slots:
|
||||
void open(QString pathFile);
|
||||
void prev();
|
||||
void next();
|
||||
void showGoToDialog();
|
||||
void goTo(unsigned int page);
|
||||
void updatePage();
|
||||
void updateContentSize();
|
||||
void updateVerticalScrollBar();
|
||||
void updateOptions();
|
||||
void scrollDown();
|
||||
void scrollUp();
|
||||
void magnifyingGlassSwitch();
|
||||
void showMagnifyingGlass();
|
||||
void hideMagnifyingGlass();
|
||||
void informationSwitch();
|
||||
void updateInformation();
|
||||
void goToFlowSwitch();
|
||||
void showGoToFlow();
|
||||
void moveCursoToGoToFlow();
|
||||
void animateShowGoToFlow();
|
||||
void animateHideGoToFlow();
|
||||
void rotateLeft();
|
||||
void rotateRight();
|
||||
bool magnifyingGlassIsVisible() {return magnifyingGlassShowed;}
|
||||
void setBookmark(bool);
|
||||
void save();
|
||||
void doublePageSwitch();
|
||||
void resetContent();
|
||||
void setLoadingMessage();
|
||||
void configureContent(QString msg);
|
||||
void hideCursor();
|
||||
void showCursor();
|
||||
void createConnections();
|
||||
void translatorSwitch();
|
||||
void animateShowTranslator();
|
||||
void animateHideTranslator();
|
||||
virtual void mousePressEvent ( QMouseEvent * event );
|
||||
virtual void mouseReleaseEvent ( QMouseEvent * event );
|
||||
void updateBackgroundColor(const QColor & color);
|
||||
void updateFitToWidthRatio(float ratio);
|
||||
void updateConfig(QSettings * settings);
|
||||
void showMessageErrorOpening();
|
||||
void setBookmarks();
|
||||
void updateImageOptions();
|
||||
void showIsCoverMessage();
|
||||
void showIsLastMessage();
|
||||
|
||||
private:
|
||||
bool information;
|
||||
bool doublePage;
|
||||
PageLabelWidget * informationLabel;
|
||||
//QTimer * scroller;
|
||||
QPropertyAnimation * verticalScroller;
|
||||
int posByStep;
|
||||
int nextPos;
|
||||
GoToFlowWidget * goToFlow;
|
||||
QPropertyAnimation * showGoToFlowAnimation;
|
||||
GoToDialog * goToDialog;
|
||||
//!Image properties
|
||||
float adjustToWidthRatio;
|
||||
//! Comic
|
||||
//Comic * comic;
|
||||
int index;
|
||||
QPixmap *currentPage;
|
||||
BookmarksDialog * bd;
|
||||
bool wheelStop;
|
||||
Render * render;
|
||||
QTimer * hideCursorTimer;
|
||||
int direction;
|
||||
bool drag;
|
||||
|
||||
//!Widgets
|
||||
QLabel *content;
|
||||
|
||||
YACReaderTranslator * translator;
|
||||
int translatorXPos;
|
||||
QPropertyAnimation * translatorAnimation;
|
||||
|
||||
int yDragOrigin;
|
||||
int xDragOrigin;
|
||||
|
||||
NotificationsLabelWidget * notificationsLabel;
|
||||
|
||||
private:
|
||||
//!Magnifying glass
|
||||
MagnifyingGlass *mglass;
|
||||
bool magnifyingGlassShowed;
|
||||
bool restoreMagnifyingGlass;
|
||||
|
||||
//! Manejadores de evento:
|
||||
void keyPressEvent(QKeyEvent * event);
|
||||
void resizeEvent(QResizeEvent * event);
|
||||
void wheelEvent(QWheelEvent * event);
|
||||
void mouseMoveEvent(QMouseEvent * event);
|
||||
|
||||
public:
|
||||
Viewer(QWidget * parent = 0);
|
||||
void toggleFullScreen();
|
||||
const QPixmap * pixmap();
|
||||
//Comic * getComic(){return comic;}
|
||||
const BookmarksDialog * getBookmarksDialog(){return bd;}
|
||||
signals:
|
||||
void backgroundChanges();
|
||||
void pageAvailable(bool);
|
||||
void pageIsBookmark(bool);
|
||||
void reset();
|
||||
};
|
||||
|
||||
#endif
|
78
YACReader/width_slider.cpp
Normal file
78
YACReader/width_slider.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
#include "width_slider.h"
|
||||
|
||||
#include <QWidget>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QSlider>
|
||||
#include "configuration.h"
|
||||
|
||||
YACReaderSliderAction::YACReaderSliderAction (QWidget * parent)
|
||||
:QWidgetAction (0) {
|
||||
|
||||
QWidget* pWidget = new QWidget (NULL);
|
||||
QHBoxLayout* pLayout = new QHBoxLayout();
|
||||
|
||||
pLayout->addStretch();
|
||||
|
||||
percentageLabel = new QLabel ("100%");
|
||||
percentageLabel->setStyleSheet("QLabel { color : white; }");
|
||||
percentageLabel->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||
pLayout->addWidget (percentageLabel);
|
||||
slider = new QSlider(NULL);
|
||||
slider->setOrientation(Qt::Horizontal);
|
||||
pLayout->addWidget (slider);
|
||||
|
||||
QString sliderCSS =
|
||||
|
||||
"QSlider::sub-page:horizontal {background-image: url(:/images/sliderSubPage.png); border: 0px; margin-left: 18px;}"
|
||||
"QSlider::add-page:horizontal {background-image: url(:/images/sliderAddPage.png); border: 0px; margin-right: 25px;}"
|
||||
"QSlider::handle:horizontal {image: url(:/images/sliderHandle.png); width: 31px;height:45px; }"
|
||||
"QSlider::groove:horizontal {border-image:url(:/images/sliderGround.png); border-left:-2px; border-right:0;}"
|
||||
;
|
||||
slider->setStyleSheet(sliderCSS);
|
||||
slider->setFixedSize(218,45);
|
||||
|
||||
QLabel* imgLabel = new QLabel(pWidget);
|
||||
QPixmap p(":/images/sliderBackground.png");
|
||||
imgLabel->resize(p.size());
|
||||
imgLabel->setPixmap(p);
|
||||
|
||||
pLayout->setMargin(0);
|
||||
pLayout->setSpacing(0);
|
||||
|
||||
pLayout->setStretchFactor(percentageLabel,1);
|
||||
pLayout->setStretchFactor(slider,0);
|
||||
|
||||
|
||||
pWidget->setLayout (pLayout);
|
||||
pWidget->setAutoFillBackground(false);
|
||||
|
||||
pWidget->setMinimumSize(276,45);
|
||||
|
||||
setDefaultWidget(pWidget);
|
||||
|
||||
slider->setMinimum(50);
|
||||
slider->setMaximum(100);
|
||||
slider->setPageStep(5);
|
||||
|
||||
int value = Configuration::getConfiguration().getFitToWidthRatio()*100;
|
||||
slider->setValue(value);
|
||||
percentageLabel->setText(QString("%1 %").arg(value));
|
||||
connect(slider,SIGNAL(valueChanged(int)),this,SLOT(updateText(int)));
|
||||
|
||||
|
||||
}
|
||||
|
||||
void YACReaderSliderAction::updateText(int value)
|
||||
{
|
||||
percentageLabel->setText(QString("%1 %").arg(value));
|
||||
Configuration::getConfiguration().setFitToWidthRatio(value/100.0);
|
||||
emit(fitToWidthRatioChanged(value / 100.0f));
|
||||
}
|
||||
|
||||
void YACReaderSliderAction::updateFitToWidthRatio(float v)
|
||||
{
|
||||
int value = v*100;
|
||||
slider->setValue(value);
|
||||
percentageLabel->setText(QString("%1 %").arg(value));
|
||||
}
|
29
YACReader/width_slider.h
Normal file
29
YACReader/width_slider.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef WIDTH_SLIDER_H
|
||||
#define WIDTH_SLIDER_H
|
||||
|
||||
#include <QWidgetAction>
|
||||
|
||||
class QLabel;
|
||||
class QSlider;
|
||||
|
||||
class YACReaderSliderAction : public QWidgetAction
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
QLabel * percentageLabel;
|
||||
QSlider * slider;
|
||||
|
||||
public:
|
||||
|
||||
YACReaderSliderAction (QWidget * parent = 0);
|
||||
|
||||
public slots:
|
||||
void updateText(int value);
|
||||
void updateFitToWidthRatio(float v);
|
||||
|
||||
|
||||
signals:
|
||||
void fitToWidthRatioChanged(float value);
|
||||
};
|
||||
|
||||
#endif
|
BIN
YACReader/yacreader_es.qm
Normal file
BIN
YACReader/yacreader_es.qm
Normal file
Binary file not shown.
929
YACReader/yacreader_es.ts
Normal file
929
YACReader/yacreader_es.ts
Normal file
@ -0,0 +1,929 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="es_ES">
|
||||
<context>
|
||||
<name>BookmarksDialog</name>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="25"/>
|
||||
<source>Lastest Page</source>
|
||||
<translation>Última página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="66"/>
|
||||
<source>Close</source>
|
||||
<translation>Cerrar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="74"/>
|
||||
<source>Click on any image to go to the bookmark</source>
|
||||
<translation>Pulsa en cualquier imagen para ir al marcador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="92"/>
|
||||
<location filename="bookmarks_dialog.cpp" line="116"/>
|
||||
<source>Loading...</source>
|
||||
<translation>Cargando...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Comic</name>
|
||||
<message>
|
||||
<source>Not found</source>
|
||||
<translation type="obsolete">No encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Comic not found</source>
|
||||
<translation type="obsolete">Cómic no encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bad PDF File</source>
|
||||
<translation type="obsolete">Archivo PDF erróneo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid PDF file</source>
|
||||
<translation type="obsolete">Archivo PDF inválido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No images found</source>
|
||||
<translation type="obsolete">No se han encontrado imágenes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>There are not images on the selected folder</source>
|
||||
<translation type="obsolete">No hay imágenes en el directorio seleccionado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File error</source>
|
||||
<translation type="obsolete">Error en archivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File not found or not images in file</source>
|
||||
<translation type="obsolete">Archivo no encontrado o no hay imágenes en él</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z not found</source>
|
||||
<translation type="obsolete">7z no encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z wasn't found in your PATH.</source>
|
||||
<translation type="obsolete">7z no se ha encontrado en el PATH.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z crashed</source>
|
||||
<translation type="obsolete">7z falló</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z crashed.</source>
|
||||
<translation type="obsolete">7z falló.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z reading</source>
|
||||
<translation type="obsolete">7z leyendo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>problem reading from 7z</source>
|
||||
<translation type="obsolete">Problema leyendo desde 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z problem</source>
|
||||
<translation type="obsolete">7z problema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown error 7z</source>
|
||||
<translation type="obsolete">Error desconocido 7z</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Comic2</name>
|
||||
<message>
|
||||
<source>7z not found</source>
|
||||
<translation type="obsolete">7z no encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z wasn't found in your PATH.</source>
|
||||
<translation type="obsolete">7z no se ha encontrado en el PATH.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z crashed</source>
|
||||
<translation type="obsolete">7z falló</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z crashed.</source>
|
||||
<translation type="obsolete">7z falló.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z reading</source>
|
||||
<translation type="obsolete">7z leyendo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>problem reading from 7z</source>
|
||||
<translation type="obsolete">Problema leyendo desde 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z problem</source>
|
||||
<translation type="obsolete">7z problema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown error 7z</source>
|
||||
<translation type="obsolete">Error desconocido 7z</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Configuration</name>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>Saving config file....</source>
|
||||
<translation>Guardando el archivo de configuración...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>There was a problem saving YACReader configuration. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation>Hubo un problema al guardar la configuración de YACReader. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>FileComic</name>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Not found</source>
|
||||
<translatorcomment>No encontrado</translatorcomment>
|
||||
<translation>No encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Comic not found</source>
|
||||
<translation>Cómic no encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File error</source>
|
||||
<translation>Error en archivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File not found or not images in file</source>
|
||||
<translation>Archivo no encontrado o no hay imágenes en él</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z not found</source>
|
||||
<translation>7z no encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z wasn't found in your PATH.</source>
|
||||
<translation>7z no se ha encontrado en el PATH.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed</source>
|
||||
<translation>7z falló</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed.</source>
|
||||
<translation>7z falló.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>7z reading</source>
|
||||
<translation>7z leyendo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>problem reading from 7z</source>
|
||||
<translation>Problema leyendo desde 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>7z problem</source>
|
||||
<translation>7z problema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>Unknown error 7z</source>
|
||||
<translation>Error desconocido 7z</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToDialog</name>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="17"/>
|
||||
<source>Page : </source>
|
||||
<translation>Página :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="25"/>
|
||||
<source>Go To</source>
|
||||
<translation>Ir a</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="27"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Cancelar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="41"/>
|
||||
<location filename="goto_dialog.cpp" line="73"/>
|
||||
<source>Total pages : </source>
|
||||
<translation>Páginas totales:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="55"/>
|
||||
<source>Go to...</source>
|
||||
<translation>Ir a...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToFlow</name>
|
||||
<message>
|
||||
<source>Page : </source>
|
||||
<translation type="obsolete">Página:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Total pages : </source>
|
||||
<translation type="obsolete">Page:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToFlowGL</name>
|
||||
<message>
|
||||
<source>Page : </source>
|
||||
<translation type="obsolete">Página :</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToFlowToolBar</name>
|
||||
<message>
|
||||
<location filename="goto_flow_toolbar.cpp" line="44"/>
|
||||
<source>Page : </source>
|
||||
<translation>Página : </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>HelpAboutDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="19"/>
|
||||
<source>About</source>
|
||||
<translation>Acerca de</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="22"/>
|
||||
<source>Help</source>
|
||||
<translation>Ayuda</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindowViewer</name>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="135"/>
|
||||
<source>&Open</source>
|
||||
<translation>&Abrir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="136"/>
|
||||
<source>O</source>
|
||||
<translation>O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="138"/>
|
||||
<source>Open a comic</source>
|
||||
<translation>Abrir cómic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="141"/>
|
||||
<source>Open Folder</source>
|
||||
<translation>Abrir carpeta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="142"/>
|
||||
<source>Ctrl+O</source>
|
||||
<translation>Ctrl+O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="144"/>
|
||||
<source>Open image folder</source>
|
||||
<oldsource>Open images in a folder</oldsource>
|
||||
<translation>Abrir carpeta de imágenes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="147"/>
|
||||
<source>Save</source>
|
||||
<translation>Guardar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="149"/>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Save current page</source>
|
||||
<translation>Guardar la página actual</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="153"/>
|
||||
<source>Previous Comic</source>
|
||||
<translation>Cómic anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="156"/>
|
||||
<source>Open previous comic</source>
|
||||
<translation>Abrir cómic anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="160"/>
|
||||
<source>Next Comic</source>
|
||||
<translation>Siguiente Cómic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="163"/>
|
||||
<source>Open next comic</source>
|
||||
<translation>Abrir siguiente cómic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="167"/>
|
||||
<source>&Previous</source>
|
||||
<translation>A&nterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="170"/>
|
||||
<source>Go to previous page</source>
|
||||
<translation>Ir a la página anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="174"/>
|
||||
<source>&Next</source>
|
||||
<translation>Siguie&nte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="177"/>
|
||||
<source>Go to next page</source>
|
||||
<translation>Ir a la página siguiente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="181"/>
|
||||
<source>Fit Width</source>
|
||||
<translation>Ajustar anchura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="182"/>
|
||||
<source>A</source>
|
||||
<translation>A</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="187"/>
|
||||
<source>Fit image to ...</source>
|
||||
<translation>Ajustar imagen a...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="191"/>
|
||||
<source>Rotate image to the left</source>
|
||||
<translation>Rotar imagen a la izquierda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="192"/>
|
||||
<source>L</source>
|
||||
<translation>L</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="197"/>
|
||||
<source>Rotate image to the right</source>
|
||||
<translation>Rotar imagen a la derecha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="198"/>
|
||||
<source>R</source>
|
||||
<translation>R</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="203"/>
|
||||
<source>Double page mode</source>
|
||||
<translation>Modo a doble página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="204"/>
|
||||
<source>Switch to double page mode</source>
|
||||
<translation>Cambiar a modo de doble página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="205"/>
|
||||
<source>D</source>
|
||||
<translation>D</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="212"/>
|
||||
<source>Go To</source>
|
||||
<translation>Ir a</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="213"/>
|
||||
<source>G</source>
|
||||
<translation>G</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="216"/>
|
||||
<source>Go to page ...</source>
|
||||
<translation>Ir a página...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="219"/>
|
||||
<source>Options</source>
|
||||
<translation>Opciones</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="220"/>
|
||||
<source>C</source>
|
||||
<translation>C</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="221"/>
|
||||
<source>YACReader options</source>
|
||||
<translation>Opciones de YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="226"/>
|
||||
<source>Help</source>
|
||||
<translation>Ayuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="227"/>
|
||||
<source>Help, About YACReader</source>
|
||||
<translation>Ayuda, Sobre YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="232"/>
|
||||
<source>Magnifying glass</source>
|
||||
<translation>Lupa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="233"/>
|
||||
<source>Switch Magnifying glass</source>
|
||||
<translation>Lupa On/Off</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="234"/>
|
||||
<source>Z</source>
|
||||
<translation>Z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="240"/>
|
||||
<source>Set bookmark</source>
|
||||
<translation>Añadir marcador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="241"/>
|
||||
<source>Set a bookmark on the current page</source>
|
||||
<translation>Añadir un marcador en la página actual</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="250"/>
|
||||
<source>Show bookmarks</source>
|
||||
<translation>Mostrar marcadores</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="251"/>
|
||||
<source>Show the bookmarks of the current comic</source>
|
||||
<translation>Mostrar los marcadores del cómic actual</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="252"/>
|
||||
<source>M</source>
|
||||
<translation>M</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="257"/>
|
||||
<source>Show keyboard shortcuts</source>
|
||||
<translation>Mostrar atajos de teclado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="261"/>
|
||||
<source>Show Info</source>
|
||||
<translation>Mostrar información</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="262"/>
|
||||
<source>I</source>
|
||||
<translation>I</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="267"/>
|
||||
<source>Close</source>
|
||||
<translation>Cerrar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="272"/>
|
||||
<source>Show Dictionary</source>
|
||||
<translation>Mostrar diccionario</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="279"/>
|
||||
<source>Always on top</source>
|
||||
<translation>Siempre visible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="287"/>
|
||||
<source>Show full size</source>
|
||||
<translation>Mostrar a tamaño original</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="298"/>
|
||||
<source>&File</source>
|
||||
<translation>&Archivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Open Comic</source>
|
||||
<translation>Abrir cómic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Comic files</source>
|
||||
<translation>Archivos de cómic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Comic files (*.cbr *.cbz *.rar *.zip *.pdf *.tar *.arj)</source>
|
||||
<translation type="obsolete">Archivos de cómic (*.cbr *.cbz *.rar *.zip *pdf *.tar *.arj)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Comic files (*.cbr *.cbz *.rar *.zip *.tar *.arj)</source>
|
||||
<translation type="obsolete">Archivos de cómic (*.cbr *.cbz *.rar *.zip *.tar *.arj)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="459"/>
|
||||
<source>Open folder</source>
|
||||
<translation>Abrir carpeta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Image files (*.jpg)</source>
|
||||
<translation>Archivos de imagen (*.jpg)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="627"/>
|
||||
<source>There is a new version avaliable</source>
|
||||
<translation>Hay una nueva versión disponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="628"/>
|
||||
<source>Do you want to download the new version?</source>
|
||||
<translation>¿Desea descargar la nueva versión?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>Saving error log file....</source>
|
||||
<translation>Guardando el archivo de log...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation>Hubo un problema al guardar el archivo de log de YACReader. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionsDialog</name>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="35"/>
|
||||
<source>"Go to flow" size</source>
|
||||
<translation>Tamaño de "Go to flow"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="46"/>
|
||||
<source>My comics path</source>
|
||||
<translation>Ruta a mis cómics</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation type="obsolete">Guardar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cancel</source>
|
||||
<translation type="obsolete">Cancelar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>How to show pages in GoToFlow:</source>
|
||||
<translation type="obsolete">¿Cómo deseas que se muestren las páginas en "Go To Flow":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="56"/>
|
||||
<source>Page width stretch</source>
|
||||
<translation>Ajuste en anchura de la página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="77"/>
|
||||
<source>Background color</source>
|
||||
<translation>Color de fondo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="80"/>
|
||||
<source>Choose</source>
|
||||
<translation>Elegir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="108"/>
|
||||
<source>Restart is needed</source>
|
||||
<translation>Es necesario reiniciar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="121"/>
|
||||
<source>Brightness</source>
|
||||
<translation>Brillo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="122"/>
|
||||
<source>Contrast</source>
|
||||
<translation>Contraste</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="123"/>
|
||||
<source>Gamma</source>
|
||||
<translation>Gamma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="127"/>
|
||||
<source>Reset</source>
|
||||
<translation>Reset</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="133"/>
|
||||
<source>Image options</source>
|
||||
<translation>Opciones de imagen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="143"/>
|
||||
<source>General</source>
|
||||
<translation>General</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="144"/>
|
||||
<source>Page Flow</source>
|
||||
<translation>Page Flow</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="145"/>
|
||||
<source>Image adjustment</source>
|
||||
<translation>Ajustes de imagen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="158"/>
|
||||
<source>Options</source>
|
||||
<translation>Opciones</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="165"/>
|
||||
<source>Comics directory</source>
|
||||
<translation>Directorio de cómics</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QPushButton</name>
|
||||
<message>
|
||||
<source>Hello world!</source>
|
||||
<translation type="obsolete">Hola mundo!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutsDialog</name>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="16"/>
|
||||
<source>YACReader keyboard shortcuts</source>
|
||||
<translation>Atajos de teclado de YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="20"/>
|
||||
<source>Close</source>
|
||||
<translation>Cerrar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="66"/>
|
||||
<source>Keyboard Shortcuts</source>
|
||||
<translation>Atajos de teclado</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Viewer</name>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="43"/>
|
||||
<location filename="viewer.cpp" line="634"/>
|
||||
<source>Press 'O' to open comic.</source>
|
||||
<translation>Pulsa 'O' para abrir un fichero.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Not found</source>
|
||||
<translation>No encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Comic not found</source>
|
||||
<translation>Cómic no encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="773"/>
|
||||
<source>Cover!</source>
|
||||
<translation>¡Portada!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="780"/>
|
||||
<source>Last page!</source>
|
||||
<translation>¡Última página!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Info</source>
|
||||
<translation type="obsolete">Mostrar información</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>I</source>
|
||||
<translation type="obsolete">I</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="647"/>
|
||||
<source>Loading...please wait!</source>
|
||||
<translation>Cargando...espere, por favor!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="29"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation>Click para sobreescribir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="11"/>
|
||||
<source>Restore to default</source>
|
||||
<translation>Restaurar valor por defecto</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldPlainTextEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="20"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="45"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="51"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation>Click para sobreescribir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="10"/>
|
||||
<source>Restore to default</source>
|
||||
<translation>Restaurar valor por defecto</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="13"/>
|
||||
<source>How to show covers:</source>
|
||||
<translation>Cómo mostrar las portadas:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="15"/>
|
||||
<source>CoverFlow look</source>
|
||||
<translation>Tipo CoverFlow</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="16"/>
|
||||
<source>Stripe look</source>
|
||||
<translation>Tipo tira</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="17"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation>Tipo tira solapada</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderGLFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="19"/>
|
||||
<source>Presets:</source>
|
||||
<translation>Predefinidos:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="21"/>
|
||||
<source>Classic look</source>
|
||||
<translation>Tipo clásico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="24"/>
|
||||
<source>Stripe look</source>
|
||||
<translation>Tipo tira</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="27"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation>Tipo tira solapada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="30"/>
|
||||
<source>Modern look</source>
|
||||
<translation>Tipo moderno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="33"/>
|
||||
<source>Roulette look</source>
|
||||
<translation>Tipo ruleta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="77"/>
|
||||
<source>Show advanced settings</source>
|
||||
<translation>Opciones avanzadas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="86"/>
|
||||
<source>Custom:</source>
|
||||
<translation>Personalizado:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="89"/>
|
||||
<source>View angle</source>
|
||||
<translation>Ángulo de vista</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="95"/>
|
||||
<source>Position</source>
|
||||
<translation>Posición</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="101"/>
|
||||
<source>Cover gap</source>
|
||||
<translation>Hueco entre portadas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="107"/>
|
||||
<source>Central gap</source>
|
||||
<translation>Hueco central</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="113"/>
|
||||
<source>Zoom</source>
|
||||
<translation>Zoom</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="119"/>
|
||||
<source>Y offset</source>
|
||||
<translation>Desplazamiento en Y</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="125"/>
|
||||
<source>Z offset</source>
|
||||
<translation>Desplazamiento en Z </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="131"/>
|
||||
<source>Cover Angle</source>
|
||||
<translation>Ángulo de las portadas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="137"/>
|
||||
<source>Visibility</source>
|
||||
<translation>Visibilidad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="143"/>
|
||||
<source>Light</source>
|
||||
<translation>Luz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="149"/>
|
||||
<source>Max angle</source>
|
||||
<translation>Ángulo máximo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="181"/>
|
||||
<source>Low Performance</source>
|
||||
<translation>Rendimiento bajo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="183"/>
|
||||
<source>High Performance</source>
|
||||
<translation>Alto rendimiento</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="194"/>
|
||||
<source>Use VSync (improve the image quality in fullscreen mode, worse performance)</source>
|
||||
<translation>Utilizar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="202"/>
|
||||
<source>Performance:</source>
|
||||
<translation>Rendimiento:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderOptionsDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="21"/>
|
||||
<source>Save</source>
|
||||
<translation>Guardar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="22"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Cancelar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="30"/>
|
||||
<source>Use hardware acceleration (restart needed)</source>
|
||||
<translation>Utilizar aceleración por hardware (necesario reiniciar)</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
772
YACReader/yacreader_fr.ts
Normal file
772
YACReader/yacreader_fr.ts
Normal file
@ -0,0 +1,772 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="fr_FR">
|
||||
<context>
|
||||
<name>BookmarksDialog</name>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="25"/>
|
||||
<source>Lastest Page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="66"/>
|
||||
<source>Close</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="74"/>
|
||||
<source>Click on any image to go to the bookmark</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="92"/>
|
||||
<location filename="bookmarks_dialog.cpp" line="116"/>
|
||||
<source>Loading...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Configuration</name>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>Saving config file....</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>There was a problem saving YACReader configuration. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>FileComic</name>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Comic not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File not found or not images in file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z wasn't found in your PATH.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>7z reading</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>problem reading from 7z</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>7z problem</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>Unknown error 7z</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToDialog</name>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="17"/>
|
||||
<source>Page : </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="25"/>
|
||||
<source>Go To</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="27"/>
|
||||
<source>Cancel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="41"/>
|
||||
<location filename="goto_dialog.cpp" line="73"/>
|
||||
<source>Total pages : </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="55"/>
|
||||
<source>Go to...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToFlowToolBar</name>
|
||||
<message>
|
||||
<location filename="goto_flow_toolbar.cpp" line="44"/>
|
||||
<source>Page : </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>HelpAboutDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="19"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="22"/>
|
||||
<source>Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindowViewer</name>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="135"/>
|
||||
<source>&Open</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="136"/>
|
||||
<source>O</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="138"/>
|
||||
<source>Open a comic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="141"/>
|
||||
<source>Open Folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="142"/>
|
||||
<source>Ctrl+O</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="144"/>
|
||||
<source>Open image folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="147"/>
|
||||
<source>Save</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="149"/>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Save current page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="153"/>
|
||||
<source>Previous Comic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="156"/>
|
||||
<source>Open previous comic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="160"/>
|
||||
<source>Next Comic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="163"/>
|
||||
<source>Open next comic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="167"/>
|
||||
<source>&Previous</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="170"/>
|
||||
<source>Go to previous page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="174"/>
|
||||
<source>&Next</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="177"/>
|
||||
<source>Go to next page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="181"/>
|
||||
<source>Fit Width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="182"/>
|
||||
<source>A</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="187"/>
|
||||
<source>Fit image to ...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="191"/>
|
||||
<source>Rotate image to the left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="192"/>
|
||||
<source>L</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="197"/>
|
||||
<source>Rotate image to the right</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="198"/>
|
||||
<source>R</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="203"/>
|
||||
<source>Double page mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="204"/>
|
||||
<source>Switch to double page mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="205"/>
|
||||
<source>D</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="212"/>
|
||||
<source>Go To</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="213"/>
|
||||
<source>G</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="216"/>
|
||||
<source>Go to page ...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="219"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="220"/>
|
||||
<source>C</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="221"/>
|
||||
<source>YACReader options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="226"/>
|
||||
<source>Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="227"/>
|
||||
<source>Help, About YACReader</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="232"/>
|
||||
<source>Magnifying glass</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="233"/>
|
||||
<source>Switch Magnifying glass</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="234"/>
|
||||
<source>Z</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="240"/>
|
||||
<source>Set bookmark</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="241"/>
|
||||
<source>Set a bookmark on the current page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="250"/>
|
||||
<source>Show bookmarks</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="251"/>
|
||||
<source>Show the bookmarks of the current comic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="252"/>
|
||||
<source>M</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="257"/>
|
||||
<source>Show keyboard shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="261"/>
|
||||
<source>Show Info</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="262"/>
|
||||
<source>I</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="267"/>
|
||||
<source>Close</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="272"/>
|
||||
<source>Show Dictionary</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="279"/>
|
||||
<source>Always on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="287"/>
|
||||
<source>Show full size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="298"/>
|
||||
<source>&File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Open Comic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Comic files</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="459"/>
|
||||
<source>Open folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Image files (*.jpg)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="627"/>
|
||||
<source>There is a new version avaliable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="628"/>
|
||||
<source>Do you want to download the new version?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>Saving error log file....</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionsDialog</name>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="35"/>
|
||||
<source>"Go to flow" size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="46"/>
|
||||
<source>My comics path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="56"/>
|
||||
<source>Page width stretch</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="77"/>
|
||||
<source>Background color</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="80"/>
|
||||
<source>Choose</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="108"/>
|
||||
<source>Restart is needed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="121"/>
|
||||
<source>Brightness</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="122"/>
|
||||
<source>Contrast</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="123"/>
|
||||
<source>Gamma</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="127"/>
|
||||
<source>Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="133"/>
|
||||
<source>Image options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="143"/>
|
||||
<source>General</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="144"/>
|
||||
<source>Page Flow</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="145"/>
|
||||
<source>Image adjustment</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="158"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="165"/>
|
||||
<source>Comics directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutsDialog</name>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="16"/>
|
||||
<source>YACReader keyboard shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="20"/>
|
||||
<source>Close</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="66"/>
|
||||
<source>Keyboard Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Viewer</name>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="43"/>
|
||||
<location filename="viewer.cpp" line="634"/>
|
||||
<source>Press 'O' to open comic.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Comic not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="647"/>
|
||||
<source>Loading...please wait!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="773"/>
|
||||
<source>Cover!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="780"/>
|
||||
<source>Last page!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="29"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="11"/>
|
||||
<source>Restore to default</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldPlainTextEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="20"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="45"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="51"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="10"/>
|
||||
<source>Restore to default</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="13"/>
|
||||
<source>How to show covers:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="15"/>
|
||||
<source>CoverFlow look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="16"/>
|
||||
<source>Stripe look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="17"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderGLFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="19"/>
|
||||
<source>Presets:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="21"/>
|
||||
<source>Classic look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="24"/>
|
||||
<source>Stripe look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="27"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="30"/>
|
||||
<source>Modern look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="33"/>
|
||||
<source>Roulette look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="77"/>
|
||||
<source>Show advanced settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="86"/>
|
||||
<source>Custom:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="89"/>
|
||||
<source>View angle</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="95"/>
|
||||
<source>Position</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="101"/>
|
||||
<source>Cover gap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="107"/>
|
||||
<source>Central gap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="113"/>
|
||||
<source>Zoom</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="119"/>
|
||||
<source>Y offset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="125"/>
|
||||
<source>Z offset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="131"/>
|
||||
<source>Cover Angle</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="137"/>
|
||||
<source>Visibility</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="143"/>
|
||||
<source>Light</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="149"/>
|
||||
<source>Max angle</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="181"/>
|
||||
<source>Low Performance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="183"/>
|
||||
<source>High Performance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="194"/>
|
||||
<source>Use VSync (improve the image quality in fullscreen mode, worse performance)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="202"/>
|
||||
<source>Performance:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderOptionsDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="21"/>
|
||||
<source>Save</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="22"/>
|
||||
<source>Cancel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="30"/>
|
||||
<source>Use hardware acceleration (restart needed)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
30
YACReader/yacreader_local_client.cpp
Normal file
30
YACReader/yacreader_local_client.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
#include "yacreader_local_client.h"
|
||||
#include "comic_db.h"
|
||||
|
||||
#include <QLocalSocket>
|
||||
|
||||
YACReaderLocalClient::YACReaderLocalClient(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
localSocket = new QLocalSocket(this);
|
||||
|
||||
connect(localSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
|
||||
/*connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)),
|
||||
this, SLOT(displayError(QLocalSocket::LocalSocketError)));*/
|
||||
}
|
||||
|
||||
//información de comic recibida...
|
||||
void YACReaderLocalClient::readMessage()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void YACReaderLocalClient::requestComicInfo(QString library, ComicDB & comic)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void YACReaderLocalClient::sendComicInfo(QString library, ComicDB & comic)
|
||||
{
|
||||
|
||||
}
|
27
YACReader/yacreader_local_client.h
Normal file
27
YACReader/yacreader_local_client.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef YACREADER_LOCAL_CLIENT_H
|
||||
#define YACREADER_LOCAL_CLIENT_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class QLocalSocket;
|
||||
class ComicDB;
|
||||
|
||||
class YACReaderLocalClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit YACReaderLocalClient(QObject *parent = 0);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
void readMessage();
|
||||
void requestComicInfo(QString library, ComicDB & comic);
|
||||
void sendComicInfo(QString library, ComicDB & comic);
|
||||
|
||||
private:
|
||||
QLocalSocket * localSocket;
|
||||
|
||||
};
|
||||
|
||||
#endif // YACREADER_LOCAL_CLIENT_H
|
862
YACReader/yacreader_pt.ts
Normal file
862
YACReader/yacreader_pt.ts
Normal file
@ -0,0 +1,862 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="pt_BR">
|
||||
<context>
|
||||
<name>BookmarksDialog</name>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="25"/>
|
||||
<source>Lastest Page</source>
|
||||
<translation>Última Página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="66"/>
|
||||
<source>Close</source>
|
||||
<translation>Fechar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="74"/>
|
||||
<source>Click on any image to go to the bookmark</source>
|
||||
<translation>Clique em qualquer imagem para ir para o marcador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="92"/>
|
||||
<location filename="bookmarks_dialog.cpp" line="116"/>
|
||||
<source>Loading...</source>
|
||||
<translation>Carregando...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Comic</name>
|
||||
<message>
|
||||
<source>No images found</source>
|
||||
<translation type="obsolete">Nenhuma imagem encontrada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>There are not images on the selected folder</source>
|
||||
<translation type="obsolete">Não há imagens na pasta selecionada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File error</source>
|
||||
<translation type="obsolete">Erro no arquivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File not found or not images in file</source>
|
||||
<translation type="obsolete">Arquivo não encontrado ou nenhuma imagem no arquivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z not found</source>
|
||||
<translation type="obsolete">7z não encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z wasn't found in your PATH.</source>
|
||||
<translation type="obsolete">7z não foi encontrado no seu sistema (PATH).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z crashed</source>
|
||||
<translation type="obsolete">7z fechou inesperadamente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z crashed.</source>
|
||||
<translation type="obsolete">7z fechou inesperadamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z reading</source>
|
||||
<translation type="obsolete">Lendo 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>problem reading from 7z</source>
|
||||
<translation type="obsolete">Problema na leitura do 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>7z problem</source>
|
||||
<translation type="obsolete">Problema no 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown error 7z</source>
|
||||
<translation type="obsolete">Erro desconhecido no 7z</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Configuration</name>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>Saving config file....</source>
|
||||
<translation>Salvando arquivo de configuração...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>There was a problem saving YACReader configuration. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation>Houve um problema ao salvar a configuração do YACReader. Por favor, verifique se você tem permissões suficientes na pasta raiz do YACReader.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>FileComic</name>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Comic not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File error</source>
|
||||
<translation>Erro no arquivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File not found or not images in file</source>
|
||||
<translation>Arquivo não encontrado ou nenhuma imagem no arquivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z not found</source>
|
||||
<translation>7z não encontrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z wasn't found in your PATH.</source>
|
||||
<translation>7z não foi encontrado no seu sistema (PATH).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed</source>
|
||||
<translation>7z fechou inesperadamente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed.</source>
|
||||
<translation>7z fechou inesperadamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>7z reading</source>
|
||||
<translation>Lendo 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>problem reading from 7z</source>
|
||||
<translation>Problema na leitura do 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>7z problem</source>
|
||||
<translation>Problema no 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>Unknown error 7z</source>
|
||||
<translation>Erro desconhecido no 7z</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToDialog</name>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="17"/>
|
||||
<source>Page : </source>
|
||||
<translation>Página : </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="25"/>
|
||||
<source>Go To</source>
|
||||
<translation>Ir Para</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="27"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Cancelar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="41"/>
|
||||
<location filename="goto_dialog.cpp" line="73"/>
|
||||
<source>Total pages : </source>
|
||||
<translation>Total de páginas : </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="55"/>
|
||||
<source>Go to...</source>
|
||||
<translation>Ir para...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToFlow</name>
|
||||
<message>
|
||||
<source>Page : </source>
|
||||
<translation type="obsolete">Página : </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToFlowToolBar</name>
|
||||
<message>
|
||||
<location filename="goto_flow_toolbar.cpp" line="44"/>
|
||||
<source>Page : </source>
|
||||
<translation>Página : </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>HelpAboutDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="19"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="22"/>
|
||||
<source>Help</source>
|
||||
<translation>Ajuda</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindowViewer</name>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="135"/>
|
||||
<source>&Open</source>
|
||||
<translation>&Abrir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="136"/>
|
||||
<source>O</source>
|
||||
<translation>O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="138"/>
|
||||
<source>Open a comic</source>
|
||||
<translation>Abrir um quadrinho</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="141"/>
|
||||
<source>Open Folder</source>
|
||||
<translation>Abrir Pasta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="142"/>
|
||||
<source>Ctrl+O</source>
|
||||
<translation>Ctrl+O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open images in a folder</source>
|
||||
<translation type="obsolete">Abrir imagens em uma pasta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="144"/>
|
||||
<source>Open image folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="147"/>
|
||||
<source>Save</source>
|
||||
<translation>Salvar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="149"/>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Save current page</source>
|
||||
<translation>Salvar página atual</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="153"/>
|
||||
<source>Previous Comic</source>
|
||||
<translation>Quadrinho Anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="156"/>
|
||||
<source>Open previous comic</source>
|
||||
<translation>Abrir quadrinho anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="160"/>
|
||||
<source>Next Comic</source>
|
||||
<translation>Próximo Quadrinho</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="163"/>
|
||||
<source>Open next comic</source>
|
||||
<translation>Abrir próximo quadrinho</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="167"/>
|
||||
<source>&Previous</source>
|
||||
<translation>A&nterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="170"/>
|
||||
<source>Go to previous page</source>
|
||||
<translation>Ir para a página anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="174"/>
|
||||
<source>&Next</source>
|
||||
<translation>&Próxima</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="177"/>
|
||||
<source>Go to next page</source>
|
||||
<translation>Ir para a próxima página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="181"/>
|
||||
<source>Fit Width</source>
|
||||
<translation>Ajustar à Largura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="182"/>
|
||||
<source>A</source>
|
||||
<translation>A</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="187"/>
|
||||
<source>Fit image to ...</source>
|
||||
<translation>Ajustar imagem à...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="191"/>
|
||||
<source>Rotate image to the left</source>
|
||||
<translation>Girar imagem à esquerda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="192"/>
|
||||
<source>L</source>
|
||||
<translation>L</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="197"/>
|
||||
<source>Rotate image to the right</source>
|
||||
<translation>Girar imagem à direita</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="198"/>
|
||||
<source>R</source>
|
||||
<translation>R</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="203"/>
|
||||
<source>Double page mode</source>
|
||||
<translation>Modo dupla página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="204"/>
|
||||
<source>Switch to double page mode</source>
|
||||
<translation>Alternar para o modo dupla página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="205"/>
|
||||
<source>D</source>
|
||||
<translation>D</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="212"/>
|
||||
<source>Go To</source>
|
||||
<translation>Ir Para</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="213"/>
|
||||
<source>G</source>
|
||||
<translation>G</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="216"/>
|
||||
<source>Go to page ...</source>
|
||||
<translation>Ir para a página...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="219"/>
|
||||
<source>Options</source>
|
||||
<translation>Opções</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="220"/>
|
||||
<source>C</source>
|
||||
<translation>C</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="221"/>
|
||||
<source>YACReader options</source>
|
||||
<translation>Opções do YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="226"/>
|
||||
<source>Help</source>
|
||||
<translation>Ajuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="227"/>
|
||||
<source>Help, About YACReader</source>
|
||||
<translation>Ajuda, Sobre o YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="232"/>
|
||||
<source>Magnifying glass</source>
|
||||
<translation>Lupa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="233"/>
|
||||
<source>Switch Magnifying glass</source>
|
||||
<translation>Alternar Lupa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="234"/>
|
||||
<source>Z</source>
|
||||
<translation>Z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="240"/>
|
||||
<source>Set bookmark</source>
|
||||
<translation>Definir marcador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="241"/>
|
||||
<source>Set a bookmark on the current page</source>
|
||||
<translation>Definir um marcador na página atual</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="250"/>
|
||||
<source>Show bookmarks</source>
|
||||
<translation>Mostrar marcadores</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="251"/>
|
||||
<source>Show the bookmarks of the current comic</source>
|
||||
<translation>Mostrar os marcadores do quadrinho atual</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="252"/>
|
||||
<source>M</source>
|
||||
<translation>M</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="257"/>
|
||||
<source>Show keyboard shortcuts</source>
|
||||
<translation>Mostrar teclas de atalhos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="261"/>
|
||||
<source>Show Info</source>
|
||||
<translation>Mostrar Informações</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="262"/>
|
||||
<source>I</source>
|
||||
<translation>I</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="267"/>
|
||||
<source>Close</source>
|
||||
<translation>Fechar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="272"/>
|
||||
<source>Show Dictionary</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="279"/>
|
||||
<source>Always on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="287"/>
|
||||
<source>Show full size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="298"/>
|
||||
<source>&File</source>
|
||||
<translation>&Arquivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Open Comic</source>
|
||||
<translation>Abrir Quadrinho</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Comic files</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Comic files (*.cbr *.cbz *.rar *.zip *.tar *.arj)</source>
|
||||
<translation type="obsolete">Arquivos de quadrinho (*.cbr *.cbz *.rar *.zip *.tar *.arj)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="459"/>
|
||||
<source>Open folder</source>
|
||||
<translation>Abrir pasta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Image files (*.jpg)</source>
|
||||
<translation>Arquivos de imagem (*.jpg)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="627"/>
|
||||
<source>There is a new version avaliable</source>
|
||||
<translation>Há uma nova versão disponível</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="628"/>
|
||||
<source>Do you want to download the new version?</source>
|
||||
<translation>Você deseja baixar a nova versão?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>Saving error log file....</source>
|
||||
<translation>Salvando arquivo de registro de erro....</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation>Houve um problema ao salvar o arquivo de registro de erro do YACReader. Por favor, verifique se você tem permissões suficientes na pasta raiz YACReader.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionsDialog</name>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="35"/>
|
||||
<source>"Go to flow" size</source>
|
||||
<translation>Tamanho do "Ir para cheia"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="46"/>
|
||||
<source>My comics path</source>
|
||||
<translation>Meu caminho de quadrinhos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation type="obsolete">Salvar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cancel</source>
|
||||
<translation type="obsolete">Cancelar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>How to show pages in GoToFlow:</source>
|
||||
<translation type="obsolete">Como mostrar páginas em IrParaCheia:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>CoverFlow look</source>
|
||||
<translation type="obsolete">Olhar capa cheia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stripe look</source>
|
||||
<translation type="obsolete">Olhar lista</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation type="obsolete">Olhar lista sobreposta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="56"/>
|
||||
<source>Page width stretch</source>
|
||||
<translation>Trecho da largura da página</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="77"/>
|
||||
<source>Background color</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="80"/>
|
||||
<source>Choose</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="108"/>
|
||||
<source>Restart is needed</source>
|
||||
<translation>Reiniciar é necessário</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="121"/>
|
||||
<source>Brightness</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="122"/>
|
||||
<source>Contrast</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="123"/>
|
||||
<source>Gamma</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="127"/>
|
||||
<source>Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="133"/>
|
||||
<source>Image options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="143"/>
|
||||
<source>General</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="144"/>
|
||||
<source>Page Flow</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="145"/>
|
||||
<source>Image adjustment</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="158"/>
|
||||
<source>Options</source>
|
||||
<translation>Opções</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="165"/>
|
||||
<source>Comics directory</source>
|
||||
<translation>Diretório de quadrinhos</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutsDialog</name>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="16"/>
|
||||
<source>YACReader keyboard shortcuts</source>
|
||||
<translation>Teclas de atalhos do YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="20"/>
|
||||
<source>Close</source>
|
||||
<translation>Fechar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="66"/>
|
||||
<source>Keyboard Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Viewer</name>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="43"/>
|
||||
<location filename="viewer.cpp" line="634"/>
|
||||
<source>Press 'O' to open comic.</source>
|
||||
<translation>Pressione 'O' para abrir um quadrinho.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Comic not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="647"/>
|
||||
<source>Loading...please wait!</source>
|
||||
<translation>Carregando... por favor, aguarde!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="773"/>
|
||||
<source>Cover!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="780"/>
|
||||
<source>Last page!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="29"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="11"/>
|
||||
<source>Restore to default</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldPlainTextEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="20"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="45"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="51"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="10"/>
|
||||
<source>Restore to default</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="13"/>
|
||||
<source>How to show covers:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="15"/>
|
||||
<source>CoverFlow look</source>
|
||||
<translation>Olhar capa cheia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="16"/>
|
||||
<source>Stripe look</source>
|
||||
<translation>Olhar lista</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="17"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation>Olhar lista sobreposta</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderGLFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="19"/>
|
||||
<source>Presets:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="21"/>
|
||||
<source>Classic look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="24"/>
|
||||
<source>Stripe look</source>
|
||||
<translation>Olhar lista</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="27"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation>Olhar lista sobreposta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="30"/>
|
||||
<source>Modern look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="33"/>
|
||||
<source>Roulette look</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="77"/>
|
||||
<source>Show advanced settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="86"/>
|
||||
<source>Custom:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="89"/>
|
||||
<source>View angle</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="95"/>
|
||||
<source>Position</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="101"/>
|
||||
<source>Cover gap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="107"/>
|
||||
<source>Central gap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="113"/>
|
||||
<source>Zoom</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="119"/>
|
||||
<source>Y offset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="125"/>
|
||||
<source>Z offset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="131"/>
|
||||
<source>Cover Angle</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="137"/>
|
||||
<source>Visibility</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="143"/>
|
||||
<source>Light</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="149"/>
|
||||
<source>Max angle</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="181"/>
|
||||
<source>Low Performance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="183"/>
|
||||
<source>High Performance</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="194"/>
|
||||
<source>Use VSync (improve the image quality in fullscreen mode, worse performance)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="202"/>
|
||||
<source>Performance:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderOptionsDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="21"/>
|
||||
<source>Save</source>
|
||||
<translation>Salvar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="22"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Cancelar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="30"/>
|
||||
<source>Use hardware acceleration (restart needed)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
772
YACReader/yacreader_ru.ts
Normal file
772
YACReader/yacreader_ru.ts
Normal file
@ -0,0 +1,772 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.0" language="ru_RU" sourcelanguage="ru">
|
||||
<context>
|
||||
<name>BookmarksDialog</name>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="25"/>
|
||||
<source>Lastest Page</source>
|
||||
<translation>Последняя Страница</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="66"/>
|
||||
<source>Close</source>
|
||||
<translation>Закрыть</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="74"/>
|
||||
<source>Click on any image to go to the bookmark</source>
|
||||
<translation>Нажмите на любое изображение, чтобы перейти к закладке</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="bookmarks_dialog.cpp" line="92"/>
|
||||
<location filename="bookmarks_dialog.cpp" line="116"/>
|
||||
<source>Loading...</source>
|
||||
<translation>Загрузка...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Configuration</name>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>Saving config file....</source>
|
||||
<translation>Сохраняется конфигурация...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="configuration.cpp" line="167"/>
|
||||
<source>There was a problem saving YACReader configuration. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation>Возникла проблема с сохранением конфигурации YACReader. Пожалуйста, проверьте есть ли у вас права доступа к корневой папке YACReader.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>FileComic</name>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Not found</source>
|
||||
<translation>Не найдено</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="216"/>
|
||||
<source>Comic not found</source>
|
||||
<translation>Комикс не найден</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File error</source>
|
||||
<translation>Ощибка файла</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="243"/>
|
||||
<source>File not found or not images in file</source>
|
||||
<translation>Не найден файл или изображения </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z not found</source>
|
||||
<translation>7z не найден</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="297"/>
|
||||
<source>7z wasn't found in your PATH.</source>
|
||||
<translation>7z не был найден в указанном пути.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed</source>
|
||||
<translation>7z повреждён</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="300"/>
|
||||
<source>7z crashed.</source>
|
||||
<translation>7z повреждён.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>7z reading</source>
|
||||
<translation>7z просматривается</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="303"/>
|
||||
<source>problem reading from 7z</source>
|
||||
<translation>Проблема просмотра с 7z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>7z problem</source>
|
||||
<translation>7z проблема</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="comic.cpp" line="306"/>
|
||||
<source>Unknown error 7z</source>
|
||||
<translation>Неизестная ошибка 7z</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToDialog</name>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="17"/>
|
||||
<source>Page : </source>
|
||||
<translation>Страница:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="25"/>
|
||||
<source>Go To</source>
|
||||
<translation>Перейти к</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="27"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Отмена</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="41"/>
|
||||
<location filename="goto_dialog.cpp" line="73"/>
|
||||
<source>Total pages : </source>
|
||||
<translation>Общее количеств страниц:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="goto_dialog.cpp" line="55"/>
|
||||
<source>Go to...</source>
|
||||
<translation>Перейти к...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GoToFlowToolBar</name>
|
||||
<message>
|
||||
<location filename="goto_flow_toolbar.cpp" line="44"/>
|
||||
<source>Page : </source>
|
||||
<translation>Страница:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>HelpAboutDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="19"/>
|
||||
<source>About</source>
|
||||
<translation>О программе</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/help_about_dialog.cpp" line="22"/>
|
||||
<source>Help</source>
|
||||
<translation>Справка</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindowViewer</name>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="135"/>
|
||||
<source>&Open</source>
|
||||
<translation>&Открыть</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="136"/>
|
||||
<source>O</source>
|
||||
<translation>О</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="138"/>
|
||||
<source>Open a comic</source>
|
||||
<translation>Открыть комикс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="141"/>
|
||||
<source>Open Folder</source>
|
||||
<translation>Открыть папку</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="142"/>
|
||||
<source>Ctrl+O</source>
|
||||
<translation>Ctrl+О</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="144"/>
|
||||
<source>Open image folder</source>
|
||||
<translation>Открыть папку с изображениями</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="147"/>
|
||||
<source>Save</source>
|
||||
<translation>Сохранить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="149"/>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Save current page</source>
|
||||
<translation>Сохранить нынешнюю страницу</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="153"/>
|
||||
<source>Previous Comic</source>
|
||||
<translation>Предыдущий комикс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="156"/>
|
||||
<source>Open previous comic</source>
|
||||
<translation>Открыть предыдуший комикс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="160"/>
|
||||
<source>Next Comic</source>
|
||||
<translation>Следующий комикс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="163"/>
|
||||
<source>Open next comic</source>
|
||||
<translation>Открыть следующий комикс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="167"/>
|
||||
<source>&Previous</source>
|
||||
<translation>&Предыдущий</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="170"/>
|
||||
<source>Go to previous page</source>
|
||||
<translation>Перейти к предыдущей странице</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="174"/>
|
||||
<source>&Next</source>
|
||||
<translation>&Следующий</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="177"/>
|
||||
<source>Go to next page</source>
|
||||
<translation>Перейти к следующей странице</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="181"/>
|
||||
<source>Fit Width</source>
|
||||
<translation>Подогнать ширину</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="182"/>
|
||||
<source>A</source>
|
||||
<translation>А</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="187"/>
|
||||
<source>Fit image to ...</source>
|
||||
<translation>Подогнать изображение для ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="191"/>
|
||||
<source>Rotate image to the left</source>
|
||||
<translation>Повернуть изображение против часовой стрелки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="192"/>
|
||||
<source>L</source>
|
||||
<translation>L</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="197"/>
|
||||
<source>Rotate image to the right</source>
|
||||
<translation>Повернуть изображение по часовой стрелке</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="198"/>
|
||||
<source>R</source>
|
||||
<translation>R</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="203"/>
|
||||
<source>Double page mode</source>
|
||||
<translation>Двойной режим страницы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="204"/>
|
||||
<source>Switch to double page mode</source>
|
||||
<translation>Переключить на двойной режим страницы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="205"/>
|
||||
<source>D</source>
|
||||
<translation>D</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="212"/>
|
||||
<source>Go To</source>
|
||||
<translation>Перейти к</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="213"/>
|
||||
<source>G</source>
|
||||
<translation>G</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="216"/>
|
||||
<source>Go to page ...</source>
|
||||
<translation>Перейти к странице ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="219"/>
|
||||
<source>Options</source>
|
||||
<translation>Настройки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="220"/>
|
||||
<source>C</source>
|
||||
<translation>С</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="221"/>
|
||||
<source>YACReader options</source>
|
||||
<translation>Настройки YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="226"/>
|
||||
<source>Help</source>
|
||||
<translation>Справка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="227"/>
|
||||
<source>Help, About YACReader</source>
|
||||
<translation>Справка по YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="232"/>
|
||||
<source>Magnifying glass</source>
|
||||
<translation>Увеличительное стекло</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="233"/>
|
||||
<source>Switch Magnifying glass</source>
|
||||
<translation>Переключиться на увеличительное стекло</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="234"/>
|
||||
<source>Z</source>
|
||||
<translation>Z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="240"/>
|
||||
<source>Set bookmark</source>
|
||||
<translation>Установить закладку</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="241"/>
|
||||
<source>Set a bookmark on the current page</source>
|
||||
<translation>Установить закладку на текущей странице</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="250"/>
|
||||
<source>Show bookmarks</source>
|
||||
<translation>Показать закладки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="251"/>
|
||||
<source>Show the bookmarks of the current comic</source>
|
||||
<translation>Показать закладки текущего комикса</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="252"/>
|
||||
<source>M</source>
|
||||
<translation>M</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="257"/>
|
||||
<source>Show keyboard shortcuts</source>
|
||||
<translation>Показать горячие клавиши</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="261"/>
|
||||
<source>Show Info</source>
|
||||
<translation>Показать информацию</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="262"/>
|
||||
<source>I</source>
|
||||
<translation>I</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="267"/>
|
||||
<source>Close</source>
|
||||
<translation>Закрыть</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="272"/>
|
||||
<source>Show Dictionary</source>
|
||||
<translation>Показать словарь</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="279"/>
|
||||
<source>Always on top</source>
|
||||
<translation>Всегда сверху</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="287"/>
|
||||
<source>Show full size</source>
|
||||
<translation>Полноэкранный режим</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="298"/>
|
||||
<source>&File</source>
|
||||
<translation>&Файл</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Open Comic</source>
|
||||
<translation>Открыть комикс</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="435"/>
|
||||
<source>Comic files</source>
|
||||
<translation>Файлы комикса</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="459"/>
|
||||
<source>Open folder</source>
|
||||
<translation>Открыть папку</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="483"/>
|
||||
<source>Image files (*.jpg)</source>
|
||||
<translation>Файлы изображений</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="627"/>
|
||||
<source>There is a new version avaliable</source>
|
||||
<translation>Доступно новое обновление</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="628"/>
|
||||
<source>Do you want to download the new version?</source>
|
||||
<translation>Хотите загрузить новую версию ?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>Saving error log file....</source>
|
||||
<translation>Сохранение файла с логом ошибки...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="main_window_viewer.cpp" line="693"/>
|
||||
<source>There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder.</source>
|
||||
<translation>Возникла проблема с сохраниением файла лога YACReader. Пожалуйста, проверьте есть ли у вас права доступа к корневой папке YACReader.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionsDialog</name>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="35"/>
|
||||
<source>"Go to flow" size</source>
|
||||
<translation>Перейти к исходному размеру</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="46"/>
|
||||
<source>My comics path</source>
|
||||
<translation>Путь комикса</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="56"/>
|
||||
<source>Page width stretch</source>
|
||||
<translation>Растянуть страницу в ширину</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="77"/>
|
||||
<source>Background color</source>
|
||||
<translation>Фоновый цвет</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="80"/>
|
||||
<source>Choose</source>
|
||||
<translation>Выбрать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="108"/>
|
||||
<source>Restart is needed</source>
|
||||
<translation>Необходима перезагрузка</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="121"/>
|
||||
<source>Brightness</source>
|
||||
<translation>Яркость</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="122"/>
|
||||
<source>Contrast</source>
|
||||
<translation>Контраст</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="123"/>
|
||||
<source>Gamma</source>
|
||||
<translation>Гамма</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="127"/>
|
||||
<source>Reset</source>
|
||||
<translation>Перезапуск</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="133"/>
|
||||
<source>Image options</source>
|
||||
<translation>Настройки изображения</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="143"/>
|
||||
<source>General</source>
|
||||
<translation>Общее</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="144"/>
|
||||
<source>Page Flow</source>
|
||||
<translation>Страница потока</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="145"/>
|
||||
<source>Image adjustment</source>
|
||||
<translation>Регулировки изображения</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="158"/>
|
||||
<source>Options</source>
|
||||
<translation>Настройки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="options_dialog.cpp" line="165"/>
|
||||
<source>Comics directory</source>
|
||||
<translation>Каталог комиксов</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutsDialog</name>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="16"/>
|
||||
<source>YACReader keyboard shortcuts</source>
|
||||
<translation>Клавиатурные комбинации YACReader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="20"/>
|
||||
<source>Close</source>
|
||||
<translation>Закрыть</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="shortcuts_dialog.cpp" line="66"/>
|
||||
<source>Keyboard Shortcuts</source>
|
||||
<translation>Клавиатурные комбинации</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Viewer</name>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="43"/>
|
||||
<location filename="viewer.cpp" line="634"/>
|
||||
<source>Press 'O' to open comic.</source>
|
||||
<translation>Нажмите "O" , чтобы открыть комикс.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Not found</source>
|
||||
<translation>Не найдено</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="183"/>
|
||||
<source>Comic not found</source>
|
||||
<translation>Комикс не найден</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="647"/>
|
||||
<source>Loading...please wait!</source>
|
||||
<translation>Загрузка ... Пожалуйста подождите!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="773"/>
|
||||
<source>Cover!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="viewer.cpp" line="780"/>
|
||||
<source>Last page!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="29"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation>Нажмите, чтобы переписать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_edit.cpp" line="11"/>
|
||||
<source>Restore to default</source>
|
||||
<translation>Вернуть начальные установки</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFieldPlainTextEdit</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="9"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="20"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="45"/>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="51"/>
|
||||
<source>Click to overwrite</source>
|
||||
<translation>Нажмите, чтобы переписать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_field_plain_text_edit.cpp" line="10"/>
|
||||
<source>Restore to default</source>
|
||||
<translation>Вернуть начальные установки</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="13"/>
|
||||
<source>How to show covers:</source>
|
||||
<translation>Как показать обложки:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="15"/>
|
||||
<source>CoverFlow look</source>
|
||||
<translation>Предосмотр обложки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="16"/>
|
||||
<source>Stripe look</source>
|
||||
<translation>Вид полосами</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_flow_config_widget.cpp" line="17"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation>Вид перекрывающимися полосами</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderGLFlowConfigWidget</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="19"/>
|
||||
<source>Presets:</source>
|
||||
<translation>Предустановки:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="21"/>
|
||||
<source>Classic look</source>
|
||||
<translation>Классический вид</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="24"/>
|
||||
<source>Stripe look</source>
|
||||
<translation>Вид полосами</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="27"/>
|
||||
<source>Overlapped Stripe look</source>
|
||||
<translation>Вид перекрывающимися полосами</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="30"/>
|
||||
<source>Modern look</source>
|
||||
<translation>Современный вид</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="33"/>
|
||||
<source>Roulette look</source>
|
||||
<translation>Вид рулеткой</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="77"/>
|
||||
<source>Show advanced settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="86"/>
|
||||
<source>Custom:</source>
|
||||
<translation>Пользовательский:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="89"/>
|
||||
<source>View angle</source>
|
||||
<translation>Угол зрения</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="95"/>
|
||||
<source>Position</source>
|
||||
<translation>Позиция</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="101"/>
|
||||
<source>Cover gap</source>
|
||||
<translation>Осветить разрыв</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="107"/>
|
||||
<source>Central gap</source>
|
||||
<translation>Сфокусировать разрыв</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="113"/>
|
||||
<source>Zoom</source>
|
||||
<translation>Масштабировать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="119"/>
|
||||
<source>Y offset</source>
|
||||
<translation>Смещение по Y</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="125"/>
|
||||
<source>Z offset</source>
|
||||
<translation>Смещение по Z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="131"/>
|
||||
<source>Cover Angle</source>
|
||||
<translation>Охватить угол</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="137"/>
|
||||
<source>Visibility</source>
|
||||
<translation>Прозрачность</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="143"/>
|
||||
<source>Light</source>
|
||||
<translation>Осветить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="149"/>
|
||||
<source>Max angle</source>
|
||||
<translation>Максимальный угол</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="181"/>
|
||||
<source>Low Performance</source>
|
||||
<translation>Минимальная производительность</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="183"/>
|
||||
<source>High Performance</source>
|
||||
<translation>Максимальная производительность</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="194"/>
|
||||
<source>Use VSync (improve the image quality in fullscreen mode, worse performance)</source>
|
||||
<translation>Использовать VSync (повысить формат изображения в полноэкранном режиме , хуже производительность)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_gl_flow_config_widget.cpp" line="202"/>
|
||||
<source>Performance:</source>
|
||||
<translation>Производительность:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>YACReaderOptionsDialog</name>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="21"/>
|
||||
<source>Save</source>
|
||||
<translation>Сохранить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="22"/>
|
||||
<source>Cancel</source>
|
||||
<translation>Отмена</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../custom_widgets/yacreader_options_dialog.cpp" line="30"/>
|
||||
<source>Use hardware acceleration (restart needed)</source>
|
||||
<translation>Использовать аппаратное ускорение (Требуется перезагрузка)</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
Reference in New Issue
Block a user